Thirteen products, one server
Each is a different kind of product on a different stack, in 10 languages, with its own data, its own design and a reset every night. All of them are running. Open any one and use it.
Asking the status page how everything is.

The products
Thirteen products. Open a row for a look at it and something to try.
01Bolt & BowlOnline shopTypeScriptChecking
A shop for cloth, pots and tools from small workshops, with a staff side for stock, fulfilment and refunds.
- Back end
- Next.js 16, Server Actions, Prisma
- Front end
- React 19
- Data
- PostgreSQL
Search for "lnen" with the typo, check out with a demo card, then follow the order from the staff side.
02RolodeckCRMJavaChecking
A sales team’s pipeline for a commercial solar installer: companies, contacts, a deal board, forecasts and a JSON API.
- Back end
- Spring Boot, Spring Security, JPA, Flyway
- Front end
- Thymeleaf with HTMX
- Data
- PostgreSQL
Sign in as a rep and drag a deal along the board; the forecast on the dashboard moves with it.
03FeltboardKanban boardElixirChecking
A board for a fruit and veg box round that moves for everyone at once, with limits on work in progress.
- Back end
- Phoenix LiveView, Ecto, PubSub, Presence
- Front end
- LiveView
- Data
- PostgreSQL
Open the board in two windows and drag a card in one: it moves in the other, and you can see who is looking.
04Millrace LidoBookingsPythonChecking
Booking for an outdoor pool and sauna: a fortnight’s timetable, swim passes, QR tickets and a front desk.
- Back end
- Django, Django REST framework, Celery
- Front end
- Templates with HTMX and Alpine
- Data
- PostgreSQL, Redis
Book a swim, then check yourself in at the front desk with the ticket’s code.
05SwitchbackHelp deskPHPChecking
Support for a maker of soil probes: an inbox with service clocks, and each ticket beside a map of the farm.
- Back end
- Laravel, Inertia, queues
- Front end
- Vue 3 with TypeScript
- Data
- PostgreSQL, Redis
Open a ticket about a silent probe and find the probe, its battery and its last reading pinned on the map.
06RemitInvoicingC#Checking
Invoicing for a design studio: live previews, PDFs, payments in parts, reminders and a bank feed to match.
- Back end
- ASP.NET Core 10, EF Core, QuestPDF
- Front end
- Blazor
- Data
- PostgreSQL
Draft an invoice and watch the preview set itself, then open the PDF the client would get.
07SightlineWeb analyticsGoChecking
Privacy-friendly analytics counting this showcase’s own visitors, live, without cookies.
- Back end
- chi, pgx, templ
- Front end
- HTMX with charts
- Data
- PostgreSQL, Redis
Open the live count, then come back here: your own visit is on it.
08NatterTeam chatRustChecking
Chat for the volunteers of a community radio station: channels, threads, reactions, search, all live.
- Back end
- Axum, Tokio, SQLx, WebSockets
- Front end
- React 19 with TanStack Query
- Data
- PostgreSQL, Redis pub/sub
Mention a volunteer in a thread: they start typing, then answer, a few seconds later.
09VorkursCoursesRubyChecking
A short-course school of wood, print and clay: enrolment, lessons, quizzes, discussion and marked work.
- Back end
- Rails 8, Solid Queue, Solid Cable
- Front end
- Hotwire
- Data
- PostgreSQL
Enrol on a course, take a lesson’s quiz, and watch the discussion under it update by itself.
10GableEstate agentPythonChecking
An estate agent’s homes to buy and rent, searched by the particulars or by saying what you are after.
- Back end
- FastAPI, SQLAlchemy 2, Alembic, fastembed
- Front end
- Nuxt 4 rendering on the server
- Data
- PostgreSQL with pgvector
Search for "room for horses" and see the barn come first, then ask for a viewing.
11Forno NotteOrdering and kitchen displayKotlinChecking
Collection orders for a wood-fired pizza kitchen, and the screen the kitchen works from, all live.
- Back end
- Ktor 3, Exposed, Flyway, server-sent events
- Front end
- SvelteKit with Svelte 5
- Data
- PostgreSQL
Order a pizza, keep its page open, and press Start on its docket in the kitchen screen.
12SituationsJob board and applicant trackingTypeScriptChecking
A job board read like a magazine’s situations vacant, and the office where employers work the letters.
- Back end
- NestJS, GraphQL with Apollo, Mongoose, BullMQ
- Front end
- Angular 22 with Apollo Angular
- Data
- MongoDB, Redis
Apply for a job, then sign in to the office as its employer: the letter is there, and it is being read.
13SignalboxStatus pageTypeScriptChecking
The status of everything on this page, checked every thirty seconds, with ninety days of history.
- Back end
- Bun, Hono, Drizzle, JSX on the server
- Front end
- Server-rendered pages
- Data
- SQLite
Open any service to see its checks, its latency and the incidents it has had.
Nothing here is built with that. Try a language, like Python, or a tool, like Redis or WebSockets.
One of them, opened: Forno Notte
A pizza kitchen’s oven bakes eight in ten minutes, so every collection time has eight places, and two customers must never both get the last ones. Every screen has to be live: the kitchen’s, and each customer’s own order page.

