AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Find the command you already solved. For you and your AI agents.
Developer toolsRust · HTMLGitHub @rdarshan10OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Your shell history, searchable by meaning, with proof of what worked. For you and your AI agents.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Your shell history, searchable by meaning, with proof of what worked. For you and your AI agents.
One fast Rust binary that remembers every command you and your AI agents run: where it ran, whether it worked, and what fixed it when it didn't. Find anything by describing it ("tear down containers", "run migrations"), not by remembering the exact text.
Shell history remembers text, not intent. You know you've done it before, but not the exact flags, the folder, or which of five variants actually worked.Read the full README ↗Your shell history, searchable by meaning, with proof of what worked. For you and your AI agents.
Website: rdarshan10.github.io/reman
One fast Rust binary that remembers every command you and your AI agents run: where it ran, whether it worked, and what fixed it when it didn't. Find anything by describing it ("tear down containers", "run migrations"), not by remembering the exact text.
in this folder ─────────────────────────────────────────── │ docker compose down -v
▌✓ docker compose down -v 14× 2d │ docker: Stop and remove containers, networks,
✓ docker compose up -d 20× 1h │ images, and volumes created by `docker compose up`
✓ docker system prune -af --volumes 3× 1w │ ✓ worked every time (14 runs) · last 2 days ago
everywhere ─────────────────────────────────────────────── │ in ~/work/api
· docker compose logs -f api 11× 3d │ matched: close in meaning · shares your words
· docker images 4× 1w │
this folder first ←→ · by you F3 · any outcome F2 24 results
› tear down containers Recall Fixes Flows
Shell history remembers text, not intent. You know you've done it before, but not the exact flags, the folder, or which of five variants actually worked.
docker-compose down -v.reman closes that loop: every run is captured with its folder, exit code, duration and who ran it (you or an agent), and all of it is searchable by meaning, in your terminal and by your agents.
run migrations finds alembic upgrade head even though the words don't match. Results from this folder come first, then everywhere; a folder with no good match never dead-ends. When nothing in your history is close, it says so instead of passing off a guess.gti status → git status), learned from what you actually ran next, with what it changes when it's a variant of what failed (adds --build, ci → install --legacy-peer-deps). Alt+F inserts it.npm ci hitting the ERESOLVE that npm install hit last week), it offers what fixed the first one. Agents get it too by passing the error to reman_fixes.failed the last 3 times here, after about 2m each time), or it installs, builds, migrates or deploys. It says why, shows its last error and what worked instead (Alt+F inserts it), and Enter again runs it anyway. A command that fails in a blink just runs. It's an exact lookup on Enter, never while you type (PowerShell, zsh and fish).reman settings). It lists your own commands; F3 adds what agents ran. Ctrl+O on a command shows every run of it: when, how long it took, whether it worked, the branch, the folder and who ran it, with what that run printed beside it, and Del Del forgets one run. Vim keys are a setting: Esc for normal mode, j k to move, dd to forget, i to type, q to close.reman shell runs your shell inside a terminal layer of reman's own (ConPTY on Windows, a pseudo-terminal elsewhere), passed through untouched, and keeps what each command printed, read the way your terminal drew it: colours gone, a progress bar as it ended, long output whole. , , or finds it by the command or by what it printed; agents read it through instead of running a command again. Secrets are masked, only the end of a long output is kept, and only for your newest 3000 runs. can open every new shell inside it.irm https://raw.githubusercontent.com/rdarshan10/reman/master/install.ps1 | iex
Windows PowerShell blocks profile scripts by default on a fresh Windows 10/11 ("running scripts is disabled on this system"), and then reman can't load in new windows. Setup detects this and asks to allow your own scripts for your user only (Set-ExecutionPolicy RemoteSigned -Scope CurrentUser, the same step Scoop and oh-my-posh need). reman doctor reports it too.
curl -fsSL https://raw.githubusercontent.com/rdarshan10/reman/master/install.sh | sh
Both scripts download the latest release, verify its SHA-256 checksum, and run reman setup. Setup is the whole onboarding, with nothing to configure by hand:
~/.reman/bin and starts its background daemon;.reman-bak backup first.Everything it set up can be changed later on one page: reman settings. To skip connecting coding tools, set REMAN_NO_CONNECT=1 (or run reman setup --no-connect). The first start downloads the embedding model, about 130 MB, once. reman then downloads its own model, the same one trained on commands (about 115 MB, checked against a checksum built into reman), and moves your history to it in the background; Search model in reman settings switches between the two. With updates off, reman downloads nothing.
Pick your file from the latest release:
| platform | file |
|---|---|
| Windows 10/11, x64 | reman-windows-x64.zip |
| macOS, Apple Silicon (M1 and later) | reman-macos-arm64.tar.gz |
| Linux, x64 | reman-linux-x64.tar.gz |
Intel Macs aren't supported: ONNX Runtime, which reman's search uses, publishes no build for them.
Unpack it and run reman setup (reman.exe setup on Windows). On macOS, a file downloaded through a browser may be quarantined; clear that with xattr -d com.apple.quarantine reman reman-hook.
Requires Rust 1.85 or newer.
git clone https://github.com/rdarshan10/reman
cd reman/rust
cargo build --release
./target/release/reman setup
reman update # install the latest release now
reman update --check # only say whether one is out
reman update --auto off # just tell me when one is out (on: install them on their own again)
Once a day reman asks GitHub whether a new version is out, installs it on its own, and a desktop notification says it did. With --auto off a notification only tells you, once per version. reman settings has the same choice, plus never check, which keeps reman off the network entirely.
Every update is checked before anything runs. Each release's SHA256SUMS.txt is signed with reman's release key (Ed25519), whose public half is built into reman, so a release that wasn't signed with it, or a file changed after signing, is refused. The archive must then match its signed checksum. Only a newer version is installed, never an older one. Of GitHub's answer only the version number is used, and every download address is built by reman itself, over https only. An AI agent can't turn automatic updates on.
reman uninstall # lists everything it will remove, then asks
reman uninstall --purge # also delete your history, settings and the search model
It takes reman out of every coding tool (MCP entries, capture hooks, the HTTP endpoint), your PowerShell profile, your zsh / bash / fish config, Command Prompt's r / rr and your PATH, each by reman's own marker, so everything else in those files stays as it was. Then it stops the daemon and deletes the program. Your history stays in ~/.reman unless you pass --purge. --dry-run only lists; --yes skips the question.
Open a new terminal after installing.
| you press / type | what happens |
|---|---|
↑ | the finder, for this folder |
Ctrl+R | the finder, for all folders |
Tab / Shift+Tab inside the finder | switch between Recall, Fixes and Flows |
Enter | put the command on your prompt (it never runs by itself) |
Ctrl+O inside the finder | every run of the selected command, and what each printed |
F3 inside the finder | your commands, yours and agents', or agents' only |
Alt+F | insert the fix suggested after a failed command |
F1 inside the finder | every key |
F10 inside the finder | settings |
In Command Prompt, type r (this folder), r docker (start with a query), or rr (everywhere).
From the command line:
reman search "tear down containers" # search by meaning
reman fixes "gti status" # what worked instead
reman next # what you usually run next here
reman check "docker compose up -d" # has this been run, and did it work?
reman flows --here # sequences you repeat in this folder
reman here # what you did in this folder last time
reman why # it used to work: what ran here since (or: reman why npm test)
reman runbook > RUNBOOK.md # how this project is run, from what worked
reman scrub # mask secrets in older history (dry run; --apply)
reman sessions migration last week # the agent session that did it
reman resume migration # reopen it, in its folder
reman shell # your shell inside reman's terminal layer: output kept
reman output --failed # what the last failed commands printed
reman delete "vault read" --yes # remove runs by their text
reman prune # apply ignore rules to older history
reman stats week
reman settings # or press F10 inside the finder
One page for everything setup configured. Every change is saved as you make it:
a types in any other folder.Del to turn it off (the key does what it did before reman), r for the preset's key. Presets: standard, gentle (reman leaves ↑, Tab and Enter alone) and vim. A key that's taken, types a character, or is one your shell or terminal needs is refused or flagged. From the command line: reman keys, reman keys set find_all Alt+J, reman keys set find_here off, reman keys preset gentle.reman shell.reman works fully without one. When one is available, reman runbook asks it to arrange and explain the project's commands.
Found automatically on this machine: Ollama (localhost:11434), LM Studio (localhost:1234) or a llama.cpp server (localhost:8080). Nothing leaves your machine.
Any OpenAI-compatible endpoint, if you set one in ~/.reman/config.json. A remote endpoint is only used when set there:
"ai": { "endpoint": "https://api.openai.com/v1", "model": "gpt-4o-mini", "api_key_env": "OPENAI_API_KEY" }
The key is read from that environment variable (default REMAN_AI_KEY) and never stored.
What the model may do: order, summarise, add a few words per command, and place commands no rule knows into a section. Every command in its answer must be one from your history, character for character, or it is dropped. Commands are redacted before they are sent.
Speed: the answer is cached per project until its commands change. Agents never wait on a model: they get the history-only runbook at once, and the fuller one on their next call.
Off: reman settings (Language model), or reman runbook --static for one run.
reman connect all # Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI
reman connect # status, plus folders agents can't see yet
reman connect --add-root ~/projects/api
reman connect http # local HTTP endpoint for the OpenAI Agents SDK, LangChain, curl
Agents get ten tools: reman_search, reman_check, reman_fixes, reman_recent, reman_failures, reman_flows, reman_next, reman_runbook (how the project is run, from what worked there; reman tells an agent new to a project to call it first), reman_output (what a command printed the last times it ran) and reman_running (the servers up right now in their folders, and who started each). Every command they get back is one that really ran; reman never generates commands. When nothing close is known, reman_search returns nothing rather than the least-bad guess, and says so; the same goes for a result a filter emptied or a folder the agent can't see. A query that names a tool you use (astro, vercel) is only ever answered with that tool. Commands from the agent's own project come first when matches are close.
What agents can see:
Only folders you approve. Nothing is visible to an agent until you share a folder, not even the project it's working in (a repo, a git worktree of it included; never your whole home folder or a drive).
Strict permissions, on by default: when an agent needs its project's history, only reman's own dialog box can let it in: a light or dark card on Windows, a native alert on macOS, zenity or kdialog on Linux. Allow for this session (nothing is saved; the next session asks again), Always allow, or Don't allow (not asked again this session). Your AI app's buttons and dialogs don't count, so an app set to approve tool calls by itself can't share anything. Where the dialog can't be shown (over SSH), nothing is shared. Only you can turn it off, in your own terminal (reman settings, under What agents can see).
With strict permissions off, approve it from the chat with your app's own buttons:
reman_share_project, and your app's usual tool approval (Allow / Deny) decides: Allow shares the project for this session only. After a No, the agent can't ask again that session.Either way the decision is yours, not the AI's.
Or from your terminal: reman connect --add-root <folder> shares a folder with every agent for good (--remove-root undoes it); reman connect lists your busiest folders that aren't shared.
Secrets are redacted, and in strict mode (the default) anything still secret-looking is withheld.
Commands your agents run are recorded too, tagged with the agent's name, with how long they took and, when they fail, what they printed: Claude Code (Bash and PowerShell), Codex (approve its hooks once with /hooks), Cursor, VS Code's Copilot (and the Copilot CLI), Windsurf and Gemini CLI through their own hooks, opencode and pi through a small reman plugin. Where a tool gives no exit code, or a pipe hides it, the result is read from what the command printed; with nothing clear, the run is recorded with an unknown outcome rather than a guess. Agents that type into your terminal (Copilot, Cursor, Windsurf) are recorded once, with your shell's exact exit code.
Measured on a history of about 6,000 commands and 21,000 runs:
| operation | p50 |
|---|---|
| search by meaning | 7 to 9 ms |
| browse recent | 3.5 ms |
| did-you-mean | 4 ms |
| next-command prediction | 0.2 ms |
| capture, PowerShell | no process spawned |
| capture, bash / zsh / fish | 5 / 2 / 5 ms |
rust/src/
├── daemon.rs warm daemon: model loaded when needed, whole history in memory, JSON lines on localhost
├── store.rs in-memory model of the history (vectors, provenance, per-folder stats)
├── search.rs hybrid ranking: meaning (bge-small) + fuzzy text + track record
├── dym.rs did-you-mean for failed commands
├── fixpairs.rs learned fixes: what you ran after a failure, and it worked
├── flows.rs repeated command sequences
├── predict.rs next-command prediction
├── tui.rs the finder
├── complete.rs Tab completion for reman itself, one engine for every shell
├── mcp.rs MCP server for agents, with the folder boundary
├── http.rs local HTTP endpoint (MCP Streamable HTTP + REST)
├── connect.rs `reman connect`: wires each agent's config
├── capture.rs recording, used by the shell hooks and reman-hook
├── pty.rs `reman shell`: the terminal layer that keeps what commands print
├── output.rs what a command printed, as kept: plain text, its end, redacted
└── init/ shell integrations: PowerShell, bash, zsh, fish, nushell, xonsh, Command Prompt
Detailed documentation, every key and the storage layout: rust/README.md. The real-terminal and agent test suites: rust/e2e.
redact.rs, and reman shell follows the design of its terminal layer, on Windows too. Coming from Atuin? reman setup imports its history.The full notices are in THIRD_PARTY_NOTICES.md; every Rust library reman is built from, with its license, is in THIRD_PARTY_LICENSES.html in each release.
reman is licensed under the Apache License 2.0. Contributions are accepted under the same license.
Issues and pull requests are welcome, especially new shell integrations, agent connectors and search-quality examples. Please open an issue first for larger changes.
To run the tests:
cd rust
cargo test
python e2e/search_quality.py # search quality, and the website's examples
python e2e/powershell_terminal.py # real-terminal suites, see rust/e2e/README.md
reman output npm testreman output --failedreman output ECONNREFUSEDreman_outputreman settingsreman sessions lists your coding agents' sessions: where each worked, what it built, tested or installed, and how it went. reman sessions migration last week finds the one that did that, by meaning, by a file it touched or by its folder's name. reman resume migration reopens it in its folder (Claude Code, Codex, Gemini CLI and opencode).reman search docker --failed --by agents --after monday --cwd . filters; --format "{status} {command}" and --json feed scripts. reman delete <text> (or --regex, --failed, --before) removes runs by their text, never by meaning, after showing what it will remove. reman prune applies the ignore rules you added later to the history saved before them. reman keys # every key reman takes; set, preset, reset change them reman stats week (or month, year, yesterday, a date) counts what ran then: your tools by subcommand, what failed most, your busiest folders.pull → install → test) are detected. Open one, run its first step, and the next step waits on ↑.Alt+N on an empty prompt puts it there directly (again for the next idea): the next step of a flow you started, the fix for what just failed, then what you usually run after your last command. Only commands you ran yourself, ready to edit, never run.git commit -m "‹message›" or kubectl logs ‹name› -n prod, with what went in it lately. Enter puts it on the prompt with the cursor in the blank. Searching for one value (fix login) shows that command itself.deploy last week, docker yesterday, migrate since monday, npm test 3 days ago. Only what ran then is shown; yesterday alone browses that day. Agents' reman_search understands it too.usually 3m 12s, and reman_check tells agents how long to wait before calling a command hung. A command of yours that ran a minute or more sends a desktop notification when it finishes (✓ cargo build --release · 3m 04s, faster than usual); set it to 5 minutes or off in reman settings.reman yesterday (and reman today, reman day monday) tells what you ran, by project: the commands with repeats folded, failures with what fixed them or that they still fail, and what each agent ran there.rcd alembic goes to the folder where you ran it; rcd billing api matches the folder's own name; rcd alone lists where you were lately (rcd 3 goes there).docker compose up -d → alembic upgrade head → npm run dev.git pull → npm install left-pad). Every run keeps the git branch and commit it ran on, so it also says when it worked on main and fails on feat/x, when new commits came in, or when the commit is the same and the change must be elsewhere. reman why tells the whole story.worked 5 of its last 9 runs), so nobody changes code over it. Agents are told the same.reman runbook writes how the project is run, by task (set up, run, test, lint, build, database, deploy), from the commands that actually worked there. It reads through how agents wrap a command (cd web && npx jest 2>&1 | grep Tests counts as npx jest, run in web/), keeps the setup it needs (. .\msvc-env.ps1; cargo build --release), says which folder each command runs in when a repo holds several apps, and folds variants (expo start --clear / -c, tsc -p tsconfig.json) into one line. A pipe hides a command's exit status (npx jest | tail -5 exits with tail's), so the agent hook reads the result the agent saw instead (Tests: 2 failed, test result: ok, error TS2345) and sends only that verdict, never the output; with no verdict, a run counts as run, never as worked. The same reading tells which step of a && b failed. Where the history has no whole command for a task (only one test file, say), the one the project declares is shown, marked not run yet: npm test from package.json, a Makefile target, pytest from its config. With a language model available (a local one is found automatically), it adds a summary, a getting-started order and a note per command; the model only arranges your real commands, never invents one. Agents get the same through reman_runbook.r / rr in Command Prompt. What coding agents run is captured too, each tagged with its agent: Claude Code, Codex, Cursor, VS Code (Copilot), Windsurf and Gemini CLI through their own hooks, opencode and pi through a small plugin. Agents that type into your terminal (Copilot, Cursor, Windsurf) are recorded once, with your shell's exact exit code.reman connect all wires Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI and opencode in one step.reman_check says the same about agents' last half hour in a folder. reman agents reports what each agent ran this week: runs, failures, and the commands it retried 4+ times while they failed the same way each time.reman_running tells it what is already up in its folders: the port and url, how long it has run, the command you ran to start it, and who did: you in a terminal, this agent session, another agent, an editor, or the Claude app's preview pane. So an agent uses your dev server instead of killing it or starting a second one, and picks a port nobody holds. It reads the process tree, and where the shell that started a server is gone, the run reman recorded when it began. It only reads; it never stops anything.reman_check tells an agent when a command's program isn't installed on this machine (not on its PATH, and never run successfully here), with the last time it failed for that, so the agent does the task another way instead of retrying it.~/.reman on your machine. The only thing reman sends anywhere is a daily question to GitHub about new versions (no history, nothing about you), which reman settings can turn off. Secrets are masked before anything is saved (export API_TOKEN=***), along with the token shapes of AWS, GitHub, GitLab, Slack, Stripe, npm, Netlify and Pulumi wherever they appear, and a command whose secret can't be located isn't saved at all. Commands typed with a leading space are never recorded, nor anything matching your ignore_commands / ignore_folders patterns; Del Del in the finder forgets one everywhere. reman scrub masks secrets in history saved before. If you'd rather see your own commands whole, set secrets to keep as typed in reman settings: they are saved as you typed them, and agents still get them masked.