I run a handful of local AI services — a voice server, an API, the dashboard itself — and I never quite knew which were actually up. The honest answer was ps aux | grep python and a squint. So I had Claude add one card that reads every running process, maps it to a service and its port, and warns the moment two of them fight over the same one. It caught a real collision — voice WebSocket and an old API server both on 8080 — the instant the card loaded.
Running several local AI services at once means the truth lives in your process table, not your head. Was the voice server still up? Did the old API die, or just go quiet? My routine was ps aux | grep python, read the wall of rows, and guess. No single place showed what was running, on which port, right now. The dashboard had cards for everything except the one thing I checked most.
The route walks the live process list, keeps the ones that are actually AI services, and resolves each to a friendly name and its listening port. The card renders them as rows — name, port, status dot — and polls so it stays live. Open the dashboard and the answer to "what's running?" is just sitting there: voice server on its port, API on its, dashboard on its, each green when healthy.
First load, the card lied. It showed three "API" services where there was one. The cause: uvicorn spawns worker subprocesses, and each child PID looked like a separate service to my naive scan. The fix was to collapse the process tree to parent PIDs — group children under the parent that actually owns the port, and count that once. The count went honest, and the ports lined up with reality.
Easy trap: treating every PID as a service. A modern server is a tree — one parent that owns the port, N workers underneath. Count the leaves and a single API looks like a small fleet. The card only became trustworthy once it counted the thing that binds the port, not every process that shares its name.
Four outputs from the build: the populated Services card, the port-collision warning that caught a real conflict, the process-tree fix that made the count honest, and the dashboard area before and after the card landed. Tap any image to enlarge it and read the exact prompt that drew it.




This wasn't a staged demo. The first time the card rendered, it flagged a real collision — my voice WebSocket server and an old API server I'd forgotten to kill, both bound to 8080. No terminal, no ps aux, no guessing: the dashboard told me the moment I looked. The AI built its own monitoring card while running inside the very machine it now watches — including itself.
Sixty seconds: the ps aux squint I used to do, the Services card that reads every running process and names it, the process-tree bug that triple-counted workers, and the amber badge that caught two services on port 8080 the instant the card rendered.
The process-reading route, the PID-to-service mapper, the parent-PID tree collapse, and the port-collision check — plus a demo that runs on synthetic processes so you never expose your own host. Everything in this episode is free and open — clone it, run it, make it yours. Repo lands shortly — buttons go live the moment it's public.
gh repo clone tellingtechnology/dashboard-services-card ~/dashboard-services-card && cd ~/dashboard-services-card && cat README.md
No GitHub? Comment SERVICES on the post and the bot DMs you the repo the moment it's public.
Seeing a collision is step one. Next: the card gets an action — when a service goes dark, or two collide, the dashboard doesn't just warn, it offers to kill the stray and bring the right one back, straight from the browser. Monitoring turns into control.