breadtools — one dashboard for the homelab stuff I kept forgetting to check

Foreword

I got tired of the runaround. Check on backups? SSH into the backup server. Spin up a new client instance? Click through Railway’s dashboard, then Cloudflare’s DNS panel, then set up 15 environment variables. Add a new service to the network? Log into Nginx Proxy Manager, configure the proxy host, then log into Pi-hole and add the DNS record. Check Docker containers? Different interface. Storage usage? Another one.

None of this is hard. It’s just a lot of context switching across a lot of interfaces for stuff I do regularly. I wanted one place where I could do all of it. Open a browser, click a button, done.

So I built breadtools.

What’s in it

It’s a Flask web app running in Docker on my Synology NAS. You hit it on port 8765 and get a dashboard with all the tools organized by category. Click a button, fill in any options if needed, and the tool runs, streaming output back to the browser in real time via Server-Sent Events. No waiting for a batch result, you see each line as it happens.

Here’s what’s in there right now:

The flagship tool: Railway Provisioner. This is the one I’m proudest of. I run a SaaS product (SimplyRaffle) and every time I need to deploy a new instance for a client, it used to mean clicking through Railway’s dashboard, setting up a Postgres database, configuring 15 environment variables, creating DNS records in Cloudflare, waiting for SSL verification… easily 30 minutes of clicking.

Now it’s one form. Fill in the client name, hit run, and it:

  1. Creates the Railway project via their GraphQL API
  2. Provisions a PostgreSQL 16 database with a random secure password
  3. Links the web service to my GitHub repo
  4. Injects all the environment variables (DATABASE_URL, admin creds, session secrets, API keys)
  5. Registers a custom subdomain on Railway
  6. Creates the Cloudflare CNAME DNS record
  7. Creates the Cloudflare TXT record for domain verification
  8. Streams every step back to me in real time

The whole thing takes about 2 minutes. And Railway doesn’t have a Python SDK, so this is all raw GraphQL mutations. That was fun to figure out. (It was not fun to figure out.)

DNS Audit Tool. Cross-references my Railway deployments against Cloudflare DNS records to find stale entries. When I decommission a client instance, I don’t always remember to clean up the DNS records. This catches the orphans.

NPM + Pi-hole Registration. When I spin up a new service on my network, it needs two things: a reverse proxy entry in Nginx Proxy Manager and a DNS record in Pi-hole so it resolves locally. This tool does both from one form. Before this, it was: log into NPM, create proxy host, configure SSL, log into Pi-hole, add DNS record. Now it’s: fill in one form, click run.

Fun story, this tool broke silently when Pi-hole updated to v6. They changed the API path from /admin/api.php to /api/ and restructured auth from token-based to session-based. My requests were returning 200 OK with empty responses. No error, no warning, just… nothing happening. Took a while to figure out that one.

Claude Code in the browser. This one’s kind of ridiculous but I love it. There’s an embedded web terminal powered by ttyd that runs Claude Code right in the dashboard. So I can pull up breadtools on my phone, tap into the terminal tab, and have a full AI coding assistant running against my infrastructure from anywhere. Need to debug something from the couch? From the grocery store? From bed at 2 AM because you got an alert? Just open the browser. It’s basically SSH + Claude Code without needing an SSH client.

The rest: RPDB missing artwork reports, TMDB poster injector, Docker health checks, NAS storage reports, and backup verification.

How it’s built

The cool architectural bit is that tools are just Python scripts in a /scripts directory. The scripts directory is NAS-mounted into the container, so when I edit a script, the change is live immediately. No container rebuild needed. I just click the button again.

Each tool declares a form schema in the registry, and breadtools auto-generates the modal dialog for it. Flask converts the form fields into CLI arguments and streams the subprocess output via SSE. Adding a new tool means: write a Python script, add an entry to the registry, done. No HTML changes.

There’s also an SSH interface (port 2222) with a Rich terminal menu that auto-launches when you connect, and a PowerShell integration for running tools from my Windows workstation. Three ways in, same tools.

The AI-assisted thing

Same deal as breadAI, this is AI-assisted development. Claude Code writes the Python; I tell it what to build and catch the stuff it gets wrong. The Railway provisioner in particular was a back-and-forth debugging marathon. The GraphQL API has undocumented quirks (the TXT verification data is on a CustomDomainStatus type, not in the dnsRecords array where you’d expect it, and I had to do schema introspection to even find it). That’s the kind of thing where my actual infrastructure experience meets the AI’s coding ability and something useful comes out.

Was it worth it?

I mean, I actually check on my stuff now. That’s the whole point. The scripts weren’t useless before, I just never ran them. Now they’re two clicks away in a browser and I have no excuse.

Leave a Reply