Skip to content

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

Two phones showing Scorebug: the home dashboard alongside The Slate’s list of the day’s games
ProductScorebugEarly access · Open on the web

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

Websiteplaydeltav.spaceLive

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 Scorebug

Written 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 registry

Architecture · 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.

  1. 01Brief
  2. 02Call
  3. 03Scope
  4. 04Build
  5. 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.