# wwrrj/codex-switcher architecture

> Architecture diagram of the GitHub repository wwrrj/codex-switcher, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/wwrrj/codex-switcher
- Repository: https://github.com/wwrrj/codex-switcher

## Overview

Codex Account Switcher is a local-first Windows desktop app for managing saved Codex accounts, checking usage, analyzing local token history, and optionally routing Codex requests through configurable providers. Users manage accounts and settings in the React UI; its Zustand store calls the Tauri command bridge, whose Rust backend handles Codex files, usage, scheduling, and proxy operations. README documents analytics and desktop/tray capabilities beyond the sampled implementations; links among those features are shown only where the tree or excerpts support them.

Main entry points: [`react-vite/src-tauri/src/proxy.rs`](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/proxy.rs) (Proxy service), [`react-vite/src/store/appStore.ts`](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/store/appStore.ts) (App store), [`react-vite/src/App.tsx`](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/App.tsx) (App shell), [`react-vite/src-tauri/src/commands.rs`](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/commands.rs) (Tauri commands)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Desktop interface"]
  node_app["App shell<br/>[App.tsx]"]
  node_accounts_ui["Account pool<br/>[AccountPool.tsx]"]
  node_analytics_ui["Usage analytics"]
  node_routing_ui["Routing page"]
  node_settings_ui["Settings<br/>[SettingsDrawer.tsx]"]
  node_tray["Tray menu<br/>[TrayMenu.tsx]"]
end

subgraph group_state["Frontend state"]
  node_store["App store<br/>[appStore.ts]"]
  node_api["Command API<br/>[api.ts]"]
  node_usage_cache[("Usage cache<br/>[usageDb.ts]")]
end

subgraph group_backend["Tauri backend"]
  node_commands["Tauri commands<br/>[commands.rs]"]
  node_core["Account operations<br/>[core.rs]"]
  node_models["Domain models<br/>[models.rs]"]
  node_usage_backend["Usage and quota<br/>[providers.rs]"]
  node_tokens["Token analytics<br/>[core.rs]"]
  node_scheduler["Quota scheduler"]
end

subgraph group_proxy["Request routing"]
  node_proxy_service["Proxy service<br/>[proxy.rs]"]
  node_routing["Provider selection<br/>[routing.rs]"]
  node_transforms["Protocol transforms<br/>[transforms.rs]"]
  node_proxy_config["Codex proxy config<br/>[codex_config.rs]"]
  node_proxy_state[("Proxy settings<br/>[models.rs]")]
end

node_user(("User"))
node_codex["Codex app"]
node_provider["Usage/provider services"]

node_user -->|"uses"| node_app
node_app -->|"shows"| node_accounts_ui
node_app -->|"shows"| node_analytics_ui
node_app -->|"shows"| node_routing_ui
node_app -->|"opens"| node_settings_ui
node_app -->|"renders"| node_tray
node_accounts_ui -->|"updates"| node_store
node_analytics_ui -->|"reads"| node_store
node_routing_ui -->|"updates"| node_store
node_settings_ui -->|"updates"| node_store
node_tray -->|"reads"| node_store
node_store -->|"invokes"| node_api
node_store -->|"reads/writes"| node_usage_cache
node_api -->|"invokes"| node_commands
node_commands -->|"dispatches"| node_core
node_commands -->|"dispatches"| node_usage_backend
node_commands -->|"dispatches"| node_proxy_service
node_core -->|"uses"| node_models
node_core -->|"manages auth"| node_codex
node_usage_backend -->|"reads local auth"| node_codex
node_usage_backend -->|"queries usage"| node_provider
node_tokens -->|"scans records"| node_codex
node_proxy_service -->|"selects provider"| node_routing
node_proxy_service -->|"transforms requests"| node_transforms
node_proxy_service -->|"forwards requests"| node_provider
node_proxy_service -->|"installs config"| node_proxy_config
node_proxy_service -->|"reads/writes"| node_proxy_state
node_codex -.->|"sends requests"| node_proxy_service

