Skip to content

Wednesday, June 17, 2026

The app is the subject

Jan Peter
the-app-is-the-subject.png

Provisioning was the part we sweated first, and once it was reproducible — a rebuild doing the same thing every time — the only thing left was how it actually feels to use. Having all the features is one thing; being able to reach them when you need them, and not trip over them when you don't, is another thing entirely.


Here's a detail nobody asked for. For a long time the admin was a Filament panel — CRUD, the easy path, honest forms over the data. Applications, environments, servers, services; each one a resource with a list view and an edit form. It works, and it's about the fastest way to put an admin in front of real models. But a list of fields can't guide you. It shows you everything at once and weights nothing; every setting looks as important as every other. The interface knew the data cold and knew nothing about what mattered.

So we pulled the customer-facing side out of Filament and rebuilt it from scratch — a custom interface in Inertia and Vue. Filament didn't go in the bin; it's exactly right for operators running the fleet, and it still does that job behind an ops panel. But the thing a customer actually touches needed to be built around a different question — not "what are all the fields?" but "what should you do next?" That's a lot more work than a CRUD screen, and it's the work that actually matters.

The first decision was what the screen is even about. Most tools open on the box — the server, its CPU, its memory, a wall of graphs. strackt opens on your applications. The dashboard lists the apps you shipped, not the machines underneath them; the server matters, of course it does, but you reach it through the app it runs, not the other way round. The box is the least interesting thing in the room, so it plays supporting cast.

At the top of it all sits a panel in plain language. Not a row of gauges — a sentence. Behind the scenes a presenter on the server gathers the signals that actually need you: pending changes waiting to apply, security advisories to review, the next maintenance window, a backup that didn't land. Then it composes them into small typed fragments — a bit of text, a link, a status pill — and the front-end renders them as one readable line. "3 pending changes ready to apply." "2 advisories to review." The server reporting in, briefly, so you can get back to your app.

Under that sits a dock that's always there, and it changes with where you are. It surfaces the handful of things you're most likely to do next, with the most likely one out front. On an app, that's deploy — so the dock leads with deploy. Tucked behind it is the customization: toggle the optional steps of a deploy before you run it. And when a deploy can't run — a checkpoint in progress, an environment frozen — the dock doesn't offer a dead button; it tells you why. The thing you do every day is one move away.

Past the obvious, there's a command palette — Cmd+K, the way you'd expect. That's where the fine-grained stuff lives: verb-first commands like deploy, rollback, ssh, checkpoint, invite; jump-to navigation for any app or server; keyboard shortcuts for people who'd rather not touch the mouse. Reachable in a keystroke, but never in the way of someone who just wants the obvious next move.

The rule underneath all of it: screen space is proportional to urgency, not to how much data happens to exist. A healthy app is boring on purpose — a dot, a name, done. An app in trouble gets the room: the status, the context, an inline way to fix it. Healthy things collapse to a line; problems expand to fill the space. You don't go hunting for the thing that's wrong — it's already the biggest thing on the screen.

That's progressive disclosure made literal — right down to which thing gets to be the subject. Most people will never consciously notice it. They'll just find the obvious next move already where their hand was going, and their app where their attention already was. That's the part we couldn't ship wrong.