Cloudbase runs a one-person practice — the work, the record, and the money — without ever once telling you how you did. I built it because every tool I paid for assumed I was a team of twelve, and then billed me per seat for the eleven I don't have.
It's the biggest thing I've ever built, it's in production, and it's what I open first every morning.
For years I ran my own work out of a private Flask app I called the Cockpit. It knew my projects, my hours, my mileage, and the twelve small requests that arrive in a week. It was ugly in places and it was mine, and it beat every subscription I'd tried.
Then other people started asking for it. Cloudbase is that app rebuilt properly — multi-tenant, productized, and rewritten from the assumption that the person using it is the whole company.
Here's what running a small practice actually costs: not the hours, the switching. A request in email, a note in one app, the hours in a spreadsheet, the miles on a receipt in the truck. By Friday you can't say what an hour of your week earned, and you'd rather not find out.
So one place holds all of it, and none of it scores you. There are no streaks in here, no productivity number, no capacity bar. Twelve people want something and four of them are waiting on you — that's a sentence, not a dashboard.
Real screens, real numbers, live controls — tick a task and watch what it does. The notes underneath are mine: six things on these two screens that no other tool I've paid for would do.
That isn't a support promise — it's how the thing is built. I'm the only person who has to agree, there's no roadmap committee, and most of what people ask for is a config field I haven't written yet. So it gets written.
Every dead end in the app carries a line that says tell me and I'll build it in, and it goes straight to me. That's the whole support model, and it's why Cloudbase ends up looking like your practice instead of mine.
Turn any of them off per project and the seam reads "soon", not "upgrade". Two of them cost twelve dollars extra; the rest come with it.
Most of this software's design work went into things it deliberately doesn't have. These are rules, not preferences — a screen that breaks one is a failed screen.
Flask with an app factory, SQLAlchemy 2.0, Alembic, Postgres on Neon, deployed to Fly.io with migrations on release. One shared core that ships single-tenant or multi-tenant, with per-request tenant binding as the enforced scoping layer — not a filter someone remembers to add.
No component library and no icon font: the interface is hairlines, four typefaces and Unicode glyphs set in mono. Server-rendered pages that swap only their main element, so the music never stops when you navigate. Past six hundred tests and still climbing.
Bring me the thing your current tool won't do. That's usually the shortest conversation we'll have, and I'd rather build it than talk you out of it.