Remote Pi v0.4.0 — voice, images, and a big app/UX round.
Tag tracks the pi-extension version (0.4.0). 37 commits since v0.2.1.
📷 Images & 🎙️ Voice
- Image attachments end-to-end: protocol + multimodal ingest (pi-extension) and composer attach (app).
- Voice input via native speech-to-text in the composer.
- Fix — image send unblocked: relay envelope size limit is now configurable (
RELAY_MAX_CT_MIB, default 4 MiB). The previous fixed 1 MiB cap silently dropped larger images, leaving them stuck on "sending…". - App durable send timeout: a message that never gets echoed is removed silently after 20s, and the timeout re-arms on session load/restart.
- Images survive
session_syncreplay (history mapper).
📱 App layout & UX (plan-32)
- Working room, chat polish, session-switch, detail-pane, tool-card, settings URL.
- Working/thinking indicators decoupled from the stream; thinking cursor restored at turn start.
- Device classification by
shortestSide— a phone in landscape no longer flips into tablet mode. - Compaction feedback (working bracket + result broadcast + history); forced English compaction summary.
🗄️ Architecture
- Local DB as the single source of truth (reactive SSOT) — plan-31.
workingfield inroom_meta, published on turn start/end (relay + pi-extension).- Transport: liveness watchdog on
RelayClient(force-close after silence). - Quick Actions from the mobile app (plan-28); persist
model_setto project settings (survives Pi/daemon restart). - Slash command handling + command mirror for SDK built-ins.
🔧 Chores & platform
- Version bumps: pi-extension 0.4.0, relay 0.2.2, app 1.1.0+5.
- iOS deployment target 18.0; ML Kit / CameraX 16 KB page-size compliance; App Store / Google Play store-listing metadata.
Full Changelog: v0.2.1...v0.4.0