# Client chrome — handoff

## Summary

App shell UI outside core chat: custom title bar (Electron), splash screen, welcome page, account switcher, update notifications, sync status, spec version warnings, and feature capability checks.

## User-facing behavior

- **Title bar**: drag region, window controls, room title, account menu (desktop)
- **Splash**: loading spinner during client init
- **Welcome page**: first-run / empty state hints
- **Account switcher**: switch between logged-in accounts (if multi-session)
- **Update notification**: new version available (electron-updater)
- **Feature check**: block unsupported browsers
- **Spec versions**: warn on old homeserver

## Architecture

```
ClientRoot → TitleBar + AccountSwitcher + children
SplashScreen during matrix init
WelcomePage on empty states
UpdateNotification component
FeatureCheck wraps App
SpecVersions in ClientRoot
```

## Key files

| Path | Role |
|------|------|
| `cinny/src/app/components/title-bar/TitleBar.tsx` | Desktop title bar |
| `cinny/src/app/components/splash-screen/SplashScreen.tsx` | Splash |
| `cinny/src/app/pages/client/WelcomePage.tsx` | Welcome / download links |
| `cinny/src/app/components/account-switcher/AccountSwitcher.tsx` | Multi-account |
| `cinny/src/app/components/update-notification/UpdateNotification.tsx` | Auto-update UI |
| `cinny/src/app/pages/FeatureCheck.tsx` | Browser capability gate |
| `cinny/src/app/pages/client/SpecVersions.tsx` | HS version warning |
| `cinny/src/app/pages/client/SyncStatus.tsx` | Sync indicator |
| `cinny/src/app/pages/ConfigConfig.tsx` | Config load error UI |
| `cinny/src/app/components/ClientConfigLoader.tsx` | Load config.json |

## Data model

| Key | Storage |
|-----|---------|
| Sessions | multi-account in sessions.ts |
| electron-store | window bounds (main process) |

## Dependencies

- Electron IPC for window controls
- `electron-updater` for updates
- `clientConfig` JSON (homeserver default, hash router, etc.)

## Integration points

- **electron-shell**: title bar IPC
- **matrix-client**: splash until sync ready
- **authentication**: account switcher sessions

## Testing

### Manual

1. Desktop: minimize/maximize/close via title bar.
2. Slow network: splash shows until ready.
3. Trigger update check in dev (if configured).
4. Unsupported browser: FeatureCheck message.

### Automated

- None

## Known issues & gotchas

- Title bar only on Electron — web uses browser chrome
- Welcome page links point to GitHub releases — verify URLs match your distribution (Gitea vs GitHub)
- `FeatureCheck` may block older WebViews on Android

## Future work

- Unified status bar (sync + update + call status)
- macOS traffic lights styling

## Related docs

- [electron-shell HANDOFF](../electron-shell/HANDOFF.md)
- [matrix-client HANDOFF](../matrix-client/HANDOFF.md)
- [authentication HANDOFF](../authentication/HANDOFF.md)

## Add your extra things here

- Title bar shows `Paarrot` prefix + dynamic room/space title suffix
- `ClientConfigLoader` reads public config — document config.json schema in client config handoff if split later
