{"id":47619257,"url":"https://github.com/tvup/claude-board","last_synced_at":"2026-04-01T21:54:11.364Z","repository":{"id":343874234,"uuid":"1179505512","full_name":"tvup/claude-board","owner":"tvup","description":"Real-time OTLP telemetry dashboard for Claude Code sessions — web UI + terminal CLI","archived":false,"fork":false,"pushed_at":"2026-03-20T00:45:20.000Z","size":665,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-20T06:27:36.526Z","etag":null,"topics":["claude","claude-code","dashboard","developer-tools","laravel","monitoring","opentelemetry","otlp","php","telemetry"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tvup.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-12T05:02:06.000Z","updated_at":"2026-03-19T22:53:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tvup/claude-board","commit_stats":null,"previous_names":["tvup/claude-board"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/tvup/claude-board","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tvup%2Fclaude-board","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tvup%2Fclaude-board/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tvup%2Fclaude-board/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tvup%2Fclaude-board/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tvup","download_url":"https://codeload.github.com/tvup/claude-board/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tvup%2Fclaude-board/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292621,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude","claude-code","dashboard","developer-tools","laravel","monitoring","opentelemetry","otlp","php","telemetry"],"created_at":"2026-04-01T21:54:09.143Z","updated_at":"2026-04-01T21:54:11.352Z","avatar_url":"https://github.com/tvup.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Claude Board\n\n[![Tests](https://github.com/tvup/claude-board/actions/workflows/tests.yml/badge.svg)](https://github.com/tvup/claude-board/actions/workflows/tests.yml)\n[![Coverage](https://img.shields.io/endpoint?url=https://tvup.github.io/claude-board/badge.json)](https://tvup.github.io/claude-board/)\n\nReal-time telemetry dashboard for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). Receives OpenTelemetry (OTLP) metrics and logs, stores them in SQLite, and displays session activity, token usage, cost estimates, tool performance, and more — via a web UI and a terminal CLI.\n\nBuilt with Laravel 12, Tailwind CSS v4, and vanilla JavaScript. No frontend framework required.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\u003cstrong\u003eWeb Dashboard\u003c/strong\u003e\u003cbr\u003e\n\u003cimg src=\"docs/screenshots/dashboard.png\" alt=\"Dashboard overview\" width=\"100%\"\u003e\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\u003cstrong\u003eSession Detail\u003c/strong\u003e\u003cbr\u003e\n\u003cimg src=\"docs/screenshots/session-detail.png\" alt=\"Session detail view\" width=\"100%\"\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\u003cstrong\u003eTerminal CLI\u003c/strong\u003e\u003cbr\u003e\n\u003cimg src=\"docs/screenshots/cli-dashboard.png\" alt=\"CLI dashboard\" width=\"100%\"\u003e\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Features\n\n- **OTLP receiver** — Ingests metrics and logs from Claude Code via standard OpenTelemetry HTTP/JSON protocol\n- **Live web dashboard** — Auto-refreshing (5s) dark-themed UI with session overview, cost breakdown, token analysis, tool usage, and event stream\n- **Session detail view** — Per-session metrics, events timeline, activity status with real-time polling, and session merging\n- **Terminal CLI** — Full dashboard in your terminal with `php artisan dashboard:show` (supports `--watch` for live updates)\n- **Billing awareness** — Distinguishes subscription (flat-rate) vs. API (pay-per-use) billing, configurable globally or per-project via OTLP resource attributes\n- **Multi-language** — English and Danish (easily extensible)\n- **Locale-aware formatting** — Numbers, currency, dates, and relative times adapt to the configured locale\n\n## Architecture\n\n```\nClaude Code  ──[OTLP http/json]──▶  POST /v1/metrics, /v1/logs (OtlpController)\n                                              │\n                                              ▼\n                                          SQLite DB\n                                              │\n                                 ┌────────────┼────────────┐\n                                 │                         │\n                      DashboardController          DashboardShow (CLI)\n                                 │                         │\n                                 └──── shared query ───────┘\n                                    DashboardQueryService\n```\n\n## Quick Start\n\n### Requirements\n\n- PHP 8.4+\n- Composer\n- Node.js 18+ and npm\n\n### Installation\n\n```bash\ngit clone https://github.com/tvup/claude-board.git\ncd claude-board\ncomposer setup\n```\n\nThis runs `composer install`, copies `.env.example` to `.env`, generates an app key, runs migrations, and builds frontend assets.\n\n### Start the Development Server\n\n```bash\ncomposer dev\n```\n\nStarts the PHP server on `:8080`, queue worker, log viewer, and Vite dev server on `:5173`.\n\n#### With Laravel Sail\n\n```bash\nsail up\n```\n\nSail automatically starts the Vite dev server via a dedicated `node` service — HMR works out of the box on `:5173`.\n\nOr start components individually:\n\n```bash\nphp artisan serve --port=8080    # Web server\nnpm run dev                       # Vite (HMR for CSS/JS)\n```\n\n### Configure Claude Code to Send Telemetry\n\nIn the project where you use Claude Code, create or edit `.claude/settings.local.json`:\n\n```json\n{\n  \"env\": {\n    \"CLAUDE_CODE_ENABLE_TELEMETRY\": \"1\",\n    \"OTEL_METRICS_EXPORTER\": \"otlp\",\n    \"OTEL_LOGS_EXPORTER\": \"otlp\",\n    \"OTEL_EXPORTER_OTLP_PROTOCOL\": \"http/json\",\n    \"OTEL_EXPORTER_OTLP_ENDPOINT\": \"http://localhost:8080\",\n    \"OTEL_METRIC_EXPORT_INTERVAL\": \"10000\",\n    \"OTEL_RESOURCE_ATTRIBUTES\": \"project.name=my-project,billing.model=subscription\"\n  }\n}\n```\n\n| Attribute | Description |\n|-----------|-------------|\n| `project.name` | Label shown in the dashboard for this project |\n| `billing.model` | `subscription` (default) or `api` — controls how cost figures are labeled |\n\nOpen [http://localhost:8080](http://localhost:8080) and start a Claude Code session — data will appear within seconds.\n\n## CLI Dashboard\n\n```bash\nphp artisan dashboard:show                        # Summary dashboard\nphp artisan dashboard:show --watch                # Live mode (5s refresh)\nphp artisan dashboard:show --session=\u003cID\u003e         # Session detail\nphp artisan dashboard:show --delete=\u003cID\u003e          # Delete a session\nphp artisan dashboard:show --merge=\u003cSOURCE\u003e:\u003cTARGET\u003e  # Merge sessions\nphp artisan dashboard:show --reset                # Reset all data\n```\n\n## Development Simulator\n\nWhen developing locally without real Claude Code telemetry, use the built-in simulator to generate realistic fake data:\n\n```bash\nphp artisan dev:simulate                          # 2 sessions, normal speed\nphp artisan dev:simulate --sessions=4 --speed=2   # 4 sessions, double speed\nphp artisan dev:simulate --duration=0             # Run indefinitely\nphp artisan dev:simulate --projects=my-app        # Specific project name\n```\n\nWith Laravel Sail, the endpoint is auto-detected:\n\n```bash\nsail artisan dev:simulate --sessions=4 --speed=2\n```\n\nThe simulator sends standard OTLP payloads to the local server, exercising all dashboard features:\n\n- **Sessions** with status indicators (active/idle)\n- **Cost by model** — weighted distribution across Sonnet (70%), Opus (20%), Haiku (10%)\n- **Token breakdown** — input, output, cache read, cache creation\n- **Tool usage** — 8 tools with realistic success rates and durations\n- **Recent events** — user prompts, API requests, tool decisions/results, errors (3-5%)\n- **Session grouping** — 50% of completed sessions continue as new grouped sessions\n- **Lines of code** — added/removed counts on Write/Edit tool results\n- **Commits \u0026 PRs** — occasional commit (5%) and PR (2%) events\n\nStart the server first with `composer dev` (or `sail up`), then run the simulator in a separate terminal.\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `APP_LOCALE` | `en` | UI language: `en` or `da` |\n| `CLAUDE_BILLING_MODEL` | `subscription` | Global billing mode: `subscription` or `api` |\n| `APP_PORT` | `8080` | PHP server port |\n| `VITE_PORT` | `5173` | Vite dev server port |\n\n### Per-Project Billing Model\n\nThe billing model can be set per project via the `billing.model` OTLP resource attribute. Per-session values override the global `CLAUDE_BILLING_MODEL` setting. This allows mixing subscription and API projects in the same dashboard.\n\n## API Endpoints\n\n### OTLP Ingestion\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/v1/metrics` | OTLP metrics ingestion |\n| `POST` | `/v1/logs` | OTLP logs ingestion |\n\n### Dashboard\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/` | Web dashboard |\n| `GET` | `/api/dashboard-data` | JSON polling endpoint |\n| `GET` | `/sessions/{id}` | Session detail |\n| `GET` | `/api/sessions/{id}/activity` | Session activity JSON |\n| `DELETE` | `/sessions/{id}` | Delete session |\n| `POST` | `/sessions/{id}/merge` | Merge sessions |\n| `POST` | `/sessions/{id}/group` | Group sessions together |\n| `POST` | `/sessions/{id}/ungroup` | Remove session from group |\n| `DELETE` | `/reset` | Reset all data |\n\n## Docker\n\nPre-built images are published to GitHub Container Registry on every push to `master`.\n\n```bash\ndocker pull ghcr.io/tvup/claude-board:latest\n```\n\nRun with persistent SQLite storage:\n\n```bash\ndocker run -d \\\n  --name claude-board \\\n  -p 8080:8080 \\\n  -v claude-board-data:/data \\\n  ghcr.io/tvup/claude-board:latest\n```\n\nOr with Docker Compose:\n\n```yaml\nservices:\n  claude-board:\n    image: ghcr.io/tvup/claude-board:latest\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - claude-board-data:/data\n    environment:\n      APP_LOCALE: en\n\nvolumes:\n  claude-board-data:\n```\n\nPoint Claude Code's `OTEL_EXPORTER_OTLP_ENDPOINT` at the host running the container.\n\n## Tech Stack\n\n- **Backend:** PHP 8.4+, Laravel 12\n- **Database:** SQLite\n- **Frontend:** Tailwind CSS v4, Vite 7, vanilla JavaScript\n- **Protocol:** OpenTelemetry HTTP/JSON (OTLP)\n\n## Adding a Language\n\n1. Copy `lang/en/dashboard.php` to `lang/{locale}/dashboard.php`\n2. Translate all values\n3. Set `APP_LOCALE={locale}` in `.env`\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for details.\n\n## Security\n\nClaude Board is designed as a **local development tool** with no built-in authentication. Do not expose it to the public internet without adding your own auth layer. See [SECURITY.md](SECURITY.md) for details and vulnerability reporting.\n\n## Disclaimer\n\nThis project is not affiliated with, endorsed by, or officially connected to [Anthropic](https://www.anthropic.com/). \"Claude\" and \"Claude Code\" are trademarks of Anthropic, PBC. [OpenTelemetry](https://opentelemetry.io/) is a [CNCF](https://www.cncf.io/) project. This application simply implements the standard OTLP receiver protocol to display telemetry data that Claude Code can optionally emit.\n\n## Built With\n\nThis project was designed and built collaboratively by [Torben](mailto:contact@torbenit.dk) and [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (Anthropic's AI coding agent). The vast majority of the code — architecture, OTLP parsing, dashboard UI, CLI, security hardening, tests, and documentation — was authored by Claude Code under Torben's direction and review.\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT License. See [LICENSE](LICENSE) for the full text.\n\nCopyright (c) 2026 [Torben IT ApS](mailto:contact@torbenit.dk) (CVR 39630605)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftvup%2Fclaude-board","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftvup%2Fclaude-board","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftvup%2Fclaude-board/lists"}