Party games on every phone in the room, on the same instant.
A shelf of party games sharing one room, one QR code and one set of screens. One screen runs the game, everyone else plays on whatever they have to hand, and the first to know it takes the round.
Order is decided on arrival at the server, not by the phones’ own clocks.
Entered
on-record
App · public record · live
What French deputies actually do, on the record, not what they say.
How French deputies actually vote, vote by vote. Every public vote of the Assemblée nationale, explained in plain French for readers who never followed a session, each figure traced back to the official record.
Every public vote of every deputy, with the group they sat in on the day of the vote. No ranking and no score: every figure links to the votes it counts, and every page cites its official source.
No server and no database: a nightly GitHub Actions job asks the Assemblée’s open data whether anything changed, rebuilds only what did and deploys. A night without a new vote downloads nothing and deploys nothing.
The host publishes 20,000 files per deployment, and there are over 8,000 votes: they ship in blocks, one file per deputy, small indexes for lists and search, and the build checks its whole output against a budget.
About 750 pages prerendered by the very loaders the browser runs, a fake fetch answering their data during the build, each with its own head tags and a place in the sitemap.
Find your deputy from your commune or your address, in French, light and dark.
Mechanism · no server, a nightly job asks what changed
Nightly
GitHub Actions
Open data
anything changed?
Rebuild
new vote · only what changed
Deploy
Cloudflare Pages
Quiet night
no new vote · no download, no deploy
20,000 files per deployment, 8,000+ votes shipped in blocks, the output checked against a budget.
Entered
Séance
App · training · installable, offline
A training manual that works offline and remembers everything, on the device alone.
A bodyweight training programme drawn as a gymnastics manual, one plate per movement. It guides a thirty-minute session, keeps a journal and draws the progress curves — installable, offline, with reminders, and with every number kept on the device.
Installable and fully offline: a hand-written Workbox service worker precaches the whole shell, and every route is served with the network cut, mid-session included.
Reminders without a server: an in-app clock, Notification Triggers where they exist, and Periodic Background Sync reading the schedule from IndexedDB in the worker — and the settings screen says plainly what this browser can do.
Progress charts drawn by hand in SVG and HTML: regularity counted in weeks, volume per week, waist and weight never on a shared axis, each walkable with an invisible native range input and backed by a table.
Every number stays on the device: a JSON backup carries it elsewhere, and a seeded specimen profile shows the charts full without ever touching the reader’s own data.
Thirty-seven animated figures drawn from joints, not paths: interpolation is polar and chained from the hip, so no bone stretches mid-movement.
Mechanism · zero server, everything cached on the device
This device
App shell
precached
Service worker
Workbox · reminders
IndexedDB
every number
No server
network cut
JSON backup
the only way out
Entered
Analytics
App · analytics · public dashboard
Cookie-free analytics that cannot tell two visitors apart.
Hono on Cloudflare Workers, D1 and Core Web Vitals, with a public dashboard. A row holds a path, a referrer host, a country, a locale, a theme and a device class, and there is no consent banner because there is nothing to consent to.
No cookie, no IP, no user agent, no fingerprint and no hash stored: a row holds a path, a referrer host, a country, a locale, a theme and a device class.
No consent banner, because there is nothing to consent to.
A page view reached from another page of the same site continues a visit; anything else starts one.
tracker.js weighs under 1 kB gzipped, follows single-page navigation, and never runs on localhost or in an automated browser.
Adding ?analytics=off to a URL stops counting that browser.
Mechanism · three apps report, one Worker writes a row
This site · Taverla · on-record
tracker.js
One Worker
Hono · Cloudflare
D1 · one row
path · referrer host · country · locale · theme · device class
Dashboard
public · React
Never stored
cookie · IP · user agent · fingerprint · hash
Entered
Scoreboard
App · live scoring · club hall
Every table’s score on one big screen, live, scored from any phone.
A live scoreboard for sports clubs running several tables at once. Four screens in the browser — the big screen, the umpire console, the organiser console and the spectator view — share one Durable Object per event on Cloudflare’s free tier, with nothing to install.
The register you are reading. React 19, prerendered per locale, English and French, light and dark with no flash, accessible primitives from react-aria, and a Lighthouse score gated in CI.
0.1.1Used by TaverlaUsed by on-recordUsed by Séance—Not used by Analytics—Not used by ScoreboardUsed by This siteTaverla, on-record, Séance, This siteShipped
Keeps the chosen theme from flashing, down to the phone’s toolbar.
0.3.0Used by TaverlaUsed by on-recordUsed by Séance—Not used by Analytics—Not used by ScoreboardUsed by This siteTaverla, on-record, Séance, This siteShipped
Copies to the clipboard even over plain HTTP, where the Clipboard API does not exist.
0.1.1Used by TaverlaUsed by on-recordUsed by Séance—Not used by Analytics—Not used by ScoreboardUsed by This siteTaverla, on-record, Séance, This siteShipped
The linter and formatter settings every project extends.
0.1.0Used by TaverlaUsed by on-recordUsed by SéanceUsed by AnalyticsUsed by ScoreboardUsed by This siteAll 6 appsShipped
About
Since 2023 I have been, at work, the sole developer of a multi-screen platform in production. I care about sound architecture, from monorepos to APIs typed end to end, about accessibility and tests, and I keep my projects on the latest versions of their ecosystem.
Next entry
Your team, 2026
I am looking for my next job. Write to me, or take the CV: a designed one, and a plain one for applicant tracking systems.