Releases: kevin-lee/claude-proxymate
Release list
v0.3.0
0.3.0 - 2026-07-21
New Features
-
Make Global the default Route Claude mode (#26)
The Route Claude control now defaults to Global instead of Manual, since routing Claude through the proxy automatically is what most users want. On first launch — and for existing users who never explicitly picked a route — the control starts on Global, which manages
ANTHROPIC_BASE_URLin theenvobject of~/.claude/settings.jsonwhile the proxy runs (applied on proxy start; removed on proxy stop, app quit, and by the crash-recovery sweep at the next launch, exactly as before).Anyone who had already selected a mode keeps their choice — the persisted selection is honored on launch, so an explicit Manual stays Manual.
The status-bar control is also reordered to Global · VS Code · Manual so the default sits first.
What's Changed
- Use sbt-dynver for dynamic project versioning by @kevin-lee in #24
- Bump actions/setup-node from 6 to 7 by @dependabot[bot] in #27
- Bump actions/upload-artifact from 4 to 7 by @dependabot[bot] in #28
- Close #26: Make Global the default Route Claude mode by @kevin-lee in #29
- claude-proxymate v0.3.0 by @kevin-lee in #30
New Contributors
- @dependabot[bot] made their first contribution in #27
Full Changelog: v0.2.0...v0.3.0
v0.2.0
0.2.0 - 2026-07-13
New Features
-
Add an easy way to set up VS Code to use Claude Proxymate (#17)
While enabled, the
ANTHROPIC_BASE_URLentry inclaudeCode.environmentVariablesof every detected VS Code-family editor's usersettings.json(VS Code, VS Code Insiders, VSCodium, Cursor) is managed automatically: applied when the proxy actually starts, and removed on proxy stop, proxy crash, app quit, and by a crash-recovery sweep at the next launch.Safety first:
settings.jsonis edited withjsonc-parser, so comments, trailing commas, and formatting survive.- Every write is preceded by a backup under the app's userData, verified after writing, and restored from the backup on failure.
- Ownership is record-based: a foreign
ANTHROPIC_BASE_URLvalue (e.g. a corporate gateway) is never modified or removed.
-
Improve UX and support global setting update for Claude Proxy (#19)
The main window is redesigned as title bar → address bar → content → status bar, so the one primary action and ambient state no longer compete in a single overloaded toolbar:
- The title bar keeps only view controls (theme, language, info); the About popover anchors under it.
- A new address bar holds the sole primary action (Start Proxy / Stop), the port field (editable only while stopped, locked while running so the displayed command can no longer drift from the actually bound port), and the copyable
ANTHROPIC_BASE_URLcommand. - A new IDE-style status bar shows status, port, and request count, plus the modes: a single Mask secrets switch (replacing the status chip + Reveal All button) and the Route Claude control.
- Clear moves into the captured-requests panel header, next to what it clears, and the empty states get correct copy.
The VS Code ON/OFF toggle from #17 becomes a three-way Route Claude control, so Claude can also be routed through the proxy without VS Code:
- Manual — no settings file is touched.
- VS Code — manages
ANTHROPIC_BASE_URLinclaudeCode.environmentVariables(as before). - Global — manages
ANTHROPIC_BASE_URLin theenvobject of~/.claude/settings.json.
Exactly one target is active at a time, so selecting one removes the entry from the other. The selection and the port now persist across restarts, but the env var still only exists while the proxy runs: proxy stop, app quit, and the launch sweep remove it from every target regardless of mode. Masking still starts ON at every launch for screen-share safety.
Fixes
-
The native proxy binary silently ignored
--portand always bound 8888 regardless of the UI port; both entry points now parse the real program arguments, and a startup/bind failure emits aproxy_errorprotocol event instead of only stack-tracing to stderr. (#17) -
The proxy-bar status was optimistic and could show "Running" for a dead proxy (e.g. port already in use). The UI state is now driven by the binary's actual started/stopped/error events, so "Running on port N" appears only after the true bind, the port field reflects the actually bound port, and a failed start surfaces an error alert (with a 10s watchdog as fallback). (#17)
Internal Housekeeping
- Add Dependabot configuration and PR labeler GitHub Actions workflow
Updated GitHub Actions:
actions/checkout:4=>7actions/setup-java:4=>5actions/setup-node:4=>6actions/download-artifact:4=>8softprops/action-gh-release:2=>3
What's Changed
- Add Dependabot configuration and PR labeler GitHub Actions workflow by @kevin-lee in #11
- Close #17: Add an easy way to set up VS Code to use Claude Proxymate by @kevin-lee in #18
- Clsoe #19: Improve UX and support global setting update for Claude Proxy by @kevin-lee in #20
- Update GitHub Actions workflows by @kevin-lee in #21
- claude-proxymate v0.2.0 by @kevin-lee in #22
- claude-proxymate v0.2.0 by @kevin-lee in #23
Full Changelog: v0.1.2...v0.2.0
v0.1.2
0.1.2 - 2026-07-11
Update
- Turn the
(i)button popover into an About panel with website and bug report links (#9)
Internal Housekeeping
- Fix Google Analytics credentials (#8)
What's Changed
- Bake Google Analytics credentials into the build instead of reading them at runtime by @kevin-lee in #8
- Turn the (i) button popover into an About panel with website and bug report links by @kevin-lee in #9
- claude-proxymate v0.1.2 by @kevin-lee in #10
Full Changelog: v0.1.1...v0.1.2
v0.1.1
0.1.1 - 2026-07-11
Update
-
Update price data (#5)
Update cost-calculation pricing data for current Claude models
Tier (code) Input Output Cache Read 5m Cache Write Fable5 (Fable 5, Mythos 5) $10 $50 $1.00 $12.50 OpusPremium (4.5–4.8) $5 $25 $0.50 $6.25 OpusLegacy (4.1, 4.0, Opus 3) $15 $75 $1.50 $18.75 Sonnet5 intro (≤ 2026-08-31) $2 $10 $0.20 $2.50 Sonnet5 from 2026-09-01 / Sonnet 4.x $3 $15 $0.30 $3.75 Haiku 4.5 $1 $5 $0.10 $1.25 Haiku 3.5 $0.80 $4 $0.08 $1.00 Haiku 3 $0.25 $1.25 $0.03 $0.30 Price source: https://platform.claude.com/docs/en/about-claude/pricing
Internal Housekeeping
Updated dependencies:
scala:3.3.7=>3.8.4sbt-scala-native:0.4.17=>0.5.12sbt-scalajs:1.20.2=>1.22.0sbt-devoops:3.5.0=>3.5.1cats:2.11.0=>2.13.0cats-effect:3.5.7=>3.7.0circe:0.14.8=>0.14.16fs2:3.11.0=>3.13.0http4s:0.23.33=>0.23.34scalajs-dom:2.8.0=>2.8.1hedgehog:0.13.0=>0.13.1munit:1.0.0=>1.3.3
What's Changed
- Refactor: Apply better Scala + Functional Programming (FP) practices by @kevin-lee in #1
- Update dependencies (Scala 3.8.4, Scala Native 0.5) and fix the resulting breakage by @kevin-lee in #2
- Add
build.yml- for non-release build by @kevin-lee in #3 - Drop codesign seal check from build.yml's unsigned DMG smoke verify by @kevin-lee in #4
- Close #5: Update price data by @kevin-lee in #6
- claude-proxymate v0.1.1 by @kevin-lee in #7
New Contributors
- @kevin-lee made their first contribution in #1
Full Changelog: v0.1.0...v0.1.1
v0.1.0
Claude Proxymate 0.1.0
2026-07-04
The first release of Claude Proxymate — a real-time man-in-the-middle (MITM) proxy that intercepts and visualizes API traffic between Claude Code and the Anthropic API. It surfaces the hidden prompt-augmentation machinery (CLAUDE.md injection, slash commands, skills, sub-agents, MCP tools) in a desktop UI, with privacy-first masking so captures are safe to share.
Built as a hybrid Scala Native + Scala.js application: a native HTTP proxy binary forwards traffic to Anthropic and streams capture events into an Electron UI written entirely in Scala.
Highlights
Live capture
Every request/response pair between Claude Code and api.anthropic.com is captured and reconstructed from the SSE stream into a full message. The capture's own response is shown in the Messages tab in place, rather than lagging one turn behind.
Mechanism detection
Each request body is scanned for prompt-augmentation mechanisms and highlighted in place: injected CLAUDE.md / rules / memory sections, output styles, slash commands, skills, sub-agents, and MCP tools.
Request Anatomy
A dashboard on the Analysis tab that quantifies a request: per-segment byte/token estimates, structural facts (message / turn / tool / image / thinking counts, cache-eligible system blocks), a mechanism inventory, and flagged anomalies.
Token cost
Per-capture cost breakdown driven by model-based pricing.
Privacy masking
Display-only — raw captures are never mutated:
- Sensitive field-name values (
api_key,*_token,password, account / device / session identifiers, …). - Known-shape secrets in free text (
sk-ant-…and friends) via regex detection, with longer-than-canonical tokens masked whole. - Verbose correlation IDs (
msg_…,toolu_…) compacted to a short hash tag. - Sensitive URL query-string values.
- Presenter mode — one decisive global mask-all / reveal-all toggle (⌘⇧M).
- WYSIWYG Copy — the clipboard follows the on-screen mask state, in both the detail view and the Messages tab.
Search
Across request / response / analysis / messages, with match navigation.
Messages tab
All is the first sub-tab and the default selection.
Theme and i18n
- System / light / dark theme, tracking the OS
prefers-color-scheme. - English and Korean, externalized to
.propertiesfiles and loaded at runtime.
Onboarding
A getting-started image carousel that walks new users through the app.
Security hardening
- Chromium OS-level sandbox enabled on the renderer (
sandbox: true). - All renderer-initiated navigations blocked on
webContents. - Strict Content-Security-Policy meta tag on the generated
index.html. - DevTools disabled in packaged builds, with an env-flag escape hatch.
- A confirm prompt on the Clear button before captures are discarded.
Architecture
Five cross-compiled modules:
| Module | Platform | Purpose |
|---|---|---|
claude-proxymate-core |
JVM / JS / Native | Shared core: data models, JSON codecs, SSE parser, CLAUDE.md parser, mechanism detector, Request Anatomy, masking primitives, IPC / element-ID constants, JSON-line protocol. The JVM side also generates index.html (ScalaTags) and the i18n JSON at build time. |
claude-proxymate-server |
Scala Native | HTTP proxy binary. Intercepts requests, forwards to Anthropic, tees the response, emits events as JSON lines on stdout. Default TLS backend is libcurl via FFI (CurlMain); an http4s Ember / s2n backend (Main) is available as a fallback. |
claude-proxymate-electron |
Scala.js | Electron main process. Spawns the native proxy, reads its stdout, forwards events to the renderer via IPC. |
claude-proxymate-preload |
Scala.js | Electron preload bridge. Exposes IPC channels to the renderer via contextBridge. |
claude-proxymate-renderer |
Scala.js | Electron renderer UI. All frontend logic, built on a testable View/logic split (pure ScalaTags *View modules render to strings; sibling modules wire them to the DOM). |
Install
Prebuilt macOS DMGs are published on the Releases page:
- Apple Silicon (M1/M2/M3/…):
Claude-Proxy-0.1.0-arm64.dmg - Intel:
Claude-Proxy-0.1.0-x64.dmg
Open the DMG and drag Claude Proxymate to Applications.
These builds are not yet signed with an Apple Developer ID or notarized, so
macOS Gatekeeper will refuse to open the app on the first try. Right-click the
app in Applications and choose Open, or clear the quarantine flag with
xattr -dr com.apple.quarantine "/Applications/Claude Proxymate.app". Signed +
notarized builds are planned once an Apple Developer ID is available.
Acknowledgements
Inspired by an early version of claude-inspector.
Full Changelog: https://github.com/kevin-lee/claude-proxymate/commits/v0.1.0