None of this is a feature. All of it is the kind of thing that decides whether the features keep working, so here is the recap.
Analytics on everything that is live
Every site serving traffic now reports page analytics. That covers this site, Liatris Landscaping, ResetKit, and Guardian Bots. Sites that are built but not yet deployed were left alone on purpose. There is nothing to measure until there is someone to measure.
The install is the same in each: one component in the root layout, so it covers every route rather than just the landing page. Small, boring, done.
The auth API got a test suite
ResetKit's API had none. That is the service that generates reset codes, hashes them, signs webhooks, and locks accounts after too many failed attempts, and until this week nothing checked that any of it behaved.
It now has 75 tests on the Node built-in runner. No framework, no new dependencies, nothing that touches the network or a database. Redis is replaced with an in-memory double, and anything time-dependent is tested by writing a deadline into that double rather than by sleeping. The whole suite runs in about a second.
A few of the things it pins down, because each one is easy to regress without noticing:
- Six-digit codes never come out with a leading zero. The generator adds an offset that guarantees this, and a code that stringifies to five characters would break any fixed-width input.
- The same code hashes differently every time. If it did not, two users holding the same code would look identical in the database.
- A malformed webhook signature returns false instead of throwing. The constant-time comparison underneath throws on a length mismatch, and the catch around it is what keeps a garbage header from becoming a 500.
- An expired forgery is reported as a forgery, not as expired. Ordering matters there. Reporting a bad signature as merely expired tells an attacker their token was otherwise well formed.
We also ran the suites that already existed elsewhere. Guardian Bots, Privacy Guardian, and the MySenses storefront all pass, and Privacy Guardian's three browser-path tests, which had been quietly skipping for lack of a browser binary, now actually run.
Every repo, archived
Twenty-nine repositories, mirrored with full history, every branch and every tag. Bare clones, so no build artifacts and no dependencies, just the git data. The whole thing is small, apart from one old coursework repo that turned out to be carrying 140 megabytes of accidentally committed precompiled headers.
Backups you have not tested are hopes. These restore with a single clone command, which was checked.
One cluster for the shared shape
The projects that use MongoDB are moving onto one dedicated cluster, one database per project. Nothing shares a database, which keeps per-project access scoping possible later and means a restore of one project is a restore of one project.
Two things did not move, and the reasons are worth stating.
ResetKit already runs on its own cluster and stays there. It is the only service with live customer data, and there is no upside to touching it.
Guardian Bots stays on Postgres. It uses Postgres as its job queue, not just its store, and job claiming there relies on row locking semantics that MongoDB does not have. Moving it would mean redesigning the queue, not translating it. It is live and its tests are green, so it stays where it is.
The general rule underneath both: consolidate what is cheap to consolidate, and leave alone what is working and would be expensive to move. One fewer vendor is not worth a rewrite.
What was fixed along the way
The API had its database name hardcoded, under a comment claiming it read the name from the connection string. It did not. The service talked to the same database regardless of where its connection string pointed, which made it impossible to aim at a different cluster without a code change.
It now resolves the name from the connection string first, then an environment variable, then the old default. There is a test pinning that existing deployments, which pass neither, still land exactly where they always did.
That is the shape of most infrastructure work. Nothing changed for anyone using the product. Several things that were about to become problems no longer are.