0.42.0 (2026-10-26)
Features
- pipeline: put per-request saved tokens on OutcomeSnapshot (#4231) (8cedf7b)
- proxy: let turn hooks rewrite OpenAI Responses requests on HTTP and WebSocket (#4232) (fbf7bc3)
- proxy: report the same tool savings on gateway /v1/compress as the proxy path (#4467) (a904210)
- savings: add the per-request counterfactual savings record (#4236) (2912b7b)
Bug Fixes
- batch: preserve live contexts during capacity cleanup (#4210) (2cbdd22)
- batch: preserve native Gemini continuation tools (#4211) (8757458)
- cache: bound the router's compression cache, keep the rest in SQLite (#4357) (b196424)
- cache: keep indented lines intact in OpenAI whitespace normalization (#4343) (2480100)
- cache: keep prefix-tracker state across a graceful proxy restart (#4299) (62b3bed)
- ccr: recognize client-owned MCP retrieval aliases (#4165) (89545fb)
- ccr: stream the buffered CCR upstream request so idle-killing networks cannot cut it (#4206) (ca6ba34)
- ci: pin checkout in release notification smoke workflow (#4399) (70273db)
- copilot: detect COPILOT_API_URL in cli-main.js for Copilot CLI >= 1.0.93 (#4450) (043fe09)
- copilot: preserve native inline OAuth identity (#4144) (ad62166)
- deps: bump rustls to 0.23.46 for RUSTSEC-2026-0346..0349 (#4222) (132dbc7)
- deps: patch OpenClaw Undici and narrow E2E audit exceptions (#4453) (1be699f)
- deps: require hf-xet>=1.6.0 so a Hub download can't crash Python at exit (#4192) (9e5dac7)
- deps: require mcp>=1.30.0 for CVE-2026-59951 (#4239) (2f7a83a)
- gateway: keep input_includes_cache when re-drive usage is merged (#4423) (3f94144)
- gemini: keep snake_case inline_data and function parts when compressing (#4290) (4bf1bf5)
- image: clear last_result before each compress() call (#4341) (19c91a8)
- image: flatten transparent images onto white before re-encoding as JPEG (#4296) (9f5cfcf)
- install: keep the HuggingFace cache on a writable mount in Docker presets (#4207) (#4209) (7b6cb77)
- kompress: skip the local model download when a remote endpoint is set (#4234) (ff36931)
- kompress: time each model-load stage and stop false not-ready warnings during warm-up (#4195) (89b229c)
- learn: anchor the managed block on its last start marker, append when no end marker (#4342) (45dacc1)
- learn: keep the digest's loop section inside its budget (#4269) (506ba16)
- logs: count omitted levels from dropped lines (#4141) (023dd1b)
- mcp: accept the JSONC opencode config that wrap and install already accept (#4297) (9202948)
- memory: bound retrieval queries before embedding (#4244) (8c07cf4)
- memory: ignore incidental cwd prose (#4166) (3765439)
- memory: log storage and SQLite failures that currently make retrieval miss silently (#4111) (4e6e955)
- memory: resolve partial IDs beyond the first 1000 records (#4389) (c4ea31b)
- memory: treat a cwd with no UTF-8 form as unresolved instead of raising (#4167) (760c05e)
- openai: read Responses cache_write_tokens instead of inferring writes (#4237) (4630602)
- openai: recompress cached Responses units whose CCR entries expired (#4146) (8f7b419)
- opencode: do not rewrite an OpenCode config that fails to parse (#4424) (0fe0a59)
- opencode: restore process env keys on transport dispose (#4430) (d17bac8)
- pricing: suppress litellm's Provider List banner that corrupts perf JSON (#4197) (e01ad35)
- proxy: accept HEADROOM_MEMORY_INJECTION_MODE=tool (#4395) (f89c928)
- proxy: bound per-model state keyed by the client model string (#4407) (33e5f67)
- proxy: copy cached tool compaction results (hardening) (#4410) (a256231)
- proxy: count output tokens from CRLF-framed SSE streams too (#4298) (755293d)
- proxy: do not rebuild a failed turn-hook re-drive as HTTP 200 (#4398) (f59c8ff)
- proxy: drop web_search_call history from a Responses request with no web_search tool (#4202) (2a70d12)
- proxy: honor bypass header and license gate in Anthropic batch create (#4411) (4fd9cdd)
- proxy: import Response at runtime in the Bedrock handler (#4397) (51e4ae3)
- proxy: judge NAT64 upstream addresses by their embedded IPv4 (#4179) (486afaa)
- proxy: keep in-period costs in the budget ledger when the entry cap is reached (#4448) (41c15b3)
- proxy: keep negative compression savings across restart (#4406) (bebe24c)
- proxy: keep tool deferral for GitHub Copilot upstream (#4356) (217b658)
- proxy: let HEADROOM_LOG_LEVEL=debug turn on Headroom's own debug logs (#4137) (00093ce)
- proxy: make handler failures debuggable from the logs (#4127) (7dc20b6)
- proxy: net tools a turn hook adds against the saving it books (#4057) (85520c2)
- proxy: record a stream the client closes after its terminal event as completed (#4286) (762a337)
- proxy: record outcome when a passthrough stream ends mid-character (#4429) (75cfbba)
- proxy: report disabled Kompress at startup (#4217) (430ea4f)
- proxy: report read maturation as inert in cache mode (#4198) (ba82453)
- proxy: show turn-hook savings in /stats extension_savings, incl. Codex WS (#4233) (1d112cd)
- proxy: snapshot the original messages when a turn hook can edit them (#4241) (df11f27)
- relevance: load the default embedder from one pinned snapshot (#4152) (f380692)
- savings: key a Responses conversation on its thread, not the shared session (#4440) (11f743d)
- sdk: preserve Vercel AI SDK file and image parts through compression (#4048) (1668a6c)
- security: restrict the Windows runtime log via NTFS ACL, not just warn (#4135) (125a703)
- smart-crusher: match audit-safe protected_patterns against unescaped text (#4294) (e11afdb)
- storage: normalize timezone-aware JSONL time filters (#4063) (bf34ccf)
- tabular: pass tables with repeated header names through verbatim (#4278) (ed3195b)
- telemetry: give empty-item compressions a stable tool signature (#4396) (a79def4)
- telemetry: let HEADROOM_TELEMETRY=off stop the anonymous beacon (#4235) (1a40b3c)
- transforms: keep the fences of a code block passed through for a protected tag (#4292) (02958c6)
- transforms: log the compression failures that silently become "no savings" (#4092) (580cc83)
- zcode: skip providers that point at the Headroom proxy itself (#4413) (9ac1b52)
Dependencies
- Bump base64 from 0.22.1 to 0.23.1 (#4029) (8d468d4)
- Bump ruff from 0.16.8 to 0.17.0 in the pip-minor-patch group across 1 directory (#4026) (de3f639)
- Bump the cargo-minor-patch group across 1 directory with 12 updates (#4186) (683c9a6)
- Bump the npm-minor-patch group across 2 directories with 16 updates (#4218) (07c8bbf)
- Bump the npm-minor-patch group across 3 directories with 12 updates (#4219) (1f71cb3)
- Update huggingface-hub requirement from <2.0,>=1.5.0 to >=1.5.0,<3.0 (#4027) (fcf3db8)
Code Refactoring
- integrations: share the local/cloud compress backend of asgi and litellm_callback (#4124) (58caafb)
- transforms: share one CCR persist helper for the Rust-backed compressors (#4094) (ea947ca)
Headroom for Teams: 3 months of Headroom Enterprise free with a 12-month plan. Claim the perk →