This document provides visual architecture diagrams for the TokenMeter project to help quickly understand the system structure and data flow.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TokenMeter Overall Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β macOS System Tray β β
β β ββββββββββββββββ β β
β β β Tray Icon β β Display real-time usage ($34.02 39.3M) β β
β β β + Menu β β Today/Last 30 Days/Model breakdown β β
β β ββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Tauri 2 Runtime β β
β β βββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ β β
β β β React Frontend β β Rust Backend β β β
β β β βββββββββββββββββββββ β β βββββββββββββββββββββββββ β β β
β β β β Dashboard β β β β commands/ β β β β
β β β β ProviderEditor ββββΌββββββΌββΊβ usage.rs β β β β
β β β β Settings β β IPC β β providers.rs β β β β
β β β βββββββββββββββββββββ β β βββββββββββββββββββββββββ β β β
β β β β β β β β β β
β β β βΌ β β βΌ β β β
β β β βββββββββββββββββββββ β β βββββββββββββββββββββββββ β β β
β β β β TanStack Query β β β β services/ β β β β
β β β β (Cache + Polling) β β β β ccusage.rs β β β β
β β β βββββββββββββββββββββ β β β pricing.rs β β β β
β β β β β β script_runner.rs β β β β
β β βββββββββββββββββββββββββββ β βββββββββββββββββββββββββ β β β
β β βββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β External Dependencies β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β β ccusage CLI β β models.dev β β curl/wget/http/httpie β β β
β β β (Usage data) β β (Pricing API)β β (Provider fetch) β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Data Flow Details β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 1. ccusage Usage Data Flow β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββ shell -l -c ββββββββββββββββ β
β β ccusage CLI ββββββββββββββββββββββ ccusage.rs β β
β β (npm global) β β β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
β β β β
β β JSON (daily + totals) β Parse + Transform β
β βΌ βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β CcusageResponse { daily: [...], totals: {...} } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β β cost == 0 ? βββΊ pricing.rs βββΊ models.dev API β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β UsageSummary { today, thisMonth, dailyUsage, modelBreakdown } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββΊ AppState.usage (Mutex cache) β
β ββββΊ tray.rs (Update menu bar title + menu) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 2. Custom Provider Data Flow β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ApiProvider { fetchScript, transformScript, env } β
β β β
β β Security validation (only curl/wget/http/httpie allowed) β
β βΌ β
β ββββββββββββββββ Command::new() ββββββββββββββββ β
β β shell_utils βββββββββββββββββββββΊβ External HTTPβ β
β β parse_commandβ env_clear() β Client β β
β ββββββββββββββββ ββββββββ¬ββββββββ β
β β JSON Response β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β script_runner.rs (boa_engine JS sandbox, 5s timeout, 10KB limit)β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ProviderUsageResult { cost?, tokens?, used?, total? } β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 3. Frontend-Backend Communication β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Frontend (React) Backend (Rust) β
β β
β api.ts ββββββββ invoke() βββββββββββββββΊ #[tauri::command] β
β ββββββββ JSON Response ββββββββββ β
β β
β App.tsx βββββββ listen('navigate') ββββββ lib.rs emit() β
β Dashboard βββββ listen('usage-preloaded') lib.rs emit() β
β App/Tray ββββββ listen('config-updated') usage.rs emit() β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Backend Module Dependencies β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β main.rs βββΊ lib.rs β
β β β
β βββ Register Tauri commands β
β βββ Initialize AppState β
β βββ Set up system tray β
β βββ Start background preload task β
β β β
β ββββββββββββΌβββββββββββ¬βββββββββββββββ¬βββββββββββββββ β
β β β β β β β
β βΌ βΌ βΌ βΌ βΌ β
β tray.rs commands/ services/ state.rs config.rs β
β β usage.rs ccusage.rs β types.rs β
β β providers pricing.rs β error.rs β
β β .rs script_runner β β
β β shell_utils β β
β β β β β
β ββββββββββββββββββββββββ΄βββββββββββββ β
β β β
β βΌ β
β Shared Type Modules β
β (config/types/error) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Frontend Module Structure β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β main.tsx βββΊ QueryClientProvider β
β β β
β βΌ β
β App.tsx β
β β β
β ββββββββββββββΌβββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β Dashboard ProviderEditor Settings β
β β β β β
β ββββββββββββββ΄βββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β hooks/ β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β useUsageData β β useProviders β β useTheme β β β
β β β useConfig β β useSave... β β useLanguage β β β
β β β useRefresh β β useDelete... β β useConfigEvents β β
β β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββββββββββ β β
β βββββββββββΌββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β lib/api.ts β β
β β getUsageSummary() β getProviders() β getConfig() β β
β β refreshUsage() β saveProvider() β saveConfig() β β
β β β deleteProvider()β β β
β β β testProvider() β β β
β ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ β
β β β
β β invoke() β
β βΌ β
β @tauri-apps/api/core β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β components/ui/ β β
β β button β card β input β label β separator β switch β tabs β textareaβ β
β β (shadcn/ui) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β i18n/ β β
β β index.ts (i18next init) β locales/{en,zh}/*.json (translation files)β β
β β (i18next + react-i18next) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β types/index.ts β β
β β UsageSummary β ApiProvider β AppConfig β MenuBarConfig β ... β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
~/.tokenmeter/
βββ config.json # Application config
β βββ refreshInterval # Refresh interval (seconds)
β βββ launchAtLogin # Launch at login
β βββ language # Language preference ("en"/"zh", optional, defaults to system)
β βββ menuBar # Menu bar config
β βββ format # Display format (${cost} ${tokens})
β βββ fixedBudget # Daily budget
β βββ showColorCoding # Color coding
β
βββ providers/ # Custom Provider configs
βββ {id}.json
βββ id # Provider ID
βββ name # Display name
βββ enabled # Whether enabled
βββ fetchScript # Data fetch script
βββ transformScript # JS transform script
βββ env # Environment variables
Theme preference is stored in localStorage (key: tokenmeter-theme), synchronized across windows via storage events.