Skip to content
ShareQuota

Changelog

Read from the repository’s own CHANGELOG.md at build time. Nothing on this page is written by hand, which is the only way a changelog stays true.

  1. Unreleased

    • Root governance documents: README.md, CHANGELOG.md, VERSION, .github/{CONTRIBUTING,SECURITY,CODE_OF_CONDUCT}.md, with the per-tool rule files folded into a single AGENTS.md on 2026-07-26.
    • .claude/ rules and skills so agent-assisted development follows the same conventions as human contributors.
    • CI workflow: gofmt check, go vet, go test -race, and the web dashboard build.
    • Test suites for internal/auth, internal/store, internal/clitools, internal/proxy, internal/server, and internal/translator (stdlib testing, table-driven, race-enabled).
    • .gitattributes for consistent line-ending and diff behavior across platforms.
    • Repo hygiene: untracked the ~16 MB compiled binary and 2,453 web/node_modules files from git; .gitignore updated to keep build artifacts and dependencies out of history.
    • CI on windows-latest (#12)internal/webui.serveGzipped now pins the MIME map for .js, .mjs, .css, .json, .svg, .wasm at package init. On Windows Go's mime.TypeByExtension reads from the registry, which maps .jsapplication/javascript; RFC 9239 makes text/javascript the standard everywhere else. Content-Type is now identical across OSes.
    • CI on windows-latest (#13)TestResClsHugeBodyIsCheap ceiling raised from 2 s → 30 s. The classifier IS bounded (boundedEvidence caps at MaxBodyScan); the 2 s ceiling flaked on windows-latest under -race + -cover where the per-call constant work is ~80 ms. A real body-linear regression would still trip the new ceiling (200 × 4 MiB ≈ 800 MB of scan work is 160+ s).
    • Gemini tool-call identity (#1, #2, #3)functionResponse.Name now resolves the real function name from the request's assistant tool_calls (Gemini keys tool results on name, not id); streaming gives every functionCall its own tool index and id+name header frame; non-streaming ids are minted call_<name>_<n> so duplicate function names no longer collide.
    • Translator null content (#10) — user messages with no convertible parts are dropped instead of being forwarded as "content": null, which Anthropic rejects with a 400.
    • Model routing (#5, #16) — provider alias matching is case-insensitive (Claude/... no longer silently reroutes to OpenRouter with the wrong quota burned), and o1/o3/o4 prefixes require a word boundary so o1x-custom / o365-connector no longer misroute to ChatGPT.
    • Proxy error paths (#17, #18)writeError maps status codes to proper per-dialect error types (429 → rate_limit_error, 529 → overloaded_error, 5xx → api_error/server_error, …) so clients can tell retryable failures from caller mistakes; rewriteModel returns an error instead of panicking on a JSON null body.
    • Store error handling (#6, #7, #8, #14)ValidKey compares keys in constant time and surfaces real DB errors (and proxyAuth now answers 500 rather than 401 on storage failure); EnsureInternalKey only creates a key on genuine sql.ErrNoRows, preventing duplicate rows; corrupted connection rows error with a remediation hint instead of yielding silent empty tokens; LatestCLIBackup breaks same-second timestamp ties by insert order.
    • CLI tools config safety (#4, #13, #15) — Disable restores the byte-exact pre-Enable backup (JSONC/TOML comments and formatting survive) when only ShareQuota's managed keys drifted, keeping the surgical value-restore for user edits; isLoopbackURL parses the URL and classifies the hostname correctly ([::1] is loopback, localhost.example.com is not); disabling on a machine without the CLI removes the stub config so Status.Installed is truthful again.
    • Auth (#11, #12)EnsureFresh performs all conn.Data reads and writes inside the per-connection lock (race-detector-verified); fetchGeminiProjectID's doc comment now matches its error-propagation behavior.
    • Server (#9, #19)Version is a var so release -ldflags -X injection works instead of silently no-oping; GET /api/health is localhost-only, no longer leaking the version fingerprint to the LAN.
  2. 0.1.0

    • Multi-provider quota-sharing proxy — single Go binary exposing an Anthropic-compatible POST /v1/messages and an OpenAI-compatible POST /v1/chat/completions on port 20130, guarded by an internal sq- API key, plus GET /v1/models.
    • Five providers — Claude (Anthropic), ChatGPT (OpenAI), DeepSeek, OpenRouter, and Gemini (Google), with API-key auth everywhere and OAuth for Claude, ChatGPT, and Gemini.
    • Model routing — explicit provider/model syntax, provider aliases, and prefix inference (claude-, gpt-/o1/o3/o4, gemini-/gemma-, deepseek-, namespaced ids → OpenRouter).
    • OAuth 2.0 PKCE flows — loopback callback listener, S256 challenge, provider-specific quirks handled (Claude code#state callback, insertion-ordered auth URL params), automatic token refresh with rotation persistence and invalid_grant deactivation.
    • Format translation — Anthropic↔OpenAI request/response mappers and SSE stream re-emitters, plus an OpenAI↔Gemini path including the Cloud Code envelope.
    • Embedded React dashboard — connection management, OAuth logins, CLI tool toggles, and internal-key management, served from the binary via go:embed.
    • CLI tools integration — reversible Claude Code (~/.claude/settings.json, JSONC-tolerant) and Codex (~/.codex/config.toml) configuration with backup-before-first-write and restore-on-disable.
    • Local storage — SQLite database in ~/.sharequota (override with SHAREQUOTA_DATA_DIR), localhost-only management API under /api/*.

Source: CHANGELOG.md · Keep a Changelog 1.1.0 · semantic versioning