152 lines
4.9 KiB
Markdown
152 lines
4.9 KiB
Markdown
---
|
|
project: work-index-dashboard
|
|
type: project-plan
|
|
status: active
|
|
path: Tech/Projects
|
|
tags:
|
|
- pbs
|
|
- homelab
|
|
- dashboard
|
|
- mcp
|
|
- trello
|
|
- obsidian
|
|
created: 2026-04-27
|
|
updated: 2026-04-27
|
|
---
|
|
# Work-Index Dashboard
|
|
|
|
A queryable index over the vault, Trello, and (later) Claude Code session
|
|
logs. Static HTML dashboard for daily use, MCP read/write API for agents to
|
|
use the same data layer.
|
|
|
|
## Why
|
|
|
|
The vault is already unwieldy at ~20 files. Frontmatter is invisible in the
|
|
default file list, sorting and filtering aren't possible, and nothing
|
|
connects the vault to live project state in Trello or Claude Code sessions.
|
|
The result: "what did I commit to next" can't be answered without opening
|
|
multiple tools and reading individual files.
|
|
|
|
This project closes that gap with a single dashboard surface, joined on
|
|
`project` slug across all three sources, plus an MCP server so agents can
|
|
read and write through the same layer.
|
|
|
|
## Primary use case
|
|
|
|
**"What did I commit to next."** Open the dashboard at the start of a work
|
|
session, see the current project list with active commitments, pick
|
|
something up. Commitment tracker, not activity feed.
|
|
|
|
Secondary use cases (v2): "I'm lost, what was the last decision" and "what
|
|
loose threads have I left in session notes that never made it to Trello."
|
|
|
|
## Architecture
|
|
|
|
Three-source join on project slug:
|
|
|
|
- **Vault** — frontmatter (`project`, `status`, `type`, `tags`, `created`,
|
|
`updated`, `path`) read directly from `.md` files
|
|
- **Trello** — single board, one label per project slug, cards as
|
|
commitments
|
|
- **Session notes** (v2) — markdown files under each project, written by
|
|
Claude Code sessions
|
|
|
|
The data layer is plain Python. The dashboard renders it as HTML. The MCP
|
|
server exposes it as tools. Same functions, three surfaces.
|
|
|
|
## Stack
|
|
|
|
- Python managed via `uv`
|
|
- FastAPI (long-running process; MCP server eventually shares it)
|
|
- Jinja2 templates
|
|
- HTMX for interactions without a JS framework
|
|
- Tailwind for styling
|
|
- `py-trello` for Trello API (swap to `httpx` direct calls if it gets in
|
|
the way)
|
|
- `.env` for credentials
|
|
- In-memory cache for Trello responses (~60s TTL) so refreshes feel instant
|
|
|
|
## Phasing
|
|
|
|
### v1 — dashboard
|
|
|
|
- Data layer: read vault frontmatter, read Trello cards by label
|
|
- Dashboard view: current project list with status, last vault update, open
|
|
Trello cards, links out to vault folder and Trello board
|
|
- On-demand refresh (no cron, no event-driven)
|
|
- Develop on bare metal on herbys-dev
|
|
- Deploy to Docker behind Traefik for the v1 cutover
|
|
|
|
### v2 — session notes integration
|
|
|
|
- Extend data layer to read session notes from each project
|
|
- Add "recent sessions" column to the project list
|
|
- Add "loose threads" view: `- [ ]` checkboxes in session notes that have
|
|
no matching Trello card
|
|
- Add search across session notes for the "I'm lost" case
|
|
|
|
### v3 — MCP server
|
|
|
|
- Wrap the same data layer as MCP tools
|
|
- Read tools: `get_projects`, `get_project_sessions`, `get_trello_cards`,
|
|
`search_sessions`
|
|
- Write tools: `log_session`, `update_project_status`, `create_vault_note`,
|
|
`update_card_status`, `create_card`
|
|
- stdio transport, local Claude Code only
|
|
- Closes the loop: sessions write structured logs and Trello updates
|
|
through MCP, dashboard reads the new state on next refresh
|
|
|
|
## Out of scope (v1)
|
|
|
|
- Graph visualization (revisit once queries are validated)
|
|
- Live updates (websockets, file watchers)
|
|
- Auth (homelab-internal, behind Traefik)
|
|
- Write-back from the dashboard UI
|
|
|
|
## Tasks
|
|
|
|
### v1
|
|
- [ ] Scaffold FastAPI project with uv
|
|
- [ ] Implement vault frontmatter reader
|
|
- [ ] Implement Trello client wrapper using py-trello, label-based filtering
|
|
- [ ] Build join layer keyed on project slug
|
|
- [ ] Build project list view with Jinja + Tailwind
|
|
- [ ] Add HTMX-based refresh interaction
|
|
- [ ] Add in-memory cache with TTL for Trello calls
|
|
- [ ] Write Dockerfile
|
|
- [ ] Add Traefik labels and deploy to herbys-dev
|
|
|
|
### v2
|
|
- [ ] Extend data layer with session note reader
|
|
- [ ] Add recent-sessions column to project list
|
|
- [ ] Build loose-threads view (unfiled `- [ ]` items)
|
|
- [ ] Add session search view
|
|
|
|
### v3
|
|
- [ ] Scaffold MCP server alongside FastAPI app
|
|
- [ ] Implement read tools wrapping the data layer
|
|
- [ ] Implement write tools (vault, sessions, Trello)
|
|
- [ ] Configure Claude Code to use the MCP server
|
|
- [ ] Update CLAUDE.md conventions to call `log_session` at end of sessions
|
|
|
|
## Open questions
|
|
|
|
- Trello label naming — exact slug match, or prefixed (e.g.
|
|
`proj:work-index-dashboard`)?
|
|
- Where session notes live in each project repo —
|
|
`docs/sessions/YYYY-MM-DD.md` vs. another convention
|
|
- Dashboard hostname once Traefik routing is set up
|
|
|
|
## Success criteria
|
|
|
|
v1 ships when:
|
|
- Dashboard loads in under a second on herbys-dev
|
|
- It correctly shows every active project with its Trello commitments
|
|
- It's used at the start of a work session at least three times in the
|
|
first week
|
|
|
|
If it isn't opened, it isn't earning its keep, and the design is wrong
|
|
before more layers get added on top.
|
|
|
|
|
|
...sent from Jenny & Travis |