Skip to main content

The context compression layer for AI agents - typically 0-54% fewer tokens on real high-entropy content, up to 95% on repetitive logs/fixtures (best-case ceiling), reversible via CCR

Project description

  ███████╗ ██╗   ██╗ ██████╗  ██╗
  ██╔════╝ ██║   ██║ ██╔══██╗ ██║
  █████╗   ██║   ██║ ██████╔╝ ██║
  ██╔══╝   ██║   ██║ ██╔══██╗ ██║
   ██║      ╚██████╔╝ ██║  ██║ ███████╗
   ╚═╝       ╚═════╝  ╚═╝  ╚═╝ ╚══════╝
 The context compression layer for AI agents
  

Typically 0–54% fewer tokens on real high-entropy content · up to 95% on repetitive logs/fixtures (honest read) · a Claude Code plugin · local-first · reversible

Release License: Apache 2.0

Install · Proof · Library · Community


Furl compresses everything your Claude Code agent reads — tool outputs, logs, web fetches, RAG chunks — before it reaches the model. Same answers, a fraction of the tokens. Every dropped byte stays retrievable on demand.

The name is nautical: to furl is to roll up a sail — Furl rolls long context up out of the model's way and keeps it on a line, ready to unfurl (retrieve) the instant you need it.

Furl was extracted from the author's Headroom context-engineering experimentation project — the early commit history carries that lineage.

Furl in action

Install

Two commands inside Claude Code:

/plugin marketplace add omar-y-abdi/furl
/plugin install furl@furl

That's it — this installs the compression hook, the MCP tools, and the skill. No pip install, no setup: Furl fetches itself on first use. Requires uv on your PATH (same as the official serena plugin).

