<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dim's Build</title>
    <description>The latest articles on DEV Community by Dim's Build (@dimsbuild).</description>
    <link>https://dev.to/dimsbuild</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4083540%2F3ae51ca0-5768-4fe2-9186-e2175af71d80.png</url>
      <title>DEV Community: Dim's Build</title>
      <link>https://dev.to/dimsbuild</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dimsbuild"/>
    <language>en</language>
    <item>
      <title>I Built a 170-Year Caribbean Hurricane Observatory, Alone, in Python</title>
      <dc:creator>Dim's Build</dc:creator>
      <pubDate>Sun, 01 Nov 2026 05:04:58 +0000</pubDate>
      <link>https://dev.to/dimsbuild/i-built-a-170-year-caribbean-hurricane-observatory-alone-in-python-1gkh</link>
      <guid>https://dev.to/dimsbuild/i-built-a-170-year-caribbean-hurricane-observatory-alone-in-python-1gkh</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;CaribScope is an open-source climate risk observatory for the Caribbean: 170 years of&lt;br&gt;
Atlantic hurricane tracks (NOAA HURDAT2, 1851–2022), live USGS earthquake data, sea&lt;br&gt;
surface temperature trends, and a Random Forest model that predicts a storm's&lt;br&gt;
Saffir-Simpson category. It's a 16-page Streamlit app, built solo, running on a single&lt;br&gt;
VPS. It's also, by my own admission, more finished as a product than as a project anyone&lt;br&gt;
has heard of — which is the part of this post that isn't a victory lap.&lt;/p&gt;




&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;During hurricane season, the National Hurricane Center and NOAA publish everything you'd&lt;br&gt;
want: forecasts, historical tracks, advisories. All of it in English, built for a US&lt;br&gt;
audience. French-speaking Caribbean media, creators, and residents get none of that&lt;br&gt;
tailored to them — no French-language dashboard, no historical context localized to&lt;br&gt;
Guadeloupe, Martinique, or Haiti, nothing that says "here's what a storm like this one&lt;br&gt;
has historically done in your part of the Caribbean." That gap is what CaribScope tries&lt;br&gt;
to close.&lt;/p&gt;

&lt;h2&gt;
  
  
  170 years is a lot of inconsistent data
&lt;/h2&gt;

&lt;p&gt;HURDAT2 is NOAA's official Atlantic hurricane database, going back to 1851. The format is&lt;br&gt;
a flat text file, not a clean CSV: header lines mixed with position/wind/pressure records,&lt;br&gt;
missing pressure values before the satellite era (pre-1979 mostly relies on ship and land&lt;br&gt;
station reports), and storm identifiers that changed convention more than once across 170&lt;br&gt;
years. There's no off-the-shelf pandas reader for this — parsing it means writing a state&lt;br&gt;
machine that tracks whether the current line is a storm header or a data row, and being&lt;br&gt;
honest with yourself about which columns are trustworthy back to 1851 and which only&lt;br&gt;
become reliable once aircraft reconnaissance and satellites show up mid-20th century.&lt;/p&gt;

&lt;p&gt;The payoff for going back that far isn't just the feat itself. It's context: when a Category 3&lt;br&gt;
approaches, "the last comparable storm hit this island in 1928" is a more useful sentence&lt;br&gt;
than "here's a live radar loop," especially for an audience that already has access to&lt;br&gt;
the radar loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually in it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trajectories &amp;amp; stats&lt;/strong&gt; — every HURDAT2 storm, filterable by island, category, decade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seismic map&lt;/strong&gt; — live USGS feed, magnitude ≥ 2.5, Caribbean plate boundary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Climate trends&lt;/strong&gt; — temperature and sea surface temperature (SST) over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ML prediction&lt;/strong&gt; — a Random Forest classifier (scikit-learn) trained on the HURDAT2
history, predicting Saffir-Simpson category from a storm's current attributes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hurricane of the Day&lt;/strong&gt; — a daily-format page pulling from the historical archive,
built to be the shareable/embeddable unit for media and social&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;16 Streamlit pages in total, each independently a small app. Streamlit's multi-page&lt;br&gt;
routing (a &lt;code&gt;pages/&lt;/code&gt; folder, each file a page) made that structure nearly free — the cost&lt;br&gt;
shows up later, in navigation and information architecture, not in the initial build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;Python 3.10+, Streamlit for the app itself, Plotly for every chart and map, pandas /&lt;br&gt;
numpy / pyarrow for the data layer, scikit-learn for the Random Forest, pytest for tests.&lt;br&gt;
Shipped as a Docker image (&lt;code&gt;python:3.12-slim&lt;/code&gt;) behind Coolify on a personal VPS, with&lt;br&gt;
GitHub Actions running CI and Renovate keeping dependencies current — the same&lt;br&gt;
self-hosted infrastructure I already run Listmonk on, so adding one more container was&lt;br&gt;
marginal cost, not a new operational surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Random Forest, and its actual limits
&lt;/h2&gt;

&lt;p&gt;The prediction model takes a storm's current attributes and outputs a predicted&lt;br&gt;
Saffir-Simpson category, trained on the historical HURDAT2 record. I want to be specific&lt;br&gt;
about what that is and isn't: it's a classifier trained on a few thousand historical&lt;br&gt;
storm-observations, not a physics-based forecast model, and it will never compete with&lt;br&gt;
NOAA's own operational forecasts, which fold in atmospheric modeling this project has no&lt;br&gt;
access to. What it's useful for is pattern-matching against history — showing, from data,&lt;br&gt;
what tends to happen next to storms that looked like this one before. That's a narrower&lt;br&gt;
and more honest claim than "hurricane prediction," and it's the one I'm making.&lt;/p&gt;

&lt;h2&gt;
  
  
  What doesn't work yet
&lt;/h2&gt;

&lt;p&gt;The product is ahead of its distribution, not the other way around, and I'd rather say&lt;br&gt;
that upfront than have someone else point it out. Sixteen pages, a working ML pipeline,&lt;br&gt;
live earthquake and climate data — and until recently, no analytics installed, no email&lt;br&gt;
capture, no one outside a small circle who knew it existed. Building the thing was the&lt;br&gt;
easy part. The next phase is entirely about getting it in front of the people it's&lt;br&gt;
actually for: French-speaking Caribbean media and creators during the exact six months a&lt;br&gt;
year they'd want it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Live app: &lt;a href="https://caribscope.fwicss.fr" rel="noopener noreferrer"&gt;caribscope.fwicss.fr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/FWICSS/caribscope" rel="noopener noreferrer"&gt;github.com/FWICSS/caribscope&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's open source. If you've got a dataset that would sharpen the risk picture for a&lt;br&gt;
specific island, or you've dealt with HURDAT2's pre-satellite-era gaps before and have&lt;br&gt;
opinions, I'd like to hear them.&lt;/p&gt;

</description>
      <category>build</category>
      <category>data</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
