<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds/atom-style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://gjoremilevski.com/</id>
    <title>gjore.milevski</title>
    <updated>2026-03-22T16:43:45.178Z</updated>
    <generator>Astro-Theme-Retypeset with Feed for Node.js</generator>
    <author>
        <name>Gjore Milevski</name>
        <uri>https://gjoremilevski.com</uri>
    </author>
    <link rel="alternate" href="https://gjoremilevski.com/"/>
    <link rel="self" href="https://gjoremilevski.com/atom.xml"/>
    <subtitle>Personal site of Gjore Milevski, Frontend Software Engineer at Development Seed.</subtitle>
    <rights>Copyright © 2026 Gjore Milevski</rights>
    <entry>
        <title type="html"><![CDATA[Scalable linked data views]]></title>
        <id>https://gjoremilevski.com/posts/scalable-linked-data-views/</id>
        <link href="https://gjoremilevski.com/posts/scalable-linked-data-views/"/>
        <updated>2025-12-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A quick look at using DuckDB-WASM, Mosaic and GeoArrow to query Parquet files directly in the browser.]]></summary>
        <content type="html"><![CDATA[<p><strong>Browser-based computing does not always need RESTful APIs.</strong></p>
<p>Here is a recent experiment from my personal lab: using DuckDB-WASM, Mosaic and GeoArrow to query a Parquet file directly in the browser without a backend.</p>
<p>The architecture uses Mosaic's global Coordinator to manage state between linked views using SQL predicates. Because DuckDB-WASM returns standard Arrow tables, the WKB output is converted to GeoArrow point vectors before being passed to the GeoArrowScatterplotLayer for rendering. Credit goes to Kyle Barron for his work on the <code>@geoarrow/deck.gl-layers</code> package.</p>
<p>&lt;video src="/earthquake-demo.mp4" controls autoplay muted loop style="max-width: 100%;"&gt;&lt;/video&gt;</p>
<p>Desktop-only demo with bi-directional brushing: <a href="https://linked-views-demo.netlify.app/">https://linked-views-demo.netlify.app/</a></p>
]]></content>
        <author>
            <name>Gjore Milevski</name>
            <uri>https://gjoremilevski.com</uri>
        </author>
        <published>2025-12-20T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to get wind tiles for your next wind visualization]]></title>
        <id>https://gjoremilevski.com/posts/wind-visualization/</id>
        <link href="https://gjoremilevski.com/posts/wind-visualization/"/>
        <updated>2025-06-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A quick guide to turning wind data into tiles you can use in DeckGL visualizations, using TiTiler and vsicurl.]]></summary>
        <content type="html"><![CDATA[<p><strong>Quick (and open-source) way to build wind visualizations</strong></p>
<p><em>(thanks to Henry Rodman for the vrt and vsicurl hints below)</em></p>
<h2>Step 1: Find the right GRIB2 file</h2>
<p>Browse NOAA’s HRRR model (limited to CONUS, see below for global options) via the <a href="https://registry.opendata.aws/noaa-hrrr-pds/">ASDI bucket</a>.</p>
<p>File structure:</p>
<pre><code>s3://noaa-hrrr-bdp-pds/hrrr.YYYYMMDD/conus/hrrr.t{HH}z.wrfsfcf{XX}.grib2
</code></pre>
<ul>
<li><code>t{HH}z</code> = model run hour</li>
<li><code>f{XX}</code> = forecast hour (<code>f00</code> is analysis, <code>f01</code>–<code>f48</code> are 1–48h forecasts)</li>
</ul>
<p>Example URL for wind at 10m on 2025-05-12 06Z, 4-hour forecast:</p>
<pre><code>https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrrr.20250512/conus/hrrr.t06z.wrfsfcf04.grib2
</code></pre>
<h2>Step 2: Understand the wind data</h2>
<p>Wind data is split into two bands:</p>
<ul>
<li><strong>U</strong> = east-west component (positive = eastward)</li>
<li><strong>V</strong> = north-south component (positive = northward)</li>
</ul>
<p>You'll need both bands for visualization.</p>
<h2>Step 3: Create the TiTiler URL</h2>
<p>Use <code>vsicurl</code> to let TiTiler access the remote GRIB2 file directly:</p>
<pre><code>https://your-titiler-instance.xyz/cog/preview.png?rescale=-127,128&amp;url=vrt:///vsicurl/https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrrr.20250512/conus/hrrr.t06z.wrfsfcf04.grib2
</code></pre>
<h2>Step 4: Extract wind bands</h2>
<p>Get the U and V wind components (in this case, bands 10 and 11):</p>
<pre><code>https://your-titiler-instance.xyz/cog/preview.png?rescale=-127,128&amp;url=vrt:///vsicurl/https://noaa-hrrr-bdp-pds.s3.amazonaws.com/hrrr.20250512/conus/hrrr.t06z.wrfsfcf04.grib2?bands=10,11&amp;format=png
</code></pre>
<p>This gives you the necessary tiled wind png, ready for visualization. It should look something like this one:</p>
<p><img src="src/assets/wind-tile.png" alt="Wind tile example" /></p>
<h2>Step 5: Visualize with DeckGL</h2>
<p>Pass your complete TiTiler URL to the <code>ParticleLayer</code> from <a href="https://github.com/weatherlayers/weatherlayers-gl">WeatherLayers</a> in Deck.GL:</p>
<pre><code>new ParticleLayer({
  id: 'wind-particles',
  image: 'THE_URL_GOES_HERE',
  imageType: 'VECTOR',
  imageUnscale: [-127, 128],
  bounds: [-134.1214, 21.1222, -60.8912, 52.6287],
  clipBounds: [-134.1214, 21.1222, -60.8912, 52.6287],
  // rest of the config
})
</code></pre>
<p>The result should look something like this:</p>
<p>&lt;video src="/wind-viz.mp4" controls autoplay muted loop style="max-width: 100%;"&gt;&lt;/video&gt;</p>
<h2>What about GFS?</h2>
<p>I haven’t tested it yet, but the same approach should work for GFS data <a href="https://registry.opendata.aws/noaa-gfs-bdp-pds/">(NOAA GFS on AWS)</a> with the only difference being the path structure.</p>
]]></content>
        <author>
            <name>Gjore Milevski</name>
            <uri>https://gjoremilevski.com</uri>
        </author>
        <published>2025-06-21T00:00:00.000Z</published>
    </entry>
    <entry>
        <title type="html"><![CDATA[VEDA's Fire Event Explorer]]></title>
        <id>https://gjoremilevski.com/posts/fire-event-explorer/</id>
        <link href="https://gjoremilevski.com/posts/fire-event-explorer/"/>
        <updated>2025-06-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A web-based tool to track fire events, overlay wind and terrain and export animations. Developed in collaboration with the Wildfire Tracking Lab as part of NASA's VEDA project.]]></summary>
        <content type="html"><![CDATA[<p>The Fire Event Explorer, developed in collaboration with the <a href="https://earth-information-system.github.io/fireatlas/docs/">Wildfire Tracking Lab</a>, is now available as part of NASA’s VEDA Dashboard.</p>
<p>It lets you explore the progression of wildfire perimeters over time, overlay wind and terrain data and export animations or videos, all directly in the browser.</p>
<ul>
<li>Explore the tool: https://earthdata.nasa.gov/dashboard/tools/fire-event-explorer</li>
<li>How and why it was built: https://developmentseed.org/blog/2025-06-03-fire-exploration-tool/</li>
</ul>
<p>&lt;video src="/fire-event-explorer.webm" controls autoplay muted loop style="max-width: 100%;"&gt;&lt;/video&gt;</p>
<p>Note: VEDA is a set of open-source components and services for easily working with
earth observation data, as envisioned by NASA IMPACT.</p>
]]></content>
        <author>
            <name>Gjore Milevski</name>
            <uri>https://gjoremilevski.com</uri>
        </author>
        <published>2025-06-14T00:00:00.000Z</published>
    </entry>
</feed>