{"id":47626178,"url":"https://github.com/getopsdeck/opsdeck","last_synced_at":"2026-04-01T22:48:53.456Z","repository":{"id":346066283,"uuid":"1188373142","full_name":"getopsdeck/opsdeck","owner":"getopsdeck","description":"Monitor all your Claude Code sessions from a single terminal","archived":false,"fork":false,"pushed_at":"2026-03-22T15:52:51.000Z","size":2799,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T18:25:21.275Z","etag":null,"topics":["bubbletea","claude-code","dashboard","developer-tools","go","monitoring","terminal","tui"],"latest_commit_sha":null,"homepage":"https://github.com/getopsdeck/opsdeck","language":"Go","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/getopsdeck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-22T01:31:04.000Z","updated_at":"2026-03-22T15:52:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/getopsdeck/opsdeck","commit_stats":null,"previous_names":["getopsdeck/opsdeck"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/getopsdeck/opsdeck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getopsdeck%2Fopsdeck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getopsdeck%2Fopsdeck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getopsdeck%2Fopsdeck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getopsdeck%2Fopsdeck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getopsdeck","download_url":"https://codeload.github.com/getopsdeck/opsdeck/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getopsdeck%2Fopsdeck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292703,"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":["bubbletea","claude-code","dashboard","developer-tools","go","monitoring","terminal","tui"],"created_at":"2026-04-01T22:48:52.354Z","updated_at":"2026-04-01T22:48:53.441Z","avatar_url":"https://github.com/getopsdeck.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpsDeck\n\n[![CI](https://github.com/getopsdeck/opsdeck/actions/workflows/ci.yml/badge.svg)](https://github.com/getopsdeck/opsdeck/actions)\n[![Release](https://img.shields.io/github/v/release/getopsdeck/opsdeck)](https://github.com/getopsdeck/opsdeck/releases)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Go Report](https://goreportcard.com/badge/github.com/getopsdeck/opsdeck)](https://goreportcard.com/report/github.com/getopsdeck/opsdeck)\n\n**Chief of Staff for Claude Code** — monitor all your sessions from a single terminal.\n\n![OpsDeck Demo](demo.gif)\n\nRunning 8+ Claude Code sessions? Lost track of which one is waiting for you,\nwhich one is still working, and which one crashed 20 minutes ago?\n\nOpsDeck gives you a real-time TUI dashboard, a browser-based web dashboard,\ndaily briefs, productivity metrics, cost analytics, and an AI-powered morning\nsummary — all from a single Go binary with zero config.\n\n```\n OpsDeck                                               12 sessions | 3 projects\n--------------------------------------------------------------------------------\n  PROJECT          SESSION     STATE      STARTED    LAST ACTIVITY\n--------------------------------------------------------------------------------\n\n  opsdeck/\n    abc1234         PID 9812   BUSY       14:02      Implementing TUI styles\n    def5678         PID 9834   WAITING    13:45      Tests passing, awaiting input\n\n  my-api/\n    fed8765         PID 8201   BUSY       12:30      Refactoring auth middleware\n    cba4321         PID 8244   BUSY       12:32      Writing integration tests\n    aaa1111         PID 8290   IDLE       11:15      Last: updated README\n    bbb2222         PID 8301   DEAD        9:40      --\n\n  frontend/\n    cc33333         PID 7100   WAITING    14:10      Waiting for approval\n    dd44444         PID 7112   BUSY       14:08      Running test suite\n    ee55555         PID 7150   IDLE       10:22      Last: fixed CSS layout\n    ff66666         PID 7200   DEAD        8:15      --\n    gg77777         PID 7250   WAITING    13:55      Ready for next task\n    hh88888         PID 7300   BUSY       14:12      Deploying to staging\n\n--------------------------------------------------------------------------------\n  j/k navigate | / search | 1 waiting 2 busy 3 idle 4 dead | Tab view | q quit\n```\n\n## Install\n\n```bash\ngo install github.com/getopsdeck/opsdeck/cmd/opsdeck@latest\n```\n\nOr download a binary from the [releases page](https://github.com/getopsdeck/opsdeck/releases).\n\nRequires Go 1.26+ for source builds. No other dependencies.\n\n## Quick Start\n\n```bash\nopsdeck\n```\n\nThat is it. No config files, no setup, no flags. OpsDeck finds your Claude Code\nsessions automatically and starts showing them.\n\n## Commands\n\n```bash\n# Real-time TUI dashboard (default)\nopsdeck\n\n# Daily briefing — what happened across all your projects\nopsdeck brief\nopsdeck brief --since 2h    # last 2 hours only\nopsdeck brief --since 48h   # last 2 days\n\n# Productivity metrics — today vs yesterday comparison\nopsdeck metrics\n\n# One-line status — for shell prompts or tmux\nopsdeck status\n\n# List all sessions — compact overview\nopsdeck list               # or: opsdeck ls\nopsdeck list --json        # JSON output for scripting\n\n# Cost analytics — powered by ccusage (https://github.com/ryoppippi/ccusage)\nopsdeck costs              # delegates to npx ccusage --breakdown\nopsdeck costs session      # per-session breakdown\nopsdeck costs monthly      # monthly aggregation\nopsdeck costs --instances  # per-project breakdown\n\n# AI-powered brief — natural language morning summary (opt-in, costs tokens)\nopsdeck ai-brief\n\n# Export brief to markdown file\nopsdeck export\n\n# Show dead sessions for cleanup\nopsdeck clean\n\n# Resume a session — opens claude --resume in the session's directory\nopsdeck resume \u003csession-id\u003e\nopsdeck resume 2820          # prefix match\n\n# Watch mode — monitor sessions, alert on state changes\nopsdeck watch                # macOS desktop notifications included\n\n# MCP server — let Claude Code query your sessions\nopsdeck mcp-serve            # JSON-RPC over stdio\n# Register: claude mcp add opsdeck -- opsdeck mcp-serve\n# Tools: get_sessions, get_brief, get_costs, get_session_detail\n\n# Web dashboard — browser-based UI with real-time updates\nopsdeck web                # opens http://localhost:7070\nopsdeck web :8080          # custom port\n\n# Version\nopsdeck version\n```\n\n## Features\n\n- **Auto-discovery** -- finds all Claude Code sessions on your machine by\n  scanning `~/.claude/sessions/` and the sessions index\n- **Real-time status** -- classifies each session as busy (active in last 30s),\n  waiting (30s--5min, likely needs you), idle (5min+), or dead (process gone)\n- **Project grouping** -- sessions are grouped by working directory so you can\n  see all sessions for a given project at a glance\n- **Keyboard driven** -- vi-style navigation (j/k), search (/), numeric state\n  filters (1--4), tab to switch views\n- **Auto-refresh** -- dashboard updates every 3 seconds; press `r` to force\n- **Zero config** -- no YAML, no ENV vars, no API keys\n- **Read-only** -- OpsDeck only reads session data; it never modifies sessions\n  or sends signals to processes\n- **Local-only** -- all data stays on your machine; nothing is sent anywhere\n- **Web dashboard** -- `opsdeck web` opens a browser-based view with SSE\n  real-time updates, same data, same dark theme\n\n### Web Dashboard\n\n![OpsDeck Web Dashboard](web-dashboard.png)\n\n## Keyboard Shortcuts\n\n| Key       | Action                          |\n|-----------|---------------------------------|\n| `j` / `k` | Move cursor down / up          |\n| `Enter`   | Toggle detail panel for session |\n| `/`        | Start search                   |\n| `Esc`      | Cancel search / clear filter   |\n| `1`        | Filter: waiting sessions       |\n| `2`        | Filter: busy sessions          |\n| `3`        | Filter: idle sessions          |\n| `4`        | Filter: dead sessions          |\n| `0`        | Clear state filter             |\n| `Tab`      | Toggle project / flat view     |\n| `r`        | Force refresh                  |\n| `q`        | Quit                           |\n\n## How It Works\n\nOpsDeck reads three data sources, all local and read-only:\n\n1. **Session files** (`~/.claude/sessions/\u003cid\u003e/session.json`) -- each file\n   contains the session ID, PID, and working directory\n2. **Sessions index** (`~/.claude/sessions/sessions-index.json`) -- provides\n   summaries and message counts\n3. **Transcripts** (`~/.claude/sessions/\u003cid\u003e/transcript.jsonl`) -- the last\n   entry's timestamp determines activity recency\n\nProcess liveness is checked via `kill -0` (macOS/Linux), which only tests\nwhether the PID exists -- it does not send any signal to the process.\n\nState classification:\n\n| State     | Meaning                                    |\n|-----------|--------------------------------------------|\n| `BUSY`    | Process alive, activity within last 30s    |\n| `WAITING` | Process alive, activity 30s--5min ago      |\n| `IDLE`    | Process alive, no activity for 5min+       |\n| `DEAD`    | Process no longer running                  |\n\n## Roadmap\n\n- **v0.1** -- Core TUI dashboard + daily brief + productivity metrics\n- **v0.3** -- Web dashboard with SSE real-time updates\n- **v0.4** -- Cost analytics: token usage and estimated spend per session\n- **v0.5** -- AI-powered brief via `claude -p` (current)\n\n## Privacy\n\nOpsDeck reads local session files and checks process liveness via the OS.\nThere is no telemetry and no analytics. All data stays on your machine.\n\nThe one exception is `opsdeck ai-brief`, which pipes session data through\n`claude -p` for AI summarization. This is opt-in and clearly marked.\n\n## Comparison\n\n| Feature                   | OpsDeck | claude-squad | ccusage | Claud-ometer |\n|---------------------------|---------|--------------|---------|--------------|\n| Real-time TUI dashboard   | Yes     | Yes          | No      | No           |\n| Web dashboard             | Yes     | No           | No      | No           |\n| Auto-discovers sessions   | Yes     | No (managed) | Yes     | Yes          |\n| Session state detection   | Yes     | Yes          | No      | Partial      |\n| Project grouping          | Yes     | No           | No      | No           |\n| Daily brief               | Yes     | No           | No      | No           |\n| Productivity metrics      | Yes     | No           | No      | No           |\n| Session activity detail   | Yes     | No           | No      | No           |\n| Session timeline           | Yes     | No           | No      | No           |\n| Git branch / status       | Yes     | No           | No      | No           |\n| AI-powered brief          | Yes     | No           | No      | No           |\n| Zero config               | Yes     | No           | Yes     | Yes          |\n| Read-only / non-invasive  | Yes     | No (manages) | Yes     | Yes          |\n| Cost analytics            | Yes     | No           | Yes     | Yes          |\n| MCP server                | Yes     | No           | Yes     | No           |\n| Keyboard navigation       | TUI+Web | Yes          | No      | No           |\n\nOpsDeck is designed to complement your existing workflow. It does not manage or\nspawn sessions -- it observes them. Use it alongside claude-squad or on its own.\n\nCost analytics are powered by [ccusage](https://github.com/ryoppippi/ccusage)\n-- the best token usage tracker for Claude Code. Install it with\n`npm i -g ccusage` for accurate pricing from LiteLLM. OpsDeck focuses on live\nsession monitoring and operational intelligence; ccusage handles cost tracking.\n\n## Requirements\n\n- macOS or Linux (Windows support planned for a future release)\n- Claude Code installed (OpsDeck reads its session files)\n\n## Contributing\n\nContributions are welcome.\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/my-change`)\n3. Write tests first, then implement (`make test`)\n4. Ensure `make lint` passes\n5. Open a pull request\n\nPlease open an issue before starting work on large changes.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetopsdeck%2Fopsdeck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetopsdeck%2Fopsdeck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetopsdeck%2Fopsdeck/lists"}