MalloryEstate Briefing
M·001Approved
← All briefings

Foundations & UI

Wave A Polish

Three contained fixes on the live Android app + PWA: edge-to-edge status bar insets, a real amplitude-reactive voice visualiser, and a one-tap way to jump back into an open loop.

Dated 2026-06-07Programme Foundations & UI

Situation

Bumping targetSdk to 36 opted the app into Android 15+ edge-to-edge enforcement, so the activity now draws behind the status bar and the PWA masthead rendered under the clock/icons — partly unusable.

Two smaller irritants rode along: the "Listening…" indicator was a decorative fixed CSS animation ignoring actual mic input, and Open Loops thread rows had no way to jump back in — both were free wins once the inset fix was in flight.

Key decisions

Embrace edge-to-edge

Rather than opt out, MainActivity reads system-bar insets and injects them as CSS custom properties (--safe-top/--safe-bottom) into the WebView, since Android WebView doesn't populate env(safe-area-inset-*) like iOS.

Header fills the status bar

The masthead's own background extends up under the status bar for a "match header" look, rather than leaving a gap.

Reuse the existing AnalyserNode

The visualiser reads getByteFrequencyData inside the existing monitorSilence rAF tick (no new loop), bucketed into 5 log-spaced bands with fast-attack/slow-decay smoothing.

Continue seeds the composer, no backend change

Tapping a thread's "Continue" button seeds the input with a pickup line and focuses the textarea; M already gets thread context server-side via recall.

Risks & guardrails

Icon contrast

Status-bar icon appearance (isAppearanceLightStatusBars) is set from the device's night-mode flag so icons stay legible in both themes.

Visualiser jitter

Per-band smoothing (level = max(target, prev * DECAY), DECAY ≈0.82) avoids a twitchy bar chart from raw frequency data.

Delivery

Task 1

Status-bar inset — native inset listener + injected CSS vars, web padding consumption.

Task 2

Amplitude-reactive visualiser — frequency read added to the existing tick, bars bound to smoothed levels.

Task 3

Loops "jump in" — Continue button seeds composer and closes the panel.

Out of scope

Native always-on / wake-word voice capture (Wave D)Cloudflare Access login-screen branding polish (separate follow-up)Backend per-thread turn scoping (rejected — redundant with recall)
spec · docs/superpowers/specs/2026-06-07-wave-a-polish-design.md
plan · docs/superpowers/plans/2026-06-07-wave-a-polish.md
Mallory · Estate briefing