The product is reachable from a phone outside the dev LAN for the first time. What went up, the shape we chose, and the three failures that only show up in release.
For the past month the product has lived on a developer Mac, talking to a phone on the same Wi-Fi network. Today it has a real production environment, and there’s a stable link a friend can tap to install it on their own phone over cellular.
The milestone is small — one friend, one signed phone build, one rented machine in another country. It’s the first time anything we’ve built has been reachable from a context we don’t own.
The shape we chose
A single rented box in Germany, with an edge layer in front for tls termination and origin protection. The api, the auth server, two databases, a reverse proxy — all running as containers on that one box. No managed middleware in the request path.
The reasoning: at pre-alpha there’s no usage. The bill on a hyperscaler with managed primitives is tiny right now and grows linearly with users later. The bill on a rented box stays flat until physical resources actually saturate. We’d rather pay for predictability now than relearn the unit economics under load.
The friend-preview build itself is a real signed release — the same package signature future updates will use — published to a stable link at a subdomain of the marketing site. Tap, install, sign in, use the product.
What only broke in production
Three failures ran fine in development and surfaced the moment the build was a release one.
The device’s encrypted storage silently no-op’d its first write on a fresh install. The auth flow looked correct, but the next screen tap was unauthenticated.
A canvas worklet that ran fine on chats with zero or many messages crashed only on chats with exactly one.
A bundler cache served the pre-fix code for two build iterations after the fix had landed, so the fix looked like it hadn’t worked when it had.
Different layers, same shape: in development the runtime forgives the condition; in release the same condition crashes. Live-only behaviour, every time.
What comes next
Friend installs it. We watch what they do with it. We fix what they hit. Then the next friend.