Web apps
We design and build web apps on Next.js and PostgreSQL, hosted on accounts you own. That covers customer portals, booking systems, dashboards, internal tools, marketplaces and SaaS products.
We build web apps that businesses run on every day, with logins, roles and real data behind them. We plan the database before we design any screens, and the rules about who can see what live in the database itself. When we hand over, your team gets an admin area they can use without us and written notes on how it all fits together.
What’s under all of it
Every project in the list above sits on the same three layers. Pick one to see what goes into it.
01 · Data
We design the database before any screens, because changing it later costs far more.
- Relational schema with versioned, ordered migrations
- Permission rules kept in the database itself
- Background jobs, queues and scheduled work
- Backups, and a restore we’ve tested
What you get
- 01Next.js App Router application, TypeScript end to end
- 02PostgreSQL schema with row-level security and versioned migrations
- 03Sign-in, roles and an admin area for your team
- 04Scheduled jobs, webhooks and third-party API integration
- 05Automated checks, preview deployments and a written runbook
- 06Everything handed over to your own repository, hosting and accounts
Stack
- Next.js
- React
- TypeScript
- PostgreSQL
- Supabase
- Tailwind CSS
- Vercel
Our own work
Example 01
Scorebug is a full web app with accounts and real data behind it. Nineteen leagues run off one central registry and one Next.js codebase. Photos and ticket stubs are kept in private storage behind links that expire, and the rules about who can see them live in the database, not the app. League news is collected on a schedule, so a page never waits on someone else’s server.
- leagues with live scores
- 19
- sports, from hockey to Formula 1
- 7
- the oldest season you can look up
- 2002
- Access rules on every database table, checked in a dedicated security pass
- Scheduled jobs fetch the news, so pages read our own copy
- Seven sports, Formula 1 included, on one code path, with seasons going back to 2002
Example 02
playdeltav.space is built around live data, and almost none of its pages are static. Planet distances are worked out from orbital elements when the page loads, with no feed involved, and the globes are drawn on the server from map data with d3-geo, so no map tiles are ever downloaded.
60 rockets, each with its flight history · 366 days in the almanac, one page each · 10 seconds between space station updates
- Each figure is cached for as long as it stays true: the space station moves about 77 kilometres in ten seconds, so its position is cached for ten
- 60 launch vehicles, a 366-day almanac and an upcoming-launch manifest, built and cross-linked
- Share images made for each page and calendar downloads for every launch
LimitsBoth examples are our own projects, so neither one is client work. Scorebug is in early access and open on the web. playdeltav.space is live.
See ScorebugWritten up
We wrote up how it’s built, including the four places the registry doesn’t reach and the news feed that went empty because of one of them.
Nineteen leagues, one registryArchitecture · 3 min read
Method
How a project runs
Every service follows the same steps, and nothing gets built until we’ve both agreed the scope in writing. The studio page goes through each one.
- 01Brief
- 02Call
- 03Scope
- 04Build
- 05Handover
Start a project
Tell us what you’re building
Tell us what it has to do and roughly what you want to spend. Wyatt writes back, and after a short call he’ll send an estimate.
