Skip to content

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.json

Key files

FileRole
src/lib/mergeProfiles.tsSingle source of truth — merges AWS profiles with Mimic metadata, derives auth state
src/stores/profiles.tsZustand store: raw profiles, scan, sync, auth operations
src/stores/appConfig.tsZustand store: config load, metadata CRUD, preferences, debounced save
src/lib/ipc.tsTauri invoke wrappers with mock fallback for browser preview

Scan cycle

  1. Rust reads ~/.aws/config (INI parser, no dependencies)
  2. Rust reads SSO cache (~/.aws/sso/cache/*.json) for auth_expires_at
  3. Rust reads STS cache (~/.aws/cli/cache/*.json) for credential_expires_at
  4. Results returned as CloudProfile[] over Tauri IPC
  5. Frontend merges with AppConfig metadata via mergeProfiles()
  6. UI derives filtered/sorted views

Save cycle

  1. User edits metadata (label, tags, notes, star, hide, reorder)
  2. Debounced (400ms) save to Rust via saveAppConfig
  3. Rust writes ~/.config/mimic/config.json
  4. File watcher on ~/.aws/config triggers profile re-scan
  5. wasRecentlySaved() guard prevents immediate re-read of self-written config