Architecture audit
One to two weeks: a code review, a workshop and written findings on where your cost and complexity come from, and what to cut first.

We cut the cost of over-engineered web stacks and make your applications usable by AI agents. One process on one server, one SQLite file, HTML over the wire.
Most web apps don't need a distributed system. They need a fast server, a reliable database and HTML. Everything else is cost.
→ eight bills that grow with usage, a platform team, 592 npm packages to keep patched
Measured on our Kanban board: one 13.5 MB binary and 28 MB of memory at rest, where PLANKA runs 18 processes in two containers.
This site is built the way we describe: one Go binary on one server. While you watch, it sends you these numbers once a second, as HTML over one compressed stream.
Connecting …
Your customers already ask ChatGPT and Claude to do their work. We build an MCP server in front of your existing API so they can, with you in control of what an agent may read and write.
18 read tools over all 376 endpoints of the CashCtrl accounting API, four write tools that only exist in write mode and preview every change before it is made.
Open source on GitHub →Our SaaS for vehicle costs: 8 tools on Swiss vehicle data without signing in, and 22 tools for your own garage behind OAuth, 14 of them writing. Every call lands in the audit log.
libretto.ch →43 tools with which agents run websites: content in every language, files, navigation, link checks. With a read-only key, or a writer role that can't delete.
cashctrl shows a preview
Reminder to Meier AG for CHF 1,240.00, due in 10 days. Nothing is written until you confirm.
Confirmed
Illustration using cashctrl-mcp's real tools.
libretto-garage asks you to confirm
BMW 530d Touring xDrive: CHF 340.00 on 2026-09-22 (werkstatt): Service: oil and oil filter [resets: oil]. Record this?
Confirmed
Re-enacted from a real session with Libretto's demo garage.
After a real session: how we published a post this week.
One to two weeks: a code review, a workshop and written findings on where your cost and complexity come from, and what to cut first.
Off microservices, serverless or a hyperscaler, step by step, without a big-bang rewrite.
MCP server, OpenAPI spec, typed SDK and a permission model your security team can sign off.
We build with your team using coding agents, and show them how to keep quality under control.
Three of our own builds, with the source and the raw data on GitHub.
Several people drag cards on the same board, rendered on the server: one Go binary, one SQLite file, HTML over SSE. Measured against PLANKA (React, PostgreSQL) on a slowed phone.
We rebuilt Vercel's Next.js AI chatbot as a server-rendered hypermedia app and measured both on a mid-range phone over slow 4G.
A shared board of 2,500 cells, pushed to every player five times a second over one compressed SSE stream, from a single PHP process on our own framework, php-via.
Runtime for Go apps on SQLite and Datastar: one writer applies every write in order, each changed view renders once per tick for everyone who has it open, and goes out compressed over SSE. This site runs on it too.
Gallery of Datastar web components. Go, templ, SQLite, CQRS: the stack we recommend, end to end.
Collaborative Kanban board: one Go binary, SQLite, Datastar. Measured against PLANKA, with every script and all raw data.
MCP server for the Swiss accounting system CashCtrl. 376 endpoints, read-only unless write mode is on, writes previewed.
Responsive NetFlow visualiser on top of nfdump. Our most-starred project.
Real-time engine for reactive web apps in PHP on Swoole and Datastar. Runs the Game of Life from our blog.
Vercel's Next.js AI chatbot, rebuilt in PHP with Swoole and Datastar: the app behind our measurements, with the raw data.
Geobuf, a compact format for geodata, in PHP.
43,822 downloads · PackagistRON in PHP: JSON's value model with a lighter syntax, for people and LLMs.
2,108 downloads · PackagistDatastar plugin that binds key combinations to actions.
1,284 downloads · npmDatastar plugin that keeps element properties in sync with signals.
1,017 downloads · npmTyped TypeScript client for all 376 endpoints of the CashCtrl API, with an OpenAPI 3.1 spec.
689 downloads · npm
We built a Kanban board on which several people drag cards at the same time, rendered entirely on the server, and measured it against PLANKA on a slowed phone.

Conway's Game of Life: multiplayer, real-time, without writing application JavaScript. Built with php-via, our reactive PHP web framework on top of OpenSwoole, and Datastar for SSE-based DOM morphing.
Lower development costs, because there is less architecture to build and keep in sync. Lower running costs, because one server replaces a cloud of metered services. Faster changes, because logic and state live in one place. And predictable performance, because the server decides how much it sends.
Server-rendered HTML is how the web started. What's new is streaming updates over a single SSE connection, so the page feels real-time without shipping your application state to the browser.
We measured it twice on a mid-range phone over slow 4G. Our version of the same chat app became interactive 8.3 times sooner than the Next.js original, and on our Kanban board a dragged card is confirmed by the server after 253 ms, where PLANKA, built with React, needs 712 ms.
With a single writer, performance is almost never the issue. All writes go through one connection, one after the other, so they never wait on each other's locks, and reads run alongside them without waiting. The database is a file next to the application, so a query costs no network round trip. What a single writer rules out is many processes writing at once, and the architecture is built not to need that. The writer of our Kanban board handles about 13,800 moves a second with 200 people moving cards at once.
systemd restarts a crashed process within seconds. Litestream copies every change to object storage in Switzerland about a second later, and a daily test restore checks that the copy works. If the server itself fails, a new one restores the data as it starts. That is how our SaaS Libretto runs. Until the new server is up, the app is down. For most business apps that is a fair price for not running a cluster; if it isn't for yours, we'll tell you before we start.
For most business apps it's the wrong default. Offline-first means optimistic updates: the browser shows a result before the server has accepted it, and has to take it back when the server refuses. That moves conflict handling into every client. We keep the server in charge and show honestly what it has confirmed. Where real offline work is essential, a native app is the better tool.
Go, SQLite and systemd are boring, open and widely known. The code is yours, and any Go developer can take it over.
Only if you decide it is. Our MCP servers are read-only by default. Write tools only exist in write mode, and every write is shown as a preview until someone confirms it.
It will in a sprawling architecture. In a small codebase with one binary and one database, a reviewer can still read every change, and that is the point.

Behind zwei und eins gmbh is Michael Bolli. For over 20 years he has built and looked after web applications, with a focus on architecture, performance and systems that stay maintainable.
He works without unnecessary framework layers, joins existing systems and teams quickly, and maintains open-source projects such as nfsen-ng and php-via.