{"id":50929840,"url":"https://github.com/azagatti/trimwire","last_synced_at":"2026-06-17T03:01:20.766Z","repository":{"id":364200742,"uuid":"1253776614","full_name":"AZagatti/trimwire","owner":"AZagatti","description":"Local gateway that prunes Claude Code's API context in-flight — dedup, purge failed calls, trim bloat, strip old screenshots. Anthropic-sanctioned (ANTHROPIC_BASE_URL), no CA cert, no restart.","archived":false,"fork":false,"pushed_at":"2026-06-12T04:57:45.000Z","size":1863,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T05:03:51.726Z","etag":null,"topics":["anthropic","claude","claude-code","cli","context-pruning","gateway","llm","prompt-caching","proxy","rust"],"latest_commit_sha":null,"homepage":"https://github.com/AZagatti/trimwire","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AZagatti.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-29T20:01:21.000Z","updated_at":"2026-06-12T04:56:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AZagatti/trimwire","commit_stats":null,"previous_names":["azagatti/trimwire"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/AZagatti/trimwire","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AZagatti%2Ftrimwire","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AZagatti%2Ftrimwire/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AZagatti%2Ftrimwire/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AZagatti%2Ftrimwire/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AZagatti","download_url":"https://codeload.github.com/AZagatti/trimwire/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AZagatti%2Ftrimwire/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34431810,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"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":["anthropic","claude","claude-code","cli","context-pruning","gateway","llm","prompt-caching","proxy","rust"],"created_at":"2026-06-17T03:00:33.362Z","updated_at":"2026-06-17T03:01:20.759Z","avatar_url":"https://github.com/AZagatti.png","language":"Rust","funding_links":["https://github.com/sponsors/AZagatti","https://ko-fi.com/azagatti"],"categories":[],"sub_categories":[],"readme":"# trimwire\n\n\u003e Long Claude Code sessions fill up with stale file reads, superseded tool output,\n\u003e and old reasoning — so every turn ships more dead weight to Anthropic. trimwire\n\u003e is a tiny local gateway that prunes that dead weight from each request,\n\u003e deterministically, keeping recent turns verbatim. No CA cert, no MITM, no restart.\n\n[![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue)](#license)\n[![Crates.io](https://img.shields.io/crates/v/trimwire)](https://crates.io/crates/trimwire)\n[![Rust 1.85+](https://img.shields.io/badge/rust-1.85%2B-orange)](#contributing--development)\n[![Sponsor](https://img.shields.io/badge/sponsor-%E2%9D%A4-db61a2?logo=githubsponsors\u0026logoColor=white)](https://github.com/sponsors/AZagatti)\n[![Ko-fi](https://img.shields.io/badge/Ko--fi-support-ff5e5b?logo=kofi\u0026logoColor=white)](https://ko-fi.com/azagatti)\n\n![trimwire demo](https://raw.githubusercontent.com/AZagatti/trimwire/main/docs/demo.gif)\n\n\u003c!-- regenerate with: vhs demo.tape  (see demo.tape) --\u003e\n\n## Quickstart\n\n### 1. Install\n\n**Download a prebuilt binary** — no toolchain, nothing piped to a shell. Grab the\nasset for your OS/arch from the\n[latest release](https://github.com/AZagatti/trimwire/releases/latest), then\n(Linux/macOS example — pick the asset matching your platform):\n\n```bash\ntar xzf trimwire-x86_64-unknown-linux-gnu.tar.gz   # Windows: unzip the .zip\nchmod +x trimwire\nsudo mv trimwire /usr/local/bin/                   # or any dir on your PATH\ntrimwire --version                                 # prints version + git SHA\n```\n\n**Have Rust?**\n\n```bash\ncargo binstall trimwire  # fetches the same prebuilt binary, no compile\ncargo install trimwire   # from crates.io (builds from source; needs Rust 1.85+)\ncargo install --path .   # build from a local checkout\n```\n\n**Quick install — Linux/macOS only** (convenience) — downloads the right prebuilt\nbinary *and* runs `trimwire install` for you. Read [the script](scripts/install.sh)\nfirst if you pipe to a shell:\n\n```bash\ncurl -LsSf https://raw.githubusercontent.com/AZagatti/trimwire/main/scripts/install.sh | sh\n```\n\n**Windows** — download `trimwire-x86_64-pc-windows-msvc.zip` from the\n[latest release](https://github.com/AZagatti/trimwire/releases/latest), unzip it,\nand put `trimwire.exe` on your `PATH` (or `cargo binstall trimwire`). Note: Claude\nCode on Windows typically runs under WSL2 — there, use the Linux instructions\nabove; the always-on service targets Linux/macOS (systemd/launchd).\n\n### 2. Wire it up\n\n```bash\ntrimwire install         # config + shell-rc ANTHROPIC_BASE_URL + the always-up service (auto-started)\nexec $SHELL              # pick up the new env\ntrimwire doctor          # optional: confirm the gateway is wired + healthy\nclaude                   # use claude as normal — trimwire prunes each request\n```\n\n\u003e **Day one:** zero rows in `trimwire stats` is normal — no traffic has flowed\n\u003e through the gateway yet (or the session was short and text-only). Run a session,\n\u003e then check again.\n\u003e\n\u003e **Long, reasoning-heavy sessions?** Turn on the optional summarizer to compress\n\u003e old context with a model you choose — local (ollama) or a cloud API. One command:\n\u003e `trimwire summarizer setup`.\n\nOptional shell completions: `trimwire completions zsh \u003e ~/.zfunc/_trimwire`\n(also `bash`, `fish`, `elvish`, `powershell`). `trimwire --version` reports the\nbuild's git SHA + date for bug reports.\n\nOn systemd/launchd, `install` starts the service for you (socket activation). No\nsystemd/launchd (some containers)? `install` prints a one-time `trimwire on`.\n\n`install` is idempotent and **never touches your statusline.** Want to try it\nonce without installing anything? `trimwire run` spins up the gateway in\nthe background and launches `claude` through it for that one session (any args\nyou pass are forwarded to `claude`). To see\nthe savings on a session you've *already* run, with zero install:\n\n```bash\ntrimwire preview ~/.claude/projects/\u003cproject\u003e/\u003csession\u003e.jsonl\n```\n\nIt replays the real strategies over a recorded transcript and prints what each\nwould trim. Read-only, no network. (Reports `messages[]` only; the live request\nalso carries a system prompt + tool schemas not in the transcript.)\n\n## How it works\n\n```text\n  Claude Code ──/v1/messages──▶ trimwire ──prune messages[]──▶ api.anthropic.com\n   (localhost)                  (localhost)   (cache-safe)       (real upstream)\n        ▲                                                              │\n        └──────── response streamed back byte-for-byte, unbuffered ◀───┘\n```\n\ntrimwire points Claude Code at itself via Anthropic's documented\n`ANTHROPIC_BASE_URL`, intercepts every outbound `/v1/messages` request, rewrites\nthe `messages[]` array with eight cache-safe pruning strategies, and forwards the slimmer\npayload to `api.anthropic.com`. Pure request-shaping: no CA cert, no TLS\ninterception, no Claude Code restart, and your on-disk transcript is left\nuntouched.\n\nThe always-up service uses **socket activation**: the OS owns the port, so a\ncrashed or restarting daemon never strands Claude Code; connections queue\ninstead of being refused. Set it and forget it.\n\n## Tuning \u0026 safety\n\n\u003e **New here / worried about ToS or privacy?** Short answers: with an **API key**\n\u003e you're clearly fine — `ANTHROPIC_BASE_URL` is Anthropic's documented gateway\n\u003e mechanism. With a **Pro/Max OAuth** subscription the rules tightened in 2026 and\n\u003e it's a greyer area — [`docs/FAQ.md`](https://github.com/AZagatti/trimwire/blob/main/docs/FAQ.md)\n\u003e has the honest detail. On privacy: it never stores your code (the ledger is\n\u003e content-free), and you can try it with zero risk via `trimwire preview`.\n\n- **One knob: the profile.** Run `trimwire config` and set\n  `profile = \"default\" | \"gentle\"` (default `default`). These are\n  *cleanliness levels*, not cost tiers. `default` prunes hardest (all eight\n  cache-safe strategies, aggressive knobs). `gentle` is the lightest touch (dedup +\n  failed-input-purge + a conservative bloat_cap + a conservative thinking_strip).\n  Both turn on stable-prefix re-pruning (`[reprune]`, which replays the same pruning\n  decisions turn-to-turn so the cache prefix stays byte-identical) to keep the\n  prompt cache warm on long sessions. See\n  [`CONFIGURATION.md`](https://github.com/AZagatti/trimwire/blob/main/CONFIGURATION.md)\n  and [`benchmark/`](https://github.com/AZagatti/trimwire/blob/main/benchmark/results/RESULTS.md)\n  for what each trades.\n- **Rollback any time.** To route Claude Code straight to Anthropic again,\n  `unset ANTHROPIC_BASE_URL` in your shell (or open a fresh shell after\n  uninstalling). `trimwire off` stops the gateway — note your rc still exports\n  `ANTHROPIC_BASE_URL`, so Claude calls fail until you `on` again or unset it.\n  `trimwire uninstall` removes the service, login autostart, and the statusline\n  (only if trimwire added it); it **leaves the shell-rc `ANTHROPIC_BASE_URL`\n  block** for you to delete by hand (it prints a reminder). Your config and\n  ledger stay until you delete `~/.trimwire/`.\n- **No message content stored.** The only local persistence is an optional\n  savings ledger of **byte counts + hashes** (`~/.trimwire/ledger.db`); it never\n  records your prompts or tool output. Disable with `[ledger] enabled = false`.\n  See [`SECURITY.md`](SECURITY.md).\n\n## Summarizer (opt-in)\n\ntrimwire is model-free by default. There's an **optional** summarizer that compresses\nthe old part of a long session with a language model. It's **never load-bearing**: any\nfailure (model down, slow, bad output) silently falls back to model-free pruning.\n\nConfigure with `trimwire summarizer setup` (interactive wizard). Three engines:\n\n- **`local`** — ollama on your own machine. No API key, no data leaves your machine.\n  Default model: `qwen3.5:4b` (~3.4 GB RAM), the only harm-validated model.\n- **Cloud API** (engine = a provider id, e.g. `\"anthropic\"`) — sends the prunable slice to\n  the provider you configure using your own API key. Your key, your provider, your choice.\n- **`model-free`** — the default; no summarizer, no model calls.\n\nThe wizard writes the block for you. To edit by hand, add it to\n`~/.config/trimwire.toml` (global) or `./.trimwire.toml` (per-project):\n\n```toml\n# ~/.config/trimwire.toml — local (ollama) engine\n[summarizer]\nengine = \"local\"\n\n[summarizer.local]\nmodel = \"qwen3.5:4b\"\n```\n\n```toml\n# ~/.config/trimwire.toml — cloud API engine: set engine to a provider id\n[summarizer]\nengine = \"anthropic\"                 # a provider id below (or \"local\" / \"model-free\")\n\n[[summarizer.providers]]\nid          = \"anthropic\"\nstyle       = \"anthropic\"            # or \"openai\" (OpenAI-compatible)\nbase_url    = \"https://api.anthropic.com\"\nmodel       = \"claude-haiku-4-5\"\napi_key_env = \"ANTHROPIC_API_KEY\"    # env var name; key never stored in the config\n```\n\nBest for long, reasoning-dense sessions; it only fires once a request exceeds\n`trigger_bytes` (200 KB default), so short sessions are untouched. Model fidelity\nvaries — validate your pick with `trimwire summarizer probe --model \u003cid\u003e --runs 10`\n(add `--yes` for an API provider; local models need no flag).\nSee [`docs/SUMMARIZER.md`](docs/SUMMARIZER.md) and\n[`docs/MODEL-COMPATIBILITY.md`](docs/MODEL-COMPATIBILITY.md) for the full guide + a\nverified model ranking.\n\n## Commands\n\n| Command | What it does |\n|---|---|\n| `trimwire install [--boot]` | Config + shell-rc `ANTHROPIC_BASE_URL` export + the always-up service (systemd user / launchd, login-scoped; `--boot` starts it pre-login). Idempotent; does **not** touch your statusline. |\n| `trimwire on` / `off` / `status` | Start / stop / health-check the service. |\n| `trimwire doctor` | One-shot setup diagnosis: config + active profile, gateway health, `ANTHROPIC_BASE_URL` wiring, ledger. **Exits non-zero** if a hard check fails, so `trimwire doctor \u0026\u0026 claude` and CI healthchecks work. |\n| `trimwire completions \u003cshell\u003e` | Print a shell completion script to stdout (`bash`/`zsh`/`fish`/`elvish`/`powershell`). |\n| `trimwire man [--out DIR]` | Generate man pages: to stdout (`trimwire man \\| man -l -`), or one page per command into `DIR` (for packagers). |\n| `trimwire run [claude args…]` | Start the gateway in the background and launch `claude` through it (no install needed). |\n| `trimwire summarizer setup` / `status` / `benchmark` / `probe` | Configure the optional summarizer (interactive wizard), check its status, score a model for fact retention/compression, or `probe` whether your model holds your slice budget (retention by position). |\n| `trimwire stats [--json] [-q] [-v] [--session [ID]] [--since YYYY-MM-DD] [--until YYYY-MM-DD]` | Savings ledger: total saved, reduction %, ~tokens removed, per-strategy gauge (bars by bytes trimmed), cache-prefix stability. `--session [ID]` drills into one session's per-model cache/token report (omit ID for the most recent); `--since`/`--until` restrict to a UTC date window; `--json` for scripting; `-q`/`--quiet` for a one-line headline; `-v`/`--verbose` for full instrumentation. |\n| `trimwire recall [query] [--json] [--limit N]` | List recent sessions (content-free: date, requests, in→out + reduction %, cache-hit %, model), newest first; optional substring filter on session-id / model. Find a session id to pass to `stats --session`. |\n| `trimwire dashboard [--out FILE]` | Write a self-contained local HTML stats dashboard (content-free; embeds the ledger report, no server, no network) to `FILE` (default `trimwire-report.html`). Open it via `file://`. A snapshot; re-run to refresh. |\n| `trimwire share enable` / `disable` | Opt in or out of telemetry uploads. Persists `[share] enabled = true/false` in the global config. Once enabled, `trimwire share stats` uploads without `--yes` each run. |\n| `trimwire share stats [--yes] [--force]` | **Opt-in, off by default.** Upload an anonymous, content-free aggregate of your ledger to the community dashboard. Requires consent (`share enable` or `--yes`). Without consent, prints the exact payload it would send (a dry run, no network). `--force` bypasses the once-per-day upload throttle. Coarse buckets only; never prompts/paths/ids. See [`docs/TELEMETRY.md`](https://github.com/AZagatti/trimwire/blob/main/docs/TELEMETRY.md). |\n| `trimwire share benchmark [--model TAG] [--all-installed] [--yes]` | **Opt-in, off by default.** Score your summarizer model on a bundled synthetic corpus and upload one anonymous, content-free per-model row to the community [benchmark leaderboard](https://trimwire.dev/benchmark/). Dry-run (prints the row) without `--yes`. See [`docs/BENCHMARK.md`](https://github.com/AZagatti/trimwire/blob/main/docs/BENCHMARK.md). |\n| `trimwire preview [\u003csession.jsonl\u003e\\| --last] [--profile] [--json]` | Read-only what-if: reconstruct `messages[]` from a recorded session transcript and report what pruning *would* trim (per strategy), without touching the file or the network. `--last` auto-picks the most recent session (no path needed). |\n| `trimwire statusline add` / `wrap` / `remove` | Opt-in live savings bar (see below). |\n| `trimwire hook` | Optional `SessionStart` hook that warns in-session if trimwire is set but not actually serving. |\n| `trimwire sweep list` / `all [--dry-run] [--yes]` / `file \u003cpath\u003e` / `undo \u003cpath\u003e` | Clean session transcripts on disk (atomic, backed up). `list`/`all` auto-discover; `all` confirms first (`--yes` to skip; required when piped/CI); `undo` restores a backup. |\n| `trimwire config` / `config show [--json]` | Open the config in `$EDITOR`; `show` prints the *resolved* effective config + active profile. |\n| `trimwire uninstall` | Remove the service, GUI/login env hooks, lingering, and the statusline (if trimwire added it). Leaves the shell-rc `ANTHROPIC_BASE_URL` block for you to delete by hand. |\n\n\u003e Output adapts to context: the status glyphs (`✓ ✗ ⚠ ⊡`) and the `▰▱` gauge fall\n\u003e back to ASCII (`[ok] [x] [!] ::`, `#-`) when stdout is piped/redirected or\n\u003e `NO_COLOR` is set, so logs and scripts stay clean.\n\n## Live savings bar (opt-in)\n\n`trimwire install` **never modifies your Claude Code statusline.** Showing live\nper-session savings (`⊡ trimwire 128 KB (~32K tok) · 41% ↓ · 87 reqs`) is a\nseparate, explicit step:\n\n- **No statusline yet** → `trimwire statusline add` makes trimwire your bar.\n- **Already have one** (e.g. [`claude-statusline`](https://github.com/Flagrare/claude-statusline)) → `trimwire statusline wrap` adds a trimwire row *beneath* it, reversibly.\n- `trimwire statusline remove` undoes either.\n\nEmbedding trimwire as a segment in your own script, and the health-alert hook,\nare covered in [`CONFIGURATION.md`](https://github.com/AZagatti/trimwire/blob/main/CONFIGURATION.md). `trimwire stats` always\nshows totals with no statusline at all.\n\n## Telemetry — opt-in, anonymous, off by default\n\ntrimwire collects **nothing** unless you explicitly opt in. Opt in with\n`trimwire share enable` (persists consent); opt out with `trimwire share disable`.\nOnce enabled, `trimwire share stats` uploads a single small JSON of **coarse,\nbucketed, aggregate** numbers: per-strategy reduction share, overall reduction,\nversion, model family, profile, cache health, conversation length bucket. Nothing\nelse. Never prompts, code, file paths, session ids, machine ids, IPs, or raw\ncounts. Everything is bucketed on your machine before it leaves.\n\nThe built-in community collector endpoint ships in the binary and points at\n`https://api.trimwire.dev/ingest`. The public community dashboard at\n\u003chttps://trimwire.dev\u003e shows only k-anonymous aggregates. Full contract:\n[`docs/TELEMETRY.md`](https://github.com/AZagatti/trimwire/blob/main/docs/TELEMETRY.md).\n\n## How much does it save?\n\nIt depends on your session shape. trimwire prunes only when a strategy matches,\nand **does nothing** when there's no redundancy, so there's no single \"saves\nX%\". Offline replay through the real strategy code (`default` profile) spans the\nfull range:\n\n| Session shape | Request size | Reduction |\n|---|--:|--:|\n| Plain chat, no tools | 9.5 KB | **0%** (no-op) |\n| Repeated searches | 29.8 KB | **78%** |\n| Coding (superseded reads + old log) | 48.0 KB | **83%** |\n| Long-running diverse tools | 133.6 KB | **60%** |\n| Resumed ~50-turn session | 186.4 KB | **65%** |\n| Browser / screenshot-heavy | 423.2 KB | **85%** |\n| Realistic composite | 363.0 KB | **95%** |\n\n**The point is a cleaner session, not a smaller bill.** Pruning drops stale\nbacklog so the current task isn't buried in history (\"context rot\"). That lifts\nthe **focus ratio** (the share of the request that's your recent working window:\nrepeated-search 33%→66%, browser 71%→98%) and keeps it 2–3× higher than no\npruning over a long session. (Focus is a byte-share proxy; that it improves model\noutput is plausible, not proven.)\n\n**Cost is a side effect, and non-monotonic.** Cache hits bill at ~0.1×, so\npruning *old* content can bust the cache: short sessions are a wash-to-loss, long\nones win (≈ **−55%** at 256 turns). Overhead is **sub-2 ms** per request, off the\nnetwork path.\n\nNumbers are reproducible (`cargo run --release --example bench`) and least\nreliable for token/cost estimates (~4 bytes/token). The full 14-corpus tables,\nper-strategy attribution, profiles, cache-stability, and the cost model live in\n[`benchmark/`](https://github.com/AZagatti/trimwire/blob/main/benchmark/results/RESULTS.md).\nFor figures from *your* traffic, run `trimwire stats`.\n\nEight cache-safe strategies ship enabled in `default`: `cross_turn_dedup`,\n`failed_input_purge`, `stale_input_cap`, `stale_reads`, `bloat_cap`,\n`sliding_window`, `image_strip`, `thinking_strip`. The `gentle` profile runs a\nconservative subset: dedup + failed_input_purge + bloat_cap + thinking_strip. A\nninth strategy, `simhash_dedup` (near-duplicate `tool_result` collapse), is opt-in\n(off in both profiles). Every threshold, denylist, profile, and the ledger are\ndocumented in\n[`CONFIGURATION.md`](https://github.com/AZagatti/trimwire/blob/main/CONFIGURATION.md).\n\n\n## Compatibility\n\n- Works with both Pro/Max OAuth subscriptions and API keys (auth header\n  forwarded unchanged).\n- Covers the terminal `claude` CLI and IDE extensions that inherit the shell\n  environment.\n- Does **not** cover the standalone desktop/web app. Like any local gateway, it\n  only sees clients that read `ANTHROPIC_BASE_URL`.\n- Does not modify the Claude Code system prompt.\n\n## Docs\n\n- **FAQ \u0026 Trust:** ToS, code privacy, latency, how to try it safely first:\n  [`docs/FAQ.md`](https://github.com/AZagatti/trimwire/blob/main/docs/FAQ.md)\n- **Configuration:** every strategy knob, the ledger, statusline integration:\n  [`CONFIGURATION.md`](https://github.com/AZagatti/trimwire/blob/main/CONFIGURATION.md)\n- **Troubleshooting:** connection errors, empty stats, port conflicts, sweep aborts:\n  [`docs/TROUBLESHOOTING.md`](https://github.com/AZagatti/trimwire/blob/main/docs/TROUBLESHOOTING.md)\n- **Alternatives:** mitmproxy-based pruners and other options:\n  [`docs/ALTERNATIVES.md`](https://github.com/AZagatti/trimwire/blob/main/docs/ALTERNATIVES.md)\n- **Architecture:** module-by-module design: [`ARCHITECTURE.md`](https://github.com/AZagatti/trimwire/blob/main/ARCHITECTURE.md)\n- **Design rationale + validation:** [`SPIKE.md`](https://github.com/AZagatti/trimwire/blob/main/SPIKE.md)\n- **`/trimwire` Claude Code skill:** in-session savings/cache visibility by\n  shelling the read-only CLI; bundled at\n  [`.claude/skills/trimwire/`](https://github.com/AZagatti/trimwire/blob/main/.claude/skills/trimwire/SKILL.md)\n  (copy into your project's `.claude/skills/` to use it).\n\n## Contributing \u0026 development\n\n```bash\ncargo build\ncargo test\ncargo clippy --all-targets -- -D warnings\ncargo fmt --check\n```\n\nSee [`CONTRIBUTING.md`](https://github.com/AZagatti/trimwire/blob/main/CONTRIBUTING.md) for how to submit changes, [`AGENTS.md`](https://github.com/AZagatti/trimwire/blob/main/AGENTS.md)\nfor repo conventions + pre-commit gates, and [`SECURITY.md`](https://github.com/AZagatti/trimwire/blob/main/SECURITY.md) for the\nthreat model (a localhost proxy that buffers your requests; the only local\npersistence is the savings ledger (byte counts + hashes, no message content))\nand how to report a vulnerability.\n\n## License\n\nDual-licensed under [MIT](https://github.com/AZagatti/trimwire/blob/main/LICENSE-MIT) or [Apache-2.0](https://github.com/AZagatti/trimwire/blob/main/LICENSE-APACHE) at your\noption. Unless you state otherwise, any contribution you submit shall be\ndual-licensed as above, without additional terms.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fazagatti%2Ftrimwire","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fazagatti%2Ftrimwire","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fazagatti%2Ftrimwire/lists"}