Plans007 2026 02 20 Dashboard Service
Completed
- T-001: Scaffold @services/dashboard config files
- T-002: Update NETWORK.yml with dashboard entry
- T-003: src/styles.css and src/router.tsx
- T-004: Seed src/routeTree.gen.ts
- T-005: src/routes/__root.tsx and src/routes/_app.tsx
- T-006: lib/duck.ts — DuckDB server helper
- T-007: lib/db.ts — Drizzle/LibSQL server helper
- T-008: src/routes/_app/index.tsx — Overview
- T-009: src/routes/_app/revenue.tsx — Revenue Comparison
- T-010: src/routes/_app/orders.tsx — Key Comparison
- T-011: src/routes/_app/programs.tsx — Program Progress
- T-012: src/routes/_app/schools.tsx — School Progress
- T-013: src/routes/_app/marketing.tsx — Channel Marketing
- T-014: src/routes/_app/students.$id.tsx — Student Profile
- T-015: src/routes/_app/organizations.$id.tsx — Organization Detail
- T-016: bun install + type-check
- T-017: Update AGENTS.md
- T-018: Dev server verification
In Progress
- None
Blocked
- None
Pending
- None
Learnings
- TanStack Start pathless _app routes map to /, /revenue, /orders, etc. and conflict with a separate root index.tsx — resolved by keeping only the _app layout.
- @duckdb/node-api requires excluding DuckDB bindings from Vite dep optimization to avoid .node prebundle errors.
- Missing mart tables are handled gracefully in duck.ts — routes return empty state (HTTP 200) instead of crashing.
- All routes verified: / /revenue /schools /marketing return HTTP 200 with real mart data from atlas.db.
- mart_revenue for 2026-02: REAL Rp357M, NP Rp144M, ICC Rp79M, WLC_NON_ENGLISH Rp70M, TM Rp43M, WLC_ENGLISH Rp38M.
- mart_channel_marketing: KBM 44.78% contribution, Social Media 43.28% for Feb 2026.
Questions
- None
Next
- Optional: run bun run dev --filter @services/dashboard and do a full browser walkthrough of all 8 routes
- Optional: populate atlas-ops.db with real person/order data (requires sync → operational layer integration, future plan)
- Optional: add a period selector that persists via URL search params