All notable changes to Quotio will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- agent-config: Preserve Codex config when applying proxy setup (#334)
- Fix configuration loss when Codex is already configured
- Use TOML-aware merging to preserve custom Codex settings
- oauth: Don't auto-open browser during OAuth flow (#330)
- User clicks 'Open Link' button instead of browser opening automatically
- oauth: Add copy URL option for OAuth login flow (#325)
- Copy authorization URL to clipboard for manual browser entry
- Useful when default browser doesn't open automatically
- tunnel: Add auto-restart tunnel on disconnect option (#323)
- Automatically restart Cloudflare tunnel when connection drops
- Configurable in Settings with on/off toggle
- menubar: Hide CLI-based providers from menu bar when CLI not installed (#320)
- Cleaner menu bar display by hiding inactive providers
- tunnel: Use HTTP/2 protocol for Cloudflare tunnels (#319)
- Improved tunnel stability with HTTP/2 transport
- codex: Unify Codex quota account identity (#315)
- Fix duplicate account display when using both Codex CLI and OpenAI fetcher
- Consistent account identification across different auth methods
- auth: Use local timezone for expired field to match existing auth files (#314)
- Fix timezone mismatch causing auth validation issues
- custom-provider: Add optional model prefix parameter for custom providers (#310) - thanks @darkedge 🎉
- New
prefixfield in CustomProvider for model name prefixing - Propagated through all YAML generation methods (OpenAI/Claude/Gemini/Codex/GLM)
- UI input field in CustomProviderSheet with "Optional" label
- New
- fallback: Fix provider icons, context menu scope, and add model refresh (#308) - thanks @ming 🎉
- Prioritize
owned_byfield over model ID prefix matching for aggregator providers (Copilot, Antigravity, Kiro) - Scope context menu to virtual model title row only, preventing accidental deletion of entire virtual model groups
- Add refresh button in Add Fallback Entry sheet to reload model list without dismissing
- Prioritize
- auth: Preserve disabled field when token refresh rewrites auth files (#312) - thanks @apiggy 🎉
- Replace
JSONEncoderwith read-modify-write pattern to preserve all existing fields - Prevents disabled accounts from re-enabling after token refresh cycle
- Update
expired/expires_in/timestampcorrectly on Antigravity and OpenAI token refresh
- Replace
- proxy: Persist upstream proxy URL across restarts (#307) - thanks @ming 🎉
- Sync proxy URL to CLIProxyAPI config on startup and settings change
- keychain: Rebrand bundle identifier to
dev.quotio.desktopwith multi-layer keychain migration (#306, #313) - i18n: Troubleshooting section missing localization (#311) - thanks @darkedge 🎉
- Replace 4 hardcoded English strings with localization keys
- Add translations for EN/FR/VI/ZH-Hans
- antigravity: Add cancellation support to prevent IDE close freeze (#303)
- Add
Task.isCancelledchecks and cancellation checkpoints throughout account switch flow - Add timeout to
killallcommands (2s) and reduce settle delays for faster operations - Extract AntigravityDeviceManager and AntigravityVersionDetector services
- Add
- crash: Prevent proxy-start UI reentrancy crash (#301)
- Guard against concurrent proxy start calls that caused UI reentrancy crash
- Remove dead
populateMenu()method from StatusBarManager
- proxy: Prevent spurious proxy restart when navigating to Settings (#299)
- Add same-value guards to CLIProxyManager port and allowNetworkAccess setters
- Add
isLoadingConfigflag to suppressonChangeduring initialonAppearload
- tunnel: Enable remote access automatically when Cloudflare tunnel is active (#296) - thanks @benzntech 🎉
- Auto-toggle
allow-remotein CLIProxyAPI config based on tunnel lifecycle - Use tunnel URL for agent configuration when tunnel is active
- Skip local filesystem quota fetching in remote proxy mode
- Parse JSON error blobs for human-readable status messages in QuotaCard
- Auto-toggle
- models: Add gpt-5.3-codex model (#285) - thanks @DIYgod 🎉
- auth: Auto-refresh expired Claude OAuth tokens (#294) - thanks @jakozloski 🎉
- Automatically refresh access tokens using refresh tokens before quota fetch
- Check token expiration with buffer to prevent failed requests
- Persist refreshed tokens to auth files on disk
- Redesign menu bar to show all accounts grouped by provider
- Fix duplicate Codex accounts when OpenAI fetcher already populates quotas
- crash: Prevent app crash when navigating to Settings or clicking mode badge (#290) - thanks @benzntech 🎉
- Use
@StateforOperatingModeManager.sharedin SwiftUI views for correct observation - Use
@ObservationIgnoredin view models that don't react to mode changes - Add PID check in
killProcessOnPortto prevent app from killing itself during cleanup
- Use
- models: Add Claude Opus 4.6 Thinking model (#281) - thanks @kvokka 🎉
- proxy: Add exponential backoff retry logic for proxy restart scenarios (#279) - thanks @benzntech 🎉
- quota: Show warning icon for forbidden accounts instead of --% (#277) - thanks @1saifj 🎉
- upgrade: Fix post-upgrade notification showing after successful CLI proxy update (#262) - thanks @benzntech 🎉
- concurrency: Resolve Swift 6 strict concurrency errors (#280) - thanks @hoducha 🎉
- build: Resolve Swift compiler warnings
- accounts: Add disable/enable toggle for provider accounts (#261)
- Toggle button in account row with visual feedback (dimmed when disabled)
- Persist disabled state locally using UserDefaults
- Sync disabled state to backend on proxy startup
- proxy: Auto-restart proxy when settings change (#263)
- Automatically restart proxy when routing strategy or other settings change
- proxy: Add workaround to force primary API URL (#264)
- quota: Clamp quota percentages to 0-100 range in all fetchers (#274, #275)
- Prevents >100% or <0% values from displaying in the UI
- Affects: Antigravity, Cursor, Copilot, Warp, Trae, Kiro quota fetchers
- Add defensive clamp in StatusBarManager formatPercentage display
- opencode: Add attachment and modalities fields for image support (#273)
- Vision-capable models (Claude, Gemini, GPT, Qwen VL) now include required fields
- Fixes image attachments not working in OpenCode (Issue #272)
- providers: Use sheet(item:) for custom provider editing (#258)
- Fix closure capture issue where editingCustomProvider was nil
- build: Remove duplicate restartProxyIfRunning() declaration
- i18n: Localize "Hide accounts" menu bar label (#250)
- Add translations for zh-Hans, vi, fr
- proxy: Parse detailed error messages from proxy responses (#251)
- Extract and display actionable error messages from CLIProxyAPI
- logging: Add unified Logger with privacy controls and DEBUG guards
- Nonisolated enum callable from any actor context
- Category-based logging: API, Quota, Proxy, Auth, Keychain, Warmup, Update
- Privacy helpers:
Log.mask()andLog.maskEmail()
- compatibility: Wrap macOS 15+ symbolEffect API for macOS 14 compatibility
- Add
@availablecheck for.contentTransition(.symbolEffect)usage - Fixes crash on macOS 14 due to missing API (Issue #45)
- Add
- kiro: Use case-insensitive authMethod comparison for token refresh (#252)
- Fix token refresh failures when importing from Kiro IDE
- CLIProxyAPI uses "idc" (lowercase) vs Kiro IDE uses "IdC" (mixed case)
- proxy: Use effectiveBinaryPath for auth commands and Finder reveal (#254)
- Fix "CLIProxyAPI does not exist" error when using versioned storage
- Auth commands and Finder reveal now use correct binary path
- models: Remove model list caching to always fetch fresh data (#255)
- Fix stale model lists after CLIProxyAPI configuration changes
- security: Replace print() statements with Logger to prevent data leakage
- All debug logging disabled in Release builds via
#if DEBUG - Replaced 19 print() calls across 9 files with category-specific Log methods
- All debug logging disabled in Release builds via
- security: Migrate sensitive keys from UserDefaults to Keychain
- Local management key now stored in Keychain with auto-migration
- Warp tokens now stored in Keychain with auto-migration
- Legacy UserDefaults data automatically migrated on first access
- safety: Fix force unwraps to prevent potential crashes
- AtomFeedUpdateService: Safe version comparison with if-let
- QuotaFetchers: Guard-based URL construction with proper error handling
- FileManager paths: Guard with fatalError for critical system directories
- Add
invalidURLcases to CodexQuotaError and CodexCLIQuotaError
- compatibility: Lower MACOSX_DEPLOYMENT_TARGET from 14.6 to 14.0
- Fixes build compatibility for macOS 14.0-14.5 users
- proxy: Efficient Atom feed polling for CLIProxyAPI updates (#226)
- Poll every 5 minutes using conditional requests (ETag caching, 304 Not Modified)
- Show "Last checked" time in Settings/About screens
- Start polling on app launch, stop on terminate
- kiro: Dynamic region support for Enterprise/IdC authentication (#241)
- Make OIDC endpoint region dynamic based on token data
- Support both Social (Google) and IdC (AWS Builder ID/Enterprise) auth methods
- Sync refreshed tokens to Kiro IDE auth file (~/.aws/sso/cache/kiro-auth-token.json)
- compatibility: Lower minimum macOS version to 14.0 Sonoma
- App now runs on macOS 14.0+ instead of requiring macOS 15.0
- menubar: Refresh quota data in background without main window (#248)
- Add NotificationCenter-based notification for quota data changes
- Menu bar now updates correctly when app runs in background
- shell: Support XDG Base Directory for zsh config path (#247)
- Add ZDOTDIR environment variable support for custom zsh config location
- Add XDG_CONFIG_HOME fallback to ~/.config/zsh/.zshrc
- settings: Prevent infinite loading when checking updates without network (#244)
- Add defer block to ensure loading state is always reset on timeout
- agent: Remove
fdfrom Factory Droid binary detection (#245)- Prevent false positive detection when fd-find (sharkdp/fd) is installed
- menubar: Prevent auto-adding providers after user modification (#232)
- Set flag to prevent autoSelectNewAccounts when user manually modifies selection
- logs: Display fallback trace details in request log (#200)
- proxy: Handle thinking block signature errors on provider switch (#218)
- Detect provider-bound cryptographic signatures that cause 400 errors
- Add response-driven sanitization with automatic retry
- Strip thinking/redacted_thinking blocks when forwarding between Claude providers
- quota: Handle ISO8601 dates with and without fractional seconds (#233)
- Fix reset time not displaying for some providers (e.g., Codex)
- settings: Initialize app services on launch for auto-start at login (#225)
- Fix proxy not auto-starting when app launches at login with dock hidden
- Move initialization to AppDelegate for immediate service startup
- agent: Update Factory Droid URL to new documentation site (#224)
- auth: Preserve prefix, project_id, and proxy_url fields when refreshing auth tokens (#210)
- menubar: Add configurable max items with improved UX (#209)
- Add truncation confirmation dialog when reducing max items
- Fix warning threshold relative to maxItems
- warp: Add support for Warp AI quota tracking (#197)
- Dedicated Warp provider with OAuth-based authentication
- Display bonus credits with expiration and tooltip
- Fetch bonus grants from workspaces and user level
- quota: Scope subscriptions by provider and show plan badges in menubar (#199)
- Store subscriptionInfos per provider to avoid cross-provider overrides
- Fall back to planDisplayName for menubar tier badge
- Improve Codex accountId extraction for ChatGPT-Account-Id header
- agent-config: Agent configuration persistence, proxy switching & backups (#178)
- Load existing agent settings from disk and environment variables
- Toggle between routing through Quotio proxy or direct to providers
- Automatic configuration backups before applying new settings
- UI to view and restore from previous backups
- fallback: Simplify fallback logic by removing format conversion (#186)
- settings: Customizable usage calculation and aggregation modes (#160)
- Total usage calculation: session-only vs combined
- Model aggregation: lowest vs average
- New Usage Display section in Settings
- routing: Fetch routing strategy from dedicated API endpoint (#174)
- Fix setting reset to 'round-robin' when navigating away from Settings
- Handle both legacy and new response formats
- routing: Prevent routing strategy reset when leaving settings view (#173)
- i18n: Add missing translations for zh-Hans, vi, and fr (#171)
- fallback: Cross-provider format conversion with FallbackFormatConverter (#169)
- APIFormat detection (openai, anthropic, google) for automatic conversion
- Message and tool_use/tool_calls conversion between Anthropic and OpenAI formats
- System message and parameter conversion across providers
- Thinking block cleanup for non-Claude models
- kiro: Proactive token refresh with 5-min buffer before expiry (#169)
- Reactive refresh on 401/403 responses with automatic retry
- Display token expiry time in quota UI
- fallback: Dynamic provider parameter adaptation for virtual models (#169)
- Fix maxOutputTokens error by adapting API parameters based on actual provider
- ModelCache with stale-while-revalidate pattern
- Cache by entry ID (not index) for correct reordering handling
- logs: Display fallback route info (virtual → resolved model/provider) in request logs (#169)
- agent-setup: Decoupled cache invalidation when provider accounts change (#169)
- copilot: Treat educational quota as Pro for GitHub Copilot (#164)
- Educational accounts (free_educational_quota) now display as 'Pro' with unlimited chat/completions
- fallback: Model picker now falls back to default when saved model unavailable (#169)
- copilot: Add missing plan types to planDisplayName (#162)
- Add 8 additional plan types: guest, go, free_workspace, business, education, quorum, k12, edu
- crash: Prevent crash in String.index(after:) at boundary (#161)
- Add bounds checking to prevent EXC_BREAKPOINT at string boundaries (Fixes #103)
- tunnel: Share Proxy via Cloudflare Tunnel (#137)
- Expose local proxy to internet with temporary public URL
- TunnelManager for lifecycle management with orphan cleanup
- Dashboard integration with status badge and public URL display
- Menu bar tunnel section with start/stop controls
- Auto-start tunnel option in Settings
- menu-bar: Quota display styles with ring progress indicator (#146)
- QuotaDisplayStyle enum (card, lowestBar, ring)
- RingProgressView circular progress component
- Display style picker in Settings
- network: Allow network access - bind to 0.0.0.0 (#147) - thanks @Benson 🎉
- proxy: Upstream proxy support for all quota fetchers and managers (#145) - thanks @Tsingv 🎉
- ProxyConfigurationService for centralized proxy configuration
- All quota fetchers now route through user-configurable proxy
- settings: Launch at login setting not working (#130, #139)
- Add LaunchAtLoginManager with robust error handling
- App location validation (/Applications requirement)
- Handle .requiresApproval status from System Settings
- tunnel: Clean build warnings and tunnel handling (ccbf9ff)
- fallback: Model Fallback Strategy System (Experimental) (#136)
- Create virtual models with automatic provider fallback based on quota availability
- Dynamic fallback resolution at request time in ProxyBridge
- Auto-retry with next fallback entry on quota exhaustion (429)
- Bridge Mode routing when Fallback is enabled
- New Fallback screen for managing virtual models and entries
- ui: Add ExperimentalBadge component for marking experimental features (a345698)
- onboarding: Complete redesign with step-based flow (#136)
- Welcome, Mode Selection, Provider, Remote Setup, and Completion steps
- remote: Remote connection support for connecting to remote proxy servers (#136)
- ui: CurrentModeBadge component for displaying current operating mode (#136)
- docs: Add Contributor Covenant Code of Conduct (6c2915b)
- mode: Refactor operating mode system with enhanced OperatingMode struct (#136)
- agent: Route through ProxyBridge when Fallback is enabled for virtual model detection (#136)
- dock: Fix dock icon management and ghost icon issues (#133)
- fallback: Fix fallback route caching for better performance (#133)
- proxy: CLIProxyAPIPlus v6.6.92+ compatibility (#133)
- quality: Code quality improvements and cleanup (#135)
- proxy: Always route traffic through Quotio proxy endpoint (#131)
- Remove incorrect fallback-based endpoint logic that bypassed ProxyBridge when Fallback was disabled
- All external clients now connect through clientEndpoint for proper connection management and request logging
- kiro: Complete Kiro provider integration with quota monitoring and OAuth improvements (#118)
- Rewrite KiroQuotaFetcher to parse actual AWS CodeWhisperer API response
- Support trial accounts (500 bonus credits) and paid accounts (50 base credits)
- Display correct percentage remaining with expiry/reset dates
- Show plan type from subscription info (e.g., "KIRO FREE")
- models: Dynamic model fetching from proxy
/modelsendpoint (#118)- Cache models in UserDefaults for faster subsequent loads
- Add refresh button with loading indicator in Agent Config sheet
- Group models by provider (Anthropic, OpenAI, Google) in picker dropdown
- antigravity: Auto-warmup scheduling for token counter reset (#104)
- Flexible scheduling: "Every X minutes", "Every X hours", or "Daily at [Time]"
- Immediate trigger for interval-based schedules
- Cost-efficient single model selection to minimize resource consumption
- quota: Improve Claude Code quota handling and multi-account UX (#109)
- Authentication error detection for expired OAuth tokens (~1 hour TTL)
- Show re-authenticate button when token expires
- Account count badge in AddProviderPopover
- Hint text for adding multiple accounts
- Show "quota not available" message for providers without quota API
- Replace curl with URLSession for Claude Code network requests (#109)
- settings: Fix menu bar icon toggle and dock visibility (#107)
- Fix bug where toggling "Show Menu Bar Icon" OFF caused window and dock to disappear
- Fix bug where toggling menu bar icon back ON didn't restore the icon
- Apply "Show in Dock" toggle immediately on app launch
- kiro: Fix menu bar ghost icon issue for Kiro accounts (#118)
- kiro: Show auth provider name (e.g., "Google") when email is empty (#118)
- agent-config: Adjust footer height in AgentConfigSheet for better layout (#119)
- quota: Fix RequestTracker ISO8601 date decoding mismatch (#109)
- glm: add GLM provider support with API key-based quota tracking (#77) - thanks @prnake 🎉
- detection: check XDG_DATA_HOME for fnm path detection (#102)
- glm: resolve Swift 6 concurrency warnings in GLMQuotaFetcher (#106)
- unified operating mode system with remote management support (#86)
- settings: add management API key display and regenerate (#97)
- changelog: clean up duplicates and add auto-squash for prereleases (fa1a273)
- Memory optimization - reduce RAM from 150-250MB to <100MB (#100)
- proxy: add buffer to reduce stop/start race condition window (#93)
- settings: add restart notice for routing strategy changes (#94)
- proxy: prevent hang after extended runtime (#96)
- antigravity: Fix account switch DB lock handling with SQLite3 busy timeout and immediate transactions (#88)
- migrate to Swift 6 with strict concurrency (#83)
- ci: resolve bash regex parsing issue and add manual workflow trigger (651fd46)
- ci: merge appcast entries to make beta releases visible to updater (33e28a8)
- antigravity: fix Use in IDE hanging on macOS 15.5+ (#81)
- Configurable Refresh Cadence: Add setting to configure auto-refresh interval with 10-minute default (#76)
- GitHub Actions CI/CD: Automated release workflow with tag-based and manual triggers (#74)
- Add
update-changelog.shscript for automated changelog updates - Add
generate-appcast-ci.shfor CI-compatible Sparkle appcast generation - Add
quick-release.shhelper for local tag creation
- Add
- String Catalogs Localization: Migrate from in-code dictionary to
Localizable.xcstringswith 600+ keys across 4 languages (#74)- Dynamic language switching without app restart
- Modernize
LanguageManagerwith@Observablepattern - Migrate legacy "zh" language code to "zh-Hans"
- Swift 6 Concurrency: Resolve build errors and concurrency warnings for Xcode 16.2
- Add
localizedStatic()nonisolated variant for enum computed properties - Fix sendability issues in
AntigravityDatabaseService,AntigravityProcessManager,CLIExecutor,CLIProxyManager
- Add
- CI Compatibility: Update Xcode version to 16.2 for macos-14 runner compatibility
- Build Scripts: Improve reliability and error handling
- Localization Crash: Fix duplicate dictionary key causing compiler error and app launch crash
- French Localization: Full French translation for all UI strings and README documentation
- Antigravity 4-Group Display: Replace 3-group display with 4 model groups: Gemini 3 Pro, Gemini 3 Flash, Gemini 3 Image, Claude 4.5 (#66)
- Add expandable group rows in QuotaScreen with individual model details
- Show model count badge and individual progress bars when expanded
- Native Menu Bar Submenus: Implement
NSMenuItem.submenufor Antigravity accounts with automatic hover cascade (#66)- Reactive provider picker - accounts update immediately when switching providers (no menu close needed)
- Add
rebuildMenuInPlace()for proper menu refresh across macOS Desktops
- Menu Bar Submenu Hover: Fix submenu not working after switching macOS Desktops (#66)
- Menu Bar Dynamic Height: Fix incorrect height when switching between providers (#66)
- Menu Bar Loading Animation: Use Timer with
.commonRunLoop mode for animation while menu is open (#66) - Model Display Names: Consistent naming across QuotaScreen and menu bar (#66)
- Custom AI Providers: Add and configure your own AI providers with custom API endpoints, headers, and model mappings (#62)
- Upstream Proxy Support: Configure upstream proxy URL in Settings for corporate networks or VPN environments (#63)
- Proxy Idle Hang: Prevent proxy process from hanging after extended idle periods (Issue #37, #53)
- Beta Channel Support: Opt-in to beta updates via Settings with separate Sparkle appcast feed (#56)
- Dynamic App Icon: App icon automatically switches between production and beta based on update channel (#56)
- Privacy Mode: Option to hide sensitive information (emails, account names) with asterisks across the app (#46)
- ProgressView Crash: Fixed Auto Layout constraint conflicts by replacing ProgressView with custom SmallProgressView component (#56)
- Version Parsing: Fixed version check parsing in CLIProxyManager (#56)
- About Screen Icon: Use observable for real-time icon updates when switching update channels (#56)
- Menu Bar Spacing: Adjusted horizontal padding to match native macOS spacing (#50)
- Chinese Localization: Full Simplified Chinese translation for all UI strings (#39)
- Sparkle Update Loop: Sync build number to match released version, preventing false update notifications
- Claude Code 2.0+ Support: Read OAuth credentials from macOS Keychain instead of credentials.json (#27)
- Managed Proxy Upgrade: Version manager for proxy binary updates (#30)
- Versioned binary storage with symlink-based switching
- SHA256 checksum verification for secure downloads
- Compatibility check (dry-run) before activation
- Rollback capability for failed upgrades
- Auto-check for proxy updates on app launch
- Upgrade available notifications
- IDE Scan Dialog: New consent-based IDE scanning with privacy notice (#33)
- IDE Quota Persistence: Cursor and Trae quota data now persists across app restarts
- Localization: Vietnamese translations for IDE scan UI
- Chinese README: Documentation in Simplified Chinese (#35)
- MIT License: Project now licensed under MIT (#24)
- About Screen Redesign: Move update settings into About screen with modern card-based UI
- Privacy: Reduce file system access to address macOS privacy warnings (#33)
- Remove Cursor and Trae from auto-refresh - require explicit user scan
- Add "Scan for IDEs" button with consent dialog on Providers screen
- No persistent storage of scan consent - cleared on app restart
- Agent Detection: Restore CLI binary paths for proper detection
- GUI apps don't inherit user's shell PATH, causing
whichto fail - Re-add common paths: ~/.local/bin, ~/.bun/bin, ~/.cargo/bin, ~/.deno/bin
- Add tool-specific: ~/.opencode/bin
- Add version manager support: nvm, fnm, Volta, asdf, mise
- GUI apps don't inherit user's shell PATH, causing
- ForEach ID Collision: Fix duplicate ID issue when Cursor and Trae share same email (#33)
- Standalone Quota Mode: View quota and accounts without running the proxy server - perfect for quick checks
- Mode Switcher: Responsive toggle in sidebar to switch between Full and Quota-Only modes
- Trae Provider: Support for Trae AI coding agent with quota tracking
- Menu Bar Redesign: Provider-first layout with improved Liquid Glass compatibility
- Menu Bar Animation: Use Timer-based rotation for reliable refresh animation
- Cursor SQLite: Use immutable mode to avoid WAL file lock errors
- Menu Bar Full-Screen Support: Replace NSPopover with custom NSPanel to enable visibility in full-screen applications (#13)
- Menu Bar Auto-Focus: Prevent auto-focus on buttons when panel opens (#13)
- Refresh Button: Manual refresh button for auto-detected providers section to detect logout changes (#11)
- Increase auto-refresh interval from 5s to 15s to reduce connection pressure (#11)
- Proxy Connection Leak: Fix URLSession connection leak in ManagementAPIClient with proper lifecycle management (#11)
- Menu Bar Sync: Fix menu bar not updating when accounts are removed or logged out (#11)
- Quota Calculation: Filter out unknown percentages when calculating lowest quota for menu bar display (#8)
- ForEach Duplicate ID: Add uniqueId field combining provider+email to prevent duplicate ID warnings (#11)
- Race Condition: Avoid race condition in stopProxy by capturing client reference before invalidation (#11)
- Appearance Settings: New theme settings with System, Light, and Dark mode options
- Updated and optimized app screenshots
- Claude Code Reconfigure: Preserve existing settings.json configuration when reconfiguring Claude Code (#3)
- Dashboard UI: Hide +Cursor button for non-manual-auth providers (#5)
- Quota-Only Mode: New app mode for tracking quotas without running proxy server
- Cursor Quota Tracking: Monitor Cursor IDE usage and quota directly
- Quota Display Mode: Choose between showing used or remaining percentage
- Direct Provider Authentication: Read quota from provider auth files (Claude Code, Gemini CLI, Codex CLI)
- Mode picker onboarding for first-time setup
- Redesigned Quota UI: New segmented provider control with improved layout
- Improved Menu Bar Settings: Direct toggle with better UX
- Better Status Section: Improved sidebar layout and port display formatting
- Improved Mode Picker: Fixed UI freeze when switching app modes
- UI freeze when switching between Proxy and Quota-Only modes
- Cursor excluded from manual add options (quota tracking only)
- Appcast generation with DMG files
- Loading indicator in sidebar during proxy startup
- Force termination with timeout and SIGKILL fallback for reliable proxy shutdown
- Kill-by-port cleanup to handle orphan processes
- Claude Code configuration storage option (global vs project-local)
- Dev build distinction with separate app icon
- Menu bar now persists when main window is closed (app runs in background)
- Improved build configuration with xcconfig support for dev/prod separation
- Proxy process not terminating after running for a while
- Orphan proxy processes remaining after app quit
- Proxy still running when quitting app from menu bar
- Multi-Provider Support: Connect accounts from Gemini, Claude, OpenAI Codex, Qwen, Vertex AI, iFlow, Antigravity, Kiro, and GitHub Copilot
- Real-time Dashboard: Monitor request traffic, token usage, and success rates live
- Smart Quota Management: Visual quota tracking per account with automatic failover strategies
- Menu Bar Integration: Quick access to server status, quota overview, and controls from menu bar
- Custom provider icons display in menu bar
- Combined provider status indicators
- Quota Display Improvements:
- GitHub Copilot quota display (Chat, Completions, Premium)
- Antigravity models grouped into Claude, Gemini Pro, and Gemini Flash categories
- Collapsible model groups with detailed breakdown
- High precision percentage display
- Agent Configuration: Auto-detect and configure AI coding tools (Claude Code, OpenCode, Gemini CLI, Amp CLI, Codex CLI, Factory Droid)
- API Key Management: Generate and manage API keys for local proxy
- System Notifications: Alerts for low quotas, account cooling periods, and proxy status
- Settings:
- Logging to file toggle with dynamic sidebar visibility
- Routing strategy configuration (Round Robin / Fill First)
- Auto-start proxy option
- About Screen: App info with donation options (Momo, Bank QR codes)
- Sparkle Auto-Update: Automatic update checking and installation
- Bilingual Support: English and Vietnamese localization
- Sheet state not resetting when reopening
- Agent configurations persisting correctly on navigation
- CLI agent configurations matching CLIProxyAPI documentation
- Initial release
- Basic proxy management
- Provider authentication via OAuth
- Simple quota display