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:

  1. What's running? — job names, schedules, loaded/idle/error state
  2. What happened? — recent logs, last exit codes
  3. Is everything healthy? — doctor-style health checks

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 all

Your dashboard is a rendering layer on top of this API.

Choose Your Surface

Pick based on what you use and what excites you:

  • Web — a localhost HTML page. Simplest. No dependencies. Good first dashboard.
  • Raycast — a Raycast extension. Slick if you already use Raycast. ⌘+Space to check your jobs.
  • SwiftUI — a native macOS menubar app. The most ambitious. A real Mac app.
  • Electron — a desktop app. Cross-platform. Full window.
  • TUI — a terminal dashboard. Consumes jobs watch NDJSON. No GUI.

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 5

watch 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:

  • Jobs as directories
  • Three schedule types (periodic, calendar, filesystem watch)
  • An AI-powered run script using your chosen LLM
  • Reactive file processing with WatchPaths
  • A debugging toolkit (doctor, logs)
  • Idempotent declarative sync
  • An agent-first CLI
  • A dashboard showing it all

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.