DEV Community

Cover image for I built a digital twin of a Greek island and it found a lighthouse no one asked about
Panagis Tzivras
Panagis Tzivras

Posted on

I built a digital twin of a Greek island and it found a lighthouse no one asked about

I built a digital twin of a Greek island and it found a lighthouse no one asked about

One person, one laptop, zero budget, one island.


The problem

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?

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.

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.

So I started building the distribution layer.


What ARGOS is

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.

The stack is deliberately boring:

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

Boring stacks ship. This one shipped in six weeks of Saturday mornings.


The map that argues back

The live map is at argos-geo.org/map. 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.


The lighthouse problem

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.

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.

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.

Oh, and - it's an island.

The algorithm knew that too. It just didn't think it was worth mentioning.


The hazard layers (or: why I don't trust my own model yet)

ARGOS WATCH: Wildfire Risk v1.1

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×.

But here's the honest part: the model thinks Greek fir (Abies cephalonica) 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.

ARGOS WATCH: Flash-Flood / Debris-Flow v1

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.

Both layers are screening baselines, not forecasts. Directionally validated, not calibrated. I say this explicitly because credibility comes from admitting limitations, not hiding them.


The architecture

Every pipeline step is a numbered, committed script in scripts/. 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.

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.


The three sub-brands

  • ARGOS GEO - the twin itself: data, pipelines, API, map
  • ARGOS WATCH - hazard intelligence: wildfire + flash-flood screening, validated in the open
  • ARGOS COMMONS - whatever this grows into next, with the people who gather around it

What's next

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.

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 first.


Links

Built in Kefalonia. Watching over the places we call home.

If you know Mediterranean fuel models, Greek forestry data, or municipal civil protection workflows, I need you. Drop a comment or email hello@argos-geo.org.


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.

Top comments (0)