Family-page build queue (Sam's voice brief, 2026-06-03)
Captured so nothing's lost. These extend the family surfaces (chanie-home.html /wife,
family-kiosk.html /family). All must stay key-free (no master key) so the gated
family login is safe. Build order = top to bottom (quickest/most-emphasized first).
0. 🐛 FIX: kiosk voice fails in the home-screen app ("service not allowed")
Confirmed root cause: family-kiosk.html uses webkitSpeechRecognition (Web Speech API,
line ~493). It works in Safari but iOS blocks it inside a standalone/home-screen app →
service-not-allowed. (Interim done 2026-06-03: honest error message + "use Safari" hint.)
Real fix: replace the SpeechRecognition flow with getUserMedia → MediaRecorder → POST the
audio to /voice/transcribe (already on the Worker, index.ts ~1266: audio → Whisper → text).
getUserMedia does work in standalone on iOS 18, so this fixes the wall-tablet case. Test the
iOS MediaRecorder output format against what Whisper accepts (iOS records mp4/aac). Apply the
same fix anywhere else a page uses webkitSpeechRecognition for input. Build before relying on
the wall iPad for voice.
1. Messaging → a prominent CHAT button (Sam emphasized)
Today the two-way thread exists + a mic, but it's not prominent. Add a persistent "Chat"
button near the top (like a Verizon/utility app's chat bubble) that jumps straight to the
messaging thread (#zee on Chanie's page / the kiosk thread). In addition to the mic, not
instead. Put it on /wife + /family (+ wherever else). Make messaging feel one-tap.
2. Calendar → UPCOMING per person (not just today)
The people-tagging (calendar-tags.js HSCAL) currently shows only today's tagged events.
Sam wants upcoming per person — e.g. "Yaakov: Chemistry Regents (Tue), Algebra (Thu)".
Extend loadPeopleToday → an upcoming window (next ~14 days), grouped by person, on the
kiosk/home. Uses /calendar?scope=family (already referer-gated, no key).
3. Groceries → a "bought / re-add" page + store breakdown
- A box/link between
/wifeand/family→ a separate grocery page showing items
already bought (checked off), so you can un-check → it auto re-adds to the active list.
Back-and-forth: "redo your grocery shopping." (Engine: GLIST = open, BOUGHT = checked;
need a "show bought" + "un-buy / re-add" path — likely a new command likeUNBUY <n>or
reuse the Grocery_List tab's bought rows.) - Store customization: let Sam set up a few stores, then the list breaks down by store
("where to get what, where") — assign each grocery item a store, render grouped by store. - Ties to the command-inbox Grocery_List tab (recently redone). Confirm the data model
(open vs bought rows) before building.
4. Top-of-page polish
The "Good evening" greeting + the block underneath could be refined on the family pages.
Vague — get Sam's specifics before changing (don't guess the aesthetic).
5. iPad wall-mount HARDWARE (researched 2026-06-03) — for the wall tablet
Sam's device: iPad 8th gen (10.2", 2020), model MYLN2LL/A, iPadOS 18.3.1. Wants a
magnetic setup: a plate on the wall + a magnetic-backed case on the iPad → snaps flat to
the wall, charges, removable (also sticks to the fridge/other metal). Aesthetic, front-of-house.
- EMONITA Magnetic Wall Mount + Charging Case A7 — exact fit (iPad 7/8/9 10.2"): magnetic
case + ~10mm slim wall mount, 18W charging, 360° rotate, removable. This is the one.
- Zilvex Magnetic Wall-Mount Charging Kit (iPad 7/8/9 10.2") — 15W, TPU case, 360°, aesthetic.
- Caseco "Simpl" Magnetic iPad Wall Mount — minimalist alternative.
- Pair with: iOS Guided Access (lock to one page) + Add to Home Screen (standalone) +
the family-scoped CF login (so the wall device can't reach Sam's pages) — see
docs/MILDRED_SERVER_SCOPING.md pattern.