Surface C · Settings & native consistency

No second-class rooms

Left is the settings screen today — stock Android widgets, default font, the everyday mixed with the technical. Right is the same settings held to the main page’s craft, with the mental model sorted: everyday up top, developer config behind “Advanced”.

● Today — raw native
☰ Mallory settings
Sign in to chat in the app. All notifications are forwarded to M as context (except apps you list as blocked) using the Access service token below.
PWA URL
https://m.thehansfords.app
API base URL
https://mallory.thehansfords.app
Access Client ID
••••••••••
Access Client Secret
••••••••••
Blocked apps
com.whatsapp, com.bank…
Forward notifications to M
Open notification access
Save

Settings

Voice
Mallory speaks aloud
Reads replies in her voice
Hands-free reply
Auto-listen after she finishes
Appearance
Theme
DarkPaperSystem
Notifications
Forward to Mallory
As context for the desk
Blocked apps
3 hidden
Notification access
Advanced — URLs, tokens

Where should settings live?

1 · Restyle the native screen

Rebuild SettingsActivity in Kotlin to match the aesthetic.

+ Works pre-login, offline, no bridge
– Two design systems forever; serif/feel never quite matches; drifts again

2 · Host settings in the web (rec.)

A /settings route in the PWA, same tokens & components. Native keeps only the OS-permission bridge.

+ One design system; consistent by construction; never drifts
– Needs a small JS↔native bridge for notification access

3 · Hybrid

Everyday settings in the web; a tiny native “Setup” for first-run bootstrap config (URLs, token).

+ Best of both; clean first-run
– Slightly more surface to maintain than pure web

Pick where settings live (web pre-selected — it’s the only option that makes “same craft” structural rather than a promise). Confirm the regrouping (Voice · Appearance · Notifications · Advanced) and the controls (our oxblood toggle, weight-led theme chips). I’ll also unify the oxblood token (#7a2436 everywhere; native is currently #5B1A1A). Then C locks and we revisit D · the main chat.