Warm Amber: an iOS companion for islet

For nine days, islet has lived in a terminal. The daemon runs on a Raspberry Pi, the analytics engine crunches numbers in the background, the API accepts uploads — all invisible unless you know the right curl command. Logging a meal meant SSH and a CLI. That works at a desk. It does not work holding a fork. Safety note: islet is a personal project and is not medical advice. It does not make dosing decisions. PCU values are informational only and must not be used as dosing advice. ...

February 24, 2026 · 4 min · Christopher Griffiths

From daemon to device: islet at 86 commits

On February 15th, islet was a Python script that polled Nightscout every 60 seconds and stored the results in SQLite. Nine days and 86 commits later, it runs as a self-hosted platform: its own ingest API, analytics engine, relay system, and a native iOS app on my phone. Nightscout polling is off. The only remaining dependency is a relay for the second phone. Safety note: islet is a personal project and is not medical advice. It does not make dosing decisions. PCU values are informational only and must not be used as dosing advice. ...

February 24, 2026 · 4 min · Christopher Griffiths

Replacing Nightscout

For the first two weeks, islet was a parasite. It polled Nightscout every sixty seconds, pulled down whatever was new, and stored it in SQLite. Nightscout did the hard work of receiving data from CGM apps. islet just copied it. That dependency was always temporary. Why Nightscout had to go Nightscout is a good project. It solved CGM data sharing when nobody else would. But as a dependency inside islet, it created three problems: ...

February 23, 2026 · 4 min · Christopher Griffiths

Cutting the cord: islet runs without Nightscout

For eight days, islet has been the primary ingestion path. Tonight it became the only one. Nightscout polling is off. Both phones POST directly to a Raspberry Pi in the next room, and the system does not care. That sounds undramatic because it should be. The entire point of the last eight days was to make this moment boring. The dependency that was hard to see Nightscout was never just a database. It was the implicit trust boundary for every data flow in the system. Sensor readings went from phone to Nightscout to islet. Treatments went the same path. Every piece of data arrived through someone else’s API, on someone else’s schedule. ...

February 23, 2026 · 4 min · Christopher Griffiths

Making ingest boring: notes from moving islet to direct uploads

Most migration plans look clean in architecture diagrams. One box becomes another box, one arrow moves, and the system is “simpler” afterwards. In practice, the shape of the arrows matters more than the boxes. For islet, Phase 3 looked simple on paper: stop depending on Nightscout polling, accept uploads directly, keep local storage as the source of truth, and treat upstream relay as optional safety. The target was straightforward: Libre sensor -> phone app -> islet ingest API -> SQLite -> analytics. ...

February 22, 2026 · 4 min · Christopher Griffiths

Specification-first: how islet went from zero to a working system in one session

There's a strong temptation, when you know what you want to build, to just start building it. Open an editor, create a file, write the first function. You'll figure out the rest as you go. I’ve done that plenty of times. It works until it doesn’t. The problems tend to arrive around the third or fourth decision that depends on an earlier one you didn’t think through. By then you’re committed and the cost of changing direction is no longer zero. ...

February 22, 2026 · 4 min · Christopher Griffiths