Data flow
~/.aws/config ─────────────────────────────────┐
~/.aws/sso/cache/*.json │
~/.aws/cli/cache/*.json │
~/.config/mimic/config.json │
▼
Rust scan_profiles()
Rust load_app_config()
│
┌──────────┴──────────┐
│ │
CloudProfile[] AppConfig
│ │
└──────────┬──────────┘
▼
mergeProfiles()
(src/lib/mergeProfiles.ts)
│
▼
ProfileViewModel[]
│
┌──────────┴──────────┐
│ │
filterProfiles() useMemo
sortProfiles() (derived)
│ │
└──────────┬──────────┘
▼
React UI
User edits metadata ──► debounced save (400ms) ──► Rust save_app_config()
│
▼
~/.config/mimic/config.jsonKey files
| File | Role |
|---|---|
src/lib/mergeProfiles.ts | Single source of truth — merges AWS profiles with Mimic metadata, derives auth state |
src/stores/profiles.ts | Zustand store: raw profiles, scan, sync, auth operations |
src/stores/appConfig.ts | Zustand store: config load, metadata CRUD, preferences, debounced save |
src/lib/ipc.ts | Tauri invoke wrappers with mock fallback for browser preview |
Scan cycle
- Rust reads
~/.aws/config(INI parser, no dependencies) - Rust reads SSO cache (
~/.aws/sso/cache/*.json) forauth_expires_at - Rust reads STS cache (
~/.aws/cli/cache/*.json) forcredential_expires_at - Results returned as
CloudProfile[]over Tauri IPC - Frontend merges with
AppConfigmetadata viamergeProfiles() - UI derives filtered/sorted views
Save cycle
- User edits metadata (label, tags, notes, star, hide, reorder)
- Debounced (400ms) save to Rust via
saveAppConfig - Rust writes
~/.config/mimic/config.json - File watcher on
~/.aws/configtriggers profile re-scan wasRecentlySaved()guard prevents immediate re-read of self-written config