-
Notifications
You must be signed in to change notification settings - Fork 12
lore
A narrative history of DroidProxy, reconstructed from git. Every era below is anchored to a date or month pulled from the commit log. Where the commits do not explain why something happened, the text hedges ("appears to", "likely").
The first commit landed on 2025-10-04 ("initial commit"). Within days the project had a working shape: a macOS menu bar app that wrapped the cli-proxy-api backend. By 2025-10-05 the binary and config were committed directly into the repo ("Commit cli-proxy-api binary and config to repo", "Add entitlements for notarization", "Sign cli-proxy-api binary for notarization"), and the same day the project was branded VibeProxy ("Rebrand to VibeProxy and improve process cleanup", "Update Makefile to reflect rebranding to VibeProxy").
This era is mostly about getting a signed, notarizable menu bar app to start and stop a bundled backend cleanly — including "automatic cleanup of orphaned server processes on app startup" (2025-10-06) and Gemini OAuth login fixes (2025-10-14). ThinkingProxy.swift first appears on 2025-10-14, so the user-facing proxy layer was added shortly after the wrapper itself stabilized.
Through late 2025 the app grew from a single-provider wrapper into a multi-provider, multi-account tool. Antigravity OAuth support arrived on 2025-11-21 ("Add Antigravity OAuth support to VibeProxy"), bringing Gemini 3 Pro routing with it (2025-11-22). Multi-account support with automatic failover landed on 2025-12-06, and a per-account disable/enable toggle followed on 2026-02-27.
The provider list kept widening: Z.AI GLM (2026-01-10), Claude-via-Antigravity gemini-claude-* models (2026-01-05), and a "Provider Priority" toggle to control which providers are active (2026-01-13). This era is where the auth/provider model that the app still uses took shape.
On 2025-12-08 the backend was swapped: "Switch to CLIProxyAPIPlus with GitHub Copilot support (v1.8.0)". For most of its life the app bundled this cli-proxy-api-plus binary. December 2025 was also the single busiest month in the history (168 commits), which likely reflects the churn of migrating to the new backend and shipping the v1.8 line.
A notable wrinkle of that era: the CLIProxyAPIPlus fork's upstream releases became unavailable, so the binary was vendored directly in the repo rather than pulled from a live upstream at build time. That vendoring decision still holds today (the binary is committed, not downloaded during release builds), but the backend itself has since moved on — see the next milestone.
On 2026-05-30, "Switch bundled backend to mainline CLIProxyAPI; remove Amp (#100)" replaced the CLIProxyAPIPlus fork with the mainline router-for-me/CLIProxyAPI. The bundled binary was renamed cli-proxy-api-plus → cli-proxy-api (and shrank from ~49 MB to ~40 MB), the auto-bump workflow now pulls the darwin_aarch64 tarball and detects the version via cli-proxy-api -h, and the orphan-sweep matches both the new and legacy names with pgrep -x. The same change tore out Amp CLI routing entirely: the /auth/cli-login redirect, /provider/* rewrite, ampcode.com management forwarding, and Amp response normalization were all removed from ThinkingProxy (which dropped from ~1,408 to ~1,124 lines), and the amp-upstream-url / amp-restrict-management-to-localhost keys left config.yaml. The release path itself lives in .github/workflows/release.yml.
The VibeProxy → DroidProxy rename happened in two visible steps. On 2026-03-26 the project was rebranded and trimmed ("refactor: rebrand to DroidProxy, strip non-Claude providers and Vercel gateway"), and on 2026-04-02 the rename was completed alongside Codex support ("refactor: rename VibeProxy to DroidProxy, update documentation and features for Codex support"). The bundle identity settled on com.droidproxy.app. As late as 2026-05-30 there was still cleanup of the old identity ("Remove all VibeProxy/automazeio references"), so the rebrand appears to have been a gradual sweep rather than a single atomic change.
This era also added Gemini provider support with thinking-level controls (2026-04-05) and overhauled the settings UI with "Liquid Glass" styling for macOS 26+ (2026-04-16).
The defining rewrite of 2026 was handing reasoning control to Droid CLI: "Hand thinking control to Droid CLI (#75)" on 2026-05-21. Before this, the proxy injected reasoning/thinking fields into request bodies itself (the file is still named ThinkingProxy.swift for that original job). After it, per-session reasoning effort is owned by Droid CLI via Factory custom-model metadata, and the proxy forwards whatever the client sends. See Thinking proxy for the current, slimmed-down behavior. This is covered in more detail under "Major rewrites" below.
The most recent era kept adding providers and tightening the proxy. Kimi login and the k2.6 model landed on 2026-05-12 ("Add Kimi login and k2.6 model (#66)"); Cursor API / Composer proxying arrived on 2026-05-25 ("feat: add Cursor API & Composer proxy integration (#85)"); and Gemini was rerouted through the Antigravity executor for a paid quota path on 2026-05-25 ("Route Gemini models through Antigravity executor (#84)"). Performance work in the same window avoided JSONSerialization for request checks (2026-05-25, #87) and a "simplify-swarm pass" simplified the Swift sources (2026-05-26, #91). OAuth usage probes for Claude and Codex were added to the menu bar a bit earlier, on 2026-05-11 ("feat: add Claude and Codex usage probes to menu bar (#64)").
The oldest surviving files (first commit touching each, via git log --reverse --format=%ai -- <file>):
| First seen | File |
|---|---|
| 2025-10-04 | create-app-bundle.sh |
| 2025-10-05 | src/Sources/main.swift |
| 2025-10-05 | src/Sources/AppDelegate.swift |
| 2025-10-05 | src/Sources/ServerManager.swift |
| 2025-10-05 | src/Sources/Resources/config.yaml |
| 2025-10-14 | src/Sources/ThinkingProxy.swift |
create-app-bundle.sh is the single oldest surviving artifact, present from the initial commit — the bundling story predates most of the Swift code. The app shell (main.swift, AppDelegate.swift), the backend manager (ServerManager.swift), and the bundled config.yaml all date from the first full day. ThinkingProxy.swift is about ten days younger, consistent with the proxy layer being added on top of an already-working wrapper.
The largest behavioral rewrite was the removal of proxy-side reasoning injection ("Hand thinking control to Droid CLI", 2026-05-21). The ThinkingProxy no longer injects thinking, reasoning, reasoning_effort, output_config, budget_tokens, or generationConfig.thinkingConfig. Earlier history shows how much logic this removed: there had been a "Max Budget Mode" path scoped to Sonnet 4.6 (2026-04-16, #36), Gemini "thinking injection" (2026-04-08), and Claude variant handling — all of which the refactor consolidated into Factory custom-model metadata that Droid CLI sends. The file kept its name, so today ThinkingProxy is named for a job it no longer does (see Fun facts).
A second, quieter rewrite was the move off full JSON re-serialization. To preserve Anthropic's prompt-cache key ordering, the proxy switched to surgical raw-string JSON edits ("perf(proxy): avoid JSONSerialization for request checks", 2026-05-25, #87; earlier cleanup of the "surgical JSON helpers" on 2026-03-19). This is why ThinkingProxy.swift carries a hand-written JSON scanner instead of using JSONSerialization.
The version tags tell a fast-moving story: from v1.0.0 to the v1.8.x line, with the bulk of releases concentrated in the v1.8.* series (v1.8.0 through the high v1.8.x patches). Commit volume stayed high throughout — ~761 commits since 2025-10-04, averaging well over 100 per month early on and ~235 in the most recent 90 days. The 2025-12 peak (168 commits) coincides with the CLIProxyAPIPlus migration and the v1.8.0 cut.
A meaningful fraction of that commit count is automation: the release bot commits an appcast/version bump per release, so the raw commit total over-represents shipping activity relative to feature work. See By the numbers for the bot-vs-human breakdown.