{"id":51723148,"url":"https://github.com/aytzey/showagent","last_synced_at":"2026-07-24T07:01:08.117Z","repository":{"id":366539490,"uuid":"1276660664","full_name":"aytzey/showagent","owner":"aytzey","description":"Terminal picker for local Codex and Claude Code sessions, built with Bubble Tea v2.","archived":false,"fork":false,"pushed_at":"2026-06-22T08:52:58.000Z","size":52,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T10:15:15.428Z","etag":null,"topics":["ai-agents","bubbletea","claude-code","cli","codex","lipgloss","showagent","tui"],"latest_commit_sha":null,"homepage":"","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/aytzey.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-06-22T07:18:43.000Z","updated_at":"2026-06-22T08:52:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aytzey/showagent","commit_stats":null,"previous_names":["aytzey/showagent"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/aytzey/showagent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aytzey%2Fshowagent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aytzey%2Fshowagent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aytzey%2Fshowagent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aytzey%2Fshowagent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aytzey","download_url":"https://codeload.github.com/aytzey/showagent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aytzey%2Fshowagent/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35831258,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-24T02:00:07.870Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ai-agents","bubbletea","claude-code","cli","codex","lipgloss","showagent","tui"],"created_at":"2026-07-17T15:00:32.875Z","updated_at":"2026-07-24T07:01:08.107Z","avatar_url":"https://github.com/aytzey.png","language":"Go","funding_links":[],"categories":["Applications","Harnesses \u0026 orchestration"],"sub_categories":["AI","Session managers \u0026 parallel runners"],"readme":"\u003c!-- mcp-name: io.github.aytzey/showagent --\u003e\n\u003ch1 align=\"center\"\u003eshowagent\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cb\u003eshowagent\u003c/b\u003e — every AI coding session on your machine, in one TUI.\u003cbr\u003e\nBrowse, search, resume, branch — and \u003cem\u003econvert\u003c/em\u003e a conversation from one agent to another.\u003cbr\u003e\nCodex · Claude Code · Gemini CLI · OpenCode · jcode · Pi\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/aytzey/showagent/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/aytzey/showagent/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/aytzey/showagent/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/aytzey/showagent\" alt=\"Release\"\u003e\u003c/a\u003e\n\u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n![showagent demo](docs/demo.gif)\n\n\u003e Started debugging in Codex and want Claude's take? Press `x`. Your\n\u003e conversation moves with you — every user and assistant turn, rewritten in\n\u003e the target agent's native session format.\n\n## Why\n\nYou use more than one coding agent now — most of us do. But every agent buries\nits sessions in its own format under its own dot-directory, and yesterday's\ncontext is trapped in whichever tool you happened to start it in. showagent\nreads the session stores straight off disk and gives you one searchable picker\nfor all of them. It is the only TUI that combines browse + search + resume +\nbranch + convert across agents.\n\n- **One list for everything** — sessions from every agent, grouped by\n  workspace, fuzzy-searchable, newest first.\n- **Resume or branch anywhere** — reopen a session in its own CLI, or fork a\n  local native-format copy of its transferable conversation to try a different\n  direction.\n- **Convert between agents** — rewrite a session into another agent's native\n  format so that agent's own resume just works. Originals are never modified;\n  conversions are written atomically.\n- **100% local** — one static binary that reads your own files. No hosted\n  service, no telemetry, no account.\n\n## Supported agents\n\n| Agent | CLI | Sessions read from | Env override | Convert from | Convert to |\n|---|---|---|---|:---:|:---:|\n| Codex | `codex` | `~/.codex/sessions/**/*.jsonl` | `CODEX_HOME` | ✅ | ✅ |\n| Claude Code | `claude` | `~/.claude/projects/**/*.jsonl` | `CLAUDE_HOME` | ✅ | ✅ |\n| Gemini CLI | `gemini` | `~/.gemini/tmp/\u003cproject\u003e/chats/` | `GEMINI_CLI_HOME` | ✅ | ✅ |\n| OpenCode | `opencode` | `opencode.db`, via the `opencode` CLI | `OPENCODE_DATA_HOME` | ✅ | ✅ |\n| jcode | `jcode` | `~/.jcode/sessions/*.json` | `JCODE_HOME` | ✅ | ✅ |\n| Pi | `pi` | `~/.pi/agent/sessions/**/*.jsonl` | `PI_CODING_AGENT_DIR`, `PI_CODING_AGENT_SESSION_DIR` | ✅ | ✅ |\n\nNotes:\n\n- OpenCode stores sessions in a SQLite database, so every OpenCode operation\n  (discover, export, import, delete) goes through your own `opencode` CLI —\n  showagent never writes into the database directly. OpenCode and jcode only\n  appear when their CLI is installed.\n- The picker only offers hand-off targets whose CLI is on `PATH`, so it never\n  strands a conversion. Scripted conversion to file-backed agents can still\n  prepare a session before their CLI is installed; OpenCode always requires\n  its CLI because imports go through OpenCode itself.\n- jcode is a niche, experimental agent CLI. Its support is auto-hidden: if no\n  `jcode` binary is on `PATH`, showagent never shows it.\n- Pi sessions are versioned JSONL trees. showagent follows Pi's active leaf\n  through `parentId` links, so abandoned branches are not previewed or moved\n  into another agent. Converted sessions use Pi's native v3 format, verified\n  against `@earendil-works/pi-coding-agent` 0.80.6 source plus its export and\n  RPC session loader.\n- A project-local Pi `sessionDir` is visible when showagent is launched from\n  that project. Like Pi itself, showagent cannot discover arbitrary custom\n  session roots belonging to other projects unless one is selected globally\n  with `PI_CODING_AGENT_SESSION_DIR`.\n- Platforms: Linux and macOS (amd64 + arm64). Windows (amd64) builds are\n  released but **experimental**: resume runs the agent as a child process\n  instead of replacing showagent.\n\n## Install\n\n```sh\n# Homebrew (Linux/macOS)\nbrew install aytzey/tap/showagent\n\n# install script (Linux/macOS, puts the binary in ~/.local/bin)\ncurl -fsSL https://raw.githubusercontent.com/aytzey/showagent/main/scripts/install.sh | sh\n\n# Go 1.25.12+\ngo install github.com/aytzey/showagent/cmd/showagent@latest\n```\n\nOr grab an archive from the [releases page](https://github.com/aytzey/showagent/releases/latest)\n— `linux`/`darwin` amd64 + arm64, `windows` amd64 (experimental).\n\n## Quick start\n\n```sh\nshowagent                  # open the interactive picker\nshowagent list             # plain table of every session\nshowagent list --json      # the same, machine-readable\nshowagent resume latest    # reopen the most recent session, any agent\nshowagent convert latest --to claude --dry-run\n                           # preview exactly what a hand-off would carry/drop\nshowagent info latest      # exact resume command + storage location\nshowagent mcp              # serve session history to MCP-capable agents (stdio)\nshowagent mcp --read-only  # same search/transcript tools, without tools that write copies\nshowagent mcp --allow-secrets\n                           # explicitly allow verbatim secret-like transcript values\nshowagent update           # update a standalone install (Homebrew: brew upgrade aytzey/tap/showagent)\nshowagent --help           # full CLI help\n```\n\n### Keybindings\n\n| Key | Action |\n|---|---|\n| `↑/k`, `↓/j`, `pgup/pgdn` | Move through sessions |\n| `/` | Fuzzy search across agent, workspace, session id, and messages |\n| `enter` | Resume the selected session in its own CLI |\n| `1`..`9` | Toggle provider visibility, numbered as listed in the header bar |\n| `p` | Cycle the preview column: first → latest → first + latest message |\n| `space` | Collapse or expand the selected workspace group |\n| `o` | Cycle the convert target for the selected session |\n| `t` | Cycle the convert scope: all turns, or latest 200/100/50/20/10 |\n| `x` | Preview convert; press `x` again to write and select the new session |\n| `n` | Branch: create a full local copy of the session |\n| `y` | Toggle the provider's yolo resume mode (jcode/Pi add no flag) |\n| `C` | Compound: resume with a learnings-capture prompt (see below) |\n| `d`, `del`, `backspace` | Delete the session — second press confirms, moving disarms |\n| `r` | Rescan session stores (keeps cursor, search, and filters) |\n| `?` | Toggle the full keybinding overlay |\n| `esc` | Clear search / close overlay / cancel an armed delete (never quits) |\n| `q`, `ctrl+c` | Quit |\n\n## Scripting\n\n`showagent list --json` emits an array sorted newest-first — the field names\nare a stable contract:\n\n```json\n[\n  {\n    \"id\": \"1f7c9a2e-4b31-4c8e-9d02-8a5e3f6b1c44\",\n    \"provider\": \"codex\",\n    \"workspace\": \"/home/you/code/api-server\",\n    \"updated\": \"2026-07-08T19:51:25Z\",\n    \"first_message\": \"Add rate limiting to POST /v1/charges\",\n    \"last_message\": \"the redis TTL test is flaky - mock the clock\"\n  }\n]\n```\n\n`showagent resume \u003cid|latest\u003e [--yolo]` resumes without the picker, so a shell\nalias can reopen your last session in one keystroke.\n\n`showagent convert \u003cid|latest\u003e --to \u003cprovider\u003e --dry-run` prints the hand-off\nbefore writing anything: source session, target provider, workspace, scope,\ntransferable turn count, last user ask, and the agent-specific state that will\nbe dropped. Remove `--dry-run` to write the converted session, then showagent\nprints the resume recipe for the new row.\n\n`showagent info \u003cid|latest\u003e [--yolo]` prints the exact resume command,\nworking directory, and storage location for a session.\n\nExit codes: `0` success, `1` error (including \"no sessions found\"), `2` usage.\nWhen stdout is not a terminal, plain `showagent` prints the `list` table, so\npipes just work.\n\n## Use it from inside your agent (MCP)\n\n`showagent mcp` runs a stdio MCP server, so the agent you are talking to can\nsearch every past coding session on your machine — from **any** agent — and\npull one in as context or convert it to continue right there. Ask Claude Code\n\"have I solved this rate-limit bug before?\" and it can find the Codex session\nwhere you did, read the transcript, and hand you the command to resume it —\nor rewrite it as a native Claude Code session and keep going. Your session\nhistory stops being per-tool memory and becomes shared memory.\n\n```sh\n# Claude Code\nclaude mcp add showagent -- showagent mcp\n\n# Codex (~/.codex/config.toml)\n[mcp_servers.showagent]\ncommand = \"showagent\"\nargs = [\"mcp\"]\n```\n\nAn MCP client can send returned transcript text to its model provider. Common\nsecret-like values are therefore redacted by default, and every transcript is\nmarked as untrusted historical data rather than instructions. If verbatim\nvalues are required, the user must explicitly start the server as\n`showagent mcp --allow-secrets`; an MCP tool call cannot bypass redaction.\nFor clients that should never write session copies, register\n`showagent mcp --read-only`; that mode omits `branch_session` and\n`convert_session` entirely.\n\nTools:\n\n| Tool | What it does |\n|---|---|\n| `list_sessions` | Search sessions across all agents — filter by provider, workspace substring, or free text over workspace + first/last user message (default 25, max 100 results) |\n| `get_transcript` | Read recent user/assistant turns (default 50, hard max 500); secrets are redacted unless the server was explicitly started with `--allow-secrets` |\n| `branch_session` | Fork a full local copy of a session, same agent; returns the new id, file, and resume command |\n| `convert_session` | Rewrite a session into another agent's native format; returns the new id, file, and resume command |\n| `resume_command` | The exact shell command (and cwd) that resumes a session — returned as a string, **never executed** |\n\nThe default MCP surface is deliberately non-destructive: there is **no delete\ntool**, and it never launches or resumes an interactive agent. OpenCode storage\noperations still go through the local `opencode` CLI because its sessions live\nin SQLite. Deleting sessions stays exclusive to the TUI, where it takes two key\npresses with a human watching. Branch and convert only add new sessions —\noriginals are never modified — and `--read-only` removes even those additive\ntools.\n\n## How it compares\n\nGreat tools exist for *running* agents in parallel — showagent is about the\nsessions they leave behind. [claude-squad](https://github.com/smtg-ai/claude-squad)\nand [ccmanager](https://github.com/kbwo/ccmanager) orchestrate multiple live\nagents in tmux sessions and git worktrees, which is the right choice when you\nwant several agents working at once.\n[Agent Sessions](https://github.com/jazzyalex/agent-sessions) is a polished\nmacOS app for browsing session history across many agents. showagent is the\nhistory-first, terminal-first take: a single cross-platform binary that reads\nthe session stores on disk, resumes and branches from them — and is the only\none of the group that converts a session from one agent's format to another's.\n\n## Compound engineering\n\nPress `C` on a session and pick an agent. showagent resumes the session there\nand starts it on a compound-engineering pass: review what was solved, then\nrecord the durable learnings as markdown.\n\nLearnings are pooled per project but shared across agents: each workspace gets\na directory under `~/.showagent/learnings/\u003cproject\u003e/` (override with\n`SHOWAGENT_LEARNINGS_DIR`) that every agent reads and writes. Picking an agent\nthat did not create the session converts it first, so it has full context.\n\n`showagent setup` installs the companion\n[compound-engineering plugin](https://github.com/EveryInc/compound-engineering-plugin)\ninto the Codex, Claude Code, and Pi CLIs found on the machine. For Pi it also\ninstalls the `pi-subagents` and `pi-ask-user` companion packages. The command\nis idempotent and only installs what is missing.\n\n## FAQ\n\n**Is my session data sent anywhere?**\nshowagent itself does not upload session content and has no telemetry or\naccount. An MCP client may send `get_transcript` results to that client's model\nprovider, so MCP transcripts redact common secrets by default; keep that\nboundary in mind before registering the server. showagent's own HTTP client is\nused only by the optional release updater and startup update check (disable\nwith `SHOWAGENT_NO_UPDATE_CHECK=1`). `showagent setup` invokes the installed\nCodex/Claude/Pi CLIs, which may download the requested plugin. Message previews\nalso redact password-like strings and API keys before rendering (covered by\ntests in [`internal/session/session_test.go`](internal/session/session_test.go)).\nRelease archives ship with a `SHA256SUMS` file, and releases after v0.7.0\nalso carry GitHub build provenance — verify with\n`gh attestation verify \u003cfile\u003e --repo aytzey/showagent`.\n\n**How does conversion work?**\nConversion extracts the user and assistant turns from the source transcript\nand writes a brand-new session in the target agent's native format (for\nOpenCode, via `opencode import`), so the target's own resume command picks it\nup. Code blocks, newlines, and indentation are preserved. The original session\nis never modified, and files are private (`0600`) and written atomically — a\ncrash cannot leave a half-written session in another tool's store.\n\nTrust is explicit: in the TUI, the first `x` shows the hand-off preview and the\nsecond `x` writes it. In scripts, use `showagent convert ... --dry-run` for\nthe same preview. Conversion intentionally does **not** copy tool-call\ninternals, approval history, encrypted reasoning blobs, or provider\nattachments: those are private to the source agent and would not replay\ncorrectly anyway. Branching uses the same safe user/assistant-turn projection;\nit does not byte-clone provider-private runtime metadata. `t` / `--scope` trims\nthe scope to the latest N turns before converting.\n\n**What does delete actually do?**\nCodex sessions are deleted through `codex delete --force`; OpenCode through\n`opencode session delete` (which cascades inside its database). Claude Code\nremoves the JSONL plus its matching index entry, jcode removes the JSON plus\nbackup/journal sidecars, and Gemini and Pi remove their session files. Delete\nalways takes two presses, and moving the cursor disarms it.\n\n**Windows?**\nBinaries are released and the whole TUI works, but resume semantics are\napproximated (child process instead of exec), so Windows is labeled\nexperimental until it has seen real use.\n\n**A session is missing from the list.**\nRun `showagent list` with no sessions found and it prints exactly which\ndirectories were scanned and which env vars override them. `r` rescans\nin-place after you start a new conversation.\n\n## Adding a provider\n\nA provider is one self-contained file implementing the 8-method interface in\n[`internal/session/provider.go`](internal/session/provider.go) — around 250\nlines including discovery, resume arguments, transcript extraction, and\nconversion. [`gemini.go`](internal/session/gemini.go) (file-based store) and\n[`opencode.go`](internal/session/opencode.go) (CLI-based store) are the two\ntemplates. Register it in the `registry` slice and the TUI picks up badges,\nfilter keys, and convert targets automatically. Add a matching env override\nso its tests stay hermetic. Issues and PRs welcome.\n\n## Building\n\n```sh\ngit clone https://github.com/aytzey/showagent.git\ncd showagent\ngo test ./...\ngo build -o showagent ./cmd/showagent\n```\n\nThe minimum supported toolchain is Go 1.25.12; CI also runs race tests,\ngolangci-lint, `govulncheck`, and every published cross-compile target.\n\nThe demo GIF is recorded hermetically with [vhs](https://github.com/charmbracelet/vhs)\nagainst fabricated fixtures — see [`demo/README.md`](demo/README.md).\n\nSecurity issues and sensitive-data exposure should be reported privately; see\n[`SECURITY.md`](SECURITY.md). Contributions are covered by\n[`CONTRIBUTING.md`](CONTRIBUTING.md).\n\n## License\n\nMIT. Built with [Bubble Tea](https://github.com/charmbracelet/bubbletea),\n[Bubbles](https://github.com/charmbracelet/bubbles), and\n[Lip Gloss](https://github.com/charmbracelet/lipgloss).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faytzey%2Fshowagent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faytzey%2Fshowagent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faytzey%2Fshowagent/lists"}