Skip to content

Pages

Every route registered in src/App.tsx, what it renders, which API client it uses, and what it actually does. Verified against the current source; where a route's label in the sidebar doesn't match the page family you'd expect, that's called out explicitly below.

How to read this page

Two page families coexist by design (see architecture.md):

  • Pro (src/pages/control/*), the corrected, complete-control surface. Uses lib/bq.ts. This is where new work happens.
  • Classic (src/pages/*, first-gen), the original read-mostly view pages. Uses lib/api.ts. Kept intact per the additive rule; not actively extended.

Every nav-reachable route now serves a Pro page except /settings (the only settings page, shared by both families) and /alerts (client-side alert rules). Each classic page remains routable at a -classic suffix.

Route table (from src/App.tsx)

PathComponentFamilyClient
/control/OverviewProProbq
/overview-classicOverviewClassicapi
/queuescontrol/QueuesOverviewProbq
/queues/:namecontrol/QueueDetailProProbq
/queues-classicQueuesClassicapi
/queues-classic/:nameQueueDetailClassicapi
/jobscontrol/JobsProProbq
/jobs-classicJobsClassicapi
/dlqcontrol/DlqProProbq
/dlq-classicDlqClassicapi
/croncontrol/CronManagerProbq
/cron-managerredirect → /cronn/a (legacy alias)n/a
/cron-classicCronClassicapi
/flowscontrol/FlowsProbq
/metricscontrol/MetricsProProbq
/metrics-classicMetricsClassicapi
/workerscontrol/WorkersProProbq
/workers-classicWorkersClassicapi
/logscontrol/LogsProProbq + SSE
/logs-classicLogsClassicapi
/servercontrol/ServerControlProbq (+ control agent)
/add-jobcontrol/AddJobProbq
/jobs/bulk-addcontrol/BulkAddJobsProbq
/jobcontrol/JobInspectorProbq
/queue-controlcontrol/QueueControlProbq
/dlq-controlcontrol/DlqControlProbq
/webhookscontrol/WebhooksProbq
/diagnosticscontrol/DiagnosticsProbq
/alertsAlertsClient-side rules (see below)alertsStore + useAlertEngine
/benchmarkcontrol/BenchmarkProbq
/databasecontrol/DatabasePro, read-only SQLite inspector via the control agent's /db/* endpointsbq.db (agent)
/mcpcontrol/McpServerPro (static setup guide)none
/usagecontrol/UsageProProbq
/usage-classicUsageClassicapi
/s3control/S3BackupProProbq + s3Store
/s3-classicS3BackupClassicapi
/settingsSettingsClassic (the only settings page)api, connectionStore, themeStore
*NotFoundn/an/a

/cron-manager was a duplicate route serving the same CronManager page as /cron; it is now a <Navigate replace> redirect to /cron so old bookmarks keep working.

src/components/layout/Sidebar.tsx (NAV, also consumed by the Cmd/Ctrl-K command palette) groups nav items into four sections plus the root Overview:

  • Queues: Queues (QueuesOverview) · Jobs (JobsPro) · Dead Letter Queue (DlqPro) · Cron Jobs (CronManager) · Flows.
  • Monitoring: Metrics (MetricsPro) · Workers (WorkersPro) · Logs (LogsPro) · Alerts.
  • Control: Server · Add Job · Bulk Add · Job Inspector · Queue Control · DLQ Control · Webhooks · Diagnostics · Benchmark, all Pro, all bq.
  • Management: Database · MCP · Usage (UsagePro) · S3 Backup (S3BackupPro) · Settings (classic).

There are still three DLQ pages (DlqPro at /dlq, DlqControl at /dlq-control, classic Dlq at /dlq-classic), intentional per the additive rule, not an oversight: /dlq is the cross-queue dashboard, /dlq-control the single-queue triage surface.

Home & Control (Pro, bq)

RoutePageBehaviour
/OverviewProConnection banner (host · uptime · RAM) that flips to an amber "Connection lost, showing last known data / Stale" state when a poll fails after the first success; two rows of stat cards, a Queue Health grid, and a live Recent Activity feed from useActivityStream().
/serverServerControlStart/Stop/Restart via the control agent (amber "agent unreachable" banner + disabled lifecycle buttons when the agent poll dies); storage row (SQLite main/WAL/total-on-disk/last-modified); always-editable config form with port validation, a "Save & restart" shortcut and a "restart to apply" hint; colour-coded live process-log tail (stdout/stderr/sys).
/add-jobAddJobEnqueue with full options (priority/delay/maxAttempts/backoff/timeout/jobId/removeOnComplete/removeOnFail/durable/lifo), single or bulk via a Count field (validated, ≤10000; bulk with a custom ID reports the real deduped created count).
/jobs/bulk-addBulkAddJobsBulk enqueue: paste a JSON array or NDJSON (one JSON value per line), validated client-side, submitted via bq.addJobsBulk.
/jobJobInspectorLook up a job by ID (deep-linkable via ?id=). Kv overview, Data (editable), Result (fetched separately via GET /jobs/:id/result), Error + stacktrace, Timeline (persisted state transitions, capped at 20), Backoff schedule preview, job logs, children. Actions gated by the job's actual state via lib/jobActions.ts::actionGates. 404 ("Job not found") is distinguished from network/5xx errors.
/queue-controlQueueControlPer-queue counts; Lifecycle card (pause/resume/drain/retry-completed/promote-delayed/clean, destructive ops confirmed with target + counts); Limits cards (rate-limit, concurrency); Stall-detection and DLQ-policy forms (re-seeded per queue via key={queue}, errors surfaced inline).
/cronCronManagerCreate a schedule (cron expression or interval-in-ms, mutually exclusive via a segmented control, with a client-side next-runs preview) and list/delete existing ones.
/dlq-controlDlqControlSingle-queue DLQ triage: entries table (job id linked to the Job Inspector, reason, error, attempts, entered), Retry-all / Retry-one / Purge with confirmation.
/dlqDlqProCross-queue DLQ dashboard: totals/top-reason cards, a clickable per-queue DLQ-count grid, then a filtered (reason + search) + sortable, server-paginated entries table for the selected queue, with Retry-all/Purge-all and per-row Retry.
/webhooksWebhooksCreate (URL, optional queue scope, optional HMAC secret, event checkboxes from WEBHOOK_EVENTS), list with success/failure counts and last-triggered, enable/disable toggle, delete (confirmed).
/diagnosticsDiagnosticsHealth/version/uptime/disk cards, a manual Ping button (round-trip ms), WS/SSE client counts, storage error, memory (heap/RSS), lifetime totals.
/benchmarkBenchmarkInteractive load benchmark: push and/or drain (pull-batch + ack-batch) against a queue in count or duration mode, presets, live throughput chart, run history. Logic in control/benchmark/ (engine, useBenchmark, RunHistory).
/flowsFlowsClient-side DAG visualizer for a job flow (parent/children/dependsOn) with its own layout engine (lib/flowLayout.ts, no graph library).
/databaseDatabaseRead-only SQLite inspector over the agent: tables, schema/indexes/DDL, sortable + filterable data grid, row detail drawer, and a query runner (SELECT-only allowlist, 500-row cap, history, EXPLAIN, CSV/JSON export).
/mcpMcpServerStatic setup/reference guide for the bunqueue-mcp stdio MCP server: config snippets with copy buttons, not a live monitor.

Queues / Jobs / Metrics / Logs / Usage / S3 (Pro, bq)

RoutePageBehaviour
/queuesQueuesOverviewQueue list over bq.queuesSummary() (search, totals, client-side pagination); click a row to drill into QueueDetailPro.
/queues/:nameQueueDetailProSingle-queue drill-in on the same building blocks as QueueControl, plus obliterate, a live backlog-depth sparkline, recent jobs, and jump-off links to this queue's Jobs and DLQ views.
/jobsJobsProSingle-queue, server-paginated job explorer: queue + status filters, stat cards, checkbox multi-select. Row and bulk actions are state-gated via the shared actionGates; bulk actions run Promise.allSettled and report "N succeeded, M failed" honestly.
/metricsMetricsProLive throughput area chart (rolling 60s via useThroughputSeries), error/success-rate gauge, server-overview Kv list, per-queue counts table. Latency strip reads the real per-operation percentiles (push/pull/ack × p50/p95/p99).
/logsLogsProPaginated, filterable (queue/status/search) view over the same live SSE stream useActivityStream drives on OverviewPro, a fuller UI over the identical 250-event ring buffer, not a separate data source.
/workersWorkersProRegistered-workers table over bq.workers(), with active/stale status and a confirmed per-row Unregister. Caps at 100 rows with a truncation hint.
/usageUsageProCumulative totals, error rate, runtime, and an honest Storage health card from bq.storage() (red "Disk full, writes suspended" when diskFull). Renders uptime correctly (stats.uptime is ms).
/s3S3BackupProLocal-only (s3Store) form to assemble S3-compatible backup settings; bunqueue OSS reads these from server environment variables, so this page cannot push them to the server. "Test Connection" calls bq.storage(); "Backup Now" is permanently disabled (no server endpoint).

Alerts (client-side)

/alerts (src/pages/Alerts.tsx + alertsStore) manages threshold rules and channels; the rules are evaluated in the browser by useAlertEngine (mounted app-wide via AlertEngine): 15s poll, edge-triggered breach detection, per-rule cooldown, in-app toast + optional desktop Notification. Delivery channels (email/webhook/slack) have no backend in bunqueue OSS, so see known-issues.md for the real limits.

First-gen view pages (Classic, api)

These predate the Pro pages and are kept intact per the additive rule. All are off-nav (-classic routes) and superseded by a Pro page; several render wrong data by design of the old client, so see known-issues.md before treating anything below as a fresh bug.

RoutePageBehaviour
/overview-classicOverviewStat cards + throughput + resources + a compact workers/crons summary. Renders uptime ×1000 too large.
/queues-classicQueuesFull queue list with client-side name search; header cards only sum the current page.
/queues-classic/:nameQueueDetailSingle-queue drill-in: pause/resume/drain/obliterate, counts, recent jobs, embeds pages/queue/QueueConfig.tsx.
/jobs-classicJobsSame shape as JobsPro minus multi-select/bulk; Duration/Name columns are dead (reads fields real jobs don't have); polls the full queue list every 3s.
/dlq-classicDlqSingle-queue DLQ table reading the flat, uncorrected DlqEntry type, which renders wrong for real entries and crashes on a non-empty DLQ ({e.attempts} as a React child).
/cron-classicCronList + delete only (no create form, use /cron).
/metrics-classicMetricsKv dumps of the raw /dashboard payload (latency/collections/totals/memory), useful for inspecting the raw shape.
/workers-classicWorkersRegistered-workers table, no status/unregister.
/logs-classicLogsSame SSE feed as LogsPro, no pagination, "Job Name" column permanently "unknown".
/usage-classicUsageCumulative totals + runtime + storage; storage row reads a shape /storage doesn't return (always "Healthy") and uptime is ×1000 too large.
/s3-classicS3BackupRead-only storage status + a static list of the server env vars that configure S3 backup.

Settings

/settings (Settings, classic) is the only settings page, used by both families: connection (baseUrl buffered until Save, server bearer token, agent token, "Test connection" round-trip), theme, and poll-refresh interval.

Layout shell (every route)

App.tsx wraps every route above in one AppLayout (Sidebar + Topbar + <Outlet/>), with two error boundaries (app-wide + per-page, reset on any navigation) and a single <Suspense> around the outlet so the shell never blanks during a lazy-chunk load. See architecture.md for the shell and components.md for Sidebar/Topbar/SidebarFooter details.

Drives a bunqueue server over its public HTTP API plus a local control agent.