What you get

  • Auto-compression hook — shrinks large Bash / WebFetch / WebSearch / Task (sub-agent) outputs before they enter context. Fail-open: never breaks a tool call. It does not touch your Read / Grep / Glob file reads — by design, so a later Edit still sees exact file bytes; those reads (often a coding agent's largest context cost) pass through uncompressed (why). One honest limit: when an output is so large that Claude Code itself persists it to a file and hands the model only a file reference, there is no inline output for the hook to compress.
  • Known issue: Claude Code ≥2.1.163 currently ignores hooks' replacement output (anthropics/claude-code#68951), so the automatic PostToolUse compression above stores and accounts savings, but the model may still receive the original text until that bug is fixed. Manual tools (furl_compress / furl_retrieve / furl_search) are unaffected. See LIBRARY.md for current harness status and the FURL_PRETOOL_PIPE opt-in.
  • Signal-aware offload + sliceable retrieval — a payload too big to compress inline (e.g. a 33 MB trace) comes back as a structured summary (schema, per-field value histograms, example rows) instead of a truncated head/tail, and the agent pulls a narrow slice on demand — retrieve(hash, select_field="name", select_equals="DroppedFrame") or a numeric range — without materializing the whole thing.
  • MCP toolsfurl_compress, furl_retrieve, furl_stats, furl_purge (erase stored originals), furl_search (find by content substring), furl_list (list stored entries). A seventh tool, furl_read, exists but is off by default — enable with FURL_MCP_READ=1 (see LIBRARY.md).
  • Skill — explains the <<ccr:HASH>> retrieval flow and how to tune or disable it.

Tuning, disabling (FURL_HOOK_ENABLED=0), and the full reference: plugins/furl/README.md. Retrieval TTL differs by surface: the library defaults to 30 minutes; this Claude Code plugin ships a 24 h window (FURL_CCR_TTL_SECONDS=86400) governing both the hook's offloads and the MCP tools' stores; the furl CLI (no bare binary on PATH by default — run it via uv run --no-project --with 'furl-ctx[mcp]' furl ..., or pip install furl-ctx for a persistent one) defaults to the same 24 h. (A bare MCP server without a valid FURL_CCR_TTL_SECONDS keeps a 1 h session TTL for its tool-stored entries, while dropped-row originals embedded in compressed output follow the library's 30-minute default — the full 24 h window needs the env set, as the plugin ships it.)

A note on version numbers: the Claude Code plugin versions independently from the furl-ctx engine it pins — a plugin release doesn't always mean an engine release, and vice versa. /plugin shows the plugin version; GitHub Releases and CHANGELOG.md track the engine version; the SessionStart banner shows both together (furl <plugin> · engine furl-ctx <engine>), which is the quickest way to see both numbers at once.

Proof

Token reduction on real captured data — a dated snapshot (inputs committed under benchmarks/data/ for auditability; a re-run measures the current engine, so absolute counts can drift from this table — the honest-read band below is the authoritative check). Every number uses the engine's own tokenizer and measures compress() directly — independent of the PostToolUse hook-delivery issue noted above; needle recall is 100% (a known unique row is always recoverable, in the output or via CCR). Read every figure below as a best-case ceiling, not a typical — the honest read follows.

Best-case ceilings — low-entropy dev fixtures (the compressor's happy path):

Dataset Items Before After Reduction Info retention
code 7 41,025 471 99% 100%
multiturn 135 14,866 2,073 86% 100%
logs 90 8,595 619 93% 100%
search 90 4,102 318 92% 100%
repeated logs 90 3,621 120 97% 100%
disk 9 694 279 60% 100%

Across the corpus: 95% fewer tokens (72,903 → 3,880) at 100% information retention. Full methodology and the 6-seed adversarial sweep: BENCHMARKS.md.

Honest read: the numbers above are best-case, low-entropy ceilings measured on the dev fixtures — two independent, out-of-sample audits show they degrade by 6–43pp on fresh high-entropy / near-unique / realistic data (exactly where real logs and listings live). On genuinely high-entropy content, honest lossless savings sit in the 0–54% band, not 60–95% (code 0%, search 40%, repeated_logs 54%); read every figure here as a ceiling, not a typical, and see the tier-aware breakdown in BENCHMARKS.md.

The code row's 99% is CCR-offload of a large non-file-read tool output (e.g. Bash dumping source text); an agent's own Read/Grep/Glob file access bypasses the compression hook by design and passes through unchanged, at 0%.

Also a Python library

The same engine drops into any Python app or MCP host:

from furl_ctx import compress

messages = [{"role": "tool", "content": "..."}]
result = compress(messages, model="claude-sonnet-4")
# result.messages → compressed when content is large enough; CCR keeps originals retrievable

Install, usage, pipeline internals, prompt-caching contract, and the full FURL_* config reference live in LIBRARY.md.

Community

Questions or bug reports → open a GitHub issue (the surest way to reach the maintainer). For chat, there's a Discord.

Maintainer note: Furl is solo-maintained today — one person handles issues, PRs, and security reports, so response times vary with availability. CONTRIBUTING.md covers how PRs get reviewed and SECURITY.md covers the vulnerability-disclosure process; both hold regardless of team size.

License

Apache 2.0 — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

furl_ctx-1.2.0.tar.gz (800.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl (5.4 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl (5.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

furl_ctx-1.2.0-cp310-abi3-macosx_11_0_arm64.whl (5.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

furl_ctx-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file furl_ctx-1.2.0.tar.gz.

File metadata

  • Download URL: furl_ctx-1.2.0.tar.gz
  • Upload date:
  • Size: 800.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for furl_ctx-1.2.0.tar.gz
Algorithm Hash digest
SHA256 5c1beff5e9d6e1d14b3ae9ed6fe91bd336292d8d95d1eb1d3bfefe24ace845a2
MD5 8a35c388da7bc469b9105ba9486aab83
BLAKE2b-256 73e915dcad585a138ac5e2f070c4507e8d3c2dd22c347018114ee21b75e32a46

See more details on using hashes here.

Provenance

The following attestation bundles were made for furl_ctx-1.2.0.tar.gz:

Publisher: release.yml on omar-y-abdi/furl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 64da20181a1fb10609e5005b9f3b65aedabc6a2bf9dbec5efe4492c551ea16b7
MD5 5b8301e4101707cfbb065cbcf9dc7411
BLAKE2b-256 54b308fd107c251d80a502898282b35f040eb5d0188ea0abe2648370d586c21f

See more details on using hashes here.

Provenance

The following attestation bundles were made for furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on omar-y-abdi/furl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c974370e0e91f5515af99bef0629b8ecafc396c0b060fa402855fce0ee4669fb
MD5 48d5417606d7adec56747ea9cd22487a
BLAKE2b-256 18e8493e584fd083b26a384fc8f61c191be4150dba5cdc45ad59d118aece1b68

See more details on using hashes here.

Provenance

The following attestation bundles were made for furl_ctx-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on omar-y-abdi/furl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file furl_ctx-1.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for furl_ctx-1.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 796ad84b4606d47a556beeaf34baaa830f94c127ab16c35f7a9a154f8227fdc6
MD5 72ddccd5f28a02352b5bd37af9b94dfd
BLAKE2b-256 5da700c66f89d310e6eec8e937a022accd1a431ac37cdea186d78b1ae4fc616a

See more details on using hashes here.

Provenance

The following attestation bundles were made for furl_ctx-1.2.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on omar-y-abdi/furl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file furl_ctx-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for furl_ctx-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 10dffb0dbc9d3b29d484f6a67bb7cdf9eafa176599621507884d552f0649cb91
MD5 b28cd29f87a4118e744acbcf1ae2bb9f
BLAKE2b-256 6a0b20290b9ebcfdca278ee2d18321c8c2685562aff979932225e89b641fd172

See more details on using hashes here.

Provenance

The following attestation bundles were made for furl_ctx-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on omar-y-abdi/furl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page