On the workbench
Ask a developer how many side projects they have and you’ll get a number. Ask how many are finished and you’ll get a smaller one.
Mine is smaller still.
Some of these started with a problem at work. Some started because I wanted something to behave a particular way and nothing did. A few exist because I wanted to know if an idea held up.
Progress is uneven. It happen only because I make it to Side Project Saturday. I get something working, answer the question that interested me, and wander off. That isn’t failure. Often the answer was the point.
This is what’s on the bench right now. I’ll update it occasionally, or replace it when enough has changed.
Apple News reports
Status: Working prototype
Apple News will happily email you analytics reports. Keeping a history of them is your problem. This is a real pain for many small publishers.
So I made it my problem, once. A dedicated inbox receives the reports (thanks to the free-tier of mailkit.dev), PHP parses them into a running record, and downloaded CSVs backfill the older gaps. It runs standalone or as a WordPress plugin. I needed both, so it is both.
A newsletter for me
Status: Working

Twice a week, the things I care about in one place. Tech press, Hacker News, Reddit, small blogs, and whatever is circulating on Bluesky. Headlines, short summaries, typeset properly.
The hard part is selection. The same story turns up in six places, while the useful discussion is buried in a thread nobody links to. Fix that and the rest is formatting.
Will anyone else want it? Possibly. That’s a problem for later.
The Notes App
Status: Ongoing, indefinitely
A notes app built around how I take notes. Plain text, keyboard shortcuts, almost no interface. Not Obsidian. Not iA Writer. Somewhere in between, and opinionated about it.
My needs are not unusual. My patience for apps that almost meet them is. Most of the work is deciding what to leave out, and I keep leaving out more.
I do not think the point of this project will be a real notes app, its the journey. I’m just learning so much along the way and poking at interesting questions: privacy on ATProto, disaster recovery, text parsing, and so on.
Luminaire
Status: On hold, waiting on hardware

A watchface for the Pebble Round 2 that shows the day as a simple arc following the sun. Built with Alloy and suncalc.js. It runs in the emulator. I’m also looking at redoing it in C which I haven’t touched in years.
The emulator is not a wrist. I want to glance at it on the Q train a few dozen times before deciding anything. Watchfaces are a good small problem: limited space, battery considerations, a few things worth knowing, and you look at it all day. Typography does the heavy lifting. Personality is allowed, provided it still tells the time.
USB prices
Status: Idea
One page tracking Amazon prices for USB cables and storage. For drives, price per gigabyte over time. Cables are worse. Two that look identical can differ wildly in speed and power, and the listing rarely tells you which.
I rarely buy these, and when I do I spend an hour to save four dollars. A record would at least tell me whether the four dollars was real. The real fun is finding (free) ways to get pricing data from Amazon without being blocked.
Alamo Alerts
Status: Live

A small service that emails me about Alamo Drafthouse listings in NYC as soon as they are published. It works, its live, and has gotten my my pick of seats at movies as they are announce. It’s on the bench anyway, because I’m always tweaking.
The usual suspects
Most of these share a toolkit. JavaScript (with HTML and CSS) for anything in a browser, PHP for anything on a server, and Python when a script is the fastest route to an answer. WordPress turns up more than it probably should. ATproto is where most of my recent curiosity has gone.
Nothing exotic. Boring tools, on purpose. The interesting part is rarely the stack.
Yes, PHP. It’s unfashionable, and I understand why. Developers treat languages partly as identity, and PHP is the one everyone used before they grew up. Then they spent a decade rebuilding it in JavaScript.
It’s fast, it’s everywhere, and it runs when I upload it. I’m not apologizing.