<?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: Panagis Tzivras</title>
    <description>The latest articles on DEV Community by Panagis Tzivras (@ptzivras).</description>
    <link>https://dev.to/ptzivras</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%2F4080444%2F0ea7b5c3-877a-413e-a23c-d34f6c0a8e20.png</url>
      <title>DEV Community: Panagis Tzivras</title>
      <link>https://dev.to/ptzivras</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ptzivras"/>
    <language>en</language>
    <item>
      <title># Build Log #1: Processing my first Sentinel-2 pass in 48 hours</title>
      <dc:creator>Panagis Tzivras</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:01:26 +0000</pubDate>
      <link>https://dev.to/ptzivras/-build-log-1-processing-my-first-sentinel-2-pass-in-48-hours-8p9</link>
      <guid>https://dev.to/ptzivras/-build-log-1-processing-my-first-sentinel-2-pass-in-48-hours-8p9</guid>
      <description>&lt;p&gt;&lt;strong&gt;48 hours and moderate sleep later, ARGOS just processed its first Sentinel-2 pass over Kefalonia.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is what that looks like.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I was trying to do
&lt;/h2&gt;

&lt;p&gt;I wanted a baseline vegetation map of the entire island. Not from a government PDF, not from a paid dataset- from the European Space Agency's Sentinel-2 satellite, freely available, updated every 5 days. The goal was simple: download the latest cloud-free acquisition, run it through a processing pipeline, and get an NDVI layer I could query against.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Python + &lt;code&gt;rasterio&lt;/code&gt; + &lt;code&gt;xarray&lt;/code&gt; for data handling&lt;/li&gt;
&lt;li&gt;GDAL for reprojection (Sentinel-2 comes in UTM 34N, I need EPSG:4326 for the web map)&lt;/li&gt;
&lt;li&gt;A very patient laptop&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Sentinel-2 data is "free" the same way a 500-piece puzzle is "free"- every piece is there, but no one warned you about step seven. The SAFE format, the multiple granules, the 10m vs 20m resolution bands, the cloud masking- none of it is hard individually, but the pipeline has about twelve steps and step seven fails silently if you forget to resample the 20m bands before stacking.&lt;/p&gt;

&lt;p&gt;I forgot. Twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;A very ugly Python script that I am not proud of but that works. It downloads the granule, filters clouds, calculates NDVI, reprojects to WGS84, and drops a GeoTIFF into a folder that PostGIS will eventually ingest. The script is 180 lines. 40 of them are error handling. That's the honest ratio.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;The NDVI map looks beautiful. Green valleys, dry ridges, the whole island in false colour. But "beautiful" and "useful" are different things. I spent hour 36 staring at a perfectly rendered map and realising I had no idea whether an NDVI of 0.3 meant "stressed vegetation" or "just rocks." The satellite sees what it sees. Context comes from knowing the island.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Layer 2: wildfire risk index. Slope + aspect + NDVI + fuel type. The model will be wrong. It already thinks Greek firs burn like pine. But that's Build Log #2.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/argos-geo/kefalonia-digital-twin/discussions/1" rel="noopener noreferrer"&gt;Full code + methodology on GitHub Discussion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://argos-geo.org/map" rel="noopener noreferrer"&gt;Live map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://argos-geo.org" rel="noopener noreferrer"&gt;ARGOS project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This is Build Log #1 of the ARGOS series. Build Log #2: Why the model thinks Greek firs burn like pine (and why it's wrong).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>geospatial</category>
      <category>satellite</category>
      <category>remotesensing</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I built a digital twin of a Greek island and it found a lighthouse no one asked about</title>
      <dc:creator>Panagis Tzivras</dc:creator>
      <pubDate>Tue, 18 Aug 2026 18:10:48 +0000</pubDate>
      <link>https://dev.to/ptzivras/i-built-a-digital-twin-of-a-greek-island-and-it-found-a-lighthouse-no-one-asked-about-38n3</link>
      <guid>https://dev.to/ptzivras/i-built-a-digital-twin-of-a-greek-island-and-it-found-a-lighthouse-no-one-asked-about-38n3</guid>
      <description>&lt;p&gt;I built a digital twin of a Greek island and it found a lighthouse no one asked about&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One person, one laptop, zero budget, one island.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Kefalonia is the sixth-largest island in Greece, which sounds impressive until you try to answer a simple question: if a fire starts on that ridge, how long until the fire truck actually arrives?&lt;/p&gt;

