What we build with
18 parts in 6 layers, from the tools we build with down to where the data is kept, and the lines between them: what runs inside what, who calls whom, and where data goes.
Swipe sideways to see the whole map. Every connection is also written out below.
How we make it
Design direction and reviews against our own design system.
Engineering partner: writes, reviews and tests the code with us.
Where people use it
Signed web updates to the Android app between store releases.
Wraps a web app as a native Android app when a store app is needed.
Installable web apps: manifest, service worker and icons on every phone, tablet and laptop.
What people see
Static websites that ship no framework to the visitor.
Utility CSS generated from the classes our views use.
One icon family, inlined as SVG.
Python in the browser: Pyodide for full apps, MicroPython where a page must start instantly.
Only what browsers require: service workers, vendored libraries, glue.
One language end to end
Back ends, build scripts, data work, and the browser apps through PyScript.
What answers requests
Async Python web framework for our APIs.
Our mail server: IMAP, SMTP and JMAP, with DKIM, SPF and DMARC.
AI document extraction, called from our API.
Where it is kept
One-file database for a single service, with Parquet backups.
Serverless hosting for Postgres, with branches per environment.
Shared sessions, rate limits and short-lived cache.