A broken laptop as a build farm

The screen cracked in a way that made the laptop useless as a laptop but perfectly functional as a computer. The M2 chip, 16GB of RAM, and 512GB of storage still worked. Throwing it away or paying for a screen replacement both seemed wrong. So it became a server. The hardware MacBook Pro M2, 2022. The display is physically intact but the LCD panel has internal damage — a spreading dark region that covers about 60% of the screen. Enough to make it unusable for direct interaction. Not enough to trigger a warranty claim (it was out of warranty anyway). ...

March 3, 2026 · 4 min · Christopher Griffiths

Self-hosting email in 2026

I run my own email server. On a Raspberry Pi. In my house. It sends and receives real email. People reply to it. It has not lost a message. I would not recommend it to most people. The approach The fundamental problem with self-hosting email is that the internet assumes you are a spammer until proven otherwise. Residential IP addresses have no reputation. ISPs block the ports you need. Even with every DNS record configured perfectly, the big providers will silently drop your messages for weeks until they decide you are probably legitimate. ...

March 2, 2026 · 4 min · Christopher Griffiths

One toolkit, every project

Every project had its own deployment script. islet had deploy_pi.sh. gwefan had a bespoke scp chain. ira had nothing. Each script did roughly the same thing — build, upload, restart — but each did it differently enough that copying between projects meant editing half the lines. On Saturday, all three projects switched to a single shared toolkit. The duplication problem islet’s deploy script was the most mature. It rsynced Python source and config files to the Pi, restarted two systemd services, ran a smoke test against the health endpoint, and printed a status summary. It worked well. It had also been rewritten twice as the project grew, and the third version was 80 lines of bash that nobody would want to port to another project. ...

March 1, 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