MC Dashboards (Mission Control cross-board dashboards)
A workspace-scoped dashboard that pulls data from several Mission Control boards into one view: a drag-and-resize grid of widgets, a filter toolbar that scopes every widget at once, and export. Covers creating one, the widget types, and how board access is enforced.
What it is
A workspace-scoped dashboard that computes every widget client-side over the already-loaded board data, with a drag-and-resize grid, toolbar controls, and export. Part of Mission Control Phase 4d.
What it does
Create dashboards that aggregate data from multiple boards into a single view. Each dashboard is scoped to a workspace and isolated by account (a foreign board id in the config just 404s, never leaks data). Dashboards support several widget types: Numbers (abbreviated figures like $378k), Chart (bar / column / pie / donut / line), and three sprint-related widgets: Velocity, Planned-vs-unplanned, and Burndown (frontend-computed from configured sprint/effort/done/date columns; Velocity is faithful, the other two are documented approximations since there's no sprint-history backend). Battery/Table/Apps remain in code but are off the add-widget menu.
Where to find it
Open Mission Control, then the Dashboards section in its left nav. From there the + button creates one and + Add widget builds it up.
How it behaves
How to use it
- Open Mission Control and click the "Dashboards" section in the left nav
- Click + to create a new dashboard
- Use the + Add widget dropdown to add widgets
- Connect boards via the N connected boards button (opens a connect-boards modal)
- Drag widgets to reposition, resize by dragging edges
- Use toolbar controls: People and Filter to scope widget data, Export to save as PNG or print-to-PDF
Key features
| Feature | Detail |
|---|---|
| Grid layout | react-grid-layout with per-widget {x,y,w,h} stored in config |
| Autosave | Draft + debounced-autosave model (no Edit/View toggle) |
| People/Filter toolbar | config.filters scope every widget's data via shared applyFilters; a rule only constrains boards that have its column |
| Export | Rasterizes the grid with html-to-image (PNG / print-to-PDF) |
| Invite | Reuses the member directory |
| Publish to Web | Dashboard header has a publish button (Phase 9b) |
Data model
dashboards table (workspace-scoped + account-isolated like boards) with an opaque config JSONB (boardIds + widgets). CRUD goes over the Mission Control backend's /dashboards REST routes — the client in src/plugins/mission-control/web/features/dashboard/dashboardsApi.ts calls GET /dashboards?workspaceId=, POST /dashboards, and GET / PATCH / DELETE /dashboards/:id. The backend lives in the separate amc-back repo, not in this tree. The DashboardPage computes every widget client-side over the existing ownership-checked GET /boards/:id/full.
For agents
Key files
src/plugins/mission-control/web/features/dashboard/(all dashboard components)src/plugins/mission-control/web/features/dashboard/DashboardPage.tsx(main page)src/plugins/mission-control/web/features/dashboard/DashboardHeader.tsx(header with export/invite)src/plugins/mission-control/web/features/dashboard/DashboardPublishButton.tsx(publish to web)
Tests
Pure logic (dashboardLayout / sprintData / dashboardFilter) is unit-tested. Design spec: docs/superpowers/specs/mission-control-dashboard-redesign-design.md.
Related
See also
- mission-control.md (parent page)
- INDEX.md
Last verified 2026-10-06