Build log

Dated write-ups of what I built and why, posted when there is something worth saying. A feed reader follows along with no sign-up.

Follow the build log in a feed reader

  1. Holding the page still when the brand typeface loads

    Fitting fallback faces so text stops jumping when the brand typeface lands, and the three ways the measuring gate was blind to what visitors saw.

  2. A business card a phone can scan and save

    A printed QR code that opens a card page and saves the contact, and what a Pixel taught me about vCard photos and Chrome on Android.

  3. Publishing the legal documents as pages of the site

    The contracts and policies moved from a repository to pages of the site, each with a stored PDF, a link per clause and the security.txt its policy promised.

  4. From a bare cluster to a staging environment reconciled from git

    How a bare Talos cluster became a staging environment that Argo CD reconciles from git, with its secrets, certificates and both web origins.

  5. Parking an environment, and bringing it back unattended

    Taking staging down to what a rebuild reuses in 87 seconds, and back up unattended in about eleven minutes, with every plan read by a gate first.

  6. Bootstrapping a self-hosted Kubernetes estate on Talos and Scaleway

    Why the platform runs its own Kubernetes control plane on Talos and Scaleway, and the traps met bringing the first cluster up from OpenTofu.

  7. The pre-PR gate that stands in for a team

    With no second engineer to read a diff, every pull request passes scanners, a model review that blocks on security, and a local gate that signs a receipt.

  8. Serving the site in French at its own paths

    Why French lives at /fr while English keeps the bare paths, and how one language choice follows a visitor from the site into the application.

  9. Splitting the frontend and prerendering the public site

    How the public site became its own prerendered build, and how a lint rule between it and the application became a package boundary.

  10. Taking the frontend to WCAG 2.2 AA

    Four gates that each own a class of accessibility defect, and what they found on the way to WCAG 2.2 AA.

  11. The rebrand to avanserv, on a monochrome token system

    How the rebrand to avanserv turned every colour into a role on one ink ramp, and why the contrast gate had to be fixed before it could be trusted.

  12. Per-organisation OIDC SSO with identifier-first login

    Signing in through each organisation's own identity provider, behind an email-first login, when the admins who configure that provider cannot be trusted.

  13. Transactional email as a subsystem

    Email built once, as a subsystem: an outbox row in the caller's transaction, MJML compiled without Node, and an admin view to replay failures.

  14. Access control as a declarative DSL, then roles and capabilities

    Access rules declared on each model and compiled to both a SQL filter and a record check, and the three tiers of rights that became roles and capabilities.

  15. Multi-tenancy from the first model

    How organisation isolation went into the platform's base model in its first week, where the automatic filter stops, and what I still owe it.

  16. Day one: a multi-tenant framework from an empty repository

    The platform's first evening: a written plan, a toolchain that refused sloppy code, and the request context that tenancy would hang from.