Covers August 2024 - November 2025.

In August 2024, I made the first commit of what has turned into a small fleet of applications sharing one template. I wasn’t planning a fleet. I was trying to get back into application development, and went through quite a few projects getting here.

Fifteen months of stacks: ten of them went to PowerShell, Pode and htmx before the template or the fleet existed PowerShell, Pode, htmx - a site, a SQL tool, a file monitor Supabase - four weeks of hackathon, neither project survived Convex and React - three proofs, a typing game, eight scaffolds A template and a fleet - five derived apps, Node to Bun Aug 2024 Jan 2025 Jun 2025 Nov 2025
I spent about ten months with PowerShell, Pode, and htmx before trying the stacks that led to KeyStrike and Spernakit.

PowerShell, of all things

In August 2024, I was just a DBA who wanted to work more on application development. I started out as a programmer (when I was a kid) but got distracted by SQL Server and databases somewhere along the way. I’d picked up JavaScript long ago but hadn’t touched it in years, and I didn’t know React or any modern frontend. The last web app I worked on regularly was in the iHTML/ColdFusion/PHP/Perl CGI era (’97-’05) and things had moved on. A lot.

(SaaS, the term, hadn’t been coined yet back then, but the concept was alive and well and I worked on several B2B SaaS products.)

What I did know was PowerShell, because I used it every day to keep SQL Server estates alive. So the first commit was a PowerShell web server using Pode, htmx for interactivity, and Tailwind for styling. Yes, a website served by PowerShell, a scripting language meant for system administrators. I knew that going in. It wasn’t pretty, but it shipped, and the patterns it forced me to invent (route handlers, partial rendering, a data layer separate from the presentation layer) ended up seeding everything that came after.

htmx’s debugging experience drove me crazy - it was hard to see what was happening when it swapped content. So I built a browser extension that shows every request, response, and DOM change, and shipped it to Chrome and Firefox. Google rejected it over permissions a few times; Firefox accepted the first submission. I was surprised by that - I’d always thought Firefox was the more secure one.

In October 2024, I started Deeper, a SQL Server tool I’d been thinking about for a while - Pode + htmx + JWT auth + Docker. I kept the collection side and the presentation side separate. The PowerShell piece that talks to SQL Server has nothing to do with the piece that serves the web UI. Over a year later, that collector is still running unchanged. I’ve reworked the UI several times.

In March 2025, I started a file-monitoring app. It featured CRUD, scheduled scans, and dashboards. Simple views were pleasant enough, but the moment I needed multi-panel dashboards, drill-downs, live metrics, filtering across dozens of columns - htmx fought back. Every interaction became a careful arrangement of swap targets, DOM IDs, and debugging. After that, I knew I didn’t want to keep going down that path, but I wasn’t sure which way to turn.

By late May, I gave Pode and htmx one last fair test with a TodoMVC implementation. It worked, but building even that small app required enough coordination of endpoints and the DOM that I was ready to try something else. So I shelved it and moved on.

The hackathon

Two days later, I started Idiomate, a Supabase project for a hackathon. The purpose of this particular hackathon was to focus on AI-assisted development, which I hadn’t really explored before other than my IDE’s auto-complete.

Idiomate changed faster than anything I’d ever worked on. Astrid.chat followed and kept that pace through the four weeks of the hackathon. At first it felt like the bottleneck had moved from “how do I build this?” to “what should I build next?” That was a cute assumption. It worked pretty well as long as it wrote exactly what you wanted. It was a crapshoot if you needed to change anything. Maintenance? Ha.

As expected, neither project survived the hackathon, but they were useful learning experiences. I learned that Supabase is not the right fit for me and AI is not going to replace me anytime soon.

Continuing the pattern, I moved on to Convex for a few weeks, mostly because of Theo, and built three proof-of-concept apps to test the waters.

After that, I built KeyStrike, a competitive multiplayer typing game. First commit July 30, v1.0 in production August 7. It took just eight days. That was THE turning point for me: React clicked in a way htmx never did, and Convex, which had felt awkward strapped to htmx, was effortless under React.

That settled my Convex verdict: it was a great fit for KeyStrike, while my other projects still needed a foundation I could easily self-host.

In August, I scaffolded eight throwaway projects in one day - every permutation of React + Hono/Express + Convex/self-hosted - to narrow down the stack options. The verdict: React frontend, SQLite, and a lightweight self-hosted backend. The specific backend framework remained undecided until real projects settled it in the weeks after.

Spernakit

By mid-September I rebuilt the same auth, user management, and CRUD boilerplate three times in one week: a kanban board, a reporting tool, and a scheduling manager. I got fed up. On September 22, I extracted the pattern into Spernakit - SQLite, Prisma, Express, React, Node - a full-stack template with auth, CRUD scaffolding, and security hardening out of the box. Every app since has been built on it, and improvements flow back into it.

October was the peak so far: releases landing every couple of days, five derived apps, each one dogfooding the template and finding sharp edges that got smoothed in subsequent releases. A timeline application pushed the shared frontend beyond ordinary forms and tables, while Deeper tried three different ways of building its live dashboard side by side. In mid-November 2025 the whole fleet migrated from Node to Bun in one session, and honestly the runtime mattered less to me than watching the change propagate out to the derived apps so easily.

It’s also visibly done, or close to it. Every v1 technology choice - Express, Prisma, Winston, DaisyUI - was made because I already knew the tool, not because it was the best fit. As of v1.8.0 the accumulated friction is obvious. I can feel a rewrite coming, and this time I’ll choose based on fit instead of what I learned first.

Fifteen months in, and it’s obvious that a fleet generates more well-defined work than one person can type, no matter how much I practice on KeyStrike. The backlogs are specific, the template makes the work routine, and my typing speed is the bottleneck. If a template change can propagate programmatically, maybe a backlog can be worked programmatically too. AI is getting more compelling, and unavoidable, but it’s still rough and requires a lot of hand-holding. Since October 2025, I’ve been working on an AI orchestrator, with a couple of small CLI wrappers alongside it, trying to turn all of that into a way to keep them in line.