A lock per collection time
Placing an order takes a PostgreSQL advisory lock on its collection time before counting the oven’s places. A test sends five orders at once for eight places and expects exactly two through; without the lock, all five pass.
One stream, sliced
Everything that happens goes down one Kotlin SharedFlow. The kitchen’s server-sent events read all of it; a customer’s read only their own order, starting from a snapshot taken after subscribing, so nothing slips between.
A reset that tells everyone
The nightly reset runs as its own process and ends with a PostgreSQL NOTIFY. The server listens on a connection of its own and tells every open screen to reload.
What I build
- Back ends in 10 languages, from Rust and Go to Elixir and C#, each tested against the database it really uses.
- Front ends rendered on the server, in the browser or both: React, Vue, Svelte, Angular, LiveView, Hotwire and HTMX.
- Live features over WebSockets, server-sent events and LiveView: boards, chat, kitchens and offices that move for everyone.
- Data in PostgreSQL with pgvector, MongoDB, Redis and SQLite, with migrations, queues and scheduled work.
- The running of it: one server, a router, per-product users, health checks and a reset every night.
Where it runs
One server and three containers. A request comes in through Cloudflare to Caddy on the host, and from there to the router inside the apps container, which sends it on by path.
- A visitor
- Cloudflare
- Caddy on the server
- The router, by path
showcase-apps
Every product as its own user under supervisord, with Redis beside them for queues and pub/sub.
| Path | Product | Served by | Now |
|---|---|---|---|
| /shop | Bolt & Bowl | Node.js, the Next.js standalone server | Checking |
| /crm/ | Rolodeck | A JVM running Spring Boot | Checking |
| /tasks/ | Feltboard | The BEAM, a Phoenix release | Checking |
| /book/ | Millrace Lido | Gunicorn, and a Celery worker with its beat | Checking |
| /help/ | Switchback | PHP-FPM, a queue worker and the scheduler | Checking |
| /invoices/ | Remit | .NET, the Kestrel server | Checking |
| /analytics/ | Sightline | One Go binary | Checking |
| /chat/ | Natter | One Rust binary | Checking |
| /learn/ | Vorkurs | Puma, with Solid Queue | Checking |
| /homes/ | Gable | Uvicorn for the API, Node.js for Nuxt | Checking |
| /order/ | Forno Notte | A JVM running Ktor on Netty | Checking |
| /jobs/ | Situations | Node.js, NestJS with its queue workers | Checking |
| /status/ | Signalbox | Bun | Checking |
showcase-postgres
PostgreSQL with pgvector: a database and a user for each product that needs one.
showcase-mongo
MongoDB, for Situations’ board and its CVs in GridFS.











