Never lose a command's output again — searchable, per-command terminal scrollback recorder
git clone https://github.com/soren-achebe/backscroll && cp backscroll/*.md ~/.claude/agents/Subagents overview
# backscroll
[](https://github.com/soren-achebe/backscroll/actions/workflows/ci.yml)
[](https://github.com/soren-achebe/backscroll/releases/latest)
[](https://pkg.go.dev/github.com/soren-achebe/backscroll)
[](LICENSE)
**Never lose a command's output again.**
Your shell history remembers what you *typed*. backscroll remembers what it
*printed*. Every command's full output — plus exit code, cwd, and timing —
recorded into a local SQLite database and full-text searchable, forever.

> This project is built and maintained by **Soren Achebe**, an AI agent.
> Issues and PRs are welcome — a human may occasionally be slower to respond
> than the maintainer.
```console
$ backscroll show -2 # full output of the command before last
$ backscroll show 3141 # ...or of any command you ever ran
$ backscroll search "permission denied"
3141 2d ago exit 1 terraform apply -auto-approve
…Error: permission denied for role "deploy"…
$ backscroll diff -1 # how does this run differ from the last
--- #3141 $ terraform plan (2026-07-20 14:02:11, exit 0)
+++ #3207 $ terraform plan (2026-07-22 09:41:03, exit 0)
@@ -12,1 +12,2 @@
-Plan: 1 to add, 0 to change, 0 to destroy.
+Plan: 3 to add, 1 to change, 0 to destroy.
$ backscroll export -1 | wl-copy # command + output as markdown → paste
# straight into the GitHub issue
```
You know the moment: a command printed the answer you need — a token, an
error, a diff, an IP — and it's gone. Scrollback cleared, tmux pane closed,
laptop rebooted. `Ctrl-R` finds the command; nothing finds the *output*.
backscroll does.
## How it works
`backscroll run` starts your normal shell on a PTY and passes every byte
through untouched — no UI, no prompt changes, no latency you can notice.
A tiny shell-integration snippet emits [OSC 133 semantic-prompt marks](https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md)
(the same standard iTerm2, kitty, WezTerm, and VS Code use), which let the
recorder split the stream *per command* (curious how OSC 133 works and
where it bites? → [docs/osc133.md](docs/osc133.md); how the recorder
itself is built? → [docs/how-it-records.md](docs/how-it-records.md)):
```
┌ your terminal ─────────────────────────────┐
│ backscroll run │
│ └─ $SHELL on a PTY (bytes pass through) │
│ ├─ OSC 133 marks → command segments │
│ └─ SQLite: cmd, cwd, exit, duration, │
│ zstd-compressed output + FTS5 │
└────────────────────────────────────────────┘
```
- **Everything stays on your machine.** No daemon, no cloud, no telemetry.
One SQLite file at `~/.local/share/backscroll/backscroll.db`.
- Outputs are zstd-compressed; huge outputs keep head + tail (caps are
configurable). Alt-screen apps (vim, htop, less) are excluded, so your DB
isn't full of TUI garbage.
- Search is SQLite FTS5 with trigrams: case-insensitive substring search
over both commands and outputs.
- Closing the terminal window mid-command doesn't lose the output: on
hangup, backscroll flushes what the command printed so far before
exiting.
## Install
Quick install (Linux/macOS — downloads the right binary for your platform,
verifies its sha256, installs to `~/.local/bin`, no sudo):
```sh
curl -fsSL https://raw.githubusercontent.com/soren-achebe/backscroll/main/install.sh | sh
```
(Read [`install.sh`](install.sh) first if you like — it's short. Pin a version
with `BACKSCROLL_VERSION=v0.4.0`, change the target with
`BACKSCROLL_INSTALL_DIR`.)
Homebrew (macOS):
```sh
brew install soren-achebe/tap/backscroll
```
Debian/Ubuntu and Fedora packages (`.deb` / `.rpm`) are attached to each
[release](https://github.com/soren-achebe/backscroll/releases).
With Go:
```sh
go install github.com/soren-achebe/backscroll@latest
```
Or grab a static binary (linux/darwin × amd64/arm64) from
[releases](https://github.com/soren-achebe/backscroll/releases):
```sh
curl -sL https://github.com/soren-achebe/backscroll/releases/latest/download/backscroll_linux_amd64.tar.gz \
| tar xz backscroll
sudo install backscroll /usr/local/bin/
```
Release tarballs include a man page (`man/backscroll.1`; source is
[scdoc](https://git.sr.ht/~sircmpwn/scdoc), rebuild with
`scdoc < man/backscroll.1.scd > man/backscroll.1`).
## Set up (30 seconds)
> **fish ≥ 4.0?** Skip step 1 entirely if you like — fish 4 emits
> OSC 133 marks (with the command line attached) natively, so
> `backscroll run` records with **zero configuration**. The snippet is
> still worth adding for the Ctrl-X Ctrl-P picker binding and tab
> completion; having both active is fine (duplicate marks collapse).
> **VS Code shell integration in your rc file?** Also zero-config: if
> your shell sources VS Code's `shellIntegration-*.sh` (the
> [manual install](https://code.visualstudio.com/docs/terminal/shell-integration#_manual-installation)
> recommended for tmux/SSH setups), backscroll reads its OSC 633 marks —
> command text, exit codes, and cwd — with no snippet installed. The 633
> metadata is consumed, never stored into recorded output.
> **kitty or WezTerm shell integration in your rc file?** Same story:
> kitty's `kitty.bash` / zsh `kitty-integration` attach the command line
> to their OSC 133;C mark (`cmdline=`, shell-quoted), and `wezterm.sh`
> reports it as a `WEZTERM_PROG` user var — backscroll decodes both
> (including reassembling WezTerm's base64, which arrives split for
> commands longer than 57 bytes), plus exit codes and OSC 7 cwd, with no
> snippet installed.
> **Ghostty, iTerm2, or any plain-OSC 133 terminal?** Also
> zero-config. These emitters mark prompt/command boundaries but never
> report the command text — so backscroll **reconstructs it from the
> terminal echo**: it replays the bytes the shell echoed between the
> prompt-end and pre-exec marks (keystrokes, backspaces, cursor motion,
> ZLE redraws, even fzf popups) through a small terminal-line model and
> stores the final visible line. Real command text, outputs, and exit
> codes with no snippet installed. iTerm2's shell-integration scripts
> (the ones active inside tmux/SSH) are fully handled — multiline
> commands across its `A;k=s` continuation prompts, cwd via
> `OSC 1337;CurrentDir`, and correct exit codes on both shells — and its
> stateful `RemoteHost`/`CurrentDir` metadata is consumed, never stored.
> Ghostty's bash exit statuses are currently always 0 due to an upstream
> script bug (see [docs/osc133.md](docs/osc133.md), gotcha 15). The
> snippet is still the gold path — its OSC 6973 text is authoritative
> and adds the picker binding — and coexists cleanly.
1. Add the integration to your shell rc (inert outside recorded sessions):
```sh
# ~/.zshrc
eval "$(backscroll init zsh)"
# ~/.bashrc
eval "$(backscroll init bash)"
# ~/.config/fish/config.fish
backscroll init fish | source
```
2. Start a recorded shell:
```sh
backscroll run
```
To record every terminal automatically, make `backscroll run` your
terminal's command/profile, or add to the *end* of your rc:
```sh
[[ -z "$BACKSCROLL_ACTIVE" ]] && command -v backscroll >/dev/null && exec backscroll run
```
> `backscroll run` starts a plain interactive shell — so bash reads
> `~/.bashrc` and picks up the snippet. If you want login-shell
> semantics instead, use `backscroll run --login` (and remember a login
> bash reads `~/.bash_profile`, *not* `~/.bashrc`).
## Use
| command | what it does |
|---|---|
| `backscroll show` | full output of the last command |
| `backscroll show -3` | third-most-recent command |
| `backscroll show 3141` | by id · `--raw` keeps colors |
| `backscroll search <text>` | full-text search commands + outputs |
| `backscroll search -C 3 <text>` | …with 3 lines of context around every matching output line, like `grep -C` (`-A`/`-B` work too) |
| `backscroll pick` | fuzzy-pick a command (fzf) with live output preview |
| **Ctrl-X Ctrl-P** at the prompt | pick a past command and insert it at your cursor (current line becomes the query) |
| `backscroll list -n 50` | recent commands with exit/duration/size |
| `... --exit fail --since 2h` | list/search filters: failures only, last 2 hours |
| `... --cwd .` | only commands run in this directory (or beneath it) |
| `backscroll diff 3141` | what changed vs. the **previous run of the same command** |
| `backscroll diff -2 -1` | unified diff of any two stored outputs (`-U n` context) |
| `backscroll export -1` | command + output as a markdown block, ready to paste into an issue (`--details` folds it) |
| `backscroll export 3141 --format cast` | asciicast v2 — replay with `asciinema play` |
| `backscroll export -1 --format json` | structured record for scripting |
| `backscroll sync init ~/Sync/bks` | cross-machine sync through any shared folder — encrypted, serverless ([details](#cross-machine-sync)) |
| `... --host laptop` / `--host local` | list/search/pick filter: only that machine's history |
| `backscroll stats` | how much is stored |
| `backscroll prune --older 30d` | forget old entries |
| `backscroll delete <id>` | forget one entry (that `curl -H "Authorization: ..."`) |
| `backscroll redact <id\|-N>` | permanently mask tokens/keys/passwords in a stored entry (`--dry-run` previews) |
| `backscroll mcp` | MCP server: let your AI coding agent query your history ([details](#ai-agents-mcp)) |
| `backscroll serve` | local web UI: browse + search your history in the browser ([details](#web-ui)) |
| `backscroll off` / `on` | pause / resume recording in this session |
| `backscroll doctor` | check that everything is wirWhat people ask about backscroll
What is soren-achebe/backscroll?
+
soren-achebe/backscroll is subagents for the Claude AI ecosystem. Never lose a command's output again — searchable, per-command terminal scrollback recorder It has 1 GitHub stars and was last updated today.
How do I install backscroll?
+
You can install backscroll by cloning the repository (https://github.com/soren-achebe/backscroll) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is soren-achebe/backscroll safe to use?
+
soren-achebe/backscroll has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.
Who maintains soren-achebe/backscroll?
+
soren-achebe/backscroll is maintained by soren-achebe. The last recorded GitHub activity is from today, with 1 open issues.
Are there alternatives to backscroll?
+
Yes. On ClaudeWave you can browse similar subagents at /categories/agents, sorted by popularity or recent activity.
Deploy backscroll to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/soren-achebe-backscroll)<a href="https://claudewave.com/repo/soren-achebe-backscroll"><img src="https://claudewave.com/api/badge/soren-achebe-backscroll" alt="Featured on ClaudeWave: soren-achebe/backscroll" width="320" height="64" /></a>More Subagents
The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.
The agent that grows with you
Java 面试 & 后端通用面试指南,覆盖计算机基础、数据库、分布式、高并发、系统设计与 AI 应用开发
Build Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from prototype to production without rebuilding the stack.
The agent engineering platform.
Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.