It’s been about a year and a half since I wrote about building a civic-scale threat monitoring tool with no-code, AI, and coffee. That version lived in a spreadsheet. It pulled RSS feeds, scored five domains by hand-tuned rules once a day, and mailed me a summary I mostly skimmed. ChatGPT was the thinking partner that helped me get it there – I’d describe what I wanted, it would suggest a formula or a script, I’d paste it into a cell and see what broke.

It worked, in the sense that it ran every day without me touching it. It didn’t work in the sense that matters more: nobody, including me, fully trusted the number it produced. A spreadsheet doesn’t have a memory of its own mistakes, and mine had several.

salmi, and the thing got wrong

At some point stopped trying to cover everything at once and built something narrower: single-purpose monitor for the Strait of Hormuz, which called salmi (Finnish for “strait” — not subtle, but it did the job). First real website version, not just spreadsheet someone had to open.

It also had bug I’m still little embarrassed about. For weeks the dashboard just sat there reading “normal” — through weeks that didn’t feel normal on the news at all. Turns out the scoring had ceiling hadn’t noticed, so once things got busy early on, it got stuck there and never came back down. Not quiet — incapable of ever saying otherwise. only caught it because genuinely tense week looked exactly like calm one on my own site, and that felt wrong enough to go digging.

Since then I’ve learned not to trust dashboard that never moves. Silence and “nothing’s happening” look identical from the outside — I’ve relearned that one few times since, most recently this week, when the ship-tracking status quietly kept saying “live” for five days while it wasn’t hearing anything at all.


tutka

salmi got renamed to tutka (Finnish for “radar”) in July, once it stopped being about one strait (geopolitical tension in the Middle-East peaked my interest and I wanted to see what open source data was available around the Strait of Hormuz) and started covering six domains – state and military tension, hybrid threats, the information environment, civic and critical infrastructure, social pressure, and environmental security. Same engine underneath, one shared scoring formula instead of six one-off ones, each domain just a config file on top of it. It runs on a single small Fly.io machine with SQLite on a volume, costs about two dollars a month, and pulls from GDELT, Statistics Finland, AISStream, OpenSky, and a handful of others – all free, all public.

The bigger change isn’t the feature list, it’s how I build it now. Last time I was describing intent to a chat window and copying code by hand. This time I’m working with Claude Code directly in the repository – it writes the code, runs the tests, reads its own database to sanity-check a fix before I trust it, incident-log included; every time something breaks it gets logged, which has turned out to be the single most useful habit in the whole project. I didn’t expect the discipline to be the interesting part. It is.

This week alone: I scored Finnish spot electricity prices into the infrastructure index after reading about this autumn’s Nordic power situation, promoted the “what this means for an average Finn” panel out of a bottom-tab nobody was clicking and into the main navigation, added trend charts so the national numbers (unemployment, inflation etc.) aren’t just a snapshot, and quietly retired a fictional persona I’d written into the copy a while back because it added a name and nothing else.

Where it’s at

It’s still a one-person hobby project, not a business, running on free data and a machine that costs less than a coffee subscription. It’s more honest than the spreadsheet version – every number either comes from a real baseline or says plainly that it can’t yet. But I keep having the feeling that something’s still missing, and I haven’t fully put my finger on what.

If you poke around and have thoughts – what’s confusing, what’s missing, what you’d want a tool like this to actually tell you – I’d genuinely like to hear it. The code is at github.com/kurkista/tutka, the site is at tutka.fly.dev, and the incident log is public too, mistakes and all.

Privacy Preference Center