&lt;p&gt;I spent my summers on Kefalonia. It's the sixth-largest island in Greece, which sounds impressive until you realise what that means in practice: 254 km of coastline, three municipalities, one fire station with a volunteer watch, and exactly zero real-time flood monitoring. When the August fires hit Zakynthos 20 km away, the civil protection alert arrives by SMS. When the February 2025 storm washed out roads, the information travelled at the speed of someone driving to check.&lt;/p&gt;

&lt;p&gt;I work in data. I know what Copernicus produces. I know what EFFIS tracks. I also know that none of it reaches the municipality inbox in a format anyone can use. The data is free. The gap is distribution.&lt;/p&gt;

&lt;p&gt;So I started building the distribution layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What ARGOS is
&lt;/h2&gt;

&lt;p&gt;ARGOS is an open-source digital twin of Kefalonia. One PostgreSQL/PostGIS database that holds the whole island: 12,217 road segments, 22,013 buildings, 1,831 POIs, 197 beaches, 29 trails, terrain from Copernicus DEM 30 m, vegetation from Sentinel-2, and two hazard layers that have already been tested against reality.&lt;/p&gt;

&lt;p&gt;The stack is deliberately boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostGIS 16&lt;/strong&gt; for the spatial engine (SQL I can write, no Java servers to maintain)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; for the API (&lt;code&gt;/layers&lt;/code&gt;, &lt;code&gt;/buffer&lt;/code&gt;, &lt;code&gt;/intersect&lt;/code&gt;, &lt;code&gt;/aggregate&lt;/code&gt; - all demo queries &amp;lt; 500 ms)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MapLibre GL + PMTiles&lt;/strong&gt; for the map (9.4 MB single file, served from GitHub Pages, HTTP 206 range requests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Codespaces&lt;/strong&gt; for the dev environment (&lt;code&gt;docker compose up -d&lt;/code&gt;, zero local setup)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Boring stacks ship. This one shipped in six weeks of Saturday mornings.&lt;/p&gt;




&lt;h2&gt;
  
  
  The map that argues back
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhd564iemf2raftgdxoij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhd564iemf2raftgdxoij.png" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The live map is at &lt;a href="https://argos-geo.org/map" rel="noopener noreferrer"&gt;argos-geo.org/map&lt;/a&gt;. Click anything - a building, a beach, a road segment - and it answers. The popup tells you how many minutes that building is from the fire station and the nearest ferry port. Not as-the-crow-flies. As-the-ambulance-drives. Or doesn't drive, as the case may be.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xcj7d4wockmj1n3bitv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xcj7d4wockmj1n3bitv.png" alt=" " width="339" height="240"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The lighthouse problem
&lt;/h2&gt;

&lt;p&gt;Here's my favourite edge case. The model ran its first accessibility analysis and found the hardest place to reach in an emergency. It wasn't a mountain village. It wasn't a remote beach. It was a single building with a travel time of 102 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fokc0smyzb1krrr0po4uz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fokc0smyzb1krrr0po4uz.png" alt=" " width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's a lighthouse. On an uninhabited islet. Built by the British in 1824, bombed by the Italians in 1942, flattened by the 1953 earthquakes. Accessible only by boat. No roads. No permanent population. The algorithm correctly flagged it as the most isolated structure in Kefalonia.&lt;/p&gt;

&lt;p&gt;The model doesn't know what's "important" to humans. It just knows what's hard to reach. A bombed lighthouse and a hospital get the same accessibility score. Context comes later.&lt;/p&gt;

&lt;p&gt;Oh, and - it's an island.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbgqqrvy4ixgw4s8yez1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbgqqrvy4ixgw4s8yez1z.png" alt=" " width="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The algorithm knew that too. It just didn't think it was worth mentioning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hazard layers (or: why I don't trust my own model yet)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ARGOS WATCH: Wildfire Risk v1.1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Five-factor weighted index: slope, fuel proxy (NDVI), road proximity, aspect, and historical burn scars from EFFIS. Validated against 24 real fire perimeters (2017-2026). Burned areas score 63.6 vs the island baseline of 59.1. Very-high-risk enrichment is ~3.7×.&lt;/p&gt;

&lt;p&gt;But here's the honest part: the model thinks Greek fir (&lt;em&gt;Abies cephalonica&lt;/em&gt;) burns like Mediterranean pine. It doesn't. Different fuel load, different crown fire behaviour, different moisture retention. The satellite sees NDVI = 0.6 and says "green = fuel." The local says "fir = doesn't crown-fire like pine." Build Log #2 is about exactly this failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARGOS WATCH: Flash-Flood / Debris-Flow v1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;D8 drainage network × receiving slope × upstream burn-scar exposure. Validated against the February 2025 storm. The model's top-ranked ravines: Τραπεζάκι 97.5, Πόρος 96.9, Περατάτα 94.6. Those names match the news reports. The model ranked reality correctly.&lt;/p&gt;

&lt;p&gt;Both layers are &lt;strong&gt;screening baselines, not forecasts&lt;/strong&gt;. Directionally validated, not calibrated. I say this explicitly because credibility comes from admitting limitations, not hiding them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffy7tz1l8aa47rgb3ocks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffy7tz1l8aa47rgb3ocks.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every pipeline step is a numbered, committed script in &lt;code&gt;scripts/&lt;/code&gt;. Every model has an open methodology document with an honest limitations section. The whole stack runs in a GitHub Codespace. The whole thing costs €0/month to host.&lt;/p&gt;

&lt;p&gt;The code is MIT. The derived layers are CC BY 4.0. The sources are all open: OpenStreetMap, Copernicus DEM, Sentinel-2, NASA FIRMS, EFFIS. Attribution is architecture, not decoration.&lt;/p&gt;




&lt;h2&gt;
  
  
  The three sub-brands
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ARGOS GEO&lt;/strong&gt; - the twin itself: data, pipelines, API, map&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ARGOS WATCH&lt;/strong&gt; - hazard intelligence: wildfire + flash-flood screening, validated in the open&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ARGOS COMMONS&lt;/strong&gt; - whatever this grows into next, with the people who gather around it&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;v0.0.1 is a static twin: snapshots, not streams. Phase 2 adds real-time feeds (Open-Meteo weather, ADS-B aircraft, EFFIS/Copernicus EMS alerts), a 7-day hazard outlook, and historical playback. Phase 3 is a municipality pilot: three months, no cost, they provide feedback.&lt;/p&gt;

&lt;p&gt;The long-term goal isn't to replace civil protection. It's to give them a layer they don't have: local granularity on top of satellite data. EFFIS shows Greece burns ~50,000 hectares annually. ARGOS is trying to answer which 16 km² of Kefalonia burn &lt;em&gt;first&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🗺️ &lt;strong&gt;Live map:&lt;/strong&gt; &lt;a href="https://argos-geo.org/map" rel="noopener noreferrer"&gt;argos-geo.org/map&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/argos-geo/kefalonia-digital-twin" rel="noopener noreferrer"&gt;github.com/argos-geo/kefalonia-digital-twin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://argos-geo.org" rel="noopener noreferrer"&gt;argos-geo.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📧 &lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:hello@argos-geo.org"&gt;hello@argos-geo.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🦋 &lt;strong&gt;Bluesky:&lt;/strong&gt; &lt;a href="https://bsky.app/profile/argos-geo.org" rel="noopener noreferrer"&gt;@argos-geo.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐘 &lt;strong&gt;Mastodon:&lt;/strong&gt; &lt;a href="https://mapstodon.space/@argos_geo" rel="noopener noreferrer"&gt;@argos_geo@mapstodon.space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐦 &lt;strong&gt;X:&lt;/strong&gt; &lt;a href="https://x.com/argos_geo" rel="noopener noreferrer"&gt;@argos_geo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built in Kefalonia. Watching over the places we call home.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you know Mediterranean fuel models, Greek forestry data, or municipal civil protection workflows, I need you. Drop a comment or email &lt;a href="mailto:hello@argos-geo.org"&gt;hello@argos-geo.org&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is Build Log #0 - the debut. Build Log #1 (Sentinel-2 processing and the crime scene Python script) is already live and a few days old, which in internet years makes it practically vintage. Build Logs #2-10 are coming: the Greek fir problem, drainage mapping, the Vardiani lighthouse, stack decisions, containerisation, the Copernicus → inbox gap, API-first architecture, hosting on Cloudflare Pages, and what "building in public" actually means when your model is wrong.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>geospatial</category>
      <category>postgressql</category>
      <category>digitaltwin</category>
    </item>
  </channel>
</rss>
