Dashboard
See your jobs at a glance. Choose how you want to see them.
Branch chooser
How do you want to see your job status?
Dashboard: Electron
A desktop app with a window. Between web and native.
Dashboard: Raycast Extension
Job status from ⌘+Space. The slickest option if you use Raycast.
Dashboard: SwiftUI Menubar
A native macOS menubar app. The most ambitious branch.
Dashboard: Terminal (TUI)
A terminal dashboard consuming the NDJSON stream. No GUI.
- default
Dashboard: Web
A localhost HTML page that polls the CLI. Simplest stack.
You've built a job scheduler with an agent-first CLI. Every command returns JSON. jobs watch streams state changes as NDJSON. This is an API — now pick your frontend.
What the Dashboard Shows
Regardless of which surface you choose, a dashboard answers three questions:
The CLI already answers all three:
bun run src/cli.ts status # what's running
bun run src/cli.ts logs X # what happened
bun run src/cli.ts doctor # is it healthy
bun run src/cli.ts watch # stream it allYour dashboard is a rendering layer on top of this API.
Choose Your Surface
Pick based on what you use and what excites you:
Or don't build a dashboard at all. jobs status | jq is a valid answer. The CLI is already agent-readable — if you have a coding agent, it can check your jobs for you.
The Universal Backend
Whichever surface you pick, the backend is the same:
# Point-in-time state
bun run src/cli.ts status
# Streaming state (for live dashboards)
bun run src/cli.ts watch --interval 5watch outputs one JSON line per poll. Your frontend reads lines from stdout (TUI, Electron) or you wrap it in a tiny HTTP server (web, Raycast).
After You Build It
You now have a local AI job scheduler with:
What started as "schedule a script" became personal AI infrastructure. The same pattern — durable jobs, declarative state, observable output — scales from a hello-world timer to a system that processes your files, summarizes your notes, and monitors itself while you sleep.