click node_app "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/App.tsx"
click node_accounts_ui "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/AccountPool.tsx"
click node_analytics_ui "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/UsageAnalyticsPage.tsx"
click node_routing_ui "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/ProxyRoutingPage.tsx"
click node_settings_ui "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/SettingsDrawer.tsx"
click node_tray "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/TrayMenu.tsx"
click node_store "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/store/appStore.ts"
click node_api "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/lib/api.ts"
click node_usage_cache "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/lib/usageDb.ts"
click node_commands "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/commands.rs"
click node_core "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/core.rs"
click node_models "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/models.rs"
click node_usage_backend "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/providers.rs"
click node_tokens "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/core.rs"
click node_scheduler "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/mobile_residency.rs"
click node_proxy_service "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/proxy.rs"
click node_routing "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/routing.rs"
click node_transforms "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/transforms.rs"
click node_proxy_config "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/codex_config.rs"
click node_proxy_state "https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/models.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_accounts_ui,node_analytics_ui,node_routing_ui,node_settings_ui,node_tray,node_user toneBlue
class node_store,node_api,node_usage_cache toneAmber
class node_commands,node_core,node_models,node_usage_backend,node_tokens,node_scheduler toneMint
class node_proxy_service,node_routing,node_transforms,node_proxy_config,node_proxy_state toneRose
class node_codex,node_provider toneIndigo
```

## Components

### Desktop interface

- [App shell](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/App.tsx): `react-vite/src/App.tsx`
- [Account pool](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/AccountPool.tsx): `react-vite/src/components/AccountPool.tsx`
- [Usage analytics](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/UsageAnalyticsPage.tsx): `react-vite/src/components/UsageAnalyticsPage.tsx`
- [Routing page](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/ProxyRoutingPage.tsx): `react-vite/src/components/ProxyRoutingPage.tsx`
- [Settings](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/SettingsDrawer.tsx): `react-vite/src/components/SettingsDrawer.tsx`
- [Tray menu](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/components/TrayMenu.tsx): `react-vite/src/components/TrayMenu.tsx`

### Frontend state

- [App store](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/store/appStore.ts): `react-vite/src/store/appStore.ts`
- [Command API](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/lib/api.ts): `react-vite/src/lib/api.ts`
- [Usage cache](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src/lib/usageDb.ts): `react-vite/src/lib/usageDb.ts`

### Tauri backend

- [Tauri commands](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/commands.rs): `react-vite/src-tauri/src/commands.rs`
- [Account operations](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/core.rs): `react-vite/src-tauri/src/core.rs`
- [Domain models](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/models.rs): `react-vite/src-tauri/src/models.rs`
- [Usage and quota](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/providers.rs): `react-vite/src-tauri/src/providers.rs`
- [Token analytics](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/core.rs): `react-vite/src-tauri/src/core.rs`
- [Quota scheduler](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/mobile_residency.rs): `react-vite/src-tauri/src/mobile_residency.rs`

### Request routing

- [Proxy service](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/proxy.rs): `react-vite/src-tauri/src/proxy.rs`
- [Provider selection](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/routing.rs): `react-vite/src-tauri/src/routing.rs`
- [Protocol transforms](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/transforms.rs): `react-vite/src-tauri/src/transforms.rs`
- [Codex proxy config](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/codex_config.rs): `react-vite/src-tauri/src/codex_config.rs`
- [Proxy settings](https://github.com/wwrrj/codex-switcher/blob/main/react-vite/src-tauri/src/models.rs): `react-vite/src-tauri/src/models.rs`

### Other components

- **User**
- **Codex app**
- **Usage/provider services**

## Connections

- User → App shell: uses
- App shell → Account pool: shows
- App shell → Usage analytics: shows
- App shell → Routing page: shows
- App shell → Settings: opens
- App shell → Tray menu: renders
- Account pool → App store: updates
- Usage analytics → App store: reads
- Routing page → App store: updates
- Settings → App store: updates
- Tray menu → App store: reads
- App store → Command API: invokes
- App store → Usage cache: reads/writes
- Command API → Tauri commands: invokes
- Tauri commands → Account operations: dispatches
- Tauri commands → Usage and quota: dispatches
- Tauri commands → Proxy service: dispatches
- Account operations → Domain models: uses
- Account operations → Codex app: manages auth
- Usage and quota → Codex app: reads local auth
- Usage and quota → Usage/provider services: queries usage
- Token analytics → Codex app: scans records
- Proxy service → Provider selection: selects provider
- Proxy service → Protocol transforms: transforms requests
- Proxy service → Usage/provider services: forwards requests
- Proxy service → Codex proxy config: installs config
- Proxy service → Proxy settings: reads/writes
- Codex app → Proxy service: sends requests
