A template repository, not a product. Everything on this page describes what is inside it.

The part of a SaaS that is the same every time, already built

Sign-in without passwords, workspaces that cannot read each other, two languages in every address, and a release that migrates before it deploys. Clone it, keep this repository as upstream, and pull the fixes forward when you want them.

Signing in works before you have an email provider.

What a clone starts with

Six things every product needs before it has a feature of its own, decided once and written down where the decision was taken.

  • Sign in without passwords

    A single-use link, emailed and good for fifteen minutes. Google appears beside it only where a deployment has registered a client for it.

  • Workspaces that cannot read each other

    A page is handed a database handle bound to one workspace, and the unbound one is out of reach — enforced by a lint rule rather than by a habit.

  • Two languages, in the address

    English and European Portuguese, negotiated when a visitor arrives and carried in every URL they can share.

  • Email before you have a provider

    The outbox transport records every message the application would have sent, and mirrors it to a file for any reader outside the process, so signing in works locally, and in the pipeline, with no provider account anywhere.

  • A release that migrates first

    The pipeline applies migrations to production and only then asks for the new version. A failed migration releases nothing.

  • Limits that outlive a restart

    Two allowances counted in PostgreSQL, one per inbox and one per machine, so they hold however many instances are running.

Numbers this repository can stand behind

Each one is a fact about what is in here, and a test reads the repository back and fails when the two disagree.

2
languages, on every pageEnglish and European Portuguese. A third is a line of configuration, not a second sitemap to keep in step.
0
passwords storedThere is no password field anywhere, and password sign-in is switched off explicitly rather than left unconfigured.
10
decisions written downEvery architectural choice has a record saying what it traded away, not only what it chose.
3
minutes budgeted for a verdictLint, types, unit tests and integration tests run on every pull request. Three minutes is the budget they are written to; what the workflow enforces is a ceiling above it, so a run that stops being fast fails rather than drags.

Three decisions you inherit

The ones that are expensive to take late. Each is taken here, and recorded beside the code that takes it.

A workspace is an address

Which workspace is active is written in the URL and nowhere else, so there is no session state to fall out of step with the page. Two tabs hold two workspaces open at once, and a link to one of them opens the thing it names.

One list of languages, everything downstream

Add a locale to the site configuration and the routes, the sitemap, the alternates and the social preview image follow it. Nothing else has to be told, which is what stops anything else disagreeing.

The pipeline owns the order of a release

Browser tests, then migrations against production, then the new version — and the platform's own deploy on push is switched off, so nothing can go out in another order.

Start where the interesting problems are

Clone it, keep this repository as upstream, and pull the fixes forward deliberately. There is nothing to install and nothing to subscribe to.