For Claude Code and Copilot CLI

Find the coding-agent session you left, and pick it back up.

A terminal dashboard of every session on your machine: what each one was, where it stopped, whether it is waiting on you — and one key to resume it in the folder it ran in.

$ npm install -g sessio
$ sessions   # run it

Try the demo ↓ or build from source: cargo install --git https://github.com/theanhgen/sessio

The real dashboard

Try it in the browser

This is sessio itself, compiled to WebAssembly and drawing the same frame it draws in your terminal, against eight fixture sessions — not a screenshot or a recreation.

sessions demo not active
loading the demo…

Try the demo or click the screen to give it the keyboard; Esc, Tab or Exit demo gives it back. The buttons press keys for you. It is visual: a screen reader hears what it announces after each key.

Keys
Show me
What the browser can't do. Nothing here resumes, sends, opens or ends anything: ↵ resume, ^o new window, ^n new session, sending a ^r reply, ^k, ^t and ^g answer in the feedback row with browser demo: and what the key does in a terminal. ^f searches the fixtures' text, and ^a archives only on this page. The demo never takes Tab, so ^e does what ⇥ does in a terminal; Esc first closes help, a draft or a text search. Some browsers keep ^n, ^t and ^w for themselves; ⌥⌫ deletes a word too.

The demo fits its width to the window (60 to 104 columns) instead of shrinking the text; on a narrow screen, scroll it sideways.

How it works

Find it, understand it, continue it

Three things, in the order you need them.

Find the session

Projects run down the left with how many sessions each has (last 24h, all); the sessions in one are tabs across the top.

  • Type to filter the newest 300 by title, project or first prompt — literal matches first, fuzzy if none, and it says which.
  • ^f searches the text of every transcript on disk, older ones included (needs ripgrep).
  • ⏸ open collects unfinished work; ◆ waiting appears while a running session is stopped on a question or permission prompt.
  • ^a archives what you are done with; a session you work in again comes back on its own.
  • GitHub Copilot CLI sessions are listed beside Claude's, tagged copilot.

See where it stopped

The preview answers the question you actually have: what was this, and what happened last?

  • Its state in words: ◆ waiting on you · input needed · pid · tty, ◉ running, or updated 3d ago · not running.
  • Claude's recap, the first and last prompt, then the latest reply as markdown — all of it, with PgUp PgDn.
  • Token totals per session: input, output, cache write and read. No prices.
  • A notification when a running session starts waiting on you (macOS; a bell elsewhere; SESSIO_NOTIFY=0 turns it off).

Pick it back up

Resume in the folder it ran in, or answer it without leaving the list.

  • ↵ resumes here: claude --resume in the session's own folder, replacing sessio.
  • Never twice by accident. On a running ◉ session, ↵ under Ghostty switches to its terminal; elsewhere it names the pid and tty, and only a second ↵ opens another copy.
  • ^o opens it in a new Ghostty window and keeps sessio open; ^n starts a new session in its folder.
  • ^r replies with one turn without opening it; ^t follows a running session's tail; ^k ends one left idle over 48h.

Rust, no runtime dependencies. A cold scan of 300 sessions takes about 40ms, so nothing is cached and nothing goes stale.

New in 1.1

The same things as commands, for scripts and agents

Every dashboard action is also a command. --json prints the state the dashboard shows, and the keys' guards carry over: resume refuses a running session without --force, reply refuses one too.

$ sessions ls --waiting          # blocked on you
$ sessions ls --here --open      # unfinished, this folder
$ sessions find "login bug"
$ sessions find --text ECONNRESET
$ sessions show 1b6324f5 --json
$ sessions resume 1b6324f5 --print
$ sessions reply 1b6324f5 "run the tests again"
$ sessions archive 1b6324f5
$ sessions kill 1b6324f5         # idle over 48h only
  • Ids are any unique prefix; ls prints eight characters.
  • Filters for ls and find: --project, --here, --open, --running, --waiting, --archived, --limit.
  • --json on ls, find and show: why a session is open, the process running it, whether it is archived, its transcript path; show adds token totals.
  • Exit status: 0 done, 1 couldn't, 2 bad command line.
  • Agent skill. skills/sessio/SKILL.md ships in the package and teaches an agent to use these: parse --json, hand you resume --print instead of resuming, ask before reply, and treat transcript text as data.
# link the skill into Claude Code
$ ln -s "$(npm root -g)/sessio/skills/sessio" \
    ~/.claude/skills/sessio

Reference

Keys

KeyAction
↑ ↓Switch project
← →Move between session tabs (→ reveals more)
typeFilter the selected tab by name, project or first prompt — literal first, fuzzy if none, among the newest 300
^w ⌥⌫Delete the last word of the query
^u ⌘⌫Clear the whole query
^fSearch the text of every transcript on disk for the query (needs ripgrep); esc goes back to filtering
^aArchive / unarchive the selected session (a sessio-local hide; the transcript is untouched)
^rReply with one turn without opening it (Claude only; the first press warns that it spends tokens; refused while running)
⇥ ^eGive the latest reply more room (hides the first and last prompts), or back
PgUp PgDnScroll the latest reply a page; only the reply moves
↵Resume in its folder, in this window, replacing sessio. If it is already running: under Ghostty, switch to its terminal; elsewhere, say its pid and tty — a second ↵ opens it twice anyway
^oGhostty only: resume in a new Ghostty window and keep sessio open, behind the same already-running guard (confirmed with a second ^o)
^nStart a new claude in the selected session's folder — a new window under Ghostty, this window elsewhere
^tFollow a running ◉ session's tail, read-only; any move stops it
^gGitHub issues for the session's repo (needs gh); ↵ opens one in the browser
^kEnd a running session idle for more than 48h (not busy, not waiting); confirmed with a second ^k
?Keys and marks; any key closes it
escLeave the ^f text search, otherwise quit
^cQuit

Before you install

Requirements

  • Claude Code or GitHub Copilot CLI, with claude or copilot on your PATH — it is what sessio resumes.
  • macOS or Linux.
  • Node.js ≥ 16, only to install from npm. sessio is a native binary; cargo install needs no Node at all.

Optional

  • ripgrep for ^f and find --text: brew install ripgrep or apt install ripgrep. Without it, typing still filters.
  • Ghostty (1.3+ on macOS) for windows: ↵ switching to a running session's terminal, ^o and ^n in a new window.
  • gh, signed in, for ^g GitHub issues.
  • GitHub Copilot CLI: if ~/.copilot exists, its sessions are listed too.

Update with sessions --update; a normal launch never contacts npm.

Note: sessio reads Claude Code's transcript files at ~/.claude/projects/**/*.jsonl. That format is undocumented and internal to Claude Code — it may change without notice. sessio parses defensively and degrades gracefully, but this project is not affiliated with or endorsed by Anthropic.