A platform build in progress, and the stack under it
A substantial product we are building right now. It is not announced, so there is nothing here about what it does or who it is for - only the engineering: the stack, the services it runs on, and how the build is run.
- In progress
- Status
- Not announced, not launched
- iOS, Android, web
- Platforms
- One TypeScript codebase
- Docker on Hetzner
- Runtime
- Caddy, automatic TLS
- Push to main
- Deploys
- Typecheck and tests in CI first
The challenge
The product has not been announced, so this is not a case study and does not pretend to be one. No description of what it does, no screenshots, no launch date.
What is worth publishing is the shape of the work, because the stack and the practices are the part a prospective client is actually assessing when they read a page like this.
What we did
One TypeScript codebase covers iOS, Android and web, built with React Native and Expo and shipped through EAS. State and data fetching sit on TanStack Query and Zustand, with the animation and drawing work handled by Reanimated and Skia. Platform-specific code exists only at the native seams, behind an adapter contract, so the interface layer never branches on which device it is running on.
The API is Fastify on Node with Prisma over PostgreSQL, Redis for fan-out and ephemeral state, and Zod validating every boundary. Real-time features run over WebRTC through a mediasoup SFU. There is a server-rendered admin console for the operational side.
The supporting services are deliberately boring and bought rather than built: Clerk for authentication, Stripe for payments on the web with RevenueCat handling app-store billing, Resend for transactional email, and web push for notifications. Each one is a problem we would rather not be maintaining.
It runs as Docker Compose on a single Hetzner box behind Caddy, which handles automatic TLS through Let's Encrypt. Push to main and GitHub Actions typechecks, tests against a real Postgres service container, then deploys. Mobile builds go out through EAS.
The outcome
In progress, and honest about it. The system is deployed, exercised daily and not launched: payments are wired but still in test mode, it is one box with no redundancy, and the hardening a public launch needs is on the list rather than in the code.
When it ships we will write it up properly. Until then this entry exists so the work is not invisible, not so it can be claimed as a result.
