Sprint 37 — the long way to the front door
The sprint where Domi got ready to let other people in — and where I spent a week building an authentication system only to delete it. Fifty-eight PRs: a real staging environment, a front door rebuilt twice, people-and-access management with email invitations, support for more than one country, and a long tail of bug fixes.
A place to make mistakes
For the whole life of Domi there’s been exactly one environment. My laptop, every deploy, and “production” all read and wrote the same database and the same file storage. That’s fine when you’re the only user and a broken migration only hurts you. It stops being fine the moment a stranger’s data is in there.
So the first beta-readiness move was the unglamorous one: split staging from production. There’s now a real staging.domiapp.ai with its own database and storage, isolated from the live plane, and production only moves on a deliberate, audited promote — migrate, build, deploy, smoke-test, and roll back automatically if the smoke test fails. The boring infrastructure that lets me try things without holding my breath.
The most expensive code I wrote was the code I deleted
Then the part I’m a little sheepish about.
Domi needs auth that works for both the web app and the MCP connectors — the ChatGPT and Claude integrations. I’d decided the right answer was WorkOS, a managed identity provider, and I committed to it: built the integration, wired up its hosted sign-in page, and actually cut production over to it. One provider for Google, Apple, passwordless email, and an OAuth server for the MCP clients. On paper, clean.
In practice it wasn’t. The hosted page meant handing users off to an unbranded *.authkit.app URL — an ugly redirect, with a custom domain to fix it costing $99 a month. The “build your own box” alternative was its own heavy project. And the whole thing routed every login through a third-party vendor sitting in the most sensitive path in the app.
So I reversed it. WorkOS is gone — dependencies, code, the feature flag, all of it. The front door is fully in-house again: a one-time email magic link, plus the new Continue-with-Google. And the piece WorkOS was genuinely carrying — the OAuth server the MCP connectors talk to — I rebuilt as a small thing we own, issuing our own tokens.
It’s a strange feeling to end a week roughly where you started. But the decision is the deliverable. I now know exactly why the front door is in-house: it lives on domiapp.ai, the email comes from our own domain, it costs nothing, and identity never leaves our own database. The detour cost a week and bought clarity — and clarity is the thing that was actually missing.
More than one of me
With the front door settled, the household could finally hold more than one person. Members now link to a sign-in account; you can see who can sign in and at what level; and — the piece I promised at the end of last sprint and delivered in this one — you can invite someone by email. They get a link, sign in with that address, and join with the role you set for them.
It’s the first time Domi can hold a second human. For a household app, that’s not a feature — it’s the premise.
Built for more than one place
Domi started life assuming Quebec. The cadence rules and the holidays still do, and should — but being a Quebec-only product was an accident I’d baked into the copy and the defaults rather than a decision. So this sprint widened it: choose your household currency ($, £, €), set whether the calendar week starts Sunday or Monday, enter a phone number for any country, and pick an address anywhere — with Canada, the US, the UK, and France pinned at the top. English is the default now, French a setting away. Built for Canada, with everywhere else a deliberate next step instead of a rewrite.
The long tail
And then the dozens of small things that are most of what a sprint actually is. A briefing that came out in French for an English household — because the language was deriving from the region, not the person. A person’s sign-in email that didn’t show up in their own list of emails. No way to delete an event or edit a task straight from the calendar. A steady stream of others. None of them are a headline. All of them are the difference between a demo and something a person can actually live in.
Next
Sprint 38 is the one I’m most looking forward to: per-tenant encryption — every household’s data sealed with its own key, documents protected at rest — and the ability to choose your model provider between Cohere, Anthropic, and OpenAI. That encryption is the work that turns “preparing for beta” into “open for beta.”