# CI Observer Compact Dump

## Current Production (authoritative)
- Server path: `/webapps/ci-observer-dashboard-prod`
- Container: `ci-observer-dashboard-prod`
- Port: `8089 -> 8088`
- Deploy branch: `main`
- Health check: `curl -s http://127.0.0.1:8089/api/config`

## Stack
- FE: HTML + CSS + Vanilla JavaScript
- BE: Python + FastAPI
- FE-BE bridge: REST API (`/api/runs`, `/api/filters`, `/api/config`)
- Data layer: SQLite + GitHub Actions API

## Required Env
- `GITHUB_TOKEN`
- `GH_REPOS`
- `GH_WORKFLOWS` (required for polling in current logic)
- `REFRESH_SECONDS`
- `DASHBOARD_TITLE`

## Key Features in main
- Metadata-rich run cards (event, actor, author, commit SHA, message, date, duration)
- Repo short name display (without org prefix)
- Race-style clock (`HH:MM:SS.cc`) + date in same panel
- Light mode toggle (hanging bulb), default dark, preference in localStorage
- Light mode contrast tuned for pass/fail (medium)

## Recent Important Commits on main
- `689a78c` merge: metadata cards + race clock
- `a719b7d` docs: runbook + architecture + stack overview
- `d33f96e` merge: light mode toggle + contrast tuning

## Standard Production Update
```bash
cd /webapps/ci-observer-dashboard-prod
git checkout main
git pull
docker compose up -d --build
```

## Troubleshooting Fast Path
- UI loads but no runs:
  - check `.env` (`GH_WORKFLOWS` not empty)
  - `docker compose up -d --build`
- FE change not visible:
  - browser hard refresh `Ctrl+Shift+R`

## Test Workflow Pattern
- Create isolated test folder: `/webapps/ci-observer-dashboard-<feature>`
- Use separate port (e.g. 8090)
- Validate, then merge to `main`, deploy prod, cleanup test folder

## Canonical Docs
- `docs/OPERATIONS_RUNBOOK.md`
- `docs/ARCHITECTURE.md`
- `docs/STACK_OVERVIEW.md`
- `ci-observer-handover/AGENTS.md`
