- SettingsRepository: deviceLabel fallback changed from "android" to
Build.MODEL so fresh installs show the actual device name (e.g. "Pixel 8")
- server/main.py: _generate_passphrase() replaces secrets.token_hex(32).
Picks 3 words from a 512-word embedded list, hyphen-separated
(e.g. "coral-drift-lamp"). ~27 bits entropy, readable at a glance.
Existing token.txt files are unaffected — only new generation changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
API 35 forces edge-to-edge regardless; removing enableEdgeToEdge had no effect.
Real fix: keep it, set isAppearanceLightStatusBars=true in SideEffect so
clock/battery/wifi icons are dark and visible on the light TopAppBar background.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- mipmap-* and drawable/ icon resources from Image Asset tool
- ic_launcher_background.xml: solid #22569d (matches foreground design)
- AndroidManifest.xml: add android:icon and android:roundIcon attributes
- server/app/main.py: log token on every startup (not just first run)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CaptureScreen: FlowRow of FilterChip from recent tags; tap to toggle tag in/out
- CaptureViewModel: recentTags flow (flat deduplicated from last 100 captures), lastSyncedAt, toggleTag()
- HistoryScreen: tap to expand rows, edit dialog for pending/failed, last synced in TopAppBar subtitle
- HistoryViewModel: lastSyncedAt flow, updateBody()
- CaptureDao: getLastSyncedAt(), getRecentTagsJson() (from prior commit), updateBody()
- SettingsScreen: sync interval field (number, min 15), SynqSettings.syncIntervalMinutes
- SettingsViewModel: reschedules WorkManager on save with new interval
- SyncWorker: schedule() takes intervalMinutes param, uses REPLACE policy
- AndroidManifest: ACTION_SEND text/plain intent-filter on MainActivity
- MainActivity: extracts EXTRA_TEXT on share, passes as URL-encoded nav arg to CaptureScreen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>