Claude is not expensive.
Your terminal is.

OMNI sits on a shell hook and takes the noise out of command output before your agent reads it. It also remembers your project between sessions, so you stop re-explaining it. Lossy, always reversible, and it never invents a result.

brew install fajarhide/tap/omni

Then omni init. Also on and

v0.6.8 Stable

1 of 3 · cargo test (490 passed, 10 failed) raw 16.5 KB
$ cargo test
Compiling omni v0.6.0 (/Users/f/omni)
Compiling serde v1.0.210
Compiling regex v1.10.6
Finished test profile in 41.20s
Running unittests src/lib.rs
test pipeline::score::keeps_stack_frames ... ok
test pipeline::score::drops_progress_bars ... ok
test pipeline::format::json_passthrough ... ok
test rewind::store::roundtrip_sha256 ... ok
test rewind::store::retrieve_by_hash ... ok
... 478 more passing tests ...
test distill::cargo::parses_summary ... FAILED
failures:
thread panicked at src/distill/cargo.rs:118:9
assertion `left == right` failed
left: 490
right: 500
test result: FAILED. 490 passed; 10 failed
93.3% smaller nothing deleted, all of it hashed to disk

Reproducible on tests/fixtures/: 16.5 KB of test output becomes 1,100 B, a 93.3% cut.

Cut
The compile log, the timing footer, and 478 passing tests. A test that passed tells your agent nothing it can act on.
Kept
The one test that failed, the panic and its file and line, and the runner's own result line. The count is copied, never recomputed.
Read this before installing

Where it fails, then what it promises

A tool that asks to sit between you and your output should lead with the parts that go badly.

63.6%of all calls
saved nothing at all. Across 1,810 replayed executions close to two thirds went straight back, zero bytes added, zero removed. All of the 58.9% headline comes from the other 36.4%.
82 to 308 msper hooked command
and the cost grows with your history. A 496 byte git status takes about 82ms against a fresh database and about 308ms against a 97 MB one. A 16.5 KB cargo test takes about 276ms. Budget for it.
exit != 0never compressed
Failing commands pass through whole, structured output is never touched, and a distiller that cannot parse its input stays quiet instead of guessing.
Reversible
Everything cut is archived to local SQLite keyed by SHA-256. Your agent gets the hash and calls it back when it wants the rest. omni_retrieve
Never invents
A distiller that parsed no signal hands back the raw output. It will not write a green "no errors" line that nothing supports. issue 143
Never hides
Any command that exits non-zero passes through untouched. A buried error costs more than an uncompressed one. issue 120
Never mangles
JSON, YAML, NDJSON and CSV go through byte for byte, because a corrupted payload costs more than a missed compression. pipeline::format

Any tool claiming to save 90% of every command is telling you it summarised output you needed.

Benchmarks

1,810 real commands, replayed on the release binary

One developer's actual usage over months, not a fixture set chosen to flatter the result. 15.0 MB in, 6.2 MB out.

Read from the README on main at build time, so the two cannot drift apart.
Command Calls In Out Saved
cargo 29 424 KB 13 KB 96.8%
git 256 5.9 MB 509 KB 91.3%
ls 52 71 KB 29 KB 59.5%
kubectl 212 4.4 MB 2.3 MB 48.0%
find 39 83 KB 53 KB 36.2%
grep 184 534 KB 385 KB 27.8%
cat 85 515 KB 468 KB 9.1%
58.9% fewer bytes across the whole mix
96.8% best case, cargo over 29 calls
9.1% worst case, cat over 85 calls

cargo carries the result and cat is close to a no-op. The weak row stays in the table, because quietly dropping the rows that look bad is how 58.9% turns into a fake 90%. Run omni stats for your own.

The other half

Your agent also forgets everything overnight

New session
You re-explain the project layout, which module is broken, and that it is Postgres rather than MySQL. The agent already has it. You carry on from where you stopped.
Bug you already fixed
The agent walks into the same framework quirk it solved yesterday, because nothing kept the answer. The agent pulls the stored fix back through omni_recall before it repeats the mistake.
Cursor to Claude Code
New editor, new agent, no context. You start over. The session summary is injected on the way in. The new agent is current.
Agent drifts off task
Three prompts later it is refactoring something you never asked about. omni goal restates the objective on every prompt.
The CLI

Nine commands, all of them local

No dashboard and no account. Nothing about your machine leaves it.

omni init
Wire the hook into Claude Code, Cursor, Windsurf, Codex or Antigravity. Interactive.
omni doctor --fix
Check hooks, MCP wiring and filter cost, then repair whatever is broken.
omni stats
What it actually saved on your machine. Takes --today, --week, --month.
omni diff
The last raw input beside what the agent received. This is how you check its work.
omni session --status
Context pressure, stored engrams, and the errors still open in this session.
omni learn --discover
Read your shell history and propose filters for your own internal tools.
omni goal
Set the objective once. OMNI restates it on every prompt so the agent stops drifting.
omni remember
Store a project rule or a gotcha in local SQLite. Recalled by semantic search later.
omni reset
Take it back out. Clean uninstall, keeping a backup of your config.
How it works

Six stages, and the second one usually ends it

Read
A shell hook catches stdout on its way to the agent. Nothing about how you work changes.
Guard
Non-zero exit, or JSON, YAML, NDJSON, CSV? Straight through. This branch is taken more often than not.
Score
Every line gets a weight. Stack frames and errors score high, progress bars and passing tests score low.
Collapse
Repetition folds. Four hundred passing tests become the runner's own summary line, never a paraphrase of it.
Distill
A command-specific reader runs. Returning the input is always allowed, inventing a summary is not.
Persist
Everything cut is hashed into local SQLite, so any of it comes back on demand.

If OMNI panics it fails open: the raw output passes through and your agent never notices. That is the design, not a safety net bolted on afterwards.

Questions

What people ask before installing it

Does OMNI delete my logs?
No. Everything it cuts is compressed and archived to a local SQLite store, keyed by SHA-256. Your agent receives the hash and pulls the full original back whenever it needs it, through the omni_retrieve MCP tool. Nothing is deleted and nothing leaves your machine.
Will it slow down my terminal?
Yes, measurably. OMNI runs on every hooked command and the cost grows with your history. A 496 byte git status takes about 82ms against a fresh database and about 308ms against a 97 MB one. A 16.5 KB cargo test takes about 276ms.
How much does it actually save?
58.9% fewer bytes across 1,810 replayed real commands. That average hides a lot: 63.6% of those commands saved nothing at all. The whole saving comes from the remaining 36.4%, mostly cargo and other noisy tooling.
Can it hide an error from my agent?
No. Any command that exits non-zero passes through verbatim, uncompressed. Structured output such as JSON, YAML, NDJSON and CSV is never touched. A distiller that cannot parse its input returns the raw output rather than summarising it.
Which agents does it work with?
Claude Code, Cursor, Windsurf, Roo Code, OpenAI Codex and Antigravity. It installs as a shell hook rather than a wrapper, so you keep typing the commands you already type and nothing about your workflow changes.
Can I add filters for my own tools?
Yes. Filters are TOML files in ~/.omni/signals/ that match a command by regex and strip lines by pattern. You can write them by hand, or run omni learn --discover to have OMNI read your shell history and draft them from the noise it already sees.
What does OMNI cost?
Nothing. It is MIT licensed with no paid tier, no account and no telemetry. If it saves you nothing, omni stats will tell you so and omni reset removes it.

A passion project, MIT licensed

Built by one developer who got tired of paying to read progress bars. If it saves you nothing, omni stats will say so and omni reset removes it. That is the whole deal.