{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "dynamical.org",
  "language": "en",
  "home_page_url": "https://dynamical.org/",
  "feed_url": "https://dynamical.org/feed/feed.json",
  "description": "A not-for-profit research lab advancing how we access, understand, and act on data about our world.",
  "author": {
    "name": "dynamical.org",
    "url": ""
  },
  "items": [
    {
      "id": "https://dynamical.org/updates/2026-07-30/",
      "url": "https://dynamical.org/updates/2026-07-30/",
      "title": "OMGIMERG, Zarr-Python 3.3.0, analyzing forecast rollouts cont., NVIDIA Earth-2",
      "content_html": "<p>Who's the acronym artist at NASA responsible for this tomfoolery? Yes, IMERG is constructed from <strong>I</strong>ntegrated <strong>M</strong>ulti-satellit<strong>E</strong> (!!!) <strong>R</strong>etrievals for <strong>G</strong>PM. Next level.</p>\n<h2>NASA IMERG Early and Late are live</h2>\n<p>IMERG combines observations from a constellation of satellites into a global precipitation analysis. We now have two live-updating IMERG datasets in the catalog:</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/nasa-imerg-analysis-early/\">NASA IMERG Early</a> is available about 4 hours after observation time.</li>\n<li><a href=\"https://dynamical.org/catalog/nasa-imerg-analysis-late/\">NASA IMERG Late</a> incorporates more observations and both forward and backward propagation, with a latency of roughly 12 to 18 hours.</li>\n</ul>\n<p>Both are global, 0.1° (~10 km), half-hourly, and extend back to 1998. They include precipitation rate and a precipitation quality index.</p>\n<p><img src=\"https://dynamical.org/assets/catalog-thumbnails/nasa-imerg-analysis-early.jpg\" alt=\"NASA IMERG Early\"></p>\n<p>We are releasing the Early and Late runs of IMERG V07. When NASA releases V08, we plan to add the Final run as well.</p>\n<ul>\n<li>Early: <a href=\"https://dynamical.org/catalog/nasa-imerg-analysis-early/\">docs</a> | <a href=\"https://github.com/dynamical-org/notebooks/blob/main/nasa-imerg-analysis-early.ipynb\">notebook</a></li>\n<li>Late: <a href=\"https://dynamical.org/catalog/nasa-imerg-analysis-late/\">docs</a> | <a href=\"https://github.com/dynamical-org/notebooks/blob/main/nasa-imerg-analysis-late.ipynb\">notebook</a></li>\n<li><a href=\"https://youtu.be/bDWruz5zBsk\">Release trailer</a></li>\n</ul>\n<h2>STAC + Icechunk</h2>\n<p>Every catalog page now includes two ways to open a dataset: with <a href=\"https://github.com/dynamical-org/dynamical-catalog\"><code>dynamical-catalog</code></a>, or directly from our <a href=\"https://stac.dynamical.org/catalog.json\">STAC catalog</a> with Icechunk.</p>\n<p>The examples use <code>pystac</code> because it keeps the code concise, but any HTTP client can read the same STAC metadata. The important part is that the STAC is the source of truth for the current Icechunk asset:</p>\n<pre class=\"language-python\" tabindex=\"0\"><code class=\"language-python\"><span class=\"token keyword\">import</span> icechunk\n<span class=\"token keyword\">import</span> pystac\n<span class=\"token keyword\">import</span> xarray <span class=\"token keyword\">as</span> xr\n\ncatalog <span class=\"token operator\">=</span> pystac<span class=\"token punctuation\">.</span>Catalog<span class=\"token punctuation\">.</span>from_file<span class=\"token punctuation\">(</span><span class=\"token string\">\"https://stac.dynamical.org/catalog.json\"</span><span class=\"token punctuation\">)</span>\ncollection <span class=\"token operator\">=</span> catalog<span class=\"token punctuation\">.</span>get_child<span class=\"token punctuation\">(</span><span class=\"token string\">\"noaa-gfs-forecast\"</span><span class=\"token punctuation\">)</span>\nasset <span class=\"token operator\">=</span> collection<span class=\"token punctuation\">.</span>assets<span class=\"token punctuation\">[</span><span class=\"token string\">\"icechunk-https\"</span><span class=\"token punctuation\">]</span>\n\nrepo <span class=\"token operator\">=</span> icechunk<span class=\"token punctuation\">.</span>Repository<span class=\"token punctuation\">.</span><span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span>icechunk<span class=\"token punctuation\">.</span>http_storage<span class=\"token punctuation\">(</span>asset<span class=\"token punctuation\">.</span>href<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nsession <span class=\"token operator\">=</span> repo<span class=\"token punctuation\">.</span>readonly_session<span class=\"token punctuation\">(</span><span class=\"token string\">\"main\"</span><span class=\"token punctuation\">)</span>\nds <span class=\"token operator\">=</span> xr<span class=\"token punctuation\">.</span>open_zarr<span class=\"token punctuation\">(</span>session<span class=\"token punctuation\">.</span>store<span class=\"token punctuation\">,</span> chunks<span class=\"token operator\">=</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span></code></pre>\n<p>One request: don't copy the asset URL out of STAC and hard-code it into your application. We may move or version stores in the future. Resolve the current location from STAC when you open the dataset, or let <code>dynamical-catalog</code> do that for you.</p>\n<p>This is a good time to remind everyone still accessing data products via <code>data.dynamical.org</code>: that endpoint is deprecated and will be <strong>discontinued at the end of August</strong>.</p>\n<h2>Faster reads with Zarr-Python 3.3.0</h2>\n<p><a href=\"https://github.com/zarr-developers/zarr-python/releases/tag/v3.3.0\">Zarr-Python 3.3.0</a> is out. Among many awesome improvements, <a href=\"https://github.com/zarr-developers/zarr-python/pull/3004\">Alden's partial-shard read optimization</a> replaces serial requests for chunks within a shard with one <code>Store.get_ranges()</code> call, letting stores fetch ranges concurrently and coalesce nearby ranges into fewer requests. <a href=\"https://github.com/zarr-developers/zarr-python/pull/3987\">The coalescing controls</a> are tunable, but the optimization is now on by default.</p>\n<p>Every materialized dynamical.org dataset is sharded, so they all stand to benefit. The biggest gains should appear when a read spans multiple chunks within each shard, especially on remote storage.</p>\n<p>People are saying &quot;four times faster!&quot; <a href=\"https://github.com/zarr-developers/zarr-python/pull/3004#issuecomment-4479912961\">One real-world benchmark</a> of regional reads from a sharded weather reforecast cut the median from 10.8 seconds to 2.75 seconds (that's 3.9x faster!).</p>\n<h2>When is a forecast late?</h2>\n<p>&quot;What then is time? If no one asks me, I know; if I wish to explain it, I do not.&quot;</p>\n<p>You all made Saint Augustine proud with your questions, and prompted a deeper dive into when a forecast should be considered &quot;delayed&quot; (among other explorations).</p>\n<p>The short of it:</p>\n<ul>\n<li>The delay threshold has been switched p95 + max(p95 - p50, 15 minutes) which does a decent job across all sources whether they have a really tight distribution (HRRR) or a wide one (ECMWF AIFS ENS)</li>\n<li>We analyzed whether delays of early lead groups can detect the full run being delayed, or if they often recover</li>\n<li>We loaded NOAA and ECMWF dissemination advisories (see next section) to test if we could predict them through observed file arrivals.</li>\n</ul>\n<p>The longer version, including what we learned from replaying roughly a year of arrivals, is in our living <a href=\"https://dynamical.org/research/when-the-forecast-is-ready/\">lab notes</a>.</p>\n<p>The findings resulted in improvements to our <a href=\"https://dynamical.org/status/pipeline/\">pipeline status</a>.</p>\n<h2>Upstream dissemination advisories</h2>\n<p>We now ingest dissemination advisories from NOAA and ECMWF, map them to the products we monitor, and show them alongside observed delays. We backfilled the advisory archive to early 2022 and now track new and resolved notices in real time.</p>\n<p>These are useful as two separate signals: our arrival monitoring tells us what is happening in the files, while an agency advisory can tell us why. Advisories are available on the <a href=\"https://dynamical.org/status/pipeline/\">pipeline status page</a>, in the machine readable <a href=\"https://assets.dynamical.org/wxopticon/feed.json\">status feed</a>, and as a webhook event.</p>\n<h2>New variables</h2>\n<p>Thank you for your requests! We added a few requested variables to existing datasets:</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/noaa-gfs-analysis/\">GFS analysis</a> and <a href=\"https://dynamical.org/catalog/noaa-gfs-forecast/\">forecast</a>: 80 m wind components, temperature, and pressure</li>\n<li><a href=\"https://dynamical.org/catalog/noaa-gefs-analysis/\">GEFS analysis</a> and <a href=\"https://dynamical.org/catalog/noaa-gefs-forecast-35-day/\">35-day forecast</a>: 80 m wind components, temperature, and pressure</li>\n<li><a href=\"https://dynamical.org/catalog/noaa-hrrr-analysis/\">HRRR analysis</a> and <a href=\"https://dynamical.org/catalog/noaa-hrrr-forecast-48-hour/\">materialized 48-hour forecast</a>: visible-beam downward solar flux, or direct/beam surface irradiance</li>\n</ul>\n<p>The exact variable names and coverage are in each catalog entry.</p>\n<h2>dynamical.org in NVIDIA Earth2Studio</h2>\n<p><a href=\"https://github.com/NVIDIA/earth2studio\">NVIDIA Earth2Studio</a> now includes native dynamical.org data sources. Earth2Studio resolves collections through our public STAC catalog and reads the anonymous Icechunk repositories directly.</p>\n<ul>\n<li><a href=\"https://github.com/NVIDIA/earth2studio/pull/976\">Initial dynamical.org data source integration</a></li>\n<li><a href=\"https://github.com/NVIDIA/earth2studio/pull/997\">Regional and projected data source follow-up</a></li>\n</ul>\n<p>Thanks to Duncan Anderson (who made an excellent book recommendation), Nick Geneva (who has not yet discussed books with me -- yet --, but was very pleasant to chat with in the PR!) and the NVIDIA Earth2Studio team for suggesting and working through the integration with us.</p>\n<hr>\n<p>Enjoy the <a href=\"https://youtu.be/y2FQ3ih0MoE?si=XQCLz_4N8XVbJGbq\">weather</a>,\n^ MM</p>\n",
      "date_published": "2026-07-30T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/research/virtual-data-products/",
      "url": "https://dynamical.org/research/virtual-data-products/",
      "title": "Having it all: virtual and materialized data products",
      "content_html": "<p>We want it all:</p>\n<ul>\n<li>low-latency updates</li>\n<li>completeness over time, variables, and vertical dimensions</li>\n<li>access speed for time-series and map-style reads</li>\n</ul>\n<p>But when your data is 14 PB and 1 billion GRIB messages, making that dream a reality takes some work. Virtual Icechunk Zarrs are a key complement to our materialized (rechunked) Zarrs. Together they get us one step closer to the catalog of our dreams.</p>\n<p>We recently made a big push to build up our virtual Icechunk capabilities. This note describes why we create them, how we do it, and the lessons we've learned along the way.</p>\n<h3>Why go virtual?</h3>\n<p>For gridded weather data, thoughtfully designed virtual Zarrs offer three main benefits.</p>\n<ol>\n<li><strong>Update latency.</strong> Because there's no heavyweight data to move around, our stores can reflect new data within seconds of it becoming available at the source.</li>\n<li><strong>Completeness</strong> across variables and vertical dimensions. In cases where native files are already available publicly, we avoid storing the data ourselves, letting us offer all variables at all vertical levels for more models, more quickly.</li>\n<li><strong>Fast access.</strong> Native files tend to be structured in a way that's optimal for reading the model's entire geographic area at a single time step.</li>\n</ol>\n<p>Adding virtual Zarrs gives us a catalog of options tuned to different jobs: our materialized (rechunked) products for training a regional time-series model across a forecast archive, our virtual products for low-latency inference, an analysis product as a proxy for observations, and so on.</p>\n<h3>Virtual what?</h3>\n<p>The geospatial data sector spends a lot of time optimizing, sometimes prematurely. Is this one of those moments? We think it isn't: we started with the problems (latency, completeness) and worked backward, exhausting our existing techniques before picking up a virtual approach.</p>\n<p>&quot;Virtual Zarr?&quot; you may be saying, &quot;sounds like a Zuckerberg fever dream.&quot; Nay, I say: a virtual Zarr is nothing more than a Zarr whose chunks are references to data stored somewhere else.</p>\n<p>Every chunk in a virtual Zarr is backed by a virtual reference, and the reference is just a URL saying where to find the file, and the byte offset range to read within the file. The Zarr's metadata also stores which <code>codec</code> to use to decode the bytes (netCDF, HDF5, GRIB2, etc.). If you are familiar with GRIB indexes, imagine someone combined every GRIB index from your favorite weather model into one gigantic index.</p>\n<p>The virtual Zarr concept grew out of the challenge: &quot;We have these huge piles of data in legacy file formats. We'd like to use it as an analysis-ready, cloud-optimized data cube, but we don't want to reprocess and double-store all the data.&quot; The kerchunk project pioneered this concept with the realization that by storing references that point to those legacy files, client libraries could read them on the fly, and the whole experience would act like a modern data cube. The VirtualiZarr project built on this, improving the ergonomics of constructing a virtual Zarr. Virtual capabilities were a natural addition to Icechunk. After all, references to chunks of data are core to how Icechunk achieves atomic updates and data versioning for virtual and materialized Zarrs alike.</p>\n<h4>There and back again: a virtual read</h4>\n<p>So what happens when you read <code>ds[&quot;temperature_2m&quot;].sel(time=&quot;…&quot;)</code> from a virtual Zarr?</p>\n<ol>\n<li>Xarray translates your coordinate selection into integer indexes.</li>\n<li>Zarr finds which chunks those indexes fall within (e.g., <code>temperature_2m/c/0/1/2</code> and <code>temperature_2m/c/3/4/5</code>) and asks the Zarr store for those chunks.</li>\n</ol>\n<p>Up to this point, virtual and materialized Zarrs follow the same path. Here's where they diverge:</p>\n<ol start=\"3\">\n<li>Because this store is virtual, Icechunk takes a chunk key like <code>temperature_2m/c/0/1/2</code> and looks it up in its manifest to find a source URL and byte range, then fetches those bytes (from local disk, object storage, wherever the URL points).</li>\n<li>Zarr picks back up, decoding the bytes using the <code>codec</code> named in the Zarr's metadata. In a materialized Zarr, that codec is often a standard compressor like zstd. In a virtual Zarr, it's a codec that knows how to read the native file format: netCDF, HDF5, or for GRIB weather data, the <code>GribberishCodec</code>.</li>\n</ol>\n<p>Once the bytes are decoded into an array, everything is back to standard Zarr: the array is indexed as usual, returning the values you asked for.</p>\n<h3>Virtual or materialized: which to use?</h3>\n<p>The short answer: try both, and see which is fastest for each of your access patterns. Within the same project it may be optimal to use both together.</p>\n<p>For dynamical.org's catalog, here's a rule of thumb:</p>\n<blockquote>\n<p>Does an individual unit of work read the model's whole geographic domain? If yes, use virtual, else use materialized.</p>\n</blockquote>\n<p>If a variable you need is only available in the virtual Zarr, try that and let us know at feedback@dynamical.org if the performance isn't what you need. We add variables to our materialized Zarrs based on demand.</p>\n<p>More generally, use the product that will fetch the fewest chunks of data for your access patterns. You can find the chunking of our datasets in the <a href=\"https://dynamical.org/catalog/\">catalog documentation</a> and in our <a href=\"https://stac.dynamical.org/catalog.json\">STAC</a>.</p>\n<p>There's nothing about virtual Zarrs that requires them to be faster for single-time-step, map, or spatial access patterns; it just happens that almost all native gridded weather data files follow that shape thanks to the mechanics of running a weather model. If someday we find native, time-series-optimized files, we'll virtualize those and have our materialized dataset rechunk to optimize for spatial access.</p>\n<h3>How fast is fast?</h3>\n<p>Enough talk. Let us show you the numbers.</p>\n<p>We define latency as <em>the time between the moment a file first becomes available at the source and the moment that data is first available in our Zarrs</em> — specifically, from a file's &quot;modified&quot; or &quot;created&quot; timestamp at the source to the timestamp of the first Icechunk snapshot containing the same data.</p>\n<p>These statistics are calculated on a relatively short history of our first virtual Zarr, <a href=\"https://dynamical.org/catalog/noaa-hrrr-forecast-48-hour-virtual/\">NOAA HRRR forecast, 48 hour, virtual</a>. As we build up a longer track record, we'll add them to our <a href=\"https://dynamical.org/status/pipeline/\">data product pipeline status</a> page, where you can audit the <a href=\"https://dynamical.org/research/when-the-forecast-is-ready/\">details</a> and see them covered under tight latency thresholds in our <a href=\"https://dynamical.org/sla/\">SLA</a>.</p>\n<h4>Latency (seconds)</h4>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>p50</th>\n<th>p95</th>\n<th>p99</th>\n<th>max</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>all</td>\n<td>2.9</td>\n<td>4.2</td>\n<td>5.9</td>\n<td>7.7</td>\n</tr>\n<tr>\n<td>surface</td>\n<td>3.2</td>\n<td>4.5</td>\n<td>5.8</td>\n<td>6.0</td>\n</tr>\n<tr>\n<td>pressure</td>\n<td>3.1</td>\n<td>4.2</td>\n<td>6.1</td>\n<td>7.7</td>\n</tr>\n<tr>\n<td>model</td>\n<td>1.7</td>\n<td>3.7</td>\n<td>4.7</td>\n<td>5.9</td>\n</tr>\n</tbody>\n</table>\n<figure><img src=\"https://dynamical.org/assets/notes/latency_kde_by_type.png\" alt=\"Virtual product update latency for NOAA HRRR forecast, by file type: surface, pressure, and model level\"><figcaption>End-to-end latency between data availability at the source and in our virtual Icechunk Zarr, in seconds. Model level files (`wrfnat`) feed the fewest arrays and have the lowest latency, hinting there's even more room to optimize the larger surface and pressure groups.</figcaption></figure>\n<h3>How we update them fast</h3>\n<p>Three priorities guided the design of our virtual Zarr update pipeline: fast, correct, resilient.</p>\n<p>Push or poll? This is one of the core questions when designing a system that reacts to new data as it arrives. &quot;Get notified right away&quot; makes push notifications sound like the obvious choice wherever they're available. As you get into the details, the story becomes more complex: a dataset that produces many files at once (e.g., an ensemble run) needs debouncing regardless, since committing takes about a second and many files can land in that same second. And most national NWP agencies' operational file servers, the sources with the lowest latency, don't support push notifications at all. Backfills would need their own handling too, since there's no &quot;new file&quot; event to subscribe to for data that already exists.</p>\n<p>Polling at a high rate (a second or less) collapses all of these cases into a single path. A backfill polls once, stores what's there, and moves on; an update keeps polling until the full forecast has arrived. The same loop works across HTTP, FTP, and object stores, and across backfills and updates alike, eliminating a whole class of &quot;two code paths drifted apart&quot; bugs. It's also resilient: if the process restarts, it catches back up on the next request.</p>\n<p>An update in our code follows these steps:</p>\n<ol>\n<li>List all the files we expect to have when an update is complete. A quick, deterministic enumeration driven by the Zarr's coordinate labels.</li>\n<li>Filter out the files we already have in our store. This is a fast existence check against the Icechunk manifest, not many network requests.</li>\n<li>Loop: ask the source if any of the remaining files are present. If they are, commit their virtual references to the store. Continue looping until the forecast is complete or you exceed a generous deadline to account for late forecasts.</li>\n</ol>\n<p>If you'd like to get even more into the implementation, this is all in our open-source <a href=\"https://github.com/dynamical-org/reformatters/blob/main/docs/virtual_datasets.md\">code</a>.</p>\n<h3>Lessons</h3>\n<p>In the end, the bottlenecks to low-latency updates come down to:</p>\n<ul>\n<li>CPU: zstd decompression and compression of all the Icechunk manifests changed in a commit.</li>\n<li>Network: download/upload of all Icechunk manifests changed in a commit.</li>\n</ul>\n<p>Even for large ensemble forecasts, an incremental update with well-tuned manifest splits (see below) can do this work in a couple of seconds on modest hardware.</p>\n<p>That's not to say it was fast on the first try. Lots of N² or serial loops that don't matter at small N rear their heads at the scale of a billion references and over 100 Zarr arrays. But the good news is that they're all solvable: (1) ultimately this is small data per update and computers are fast, and (2) AI does great with a verifiable objective, and wall-clock time is exactly that. We're having fun working with AI to optimize this one.</p>\n<p>Here's an incomplete list of bumps we had to work out:</p>\n<ul>\n<li><strong>Manifest splitting:</strong> just like optimal Zarr design depends on thinking through access patterns and sizing chunks accordingly, chunking the <em>metadata</em> is crucial in virtual datasets of substantial size. Too big, and commits are slow. Too small, and many tiny manifest files slow reads. <a href=\"https://icechunk.io/en/stable/guides/performance/#configuring-splitting\">Icechunk docs</a>. Thanks to Tom Nicholas of Earthmover, who helped us think through manifest splitting. Check out his <a href=\"https://www.earthmover.io/blog/virtual-grib-nbm\">write-up on the history of GRIBs and virtualizing them</a>.</li>\n<li><strong>Manifest flush concurrency on commit:</strong> we contributed an <a href=\"https://github.com/earth-mover/icechunk/issues/2273\">optimization</a> to Icechunk to let users configure the concurrency used when downloading and uploading changed manifests during a commit. This doesn't need tuning unless you have lots of arrays being updated in one commit, but without it our end-to-end latency couldn't have gone below 50 seconds. Thanks to Sebastián Galkin of Earthmover, this will probably be on Icechunk <code>main</code> by the time you read this.</li>\n<li><strong>Kubernetes node consolidation:</strong> just say no. Thirty-second container startup after moving your pod?! Gasp. Kubernetes trying to save us money isn't something we want when we're sensitive to seconds.</li>\n</ul>\n<h3>Data product design and usability</h3>\n<p>It's not enough to make them fast; we also wanted these virtual Zarrs to be as simple to use as the rest of our catalog. Much of that happens for free by virtue of them being an Icechunk Zarr: Icechunk exposes a nearly uniform interface regardless of how the dataset is constructed.</p>\n<p>A key element of ease of use for us was <strong>drop-in compatibility with our existing materialized Zarrs.</strong> For any variable in our materialized data products you can grab the same variable from the virtual product and you'll get the same values out. To make this happen we apply a few select, on-the-fly transformations to make the values you get back from our virtual Zarrs exactly match those from our materialized Zarrs. Matt Iannucci, the creator of Gribberish (also working at Earthmover), has been very helpful along the way as we contributed a couple new GribberishCodec options that do those <a href=\"https://github.com/mpiannucci/gribberish/pull/169\">on</a> <a href=\"https://github.com/mpiannucci/gribberish/pull/161\">the</a> <a href=\"https://github.com/mpiannucci/gribberish/pull/153\">fly</a>.</p>\n<h3>What's the catch?</h3>\n<p>There's a limit to how we can manipulate data to improve UX (although we do this sparingly). The two most salient: you won't find a deaccumulated precipitation rate like in our materialized datasets, and we can't homogenize a variable that switched units sometime in its history (e.g., hPa to Pa back in 2019).</p>\n<h3>What's next</h3>\n<ul>\n<li>For dynamical.org, we'll create both virtual and materialized products for all popular datasets. You'll find us initially releasing more virtual datasets since the commitment in ongoing storage is much lower.</li>\n<li>Virtual <code>grib2.bz2</code>? (e.g., NOAA MRMS, DWD ICON-EU) You bet, thanks to the power of Zarr codec pipelines.</li>\n<li>We'll start virtualizing datasets that don't have public data, e.g., ECMWF pre-schedule delivery. That will come with its own challenges (no GRIB indexes). Because there's no need to decompress and recompress data, virtuals will still give us near-optimal latency.</li>\n<li>More optimizations: what we have works great for 175 variables, but what about a 400-variable dataset? (HRDPS anyone?) Good thing there's more juice to squeeze.</li>\n</ul>\n",
      "date_published": "2026-07-16T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-07-13/",
      "url": "https://dynamical.org/updates/2026-07-13/",
      "title": "Low-latency HRRR, with all variables and levels, now in the catalog",
      "content_html": "<p>Are we living inside a Bostrom-esque simulation? Does that simulation exist inside <em>another simulation</em>?</p>\n<p>There's only one way to find out: let's add increasing layers of derivative abstraction on already-digital signals that inadequately capture what the sheeple call &quot;reality.&quot; Yeah?! Yeah.</p>\n<p>If anyone has Morpheus' phone number let him know I'm ready to be picked up on the Nebuchadnezzar.</p>\n<h2>noaa-hrrr-forecast-48-hour-virtual is now available</h2>\n<p>It is our first <strong>virtual</strong> dataset. It's low-latency, optimized for spatial access (i.e. good for maps) and has all variables and vertical levels. <a href=\"https://dynamical.org/catalog/noaa-hrrr-forecast-48-hour-virtual/\">Try it out</a>, and check out the <a href=\"https://youtu.be/Ddbwd0TZzqY\">release trailer</a>.</p>\n<p><img src=\"https://dynamical.org/assets/catalog-thumbnails/noaa-hrrr-forecast-48-hour-virtual.jpg\" alt=\"noaa-hrrr-forecast-48-hour-virtual\"></p>\n<p>We now have the machinery for rigorous, high-performance virtual data products. You will see many more of these, and they will be as thoughtfully designed as our materialized data products.</p>\n<p>You can read more about our design process in Alden's lab note: <a href=\"https://dynamical.org/research/virtual-data-products/\">Having it all: virtual and materialized data products</a>.</p>\n<h2>Gettin' serious. status.dynamical.org is live</h2>\n<p>We stood up <a href=\"https://status.dynamical.org\"><strong>status.dynamical.org</strong></a> to give insight into both:</p>\n<ol>\n<li>dynamical.org system uptime and</li>\n<li>dynamical.org and source agency forecast production pipeline</li>\n</ol>\n<p>The latter initially focuses on upstream observability (e.g. GEFS dissemination on NOAA NOMADS) and our data products (materialized and virtual) will land shortly. We just wanted to make sure they were heckin' fast first ;)</p>\n<p><img src=\"https://dynamical.org/assets/status-pipeline-2026-07.png\" alt=\"NOAA GFS forecast pipeline status\"></p>\n<p>We later added webhooks for subscribers to be notified on dissemination milestones or delays. We're still tuning what counts as &quot;delayed&quot;, but overall it's been an invaluable tool for our team (and others) to learn more about the dissemination process.</p>\n<p>You can read the lab notes here: <a href=\"https://dynamical.org/research/when-the-forecast-is-ready/\">Knowing the moment a forecast is ready</a>.</p>\n<p>This level of rigor is helping us prepare to offer an SLA to organizations who need additional support and latency/uptime assurance. Don't worry, free public access stays free. Email me at <a href=\"mailto:marshall@upstream.tech\">marshall@upstream.tech</a> if you're interested in learning more about our SLA and/or supporting the sustainable operations &amp; growth of dynamical.org &lt;3</p>\n<h2>Validation reports</h2>\n<p>The per-dataset validation reports we started in June got richer. I mean just look at this <a href=\"https://dynamical.org/catalog/noaa-hrrr-forecast-48-hour-virtual/validation/\">absolutely ridiculous one</a> for the noaa-hrrr-forecast-48-hour-virtual data product.</p>\n<h2>A cleaner catalog and site</h2>\n<ul>\n<li>Catalog pages now document <strong>chunk and shard sizes</strong> per dataset — element counts, coordinate spans, and uncompressed sizes — so you (or your robot) can align your reads to the grid.</li>\n<li>We reorganized the site around research <strong>areas</strong> and <strong>projects</strong>, refreshed the homepage, and made the whole thing legible to search engines and LLMs (<code>llms.txt</code>, structured metadata, sitemap). Lab notes inspired by the inimitable <a href=\"https://www.inkandswitch.com/\">Ink &amp; Switch</a>.</li>\n</ul>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=3c_E09gib-Y\">weather</a> -- MM</p>\n",
      "date_published": "2026-07-13T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/research/when-the-forecast-is-ready/",
      "url": "https://dynamical.org/research/when-the-forecast-is-ready/",
      "title": "Knowing the moment a forecast is ready",
      "content_html": "<p>Forecast production is a factory assembly line, a fulfillment center, and a delivery route all in one. Lewis Fry Richardson's Weather Forecasting Factory was not too far off.</p>\n<figure><img src=\"https://dynamical.org/assets/notes/conlin-1.jpg\" alt=\"\"><figcaption>“Weather Forecasting Factory” by Stephen Conlin, 1986. Based on the description in Weather Prediction by Numerical Process, by L.F. Richardson, Cambridge University Press, 1922, and on advice from Prof. John Byrne, Trinity College Dublin. Image: ink and water colour, c. 50 x 38.5 cm. © Stephen Conlin 1986. All Rights Reserved. (Courtesy: Hendrik Hoffmann, School of Mathematics & Statistics, University College Dublin. <a href=\"https://www.emetsoc.org/resources/rff/\">Source</a>)</figcaption></figure>\n<p>Every dataset in the dynamical.org catalog (so far) is downstream of a model run that\nsomeone else produces on their own cadence. And the initialization is just the beginning (literally and philosophically). Then the files start landing, one by one, eventually\ntrickling in over tens of minutes (or even hours) rather than appearing all at once. If your\npipeline depends on that data, you have two bad options: pretend you can divine a cron schedule that will &quot;always work,&quot; or poll wildly.</p>\n<p>And to add to that, we had questions like:</p>\n<ul>\n<li>How often does the full GEFS run complete &quot;late&quot;?</li>\n<li>What does &quot;late&quot; even mean? What is the spread of the min to the max latencies from init?</li>\n<li>What does the rollout of a forecast look like, file by file, minute by minute?</li>\n<li>How do different delivery routes (read: file destinations) impact latency?</li>\n</ul>\n<p>We sought to answer these questions and many more so that the dynamical.org catalog would be resilient, low-latency, and designed around the minute details of its upstream sources. The prompt for actually sitting down and answering them was a <a href=\"https://www.linkedin.com/in/will-hobbs-93215023/\">question Will Hobbs</a> <a href=\"https://www.linkedin.com/posts/will-hobbs-93215023_question-for-people-that-work-with-nwpaiwp-ugcPost-7449580009725267970-3FJU/\">posted on LinkedIn</a> about NOAA model file availability.</p>\n<p>So, we built a tool called <strong>wxopticon</strong> to remove that guesswork (I pronounce it &quot;waxopticon&quot;, and I say it in a slightly mischievous voice and picture Saruman reaching for the Palantir — no, not THAT Palantir. Oh never mind). It watches upstream weather sources and dynamical.org's own catalog stores, and it answers three operational questions:</p>\n<ul>\n<li><strong>When can I expect lead-group X dataset Y?</strong></li>\n<li><strong>Was this run on time?</strong></li>\n<li><strong>Is this in-flight run trending on time?</strong></li>\n</ul>\n<p>You can see all of this on the <a href=\"https://dynamical.org/status/pipeline/\">pipeline status page</a>.</p>\n<p>The second component is a system that enables consumers to create subscriptions\n(via webhooks, Slack notifications, etc.) to meaningful events (e.g., &quot;notify me\nwhen IFS ENS progress:f024 is complete&quot; or &quot;warn me when GEFS on AWS looks like it might arrive late&quot;).</p>\n<h2>How it works, briefly</h2>\n<p>wxopticon is a set of stateless functions over a single append-only event log in\nobject storage. <strong>The log is the source of truth</strong>, and\neverything else (the dashboard, status and timing, the readiness milestones) is a\npure replay of it.</p>\n<p>A lean detection scan runs every two minutes: it replays the log to find the runs\nstill expected, probes their upstream locations, appends any new state\ntransitions, and fans each new milestone out to subscribers. A separate\nsummarize pass runs every five minutes to refresh the status feed and seed\n&quot;delayed&quot; signals. For products with a notification stream (e.g., AWS SNS), a\ncontinuous listener catches arrivals within seconds instead of waiting for the\nnext scan.</p>\n<h2>What a year of arrivals actually looks like</h2>\n<p>Because every arrival is in the log, we can replay the whole dang thing. Over the\nlast year, wxopticon recorded roughly <strong>1.9 million file arrivals across\n9,150 completed product-runs</strong> of thirteen upstream feeds.</p>\n<p><strong>A run arrives over time.</strong> The moment a run <em>starts</em> and the\nmoment it's <em>complete</em> can be many hours apart, and the shape of that arrival looks\ndifferent for every model.</p>\n<figure><img src=\"https://dynamical.org/assets/notes/arrival-staircase.png\" alt=\"Scatter plots for four models, each point a forecast file positioned by its forecast hour (vertical) against hours after init time (horizontal). GFS traces a long diagonal, HRRR a tight one, GEFS two slopes with a plateau, AIFS a near-vertical band.\"><figcaption>Every file found over the last year, by forecast hour and time since init; the dark line is the per-lead median. GFS trickles out its 16 days of forecasts over two hours; HRRR climbs through its 48 hours in one; GEFS sprints to day 16, then delivers the 35-day tail a day later; AIFS drops everything at once. (Some rewritten timestamps clipped.)</figcaption></figure>\n<p>This is why &quot;ready&quot; is a series of milestones; a short-range\nconsumer can start using GEFS the instant the early lead groups land, long before the full run completes.</p>\n<p><strong>The feeds are punctualish!</strong> Measured from init time to the last file of the run, the median completion time is about 1h47m for HRRR, 3h37m for DWD's ICON-EU, 5h15m for AIFS, 5h22m for GFS, and a full ~26h for GEFS's 35-day run.</p>\n<figure><img src=\"https://dynamical.org/assets/notes/time-to-complete.png\" alt=\"A dumbbell chart ranking thirteen feeds by time from init to a complete run, from HRRR near two hours to GEFS 35-day near 26 hours, each showing median, 95th and 99th percentile.\"><figcaption>Init to complete run: median (filled) through the 95th to the 99th percentile (open). The striking part is how narrow most of these ranges are.</figcaption></figure>\n<p>GFS completes within a 13-minute band from its median to its 99th percentile, run after run. Regularity is exactly what makes a learned next-run expectation meaningful. A &quot;late&quot; signal is useful because on-time performance is so consistent.</p>\n<h2>What &quot;ready&quot; actually means</h2>\n<p>wxopticon models each run's progress as a sequence of <strong>readiness boundaries</strong>.\nRather than a single &quot;done&quot; flag, a run crosses named milestones as its lead\nhours become available:</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>fires when</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>progress</code></td>\n<td>every lead ≤ an intermediate lead-group horizon is available (e.g., <code>progress:f240</code>)</td>\n</tr>\n<tr>\n<td><code>complete</code></td>\n<td>the full run is available — you don't need to know group names</td>\n</tr>\n<tr>\n<td><code>in_flight</code></td>\n<td>a still-running run is behind its learned schedule</td>\n</tr>\n<tr>\n<td><code>advisory</code></td>\n<td>the upstream agency opens or resolves a dissemination advisory</td>\n</tr>\n</tbody>\n</table>\n<p>That table describes events, not run states. We initially mixed those concepts\ntogether, which made it hard to say whether <code>delayed</code> meant &quot;still running&quot; or\n&quot;finished, but late.&quot; The current model has two orthogonal axes:</p>\n<ul>\n<li><strong><code>status</code></strong> is lifecycle: <code>pending</code>, <code>in_flight</code>, <code>complete</code>, <code>failed</code>, or\n<code>unobserved</code>.</li>\n<li><strong><code>timing</code></strong> is the judgment: <code>on_time</code> or <code>delayed</code>, when there is enough\nhistory to make one.</li>\n</ul>\n<p>I went back and forth on the correct threshold for &quot;delayed.&quot; Our first pass\nsplit the question in two: an in-flight run was delayed at p95 plus one minute,\nwhile a completed run was judged against p99. Raw p95 was obviously too harsh:\nby definition, it would flag roughly one ordinary run in twenty. But adding one\nminute still hugged very consistent feeds too tightly, and p99 was a volatile\ntail statistic answering a different question.</p>\n<p>We replayed a year of arrivals and compared several buffers above p95:</p>\n<ul>\n<li>a fixed 30 minutes, which ignores whether a product normally takes two hours\nor twenty-six;</li>\n<li>ten percent of p50, which scales with typical latency but not with the\ndistribution's actual width;</li>\n<li><code>p95 + (p95 - p50)</code>, which adapts to dispersion but collapses back toward p95\non a very tight feed.</li>\n</ul>\n<figure><img src=\"https://dynamical.org/assets/notes/threshold-candidates.png\" alt=\"A scatter plot of 1,653 HRRR-on-AWS runs, each point one run's completion latency against its date. The runs form a dense band between about 105 and 120 minutes. Three horizontal candidate lines cross the plot: a dash-dotted line at 125 minutes just above the band, a dashed line at 127, and a dotted line at 146 far above everything. A density curve along the right edge shows the packed band.\"><figcaption>Three candidates, three answers: 125, 127, and 146 minutes, flagging 10, 8, and 5 of 1,653 runs. HRRR's median and p95 sit 9 minutes apart, so raw dispersion lands where routine jitter crosses it. A flat 30 minutes is a 28% cushion here — and 2% on GEFS's 26-hour run.</figcaption></figure>\n<p>The challenge was to come up with something formulaic that behaved sensibly across tight and wide distributions. What worked best was something not on our original list: a dispersion buffer with a floor:</p>\n<p><code>spreadf = p95 + max(p95 - p50, 15 minutes)</code></p>\n<p>Each product gets its own spreadf from a trailing 90-day window. Each lead\ngroup gets one too. This is useful: if GFS is still working toward\nday 10 after its day-10 group would normally be ready, wxopticon can mark the\nrun <code>in_flight</code> and <code>delayed</code> before the full 16-day run reaches its later\ndeadline. The event names the lead group that triggered the warning.</p>\n<figure><img src=\"https://dynamical.org/assets/notes/delay-threshold-comparison.png\" alt=\"A scatter plot of 443 GFS-on-NOMADS runs, each point one run's completion latency against its date. Almost every run sits in a flat band near 313 minutes; four sit above it, one as high as 441. Two horizontal lines cross the plot: a solid spreadf line at 331 minutes with four points above it, and a dashed p50frac line at 347 minutes with one point above it. A density curve along the right edge shows how tightly the band is packed.\"><figcaption>The floor earns its keep on our tightest feed: GFS on NOMADS puts 3 minutes between median and p95. Unfloored, dispersion would sit at 319 and flag 10 ordinary runs. `spreadf` lifts it to 331 (solid) and catches the four real stragglers; `p50frac` at 347 (dashed) sees only the worst.</figcaption></figure>\n<p>The spreadf approach now drives the dashboard, in-flight warnings, and the\ncompleted run's timing.</p>\n<h2>Can a delayed lead-group predict a delayed run?</h2>\n<p>We also wanted to explore the question: can delayed lead groups foretell the full run being delayed? Using the spreadf methodology, lead groups produced <strong>46 observable early warnings</strong>, or about 0.5% of runs:</p>\n<ul>\n<li>20 (43.5%) persisted to a completed full-run delay;</li>\n<li>26 (56.5%) recovered and completed on time;</li>\n<li>the median warning arrived 63 minutes before the run completed;</li>\n<li>for the warnings that persisted, the median lead over the full-run deadline\nwas 57 minutes.</li>\n</ul>\n<figure><img src=\"https://dynamical.org/assets/notes/lead-group-stagger.png\" alt=\"A scatter plot of GEFS 16-day arrivals on AWS over a year, colored by lead group. Six horizontal bands sit at increasing latencies, from f000 near 240 minutes up to f384 near 380, each with its own threshold line from 250 to 481 minutes. Red markers scattered above the bands mark delayed arrivals, some reaching past 1,000 minutes.\"><figcaption>GEFS's 16-day run, with genuinely staggered horizons: day 0 lands about four hours after init, day 16 around six and a half. That gap is what makes early warning possible — a run stuck at day 0's 250-minute threshold is in trouble four hours before the full run's deadline.</figcaption></figure>\n<p>An <code>in_flight</code> event triggered by\na lead group might be a useful warning depending on one's sensitivity to delays. Or one could subscribe to\n<code>complete_delayed</code> if they only wanted confirmed late completions.</p>\n<h2>How do delays correlate with agency advisories?</h2>\n<p>From time to time, ECMWF and NOAA, for example, issue dissemination advisories: memorable ones include the dramatic power outage impacting the Bologna data center, or the crazy summer when NOMADS FTP took early retirement (too soon?).</p>\n<p>We now ingest these in real time and surface delays on our <a href=\"https://dynamical.org/status/\">status</a> and <a href=\"https://dynamical.org/status/pipeline/\">pipeline</a> pages. We have backfilled the archive through early 2022.</p>\n<p>Using these, we asked yet another question: <strong>Can lead-group delays detect official advisories early?</strong></p>\n<figure><img src=\"https://dynamical.org/assets/notes/advisory-overlay.png\" alt=\"Lead-group arrivals for ECMWF's 15-day ensemble on AWS, with five vertical grey bands marking ECMWF dissemination advisories. Most arrivals sit in a flat band just under 480 minutes. Red delayed markers appear in clusters, some sitting on advisory bands and some far from any of them, with the worst reaching 870 minutes.\"><figcaption>Five ECMWF advisories (grey) over the 15-day ensemble. Some land on runs we flagged, some on ordinary stretches, and several of our delays have no advisory at all. Even where they coincide it isn't detection — the bands sit at init time, and our alarms fired 96 and 196 minutes *after* ECMWF posted.</figcaption></figure>\n<p>Not conclusively, based on the archive we\nhave. We found 24 product/run matches with an opening agency advisory. Four\nalso experienced a lead-group delay, and those delays <em>followed</em> the agency\npost by roughly 2, 11, 96, and 196 minutes. That is too small a sample for a\nbroad conclusion, but it is enough to reject the claim that lead-group spreadf\nwas an earlier advisory detector in this period.</p>\n<h2>Subscriptions and feeds</h2>\n<p>If you can expose an inbound HTTP endpoint, webhooks are a good way to be notified of specific dissemination events or delay conditions. wxopticon POSTs a signed JSON body to your endpoint the moment a run crosses\na boundary you've subscribed to:</p>\n<pre class=\"language-json\" tabindex=\"0\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"event_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"noaa-gfs/external-noaa-gfs-aws/2026-06-10T06:00Z/complete\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"group_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"noaa-gfs\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"product_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"external-noaa-gfs-aws\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"product_label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"NOAA GFS forecast (AWS)\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"init_time\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2026-06-10T06:00:00Z\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"kind\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"complete\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"lead_group\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"f384\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"lead_group_label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"16d\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"max_lead_hours\"</span><span class=\"token operator\">:</span> <span class=\"token number\">384</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"occurred_at\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2026-06-10T11:12:04Z\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"latency_s\"</span><span class=\"token operator\">:</span> <span class=\"token number\">18724.0</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"timing\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"on_time\"</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>Subscriptions are managed at\n<a href=\"https://status.dynamical.org/webhooks\">status.dynamical.org/webhooks</a>; access\nis currently allowlisted, so <a href=\"mailto:feedback@dynamical.org\">get in touch</a> if\nyou'd like to try it. You can even attach a small sandboxed Python function that runs\nagainst the just-arrived dataset and shapes the payload or filters out deliveries you don't want.</p>\n<figure><img src=\"https://dynamical.org/assets/notes/wxopticon-slack.png\" alt=\"A Slack channel showing a wxopticon boundary notification delivered through an incoming webhook, with the run's product, init time, and the milestone it crossed.\"><figcaption>wxopticon also supports Slack-style incoming webhooks, so boundaries can land straight in a channel.</figcaption></figure>\n<p>For those of you who hear the soft footfall of the IT team plodding imperceptibly, but threateningly, in the distance — coming closer, ever closer at the mention of <em>webhooks</em>, wxopticon publishes the same\nevents as a single JSON file you fetch on your own schedule, with no subscription or auth:</p>\n<p><strong><a href=\"https://assets.dynamical.org/wxopticon/feed.json\">https://assets.dynamical.org/wxopticon/feed.json</a></strong></p>\n<p>It's a product-keyed snapshot. Each product carries its most recent runs, and\nevery run nests the same discrete arrival events a webhook would deliver.\nActive agency advisories sit in a top-level list because one incident can span\nproducts or cycles; affected products carry references back to them.</p>\n<pre class=\"language-json\" tabindex=\"0\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"generated_at\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2026-06-10T09:45:00+00:00\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"products\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"external-noaa-gfs-aws\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"NOAA GFS (AWS)\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"runs\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token punctuation\">{</span> <span class=\"token property\">\"init_time\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2026-06-10T06:00:00+00:00\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"status\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"in_flight\"</span><span class=\"token punctuation\">,</span>\n          <span class=\"token property\">\"completion_pct\"</span><span class=\"token operator\">:</span> <span class=\"token number\">0.62</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"timing\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"on_time\"</span><span class=\"token punctuation\">,</span>\n          <span class=\"token property\">\"events\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n            <span class=\"token punctuation\">{</span> <span class=\"token property\">\"event_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"noaa-gfs/external-noaa-gfs-aws/2026-06-10T06:00Z/progress/f240\"</span><span class=\"token punctuation\">,</span>\n              <span class=\"token property\">\"group_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"noaa-gfs\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"product_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"external-noaa-gfs-aws\"</span><span class=\"token punctuation\">,</span>\n              <span class=\"token property\">\"product_label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"NOAA GFS forecast (AWS)\"</span><span class=\"token punctuation\">,</span>\n              <span class=\"token property\">\"kind\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"progress\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"lead_group\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"f240\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"lead_group_label\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"10d\"</span><span class=\"token punctuation\">,</span>\n              <span class=\"token property\">\"occurred_at\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"2026-06-10T09:41:03Z\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"timing\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"on_time\"</span> <span class=\"token punctuation\">}</span>\n          <span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token property\">\"advisories\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre>\n<p>The nested events are identical to what a webhook carries (minus the\nsubscription id), so the client logic is the same: select the products you care\nabout, and dedupe on <code>event_id</code> across polls. The file is refreshed each five-minute cycle and\nserved with <code>Cache-Control: max-age=5, stale-while-revalidate=10</code>, so feel free to slam it.</p>\n<h2>Where to go from here</h2>\n<ul>\n<li>Watch the pipeline live: <a href=\"https://dynamical.org/status/pipeline/\">dynamical.org/status/pipeline</a></li>\n<li>Poll the feed: <a href=\"https://assets.dynamical.org/wxopticon/feed.json\">assets.dynamical.org/wxopticon/feed.json</a></li>\n<li>Manage webhook subscriptions: <a href=\"https://status.dynamical.org/webhooks\">status.dynamical.org/webhooks</a></li>\n</ul>\n<p>We will continue to tune how &quot;delayed&quot; is determined. And as wxopticon now also ingests,\narchives, and cross-references official source advisories (an ECMWF\ndissemination delay, for example), we will continue to explore patterns.</p>\n<p>wxopticon is a living but experimental piece of our infrastructure. If there's a source you'd like us to watch, or a boundary you wish you could subscribe to, <a href=\"mailto:feedback@dynamical.org\">let us know</a>.</p>\n",
      "date_published": "2026-07-07T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-06-01/",
      "url": "https://dynamical.org/updates/2026-06-01/",
      "title": "AIFS ENS and validation reports",
      "content_html": "<p>I was tempted, but alas Gefs (short for Gefsfry) did not make the cut for the name of my newborn son. He's here and everyone is healthy - so I'm getting back to it. Some catch-up:</p>\n<h2>ECMWF AIFS ENS forecast</h2>\n<p><img src=\"https://dynamical.org/assets/catalog-thumbnails/ecmwf-aifs-ens-forecast.jpg\" alt=\"ECMWF AIFS ENS\"></p>\n<p>The ensemble sibling to AIFS Single is now in the catalog. <a href=\"https://dynamical.org/catalog/ecmwf-aifs-ens-forecast/\">ECMWF AIFS ENS</a>: 15-day global forecasts at 0.25°, 6-hourly steps, 51 members, updating every 6 hours. Archive starts 2025-07-02.</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/ecmwf-aifs-ens-forecast/\">Docs</a></li>\n<li><a href=\"https://registry.opendata.aws/dynamical-ecmwf-aifs-ens/\">AWS Registry</a></li>\n<li><a href=\"https://app.earthmover.io/dynamical/ecmwf-aifs-ens-forecast\">Earthmover Marketplace</a></li>\n<li><a href=\"https://source.coop/dynamical/ecmwf-aifs-ens-forecast\">Source Coop</a></li>\n<li><a href=\"https://youtu.be/9dDTeUQXmKE\">Release trailer</a></li>\n</ul>\n<h2>Validation reports</h2>\n<p>Did you know Alden has knuckle tats? They spell</p>\n<pre><code> ┌─┬─┬─┬─┐   ┌─┬─┬─┬─┐\n │R│I│G│O│   │R│O│U│S│\n └┬┴┬┴┬┴┬┘   └┬┴┬┴┬┴┬┘\n  │ │ │ │     │ │ │ │\n══╧═╧═╧═╧══ ══╧═╧═╧═╧══\n</code></pre>\n<p>To live up to the knuckles, we are adding <strong>in-depth validation reports</strong> to each catalog entry. For each variable, you get three views: a null-fraction trace over time (so you can see any gaps in the archive at a glance), side-by-side spatial maps comparing our dataset against analysis at a sample timestamp, and time-series comparisons at two random geographic points. The spatial plots also include a value-distribution histogram so you can see at a glance whether the numbers look right.</p>\n<p>Find it linked from each catalog page, or go directly — e.g. <a href=\"https://dynamical.org/catalog/ecmwf-aifs-ens-forecast/validation/\">ECMWF AIFS ENS forecast validation</a>.</p>\n<p>We are in the process of backfilling these for existing data products and we would LOVE your feedback!</p>\n<p>These are one layer of a broader validation process that runs automatically as each dataset updates. The goal is to give us (and you) enough visibility into the data that you can trust it before you build on it.</p>\n<h2>On the AWS blog</h2>\n<p>If you've ever wondered why we started with the data products that make up our catalog, check out my blog post on the AWS Public Sector Blog: <a href=\"https://aws.amazon.com/blogs/publicsector/what-if-swapping-your-weather-model-was-boring-how-dynamical-org-is-making-ai-weather-forecasting-accessible-on-aws/\">What if swapping your weather model was boring?</a></p>\n<p>AWS Open Data has been an incredible partner as we've gotten dynamical.org up and running!</p>\n<hr>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=J_7R80b8QFo\">weather</a>,</p>\n<p>MM</p>\n",
      "date_published": "2026-06-01T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-04-24/",
      "url": "https://dynamical.org/updates/2026-04-24/",
      "title": "Time 2 Chunk (2.0), DWD ICON-EU, status for weather",
      "content_html": "<p>Listen, my second child is arriving any minute now. This transmission will be brief. I haven't decided if I will name him Poseidon, Gefs, or Turbulence.</p>\n<h2>Zarr v3 deprecation</h2>\n<p>We're all-in on Icechunk. Our existing Zarr v3 datasets will continue updating for 90 days, at which point we will sunset them. Consider them deprecated and <strong>update to use our Icechunk Zarrs by July 23, 2026</strong>.</p>\n<h2>Speaking of which</h2>\n<p>The new access pattern:</p>\n<h3>Via dynamical-catalog</h3>\n<pre class=\"language-python\" tabindex=\"0\"><code class=\"language-python\"><span class=\"token keyword\">import</span> dynamical_catalog\n\n<span class=\"token comment\"># Open a dataset as an xarray Dataset via its Icechunk repository</span>\nds <span class=\"token operator\">=</span> dynamical_catalog<span class=\"token punctuation\">.</span><span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"noaa-gfs-forecast\"</span><span class=\"token punctuation\">)</span></code></pre>\n<p>To more easily ensure the right set of dependencies and to make an increasingly variable set of opening incantations more accessible, we made a python library to list and open datasets.</p>\n<pre class=\"language-python\" tabindex=\"0\"><code class=\"language-python\"><span class=\"token keyword\">import</span> dynamical_catalog\n\n<span class=\"token comment\"># List all available datasets</span>\ndynamical_catalog<span class=\"token punctuation\">.</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># Get the underlying Zarr store if you want even more control</span>\nstore <span class=\"token operator\">=</span> dynamical_catalog<span class=\"token punctuation\">.</span>get_store<span class=\"token punctuation\">(</span><span class=\"token string\">\"noaa-gfs-forecast\"</span><span class=\"token punctuation\">)</span>\nds <span class=\"token operator\">=</span> xr<span class=\"token punctuation\">.</span>open_zarr<span class=\"token punctuation\">(</span>store<span class=\"token punctuation\">)</span></code></pre>\n<h3>Via STAC</h3>\n<p>We are STAC-maxxers now. <a href=\"https://stac.dynamical.org/catalog.json\">https://stac.dynamical.org/catalog.json</a> contains ALL of the data used to create our documentation and drive the dynamical-catalog library. Point your robots at it for all the documentation they need to get going. STAC-as-skill.</p>\n<h2>ICON-EU</h2>\n<p>Deutscher Wetterdienst's <a href=\"https://dynamical.org/catalog/dwd-icon-eu-forecast-5-day/\">ICON-EU</a> is now a cloud-optimized, live-updating Icechunk 2.0 Zarr. High-resolution 5-day forecasts over Europe, nested from DWD's global ICON model, at the 00/06/12/18 UTC cycles.</p>\n<p>What makes this one extra fun: as far as we can tell, <strong>no other public archive of ICON-EU exists</strong>. DWD only keeps a short rolling window on their own servers, so we'll keep growing the archive from here.</p>\n<p>Huge thanks to:</p>\n<ul>\n<li><a href=\"https://www.linkedin.com/in/jackkelly0/\">Jack Kelly</a> from <a href=\"https://openclimatefix.org/\">Open Climate Fix</a> for getting this off the ground and hoarding forecasts to kickstart the archive and to the <a href=\"https://www.mcgovern.org/\">Patrick J McGovern Foundation</a> for supporting their work.</li>\n<li>The <a href=\"https://www.dwd.de/EN/ourservices/opendata/opendata.html\">DWD Open Data</a> program</li>\n<li><a href=\"https://source.coop/\">Source Cooperative</a> for hosting the upstream grib archive</li>\n<li>AWS Open Data for the Icechunk storage</li>\n</ul>\n<p>Find it at:</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/dwd-icon-eu-forecast-5-day/\">Docs</a></li>\n<li><a href=\"https://registry.opendata.aws/dynamical-dwd-icon-eu/\">AWS Registry</a></li>\n<li><a href=\"https://app.earthmover.io/marketplace/69eae67968ef2387158671a1\">Earthmover Marketplace</a></li>\n<li><a href=\"https://source.coop/dynamical/dwd-icon-eu-forecast-5-day\">Source Coop</a></li>\n<li><a href=\"https://www.youtube.com/watch?v=5iVzJ35Ojfk\">The over-the-top release vid</a></li>\n</ul>\n<hr>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=CEeCziXT2FE\">weather</a>,</p>\n<p>MM</p>\n",
      "date_published": "2026-04-24T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-04-17/",
      "url": "https://dynamical.org/updates/2026-04-17/",
      "title": "dynamical.org - icechunk 2.0 upgrade cometh",
      "content_html": "<p>Short one today — a quick housekeeping note for anyone pulling from our icechunk data products.</p>\n<p>Icechunk 2 is <a href=\"https://www.earthmover.io/blog/announcing-icechunk-2-better-consistency-performance-and-reliability-for-tensor-storage\">out</a>! If you're using our datasets via Icechunk, please <strong>update your Python library before Thursday April 24</strong>:</p>\n<pre><code>pip install icechunk --upgrade\n</code></pre>\n<p>or</p>\n<pre><code>uv add icechunk --upgrade\n</code></pre>\n<p>Note that <strong>icechunk 2 requires Python 3.12 or higher.</strong> If you're on an older runtime, now's the time to bump it.</p>\n<p>We'll be targeting the v2 format going forward.</p>\n<hr>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=McjFepEpcBE&amp;list=RDMcjFepEpcBE\">weather</a>,</p>\n<p>MM</p>\n",
      "date_published": "2026-04-17T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-03-31/",
      "url": "https://dynamical.org/updates/2026-03-31/",
      "title": "Rain, radar, and reckless optimism.",
      "content_html": "<p>Salutations, wxers. To balance out all the April 1 corporate tomfoolery I'm going to be less of a goofball today. Let's see if I can keep it STRICTLY BUSINESS.</p>\n<p>Lots to report since my last update. The dynamical(.org) core is a-running.</p>\n<h2>ECMWF AIFS Single forecast</h2>\n<p><img src=\"https://dynamical.org/assets/catalog-thumbnails/ecmwf-aifs-single-forecast.jpg\" alt=\"ECMWF AIFS\"></p>\n<p>The AI weather model from the European Centre has entered the catalog. ECMWF's <a href=\"https://dynamical.org/catalog/ecmwf-aifs-single-forecast/\">AIFS Single</a> — 15-day global forecasts at 0.25°, 6-hourly steps, live updating. This is the single-trace (deterministic-ish?) run of ECMWF's machine learning forecast system.</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/ecmwf-aifs-single-forecast/\">Docs</a></li>\n<li><a href=\"https://registry.opendata.aws/dynamical-ecmwf-aifs-single/\">AWS Registry</a></li>\n<li><a href=\"https://app.earthmover.io/marketplace/69cad4f4209facf5e7b737ac\">Earthmover Marketplace</a></li>\n<li><a href=\"https://source.coop/dynamical/ecmwf-aifs-single-forecast\">Source Coop</a></li>\n</ul>\n<p>And of course, don't miss the release trailer: <a href=\"https://www.youtube.com/watch?v=mGVxxcKnhxo\">Youtube</a> | <a href=\"https://www.linkedin.com/posts/marshallmoutenot_we-did-it-chat-ecmwf-aifs-single-forecast-activity-7445093619755061248-FMaD\">LinkedIn</a></p>\n<h2>NOAA MRMS</h2>\n<p><img src=\"https://dynamical.org/assets/catalog-thumbnails/noaa-mrms-conus-analysis-hourly.jpg\" alt=\"NOAA MRMS\"></p>\n<p>New CONUS RADAR dataset! <a href=\"https://dynamical.org/catalog/noaa-mrms-conus-analysis-hourly/\">MRMS</a> is Multi-Radar Multi-Sensor — NOAA's merged radar and gauge precipitation analysis over CONUS, hourly, back to late 2014. If you've ever wanted to answer &quot;how much did it actually rain here, at this exact hour&quot; without downloading 47 files from 3 different FTP servers... this is for you.</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/noaa-mrms-conus-analysis-hourly/\">Docs</a></li>\n<li><a href=\"https://registry.opendata.aws/dynamical-noaa-mrms/\">AWS Registry</a></li>\n<li><a href=\"https://app.earthmover.io/marketplace/69b17d6d9b47e3348aeb99dc\">Earthmover Marketplace</a></li>\n<li><a href=\"https://source.coop/dynamical/noaa-mrms-conus-analysis-hourly\">Source Coop</a></li>\n</ul>\n<p>Release trailer: <a href=\"https://www.youtube.com/watch?v=Szhqxu0fFJU\">Youtube</a> | <a href=\"https://www.linkedin.com/posts/marshallmoutenot_noaas-multi-radarmulti-sensor-system-activity-7442644980525047808-hFyg\">LinkedIn</a></p>\n<h2>CHILL</h2>\n<p><img src=\"https://dynamical.org/assets/requests_2026-04-01.png\" alt=\"Requests per month\"></p>\n<p>We passed the 100M monthly request mark. And then we passed the 200M monthly request mark. Which is either a sign that the data is useful or that three of you are running massive <strong>autoresearch.md</strong> deployments.</p>\n<p>Either way, it's exciting and we appreciate everyone who's sent us what you're building!</p>\n<h2>dynamical-catalog python library</h2>\n<p>We're testing a simple Python library: <a href=\"https://github.com/dynamical-org/dynamical-catalog\">dynamical-catalog</a>. The idea is to make discovery and loading even simpler — browse the catalog, pick a dataset, and get an xarray Dataset or Store back without copy-pasting URLs. We'll handle picking the best Store backend. It's early days. If you try it, let us know what breaks.</p>\n<hr>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=QpA763tzcwE\">weather</a>,</p>\n<p>MM</p>\n",
      "date_published": "2026-04-01T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-03-10/",
      "url": "https://dynamical.org/updates/2026-03-10/",
      "title": "Warmer temps, datasets heating up.",
      "content_html": "<p>It's Spring and unlike hobbits (I'm reading LOTR), who would be thinking about gardens and second breakfast and whether Farmer Maggot's mushroom crop will come in early, we are staring at grib files. Just kidding, we are walking outside enjoying the warm weather ... while talking on the <em>phone</em> about grib files.</p>\n<p>We've been busy with a whole load of updates.</p>\n<h2>GFS analysis is live</h2>\n<p>Our old <code>noaa-gfs-analysis-hourly</code> was our &quot;Hello World&quot; — 4 variables, static, Zarr v2.</p>\n<p>It has been given a lovely retirement party and replaced with the new <a href=\"https://dynamical.org/catalog/noaa-gfs-analysis/\">GFS analysis</a>.</p>\n<ul>\n<li><strong>Live!</strong> (not static)</li>\n<li><strong>21 variables</strong> (up from 4)</li>\n<li>Available in <strong>Zarr v3 and Icechunk</strong></li>\n</ul>\n<table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Spatial domain</td>\n<td>Global</td>\n</tr>\n<tr>\n<td>Spatial resolution</td>\n<td>0.25°</td>\n</tr>\n<tr>\n<td>Time resolution</td>\n<td>1 hour</td>\n</tr>\n</tbody>\n</table>\n<h2>HRRR analysis back to 2014</h2>\n<p>Four more sweet years. High Resolution Rapid Refresh has been retroactively retained through repeated re-retrieval - and now, re-released for a more uh... robust retrospective.</p>\n<p>It previously started in 2018 and now reaches back to <a href=\"https://dynamical.org/catalog/noaa-hrrr-analysis/\">2014</a>. The early years (HRRR v1/v2 era) have more missing source files — NaN values where data are unavailable — but that's the archaeology tax.</p>\n<p>Icechunk note: we've updated to v0.2.0. Please point your code at <code>noaa-hrrr-analysis/v0.2.0.icechunk/</code>.  We'll be stopping updates to v0.1.0 on 2026-03-19 and removing the archive after that.</p>\n<h2>More variables</h2>\n<p>By popular demand we've been adding variables to existing datasets. ECMWF, GEFS, and HRRR have all received new variables recently. We drew the line at <code>will_the_sports_be_cancelled_2m</code> and <code>ideal_dog_walk_surface</code> but almost everything else is in there. Check the catalog pages for the full list.</p>\n<h2>Experimental ASOS GeoParquet</h2>\n<p>I tried (and tried [and tried]) to find a good [citation needed] open source of obs once ISD was decomissioned and GHCNh made me want to cry enough tears to register on the precip gauge. Alas.</p>\n<p>Those tireless little weather stations at airports across the US are available as a GeoParquet dataset. 1940ish to present. This is our first non-model dataset and it's 100% experimental, but it updates every hour and it's what the <a href=\"https://dynamical.org/scorecard\">scorecard</a> is built on.</p>\n<h2>DWD ICON-EU grib archive</h2>\n<p>As a first step towards cloud-optimized ICON-EU Zarrs, we've started archiving DWD's gribs on <a href=\"https://source.coop/dynamical/dwd-icon-grib\">Source Coop</a> — DWD only maintains a short rolling window on their servers, so someone had to hoard them. Data hoarding is our North Star!</p>\n<p>Big thanks to <a href=\"https://www.linkedin.com/in/jackkelly0/\">Jack Kelly</a> of <a href=\"https://openclimatefix.org/\">Open Climate Fix</a> for leading this effort and to the <a href=\"https://www.mcgovern.org/\">Patrick J McGovern Foundation</a> for supporting the work.</p>\n<hr>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=3lQkGDiw-5w\">weather</a></p>\n<p>MM</p>\n",
      "date_published": "2026-03-10T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-01-23/",
      "url": "https://dynamical.org/updates/2026-01-23/",
      "title": "January cornucopia: AMS | HRRR analysis | more",
      "content_html": "<p>What say the pantheon of forecasts? Shall AMS travel be a disaster?</p>\n<blockquote>\n<p>As the flakes that fall thick upon a winter's day, when Zeus is minded to snow and to display these his arrows to humankind - he lulls the wind to rest, and snows hour after hour till he has buried the tops of the high mountains, the headlands that jut into the sea, the grassy plains, and the tilled fields of men...</p>\n</blockquote>\n<h2>Find Alden @ AMS</h2>\n<p><em>&quot;What Happens When Weather Data is Easy to Use?&quot;</em>. Join Alden during the Environmental Data Access and Its Future: Open Data for Open Science Session on <strong>Monday, January 26 at 2:15 PM CT</strong> to explore how accessible weather data transforms research, operations, and decision-making across the atmospheric sciences community. Shoot him an <a href=\"mailto:alden@dynamical.org\">email</a> if you want to meet up and chat!</p>\n<h2>HRRR analysis</h2>\n<p>HRRR analysis (2018-09-16 to present) is now available in the <a href=\"https://dynamical.org/catalog/noaa-hrrr-analysis/\">catalog</a>, including the Icechunk preview.</p>\n<p><a href=\"https://www.linkedin.com/posts/marshallmoutenot_hrrr-analysis-is-live-on-dynamicalorg-activity-7417616473172594688-NkTd?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAOgBWEBfMMmd2xB6DueOM-OrcPrj2eIBlM\">Launch trailer</a></p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Spatial domain</td>\n<td>Continental United States</td>\n</tr>\n<tr>\n<td>Spatial resolution</td>\n<td>3 km</td>\n</tr>\n<tr>\n<td>Time domain</td>\n<td>2018-09-16 00:00:00 UTC to Present</td>\n</tr>\n<tr>\n<td>Time resolution</td>\n<td>1 hour</td>\n</tr>\n</tbody>\n</table>\n<p><img src=\"https://dynamical.org/assets/hrrr_analysis_precipitation_surface_example.png\" alt=\"A screenshot from a notebook showing a precipitation analysis using HRRR analysis\"></p>\n<h2>Icechunk catalog parity party</h2>\n<p>Icechunk previews for our datasets are now listed on the <a href=\"https://registry.opendata.aws/?search=managedBy:dynamical.org\">Registry of Open Data on AWS</a>! Check out the Icechunk example usage in our docs for IFS ENS, GEFS, GFS, and HRRR forecasts to get started. With the addition of GEFS forecast and analysis <strong>we now have an identical, live updating Icechunk Zarr for all live updating standard Zarr v3 datasets in our catalog!</strong></p>\n<h2>Earthmover Marketplace</h2>\n<p>The &quot;Union of Organizations Concerned That Earth Data Is Generally Too Hard To Work With&quot; (still workshopping this title, but it has a good <em>ring</em> to it) just became more powerful - Earthmover launched their <a href=\"https://earthmover.io/marketplace\">Marketplace</a>. (Congrats team)</p>\n<p>And the aforementioned dynamical.org Icechunk catalog is within!</p>\n<h2>Steering committee minutes</h2>\n<p>Shrouded in mystery and intrigue, the steering committee guides the helm from the shadows. To lift the veil is to challenge authority itself, and... hm? What's that? The meeting notes are public?! Oh.</p>\n<ul>\n<li><a href=\"https://dynamical.org/meetings/steering_committee_2025-09-03\">Q3 Steering Committee notes</a></li>\n<li><a href=\"https://dynamical.org/meetings/steering_committee_2025-12-03\">Q4 Steering Committee notes</a></li>\n</ul>\n<p>Shout out to all the contributors to cf_xarray which both a) now works great with our datasets and b) is part of our test suite to ensure all new datasets are CF compliant from the start. Thanks to our steering committee for guiding us towards more interoperable standards.</p>\n<hr>\n<p><a href=\"https://www.youtube.com/watch?v=2RNTrXziblQ\">Stay warm, safe travels.</a></p>\n<p>MM</p>\n",
      "date_published": "2026-01-23T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2026-01-08/",
      "url": "https://dynamical.org/updates/2026-01-08/",
      "title": "Preview of dynamical.org Icechunk Zarrs are now listed on the Registry of Open Data on AWS!",
      "content_html": "<p>Check out the Icechunk example usage in our docs for <a href=\"https://dynamical.org/catalog/ecmwf-ifs-ens-forecast-15-day-0-25-degree/\">IFS ENS</a>, <a href=\"https://dynamical.org/catalog/noaa-gfs-forecast/\">GFS</a>, and <a href=\"https://dynamical.org/catalog/noaa-hrrr-forecast-48-hour/\">HRRR</a> forecasts to get started or browse these datasets on the <a href=\"https://registry.opendata.aws/?search=managedBy:dynamical.org\">Registry of Open Data on AWS</a>.</p>\n<p>Why Icechunk?</p>\n<ul>\n<li><strong>Consistent reads every time.</strong> Updating a standard Zarr while users are reading it requires extreme care. Icechunk handles atomic updates correctly, eliminating rare race conditions that can occur during standard Zarr updates.</li>\n<li><strong>Reliability and throughput.</strong> Icechunk is developing features to offer long-term stable dataset URLs. This provides direct access to underlying chunk data for high-throughput reads while allowing us to provide a permanent URL. <strong>Note:</strong> This feature will be part of the upcoming Icechunk 2.0, so when released dynamical.org will require a change to the access URL.</li>\n<li><strong>Performance with default Python tooling.</strong> While the storage formats are similar, the Icechunk client is currently faster than default libraries used for traditional Zarrs in python. You get maximum efficiency (comparable to specialized libraries like Obstore) by default.</li>\n</ul>\n<p>When Icechunk 2 is released we will make two small breaking changes (and notify you about them here):</p>\n<ul>\n<li>URLs will be updated to stable, long-term URLs</li>\n<li>Icechunk client version 2 will be required</li>\n</ul>\n<p>Special thanks to the <strong><a href=\"https://opendata.aws/\">AWS Open Data Sponsorship Program</a></strong> for supporting the storage and distribution of these datasets.</p>\n",
      "date_published": "2026-01-08T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-11-20/",
      "url": "https://dynamical.org/updates/2025-11-20/",
      "title": "🟢 ECMWF IFS ENS live and updating",
      "content_html": "<p>Colder temps may be here (where I live, at least), but ensembles are <em>so hot right now</em>. Can we agree on that? No? Ha ha get it!?</p>\n<p>As of this week The European Centre's IFS ENS forecast is live and updating in <a href=\"https://dynamical.org/catalog/ecmwf-ifs-ens-forecast-15-day-0-25-degree/\">our catalog</a>. See the catalog for init times, spatiotemporal domain, and the variable list.</p>\n<p><img src=\"https://dynamical.org/assets/ecmwf_ifs_ens_tmp.png\" alt=\"ECMWF IFS ENS Temperature_2m 2025-07-09T00_00\"></p>\n<p>I suppose with that HRRR <a href=\"https://www.linkedin.com/posts/marshallmoutenot_hrrr-is-live-the-forecast-archive-from-activity-7378448846290575360-dRMZ?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAOgBWEBfMMmd2xB6DueOM-OrcPrj2eIBlM\">&quot;release trailer&quot;</a> I've signed myself up for something completely unsustainable -- but until that time comes, when the catalog entries cometh faster than I can splice together sci fi video clips... -- ENS has a release trailer <a href=\"https://www.linkedin.com/posts/marshallmoutenot_ecmwf-ifs-ens-forecast-is-live-on-dynamicalorg-activity-7396224185951211520-3vy_?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAOgBWEBfMMmd2xB6DueOM-OrcPrj2eIBlM\">too</a>.</p>\n<h1>Icechunk</h1>\n<p>Icechunk versions are available to select groups for testing (and will likely be our default in the future). If you want to try them out please respond.</p>\n<p>I've actually been a little surprised at the lack of Icechunk inquiries. Are y'all even drinking the cutting edge data format koolaide?!</p>\n<hr>\n<p>Sending from an airship above the clouds. Enjoy the <a href=\"https://www.youtube.com/playlist?list=OLAK5uy_lh-6QK6sDCdAE4QLOdU8wjjBOmfWR3M_Y\">weather</a>. End transmission.</p>\n<p>MM</p>\n",
      "date_published": "2025-11-20T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-09-29/",
      "url": "https://dynamical.org/updates/2025-09-29/",
      "title": "Wake up, babe. A new zarr just dropped.",
      "content_html": "<p>The last time I wrote you all, the summer sweltered, determinism was still alive (now <a href=\"https://dynamical.org/podcast/\">it is dead</a>, and only 11 AI weather papers had been published in Nature (now the total is up to 188,732).</p>\n<p>If I keep it up y'all are never going to take me seriously. But lo, some seriously new stuff!</p>\n<h1>HRRR go brrr</h1>\n<p><img src=\"https://assets.dynamical.org/media/hrrr_wind_speed_10m_2025-05-25T00_conus.webp\" alt=\"HRRR wind speed @ 10m, 2025-05-25\"></p>\n<p>HRRR forecasts are live and updating! Check out the release trailer (lol) <a href=\"https://www.linkedin.com/posts/marshallmoutenot_hrrr-is-live-the-forecast-archive-from-activity-7378448846290575360-dRMZ?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAOgBWEBfMMmd2xB6DueOM-OrcPrj2eIBlM\">here</a>.</p>\n<p>Give it a try! It'll be like that time in high school when you played too much Elder Scrolls Oblivion during a long weekend, and when you finally stepped outside into <em>nature</em> you thought to yourself &quot;woah, these graphics are incredible.&quot;</p>\n<ul>\n<li><a href=\"https://dynamical.org/catalog/noaa-hrrr-forecast-48-hour/\">Catalog</a></li>\n<li>Notebook: <a href=\"https://github.com/dynamical-org/notebooks/blob/main/noaa-hrrr-forecast-48-hour.ipynb\">Github</a> | <a href=\"https://colab.research.google.com/github/dynamical-org/notebooks/blob/main/noaa-hrrr-forecast-48-hour.ipynb\">Colab</a></li>\n<li><a href=\"https://github.com/dynamical-org/reformatters/tree/main/src/reformatters/noaa/hrrr\">Reformatter code</a></li>\n</ul>\n<p>A massive thanks to Alden, Tony, Alex and Sam for getting this one out there!</p>\n<h1>Icechunk support</h1>\n<p><img src=\"https://assets.buttondown.email/images/e40436c1-8757-411a-90f6-4d939577d0bd.png?w=320\" alt=\"Screenshot 2025-09-26 at 10.37.38 PM.png\"></p>\n<p>We've also launched <s>Earthchunk</s> <em>Icechunk</em> versions of the GFS and HRRR forecasts. It's internal only until we sort out a few final details, but if you'd feel the <em>need for speed</em> and are prerelease-tolerant let us know and we can hook you up.</p>\n<h1>weathering</h1>\n<p>In case you missed it we have a <a href=\"https://dynamical.org/podcast\">podcast</a> now! We so far have covered:</p>\n<ul>\n<li>The limits of predictability</li>\n<li>End-to-end data-driven weather prediction (Aardvark Weather)</li>\n<li>The Hybrid Approach (NeuralGCN)</li>\n<li>Efficient AI ensemble forecasts (ECMWF AIFS-CRPS, DeepMind FGN)</li>\n</ul>\n<p>5 papers down, 188,727 to go! No new AI weather papers allowed.</p>\n<h1>Scorecard</h1>\n<p>Hey, wouldn't you know it. Having stuff in this here catalog makes it easier to build things. I was tired of stats against reanalysis as &quot;truth&quot; so Alden and I hacked out a very simple <a href=\"https://dynamical.org/scorecard\">scorecard</a>. When I say simple, I mean simple. For now it's just RMSE for 2m temp and precip. Of course, a few weeks after this went live, ISD-lite was killed in favor of GHCN so I gotta flip that over to keep things live-updating! URGH.</p>\n<p><img src=\"https://assets.buttondown.email/images/38062496-0e9f-4f28-8d72-5db0922d307d.png?w=300&amp;fit=max\" alt=\"Screenshot 2025-09-26 at 10.55.44 PM.png\"></p>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=RgACAdw_K2I\">weather</a>.</p>\n<p>MM</p>\n",
      "date_published": "2025-09-29T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-07-02/",
      "url": "https://dynamical.org/updates/2025-07-02/",
      "title": "🟢 GFS is live",
      "content_html": "<h2>GFS forecasts are live</h2>\n<p>GFS is GEFS' less ambiguous older sibling. The archive is processed and the updater is chugging: 4 years of 16 day forecasts, hourly step, released 4 times a day. GFS might be wrong, but at least it's confident!</p>\n<p>A note from Alden, Chef de cuisine</p>\n<blockquote>\n<p>Tonight, I've prepared for you a dataset I think you will enjoy. Check out the example notebook linked in the <a href=\"https://dynamical.org/catalog/noaa-gfs-forecast/\">docs</a> to make your own interactive animation of an atmospheric river with buttery smooth hourly resolution. The way atmospheric rivers move reminds me of how <a href=\"https://publicdomainreview.org/collection/maps-of-the-lower-mississippi-harold-fisk/\">rivers move on land</a>, only on a time scale of hours not years. Served as a semifreddo with a peach compote.</p>\n</blockquote>\n<div style=\"text-align: center;\">\n    <picture>\n        <!-- modern -->\n        <source type=\"image/webp\" srcset=\"https://dynamical.org/assets/gfs_atmospheric_river_feb_2024_precipitable_water_atmosphere.webp\">\n        <!-- fallback animation -->\n        <img src=\"https://dynamical.org/assets/gfs_atmospheric_river_feb_2024_precipitable_water_atmosphere.gif\" width=\"600\" alt=\"Visual of GFS precipitable water showing atmospheric river\" style=\"display: inline-block; border: 0;\">\n    </picture>\n</div>\n<h2>Steering committee</h2>\n<p>The dynamical.org steering committee met and talked about [1] Data and [2] Things About Data Beyond My Comprehension. <a href=\"https://dynamical.org/meetings/steering_committee_2025-06-04\">Read the summary notes</a></p>\n<h2>podcast</h2>\n<p>Did you catch episode number two of <em>weathering</em>? This time we talked about Aardvark Weather. As Marta put it: &quot;Where does the end begin? Where does the end end? And what the HELL is happening in the middle?&quot;</p>\n<p><a href=\"https://dynamical.org/podcast/002\">Check it out</a>. Like (in your heart) and subscribe (to our obsessions).</p>\n",
      "date_published": "2025-07-02T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-06-14/",
      "url": "https://dynamical.org/updates/2025-06-14/",
      "title": "introducing a new pod; GFS forecasts incoming",
      "content_html": "<p>Not even my proprietary UniverseCast™ Reality Ensemble Forecast⁺ could have predicted this. The most unlikely of scenarios: A <strong>podcast</strong>? Yes, a podcast. And it's called <a href=\"https://dynamical.org/podcast\"><strong>Weathering</strong></a>.</p>\n<p>We are trying to make sense of the current wave of <em>progress</em> occurring in weather forecasting.</p>\n<p>Each episode, we focus on a paper or group of papers and try to take a intertextual approach -- clicking on mental hyperlinks to help us understand and put into context. The format is inspired by the only two podcasts I regularly listen to (<a href=\"https://futureofcoding.org/\">Future of Coding</a> and Jed Sundwall's <a href=\"https://techsontexts.net/\">Techs on Texts</a>).</p>\n<p><a href=\"https://dynamical.org/podcast/001/\"><strong>Episode 001: The limits of predictability</strong></a><br>\nOur maiden voyage dives into a fresh-off-the-press paper from the University of Washington: <em>Testing the Limit of Atmospheric Predictability With a Machine Learning Weather Model.</em></p>\n<p>Check it out, and let us know if there's a paper you think we should cover next.</p>\n<hr>\n<p>In normal dynamical.org news, operational GFS forecasts are landing in the catalog imminently. We previously did an analysis as our first demo, so this will be a nice upgrade to tie the bow on the GEFS/GFS family.</p>\n<p>After that, the catalog will be expanding rapidly! Stay tuned.</p>\n<p>Have a good <a href=\"https://youtu.be/ArCrT2mOOuE?feature=shared\">weekend</a>,<br>\nMM</p>\n<p>⁺ Fictional? Or extremely limited access to drive scarcity? You decide.</p>\n",
      "date_published": "2025-06-14T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-04-29/",
      "url": "https://dynamical.org/updates/2025-04-29/",
      "title": "GEFS analysis is live!",
      "content_html": "<p>Well, technically it's been live for a few days. Check out our new <a href=\"https://dynamical.org/catalog/noaa-gefs-analysis/\">GEFS analysis</a>, which is derived from the <a href=\"https://dynamical.org/catalog/noaa-gefs-forecast-35-day/\">GEFS forecast</a> catalog item.</p>\n<p><img src=\"https://assets.buttondown.email/images/3f8a5ed8-29ca-4b60-88d3-690add9bfa80.png?w=960&amp;fit=max\" alt=\"image.png\"></p>\n<p>Both are live updating, and the analysis was designed to work easily with the forecast dataset. For example, you can develop your algorithm/model/sentient AI television weatherperson on the analysis, and then deploy it live with the forecast dataset. COOL!</p>\n<ul>\n<li>25+ years of data</li>\n<li>Live updating</li>\n<li>Performance optimized for time series queries</li>\n</ul>\n<p><em>Striving to create weather data experiences as satisfying as when you peel citrus in one contiguous piece. You know what I mean :)</em></p>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=28d_A_NuJ7A\">weather</a>,</p>\n<p>MM</p>\n",
      "date_published": "2025-04-29T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-03-20/",
      "url": "https://dynamical.org/updates/2025-03-20/",
      "title": "1 Million Requests!",
      "content_html": "<p>While modest on the scale of Computers, 1M is not bad for our baby’s first week in the world. The gigabytes are flying and we’ve received requests from 51 countries over the last few days. No single person has downloaded the whole dataset, so thank you but also WHAT ARE YOU WAITING FOR?!</p>\n<p>A reminder that the <a href=\"https://dynamical.org/catalog/noaa-gefs-forecast-35-day/\">GEFS</a> dataset is Zarr v3, so don’t forget to update your Xarray&gt;=2025.1.2 which includes v3 support!</p>\n<h2>Let’s make Phase 1 happen (and how you can help)</h2>\n<p>With GEFS complete, we are already working on our next slate of catalog additions. Our Phase 1 will include the following datasets:</p>\n<p>Forecasts</p>\n<ul>\n<li>NOAA GEFS, 35 day, 1x day <em>(we did it)</em></li>\n<li>NOAA HRRR <em>(Tony is on it!)</em></li>\n<li>NOAA GFS <em>(Dan is on it!)</em></li>\n<li>NOAA GEFS, 10 day, 4x day</li>\n<li>ECMWF AIFS</li>\n<li>ECMWF ENS, 15 day, 1x day</li>\n<li>ECCC HRDPS</li>\n</ul>\n<p>Analyses</p>\n<ul>\n<li>NOAA GEFS <em>(Alden is on it!)</em></li>\n<li>ECMWF AIFS</li>\n<li>ECMWF ENS</li>\n<li>NOAA HRRR</li>\n<li>NOAA GFS</li>\n<li>ECCC HRDPS</li>\n</ul>\n<p>Three ways you, dear reader, can help:</p>\n<p><strong>[1] Financial support</strong>:</p>\n<p>We estimate that making<strong> Phase 1 operational &amp; publicly accessible</strong> will run around $100,000 per year with the cost growing by approximately 30% year over year as the datasets get inevitably larger. Pennies compared to the value, in my humble opinion!</p>\n<p>So… we are seeking our first cohort of sponsors to make these forecasts and analyses a reality. If you belong to an organization that benefits from, and is able to support our work, <strong>we’d love to hear from you</strong>. Reply to this email to learn more about our plans for fiscal sponsorship.</p>\n<p>[2] <strong>Publicize these datasets as they’re released!</strong> Tell your coworkers, post on whatever social media we are using these days, tell your parents over dinner, teach your toddler about scones and pancakes.</p>\n<p>[3] <strong>Write code?</strong> Not quite yet but soon. We are testing to see if our open source code so far is sufficiently clear to have other folks pitch in and write reformatters for new datasets. If all goes well we may solicit help from your big brain.</p>\n<p>Help us out, and especially [1] so that there are NO BLOCKERS, ONLY WEATHER.</p>\n<p><a href=\"https://www.youtube.com/watch?v=BkimxLUkJwk\">Stay dry</a>,</p>\n<p>MM</p>\n",
      "date_published": "2025-03-20T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-03-12/",
      "url": "https://dynamical.org/updates/2025-03-12/",
      "title": "About GEFS-fing Time &amp; Introducing Our Steering Committee",
      "content_html": "<p>Weatherlings, the time has come for our first non-demo release. Weighing in at <strong>115TB</strong> compressed and <strong>815TB</strong> (!) uncompressed, GEFS ain’t messing around.</p>\n<p>Last year, we launched <a href=\"https://dynamical.org\">dynamical.org</a> into the world and watched as hundreds of weather data nerds emerged (sublimated?) from the woodwork. Our community has been growing steadily, united by a shared mission to make weather data <em>Spark Joy</em>.</p>\n<h1>🌎 Introducing NOAA's Global Ensemble Forecast System (GEFS) 35-Day Forecasts!</h1>\n<p>I am thrilled to announce the latest addition to Dynamical’s catalog: <strong>NOAA's Global Ensemble Forecast System (GEFS) 35-day forecasts!</strong></p>\n<h2>📦 What's in the box?</h2>\n<p><strong>The Specs:</strong></p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Details</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Spatial Domain</strong></td>\n<td>Global</td>\n</tr>\n<tr>\n<td><strong>Spatial Resolution</strong></td>\n<td>0-240 hours: 0.25 degrees (~20km), 243-840 hours: 0.5 degrees (~40km)</td>\n</tr>\n<tr>\n<td><strong>Time Domain</strong></td>\n<td>Forecasts initialized <strong>2020-10-01 00:00:00 UTC</strong> to Present</td>\n</tr>\n<tr>\n<td><strong>Time Resolution</strong></td>\n<td>Forecasts initialized every <strong>24 hours</strong></td>\n</tr>\n<tr>\n<td><strong>Forecast Domain</strong></td>\n<td>Forecast lead time <strong>0-840 hours (0-35 days) ahead</strong></td>\n</tr>\n<tr>\n<td><strong>Forecast Resolution</strong></td>\n<td>Forecast step <strong>0-240 hours: 3-hourly</strong>, 243-840 hours: 6-hourly</td>\n</tr>\n</tbody>\n</table>\n<p>Best of all, it's <strong>operationally updated with minimal latency</strong> and available in the <strong>Zarr v3</strong> format that plants crave:</p>\n<pre class=\"language-python\" tabindex=\"0\"><code class=\"language-python\"><span class=\"token keyword\">import</span> xarray <span class=\"token keyword\">as</span> xr\n\nds <span class=\"token operator\">=</span> xr<span class=\"token punctuation\">.</span>open_dataset<span class=\"token punctuation\">(</span><span class=\"token string\">\"https://data.dynamical.org/noaa/gefs/forecast-35-day/latest.zarr?email=optional@email.com\"</span><span class=\"token punctuation\">)</span></code></pre>\n<p><strong>Note, added 2026-08-06:</strong> the <code>data.dynamical.org</code> URL above stops working after <strong>August 31, 2026</strong>. This dataset is still public and still updating — it is now an Icechunk repository, opened as <code>dynamical_catalog.open(&quot;noaa-gefs-forecast-35-day&quot;)</code>. See the <a href=\"https://dynamical.org/migration-2026/\">migration guide</a> for the supported access patterns.</p>\n<p>We are already using this new dataset for R&amp;D at Upstream Tech, and we <strong>can’t wait to hear how you use it!</strong> We've included <a href=\"https://dynamical.org/catalog\">documentation and example notebooks</a> in the catalog entry to get you started. If you hit snags or have feedback, drop us a line at <a href=\"mailto:feedback@dynamical.org\">feedback@dynamical.org</a>.</p>\n<p>We’ll be holding our first dynamical.org office hours Thursday Mar 20, 2025 at 10-11am PDT / 1-2pm EDT / 5-6pm UTC. Join <a href=\"https://meet.google.com/wtc-jhff-bxn\">this Google Meet</a> to ask questions or give feedback.</p>\n<hr>\n<h1>Introducing Our Steering Committee!</h1>\n<p>We're excited to announce the formation of the <strong>dynamical.org Steering Committee!</strong> This dream team will:</p>\n<ul>\n<li>Advise on <strong>project priorities</strong> (Which datasets to zarr-ify next?)</li>\n<li>Bridge the gap between <strong>our open-source code and real-world applications</strong></li>\n<li>Shape the future of how we <strong>access and analyze weather and climate data</strong></li>\n</ul>\n<p><strong>Current Members:</strong></p>\n<ul>\n<li><strong>Alden Keefe Sampson</strong> – dynamical.org &amp; Upstream Tech</li>\n<li><strong>Jack Kelly</strong> – Open Climate Fix</li>\n<li><strong>Jake Zwart</strong> – United States Geological Survey</li>\n<li><strong>Joe Hamman</strong> – Earthmover</li>\n<li><strong>Stephan Hoyer</strong> – Xarray</li>\n</ul>\n<p>By bringing together this collective expertise, we're ensuring that <strong>Dynamical.org remains relevant, impactful, and true to its mission.</strong></p>\n<hr>\n<p><a href=\"https://www.youtube.com/watch?v=2NdhcYnC-V8\">Shine on</a> (lol),</p>\n<p>MM</p>\n",
      "date_published": "2025-03-12T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2025-01-10/",
      "url": "https://dynamical.org/updates/2025-01-10/",
      "title": "Alden @ AMS; GEFS zarrs?!",
      "content_html": "<p>CALLING ALL WEATHER DWEEBS! Bracing for a winter storm here in Nashville, where I moved to from Boston in order to escape winter storms. 3 to 7 inches they say - good thing I brought the XC skis!</p>\n<h1>dynamical.org @ AMS</h1>\n<p>From the look of it the vast majority of our subscribers will be at AMS. We are excited to see you there!</p>\n<p>Alden will be presenting at the 105th Annual Meeting of the American Meteorological Society (AMS) along with our first fiscal sponsor at Hydro-Québec! Their talk, titled “Fast, Easy, Open: Sustaining Live Updating, Analysis Ready, Cloud Optimized Weather Data Archives,” will highlight the vision behind <a href=\"http://dynamical.org\">dynamical.org</a> and the drive to create and sustain ARCO weather datasets.</p>\n<ul>\n<li>🗓️ <strong>When</strong>: Tuesday, January 14, 9:15 AM</li>\n<li>📍 Where: <a href=\"https://ams.confex.com/ams/105ANNUAL/meetingapp.cgi/Paper/448901\">355 (New Orleans Ernest N. Morial Convention Center)</a></li>\n</ul>\n<p>If you’re at AMS, find <a href=\"https://www.linkedin.com/in/alden-keefe-sampson-a0292164/\">Alden</a> and Upstream Tech's <a href=\"https://www.linkedin.com/in/phillip-butcher-96ba2461/\">Phil Butcher</a>.</p>\n<h1>Catalog Updates: GEFS is Almost Here!</h1>\n<p>We’ve made some big strides toward releasing a <em>complete</em> archive and live-updating GEFS dataset to the catalog:</p>\n<ul>\n<li>The <a href=\"https://github.com/dynamical-org/reformatters\">GEFS reformatter</a> can now create an archive of years of data <em>super quickly</em>, thanks to tons of parallelism.</li>\n<li>The dataset is not only comprehensive but also a dream to work with:</li>\n</ul>\n<pre class=\"language-python\" tabindex=\"0\"><code class=\"language-python\"><span class=\"token operator\">>></span><span class=\"token operator\">></span> ds<span class=\"token punctuation\">.</span>u100\n<span class=\"token operator\">&lt;</span>xarray<span class=\"token punctuation\">.</span>DataArray <span class=\"token string\">'u100'</span> <span class=\"token punctuation\">(</span>init_time<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> ensemble_member<span class=\"token punctuation\">:</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> lead_time<span class=\"token punctuation\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                          latitude<span class=\"token punctuation\">:</span> <span class=\"token number\">721</span><span class=\"token punctuation\">,</span> longitude<span class=\"token punctuation\">:</span> <span class=\"token number\">1440</span><span class=\"token punctuation\">)</span><span class=\"token operator\">></span> Size<span class=\"token punctuation\">:</span> 83MB\ndask<span class=\"token punctuation\">.</span>array<span class=\"token operator\">&lt;</span>open_dataset<span class=\"token operator\">-</span>u100<span class=\"token punctuation\">,</span> shape<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">721</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1440</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> dtype<span class=\"token operator\">=</span>float32<span class=\"token punctuation\">,</span> chunksize<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">73</span><span class=\"token punctuation\">,</span> <span class=\"token number\">72</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> chunktype<span class=\"token operator\">=</span>numpy<span class=\"token punctuation\">.</span>ndarray<span class=\"token operator\">></span>\nCoordinates<span class=\"token punctuation\">:</span>\n  <span class=\"token operator\">*</span> ensemble_member           <span class=\"token punctuation\">(</span>ensemble_member<span class=\"token punctuation\">)</span> uint16 8B <span class=\"token number\">0</span> <span class=\"token number\">1</span> <span class=\"token number\">2</span> <span class=\"token number\">3</span>\n    expected_forecast_length  <span class=\"token punctuation\">(</span>init_time<span class=\"token punctuation\">)</span> timedelta64<span class=\"token punctuation\">[</span>ns<span class=\"token punctuation\">]</span> 8B <span class=\"token number\">35</span> days\n    ingested_forecast_length  <span class=\"token punctuation\">(</span>init_time<span class=\"token punctuation\">)</span> timedelta64<span class=\"token punctuation\">[</span>ns<span class=\"token punctuation\">]</span> 8B <span class=\"token number\">35</span> days\n  <span class=\"token operator\">*</span> init_time                 <span class=\"token punctuation\">(</span>init_time<span class=\"token punctuation\">)</span> datetime64<span class=\"token punctuation\">[</span>ns<span class=\"token punctuation\">]</span> 8B <span class=\"token number\">2025</span><span class=\"token operator\">-</span><span class=\"token number\">01</span><span class=\"token operator\">-</span><span class=\"token number\">08</span>\n  <span class=\"token operator\">*</span> latitude                  <span class=\"token punctuation\">(</span>latitude<span class=\"token punctuation\">)</span> float64 6kB <span class=\"token number\">90.0</span> <span class=\"token number\">89.75</span> <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span> <span class=\"token operator\">-</span><span class=\"token number\">89.75</span> <span class=\"token operator\">-</span><span class=\"token number\">90.0</span>\n  <span class=\"token operator\">*</span> lead_time                 <span class=\"token punctuation\">(</span>lead_time<span class=\"token punctuation\">)</span> timedelta64<span class=\"token punctuation\">[</span>ns<span class=\"token punctuation\">]</span> 40B <span class=\"token number\">0</span> days <span class=\"token number\">00</span><span class=\"token punctuation\">:</span><span class=\"token number\">00</span><span class=\"token punctuation\">:</span><span class=\"token number\">00.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n  <span class=\"token operator\">*</span> longitude                 <span class=\"token punctuation\">(</span>longitude<span class=\"token punctuation\">)</span> float64 12kB <span class=\"token operator\">-</span><span class=\"token number\">180.0</span> <span class=\"token operator\">-</span><span class=\"token number\">179.8</span> <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span> <span class=\"token number\">179.8</span>\n    valid_time                <span class=\"token punctuation\">(</span>init_time<span class=\"token punctuation\">,</span> lead_time<span class=\"token punctuation\">)</span> datetime64<span class=\"token punctuation\">[</span>ns<span class=\"token punctuation\">]</span> 40B <span class=\"token number\">2025</span><span class=\"token operator\">-</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\nAttributes<span class=\"token punctuation\">:</span>\n    long_name<span class=\"token punctuation\">:</span>      <span class=\"token number\">100</span> metre U wind component\n    short_name<span class=\"token punctuation\">:</span>     u100\n    standard_name<span class=\"token punctuation\">:</span>  eastward_wind\n    step_type<span class=\"token punctuation\">:</span>      instant\n    units<span class=\"token punctuation\">:</span>          m<span class=\"token operator\">/</span>s</code></pre>\n<p>Woah nelly, check out those attributes!</p>\n<p>We’re testing out operational updates in our compute cluster <em>THIS WEEK</em>. Once that’s complete, we’ll be ready to push live, real-time updates to the catalog. So close, we can almost taste the churros/pancakes/scones (ha ha ha get it).</p>\n<h1>What We Are Reading</h1>\n<ul>\n<li><strong>Zarr Python 3 released!</strong> We’re especially excited about the included chunk sharding extension, which will enable a much wider range of efficient read patterns with a single, optimized dataset. <a href=\"https://zarr.dev/blog/zarr-python-3-release\">Read more here</a></li>\n<li><strong>Earthmover debuted Icechunk</strong>, a new open storage engine for Zarr datasets. It supports simple and correct updates to datasets that are being read from and written to simultaneously (e.g., live-updated weather), along with great features like dataset versioning and improved read performance. We’re already experimenting with it and considering support once the storage format stabilizes. <a href=\"https://icechunk.io/\">Check it out here</a></li>\n<li>China is planning to become a weather superpower by investing in advanced meteorological technologies and infrastructure to enhance its weather forecasting capabilities. <a href=\"https://www.bloomberg.com/news/newsletters/2024-12-11/china-is-planning-to-become-a-weather-superpower\">Bloomberg</a></li>\n</ul>\n<hr>\n<p>Finally - we'll be launching our steering committee this quarter. Thanks to all those who responded with interest in helping us achieve our mission.</p>\n<p>Catch you in the <a href=\"https://www.youtube.com/watch?v=3N6rBXI3Uow\">clouds</a>.</p>\n<p>MM</p>\n",
      "date_published": "2025-01-10T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2024-09-26/",
      "url": "https://dynamical.org/updates/2024-09-26/",
      "title": "September update",
      "content_html": "<p>Ahoy weatherheads! It’s been a busy few months for us as we shift gears from dreaming to building.</p>\n<h3>Catalog updates</h3>\n<ul>\n<li>Our dataset for <a href=\"https://dynamical.org/catalog/noaa-gfs-analysis/\">NOAA GFS analysis</a> has getting some awesome usage! Thanks to everyone who has tested it out.</li>\n<li>We are prepping to launch <strong>NOAA GEFS</strong> <strong>forecasts</strong> as the second entry to <a href=\"http://dynamical.org/catalog\">dynamical.org/catalog</a>. It will include a large historical forecast record and update in real-time. Dealing with GEFS in its standard format has, in the past, broken my spirit; and I suppose it’s part of why we are so passionate about making weather data easier to work with! So… thank you GEFS? Excited for this one.\n<img src=\"https://dynamical.org/assets/gefs-dlwrf-img-only.png\" alt=\"GEFS ensemble average downward long-wave radiation flux.\">\n<em>GEFS ensemble average downward long-wave radiation flux.</em></li>\n<li>We plan to fast-follow GEFS with <strong>GFS</strong> (forecasts vs our current analysis) and <strong>HRRR</strong> from NOAA as well as <strong>GDPS</strong> and <strong>HRDPS</strong> from ECCC (Environment and Climate Change Canada). As part of these releases we will be announcing our first <strong>catalog sponsor</strong>!</li>\n</ul>\n<h3>GFS analysis feedback</h3>\n<p>A hearty thank you to everyone who filled out our <a href=\"https://docs.google.com/forms/d/e/1FAIpQLSeqDiWRfTQfZgejPWWfNoBwcm4m2wxa9qxgSZIunsnbhH15XQ/viewform\">GFS survey</a>. Common themes included the value of live updating and forecast data, and a clear preference for reading data with python + xarray. That aligned with our expectations (wonderful) and is reflected in our roadmap above. We did see more desire for long history (re)analysis data than we had anticipated -- we'll be moving up a true reanalysis dataset in priority thanks to this feedback. Reply to this email if there's a specific reanalysis you'd like!</p>\n<h3>Assembling our Steering Committee</h3>\n<p>We are officially launching our steering committee, which will be comprised of industry users and experts in the technical and scientific domain. The committee will meet quarterly to evaluate and influence the catalog and open-source roadmap and advise potential collaborations and partnerships.</p>\n<p>If you’re interested in joining or nominating someone else, please respond to this email or email <a href=\"mailto:marshall@dynamical.org\">marshall@dynamical.org</a>!</p>\n<h3>What we’ve been reading</h3>\n<blockquote>\n<p>My souls, how the wind did scream along! And every second or two there’d come a glare that lit up the white-caps for a half a mile around, and you’d see the islands looking dusty through the rain, and the trees thrashing around in the wind; then comes a <em>h-whack!</em>—bum! bum! bumble-umble-um-bum-bum-bum-bum—and the thunder would go rumbling and grumbling away, and quit—and then <em>rip</em> comes another flash and another sockdolager.</p>\n</blockquote>\n<p>I’m reading <em>Adventures of Huckleberry Finn</em>, which has some stellar meteorological descriptions. Should we petition NOAA to make their detailed forecasts use “h-wack!-bum! bum!” and “sockdolager?” I think yes.</p>\n<p>We enjoyed Dr. Jack Kelly’s post on the vision this community shares, where he outlined a complimentary route to solving major pain points. Thanks for the <a href=\"http://dynamical.org\">dynamical.org</a> shoutouts, Jack! Definitely check it out here: <a href=\"https://openclimatefix.org/post/lazy-loading-making-it-easier-to-access-vast-datasets-of-weather-satellite-data\">https://openclimatefix.org/post/lazy-loading-making-it-easier-to-access-vast-datasets-of-weather-satellite-data</a></p>\n<p>We were thrilled to see our pals at <strong>Brightband</strong> <a href=\"https://www.brightband.com/blog/introducing-brightband\">announce themselves to the world</a>. The field of AI meteorological forecasts is progressing at quite the clip - three cheers for more open source models! We also enjoyed <strong>Zeus AI</strong>'s cool work <a href=\"https://myzeus.ai/earthnet-a-multi-modal-foundation-model-for-global-data-assimilation-of-earth-observations/\">synthesizing multiple, sparse data sources into a single gap filled analysis state</a>.</p>\n<hr>\n<p>Enjoy the <a href=\"https://open.spotify.com/track/1rJi8cf8OWsrX4CqBnMSoQ?si=d985266a142a4669\">weather</a>!</p>\n",
      "date_published": "2024-09-26T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2024-07-09/",
      "url": "https://dynamical.org/updates/2024-07-09/",
      "title": "Let there be zarr: GFS hourly analysis is live",
      "content_html": "<p>Last week, we announced <a href=\"http://dynamical.org/\">dynamical.org</a> to the world. The response was unexpected*: in just seven days, over a hundred nerds registered themselves as testers with many more following along for the ride.</p>\n<p>Apparently, we are not alone in our frustration with yesterday's weather data. Together we can create a future of well-organized data about our most beloved chaotic system!</p>\n<p><strong>Today, we are excited to announce the first entry into dynamical’s catalog: <a href=\"https://dynamical.org/catalog/noaa-gfs-analysis/\">an hourly GFS analysis</a> from 2015-01-15 to present.</strong></p>\n<p>Testers! Fire up your rigs - in the catalog entry above, we've included documentation and an example notebook. If you run into any issues, email us at <a href=\"mailto:feedback@dynamical.org\">feedback@dynamical.org</a>. As our very first release, we’re expecting there will be lots of additions and refinement based on community input.</p>\n<p>Our pals at <a href=\"https://source.coop/\">Source Cooperative</a> are generously providing storage for this first catalog entry. Their team is wonderful and their mission is badass - check them and the broader <a href=\"https://radiant.earth/\">Radiant Earth</a> organization out.</p>\n<p>Enjoy the <a href=\"https://www.youtube.com/watch?v=GvnbpG_NA2Y\">weather</a>^!</p>\n<p>MM</p>\n<p>* or expected, depending on how long you've been working with yesterday's weather data</p>\n<p>^ courtesy of Alex M.</p>\n",
      "date_published": "2024-07-09T00:00:00Z"
    }
    ,
    {
      "id": "https://dynamical.org/updates/2024-06-25/",
      "url": "https://dynamical.org/updates/2024-06-25/",
      "title": "Introducing dynamical.org",
      "content_html": "<p>Introducing dynamical! </p>\n<p>Thank you for being the first to follow our journey making weather and climate data more accessible. We are humbled by the response. Our mission clearly strikes a chord - weather data today is a pain to work with.</p>\n<p>Over <strong>one hundred people</strong> (!?) signed up to test the first versions of the data we endeavor to release. And that’s without having spilled the beans on the best parts 😉</p>\n<p>So what’s the plan? First, check out Alden’s fantastic <a href=\"https://youtu.be/uR6-UVO_3k8?si=AgXz6DM6l0mYiENw\">introduction to dynamical.org</a> (video link). Second, <a href=\"https://dynamical.org/about.html\">read</a> about how we are designing dynamical to be a long-term steward and rock-solid foundation on which to build.</p>\n<p>We are aiming to release our first public test next week in collaboration with <a href=\"https://source.coop/\">Source Cooperative</a>: <strong>a GFS analysis with a long historical record</strong>. If you are interested in testing this out and haven’t already told us, reply to this email. We plan to fast-follow with documentation and a data catalog with our roadmap.</p>\n<p>Enjoy the <a href=\"https://ought.bandcamp.com/track/beautiful-blue-sky\">weather</a>!</p>\n<p>MM + AKS</p>\n<p>P.S. Please forward this email to folks working with weather data and consider amplifying our announcement on <a href=\"https://www.linkedin.com/posts/marshallmoutenot_introducing-dynamicalorg-fast-optimized-activity-7211005158162317313-rk-V\">linkedin</a> / <a href=\"https://mastodon.social/@dynamical\">fedi</a>!</p>\n",
      "date_published": "2024-06-25T00:00:00Z"
    }
    
  ]
}
