The Overview board is a library of "boxes", each in its own file under apps/dashboard/src/components/boxes/ exporting a TileDef. Adding a box is intentionally a one-file change plus one line in boxes/index.ts.
Great candidates for new boxes:
- Bounce-rate over time (line/area)
- New vs returning visitors (stacked)
- Top entry / exit pages
- Browser / OS breakdown
- Hourly heatmap (day-of-week × hour)
- Scroll-depth or time-on-page distribution
How to add one:
- Copy an existing box (e.g.
PagesBox.tsx for a list, EventsBox.tsx for a KPI).
- Implement
render(ctx, expanded) using the shared TileContext; add an optional table(ctx) for the "view as table" toggle.
- Register it in
boxes/index.ts.
Data plumbing lives in the TileContext (see boxes/types.ts). Reuse ListBody/rowsTable from boxes/shared.tsx where it fits. Pick any one box and open a PR — each is self-contained.
The Overview board is a library of "boxes", each in its own file under
apps/dashboard/src/components/boxes/exporting aTileDef. Adding a box is intentionally a one-file change plus one line inboxes/index.ts.Great candidates for new boxes:
How to add one:
PagesBox.tsxfor a list,EventsBox.tsxfor a KPI).render(ctx, expanded)using the sharedTileContext; add an optionaltable(ctx)for the "view as table" toggle.boxes/index.ts.Data plumbing lives in the
TileContext(seeboxes/types.ts). ReuseListBody/rowsTablefromboxes/shared.tsxwhere it fits. Pick any one box and open a PR — each is self-contained.