DEV Community

Cover image for The missing UI for the things you run.
Bravi
Bravi

Posted on

The missing UI for the things you run.

Hello world, again.

Last time I wrote about confish, it was a config tool. You'd define a typed schema, your scripts would fetch values from it, and you could nudge a threshold from the sofa without a redeploy. That post ended with "my scripts and bots haven't stopped asking for more" - and what they asked for surprised me. They didn't want more values coming down. They had things to send back up.

Because here's the other half of the automation problem. Every script eventually produces something worth looking at. The scraper finds things. The backup job finishes (or doesn't). The Pi in the loft measures a temperature. Where does all that output go?

If you're anything like me: a Telegram DM to yourself. A JSON file on the box. A spreadsheet with an importer that broke in March. Or another email getting lost in space. Yet another pain point where I saw a pattern forming.

Config was data flowing down to your things. This one's about the data flowing back up.

Push it

Feeds are typed collections of living state you push into confish - crawl results, job runs, incidents, sensor readings. Same philosophy as config: define the fields once (string, number, boolean, date), and your code pushes items that fit them.

from confish import Confish

client = Confish(env_id="a1b2c3d4e5f6", api_key="confish_sk_...")

feed = client.feed("backup-runs")
feed.set("2026-07-14", {
    "host": "homelab",
    "duration_s": 214,
    "status": "ok",
}, ttl=7 * 86400)
Enter fullscreen mode Exit fullscreen mode

set is an upsert on a key you choose, so pushing the same item twice updates it in place - retries are harmless, and a "running" item can become a "done" item without growing a list. The ttl means the item cleans itself up a week later even if the script that pushed it crashes and never gets another word in. Finished runs and resolved incidents just quietly age out.

And like config, a feed's definition belongs to the application while each environment holds its own items - the same code pushes to staging and production with only the API key swapped.

Show it

Here's the part that finally killed that spreadsheet export for me. For each feed you pick a layout - cards, table, compact list, or hero - and assign fields to roles: this one's the title, this one's the badge, sort by that one. The dashboard renders whatever you push. Live, streamed in as items arrive, no refresh.

A feed rendered as a live table of backup runs in the confish dashboard

Hero deserves a special mention: it renders items big and centred, which turns out to be exactly right for singleton state, or a collection with just a handful of items. Here is my "Luckster" euromillions bot using it.

A hero-layout feed showing lottery results pushed by a bot

So the loop becomes: your script pushes typed items, and there's a live, decent-looking view of them on your phone. No frontend built, no charting library evaluated at midnight, nothing deployed.

Share it

Then it got out of hand, in a good way.

Any feed can be published at a read-only public link: unguessable URL, noindex, live updates, and it shows the items and nothing else - no app, no environment, no config details. Anyone with the link can install it on a phone or desktop as its own little app (each share is a proper installable PWA).

And when one feed isn't enough, a board composes several - feeds from any of your applications, each section pinned to whichever environment you choose, stacked in the order you set, each rendering with its own layout. Boards start as private drafts; you flip the public link on when it's ready.

Mine is a homelab board: uptime checks in a hero up top, last night's backup runs in a table, open incidents in a list. It's installed on my phone and the tablet, and it keeps itself current while I do nothing whatsoever. A zero-build status page for things that run on a shelf.

(Public links and boards are on the paid plan - pushing and viewing your own feeds isn't.)

Name it

Somewhere in all this, I looked at the product and realised the category had quietly changed underneath it.

Configuration is state flowing down to your things. Actions are commands flowing down. Logs are events flowing up. And feeds - the corner that was missing - are state flowing up. Four pillars, two directions, and none of them is "the feature" with the others as extras. The grid filled itself in, one complaint at a time.

So confish isn't a config tool with add-ons anymore. It's the dashboard your bots, scripts, and cron jobs never had - the missing UI for the things you run. Change a value, dispatch a command, watch the logs land, and see the state your things push back. One place, from anywhere, including the sofa.

Try it

If something you run keeps DMing you JSON - or worse, keeps its results entirely to itself - give feeds a spin at confi.sh. All five SDKs (Go, JavaScript, Python, PHP, Rust) speak feeds, and it's a couple of REST calls if your language isn't on the list.

Thanks for reading.

P.S. There's another way to talk to confish that keeps nagging at me. I'll come back to you on that.

Top comments (0)