# DevOpsDash Visual dashboard for [DevOpsMCP](https://devops-mcp.i80.dk) — built as a **separate service** so updates to DevOpsMCP never break the dashboard. Live at: **https://dash.i80.dk** ## Features - **Taskz** — Kanban board for all task boards (create/update tasks, add findings, change status/priority) - **Worklog** — Git commit timeline proxied from DevOpsMCP (egmont/personal/all, configurable date range) - **Standup** — AI-generated standup summary via DevOpsMCP - **Knowledge** — Browse ADRs, memories, and knowledge catalog files ## Stack - **Backend**: FastAPI (Python 3.11) - **Frontend**: Alpine.js + Tailwind CSS (CDN, no build step) - **Data**: Read-only access to DevOpsMCP's Redis + data directory (bind-mount) ## Architecture ``` DevOpsMCP (devops-mcp.i80.dk) DevOpsDash (dash.i80.dk) Redis ◄────────────────────────────── read same Redis /opt/devops-mcp/data (rw) ─────────► /data (read-only bind-mount) MCP HTTP API ──────────────────────── worklog proxy calls ``` ## Development ```bash # Copy .env.example cp .env.example .env # Edit DATA_DIR to point at local DevOpsMCP data directory # Install dependencies pip install -r requirements.txt # Run python -m uvicorn app.main:app --reload --port 8001 ``` Open http://localhost:8001 ## Deployment ```bash # Build + push image docker build -t registry.i80.dk/gitea/devops-dash:latest . docker push registry.i80.dk/gitea/devops-dash:latest # Deploy to Nomad # First: ensure the host volume exists on autobox.i80.dk # See devops-mcp.nomad for the DevOpsMCP side bind-mount setup scp devops-dash.nomad autobox.i80.dk:/tmp/ ssh autobox.i80.dk 'NOMAD_ADDR=https://nomad.i80.dk:4646 nomad job run /tmp/devops-dash.nomad' ``` ## Nomad Host Volume (one-time setup on autobox.i80.dk) Add to `/etc/nomad.d/client.hcl`: ```hcl host_volume "devops-mcp-data" { path = "/opt/devops-mcp/data" read_only = false } ``` Then restart Nomad. The DevOpsDash job mounts the same volume as read-only.