I was preparing for an FTC season with three major submission deadlines in six weeks. I had Google Calendar, Notion, and Apple Reminders all open at the same time — and still missed one. Not because I forgot. Because the signal was buried inside the noise. Every app that tracked deadlines also did seventeen other things, and none of them put the single most urgent number front and centre the moment I opened my laptop.
I tried the category options — Things 3, Todoist, Fantastical, structured bullet journaling. All of them required friction before I got to the information I actually needed. I had to navigate. Open a section. Find the right view. By the time the deadline was visible, three tabs had loaded around it.
"I didn't want a productivity system. I wanted a clock counting down to the thing that mattered most."
The requirement was simple: open laptop → see countdown → know exactly how much time remains. No account, no sync, no subscription, no setup. Just an immediate answer to "how many days do I have left?" That app didn't exist. I wrote it in a weekend — and then used it every day for six months, which is when it started to grow.
No product spec. No wireframes. No roadmap. Just six months of daily use and a growing list of things the app didn't do yet. Every feature in GHCountdown was added because I hit a wall in my own life and removed the wall.
The stack isn't the story. What building each part actually taught me is.
TypeScript taught me what "maintenance" means. I didn't add types because a tutorial said to — I added them six weeks in because I couldn't remember the shape of my own data. The compiler became institutional memory I didn't know I needed. When I rewrote the data layer in v1.3, it caught seventeen silent breakages before they reached a deadline I was actually tracking.
Building a custom IndexedDB layer taught me more about data persistence than any class I've taken. I read the spec. Implemented the schema. Wrote migration logic by hand for every version bump — not because Dexie was hard to find, but because I wanted to know what the abstraction was hiding. It took three times as long. I've never been confused about my data model since.
Choosing Electron taught me that local-first isn't a constraint — it's a design principle worth defending. I could have built a web app; it would have been faster. But I wanted the data to stay on my machine, no exceptions, no account, no outage that makes me miss a deadline. That constraint forced me to think seriously about what "offline" actually means when you're the user.
Hitting a 60fps target with Framer Motion taught me that polish compounds. I open this app every morning. Every slightly-off transition accumulates. I spent more time on animation timing curves than on any single feature. That felt excessive at first. After six months of daily use, I understand why it wasn't.
Side projects only become real when you hold them to the same standard as shipped software. GHCountdown has a CHANGELOG.md, a PRD, deployment documentation, and a SECURITY.md — not because anyone asked, but because the discipline matters.
What building — and using — something yourself every day actually teaches you.
This is what GHCountdown does — in your browser, right now. Name a deadline, pick a date. The number starts counting immediately. No account, no install.
Full overview — robotics, rowing, debate, and all builds.
Alliance selection tool built for real FTC competition. Monte Carlo, OPR, Bayesian shrinkage.
Independent research. Adaptive layer routing for energy-efficient local LLM inference. +14.43% efficiency.