🎉 Stable Release v3.5.0
Multi-Architecture Binaries
Download the appropriate binary for your platform:
- Linux x86_64:
better-ccflare-linux-amd64 - Linux ARM64 (Raspberry Pi 3/4/5, Oracle Cloud ARM, AWS Graviton):
better-ccflare-linux-arm64 - macOS Intel:
better-ccflare-macos-x86_64 - macOS Apple Silicon:
better-ccflare-macos-arm64 - Windows x86_64:
better-ccflare-windows-x64.exe
Installation
# Linux x86_64
wget https://github.com/tombii/better-ccflare/releases/download/v3.5.0/better-ccflare-linux-amd64
chmod +x better-ccflare-linux-amd64
./better-ccflare-linux-amd64
# macOS Apple Silicon (ARM64)
curl -L -o better-ccflare-macos-arm64 https://github.com/tombii/better-ccflare/releases/download/v3.5.0/better-ccflare-macos-arm64
chmod +x better-ccflare-macos-arm64
xattr -d com.apple.quarantine better-ccflare-macos-arm64 # Required for unsigned binaries
./better-ccflare-macos-arm64macOS Users: The xattr command is required to bypass Gatekeeper for unsigned binaries. If you prefer not to run unsigned binaries, install from source instead.
Or install via npm: npm install -g better-ccflare@v3.5.0
What's Changed
⚠️ Breaking Changes
Empty pool now returns 503 from proxy instead of forwarding unauthenticated to Anthropic (misleading 401). Clients expecting old behavior can set CCFLARE_PASSTHROUGH_ON_EMPTY_POOL=1.- fix: YAML syntax error in release workflow breaking change section [skip-version] (eddf513)
🚀 Features
- feat: gate ?detail=1 behind HEALTH_DETAIL_ENABLED setting (default: off) (
016389a) - feat: doctor command + integrity telemetry (#179) (
141f6e3) - feat: add 2s TTL cache to /health endpoint (#185) (
35e2b5a) - feat: report pool status in /health endpoint with three-state logic (
4ade5e3) - feat: add configurable usage throttling (preserve peakHoursPause) (
4bf9b5c) - feat: return 503 when proxy pool is exhausted (#175) (
8436a9d) - feat: return 503 for degraded/unhealthy status, add HTTP status tests (
89f3359) - feat: port reasoning effort + count_tokens + non-streaming (PR #172) (
fcc01e8)
🐛 Bug Fixes
- fix: add SQL-level race guard to peak-hours pause UPDATE (
05a1682) - fix: pass through unknown Codex model names (
0b054bf) - fix: add rate limit audit trail (issue #178) (
0b17a32) - fix: remove verbose JSDoc, assert rate_limited_until null for available accounts in test (
0ce906e) - fix: null rate_limited_until for paused accounts in detail mode, fix test description (
0dfb7c5) - fix: backup db on schema migrations, skip invalid paths [skip-version] (
0e4ad75) - fix: sync PostgreSQL migrations with SQLite schema (issue #189) (
1bddbe9) - fix: add Claude Opus 4.7 model ID [skip-version] (
215baed) - fix: use actual calendar month duration for monthly pacing (
264fcf9) - fix: use nullish coalescing for rate_limited_until (
2862e91) - fix: revert count_tokens acceptance in Codex and remove redundant normalizeUsage (
2bb0d55) - fix: stream SSE incrementally in transformSseResponseToJson, fix downgrade label (
304a4df) - fix: expose Codex context window in streaming responses (
3941c3a) - fix: address Greptile round-2 — warn level, source model excluded, ?? operator (
407e2c5) - fix: narrow payload fetch catch to 404-only, import HttpError from http-common [skip-version] (
4533e17) - fix: use union type for AccountDetail.status (
4e8caa2) - fix: address PR #183 review feedback — type safety and consistency (
5ddc762) - fix: skip premature content_block_stop when function-call block is still open (
60da65a) - fix: preserve content block order in transformSseResponseToJson (
6398a26) - fix: address PR #183 review — log timing, safe reason validation, formatter (
663e212) - fix: restore peak_hours_pause_enabled in SELECT and fix AnyUsageData cast (
6f102be) - fix: cast closure-assigned payloads to suppress TS never narrowing (
7354ed1) - fix: address Greptile review — leak, dead var, dedup, source model fallback (
83775ed) - fix: address PR #177 review feedback (
86185d7) - fix: return full health response when detail=1 but HEALTH_DETAIL_ENABLED is off (
95faf3e) - fix: narrow AccountDetail.rate_limited_reason to RateLimitReason union type (
a4c6551) - fix: eliminate double filter in computePoolStatus, clear expired rate_limited_until in detail mode (
b4c11a3) - fix: replace remaining sanitizeProxyHeaders calls with sanitizeResponseHeaders (
be1d2e2) - fix: add missing getActiveComboForFamily mock to throttling test (
c313017) - fix: add -- to printf calls to prevent format-as-option error [skip-version] (
c6e2079) - fix: restore log message, thread actual model from response.created (
c7a9fe8) - fix: align client monthly window calculation with server UTC math (
d17a600) - fix: refetch request payload in details modal when missing (
d43c52f) - fix: inject stream-intent headers into response, fix swept-entry fallback (
d7d4c5c) - fix: sync in-memory Account cooldown state with async DB writes (#184) (
d869e06) - fix: strip internal proxy headers from Codex responses and use null sentinel for delta usage (
d989676) - fix: derive Codex context window from model metadata (
db73829) - fix: drop unused role var, clarify intentional stream:true hardcode (
dccc285) - fix: correct monthly window calculation and scheduler race condition (
eb03294) - fix: YAML syntax error in release workflow breaking change section [skip-version] (
eddf513) - fix: use >= now boundary to match isAccountAvailable semantics (
f9031c4) - fix: ensureMessageStart before content_block_start, document sourceModel intent (
f926c3f) - fix: fix audit trail test mocks in proxy-operations-failover (
fd55dba) - fix: OpenAI converter compatibility fixes (#173) (
fd67a93) - fix: call runtime health functions once to prevent contradictory status/runtime fields (
ffe5ed9)
🔧 Improvements
- refactor: extract throttle utilities to shared package (
3862593) - improve: add breaking change detection and conditional version bumps [skip-version] (
567ca2e) - improve: apply biome formatting fixes across multiple files [skip-version] (
8e5d586)