Family House Map + Maintenance Hotspots (plan)
Status: PLANNED — not built. Requested 2026-07-26. The first slice (a clear
"Manage wall devices" entry on /dashboard/family + a personal/shared badge
on every device) shipped alongside this doc; the house map and hotspots below are the
staged follow-on. Inherits FAMILY_INTENT.md — this is household
operations, not surveillance.
The arc
- Devices are already located-ish. Each wall device (
family_wall_displays) haslocation_kind(shared|personal) +owner_member_id. That answers whose screen but not which room. - Map of the house. Give the household a simple room model and let a parent place each device in a room — a lightweight floorplan. "The kitchen iPad," "the mudroom screen," "Ava's bedroom screen" become real places, not just names.
- Hotspots. Once rooms exist, anchor recurring cleaning + maintenance to them: the spots in a house where upkeep is due — HVAC filter, dryer vent, smoke-detector batteries, fridge water filter, gutters, water-heater flush. Each has a cadence, a last-done date, a next-due date, and can become a chore (assigned to a member, earns credit) or a reminder on the wall.
The through-line: chores are the people half; hotspots are the house half. Both land on the same wall and the same points ledger.
Why this is mostly reuse, not greenfield
- Floorplan drag/drop — the AisleAsk store map already solved "drag tiles onto
a painterly background, persist
pos_x/pos_y/pos_w/pos_h/rotation" (migrations 570 + 573,aisleask_sections). A house map is the same primitive with rooms instead of aisles and devices instead of sections. Lift the interaction wholesale. - Actionable side —
family_chores(migration 584, intra-family credit) is exactly the reward mechanic a maintenance task needs; a hotspot that comes due can spawn a chore. Don't rebuild attribution. - Scheduling — the family reminders / routines cadence machinery (migration 075 +
the one-off
family_remindersfrom the JQ-actions work) covers "every 90 days." - Reorder-the-part — the existing Amazon affiliate pattern (the
hivejournal-20tag already used for Open Energy experiment materials) means a "replace the furnace filter" hotspot can carry a one-tap reorder link for the exact filter size — genuinely useful, and it monetizes honestly (a part you already need, not an ad).
Data model sketch (when built)
family_rooms
id, parent_user_id, name, kind (kitchen|bedroom|bath|garage|utility|outdoor|other),
pos_x, pos_y, pos_w, pos_h -- position on the house map canvas
created_at
family_wall_displays
+ room_id uuid null references family_rooms -- which room this screen lives in
family_maintenance_items ("hotspots")
id, parent_user_id, room_id null,
title, -- "Furnace filter", "Dryer vent"
category (cleaning|filter|appliance|safety|seasonal),
interval_n int, interval_unit text, -- "every N hours|days|weeks|months"
due_soon_frac real null, -- per-item yellow threshold (default 0.75)
last_done_at, -- next-due + freshness are COMPUTED, not stored
assigned_member_id null, -- who owns it (→ chore attribution)
reorder_url null, -- affiliate part link (filters etc.)
created_at
Freshness is the Upkeep Freshness engine
(upkeep-freshness.ts, pure + golden-tested): last_done_at + interval →
{ pct, status, color } (green/yellow/red), computed on read so it's always current.
Render each hotspot/room in its color; sort "what's due" by ratio (most overdue
first). The SAME engine gives family routines (brushing, showers) a freshness dot from
their check-in history — one model for personal upkeep and household maintenance alike.
RLS-off / service-role-only, gated by parent_user_id in the route — same posture as
every other family table.
Surfaces (when built)
/dashboard/family/house— the map editor: rooms on a canvas, devices dragged into rooms, hotspots pinned to rooms with due-status color (green ok / amber soon / red overdue).- On the wall — an optional "House" panel (per-device toggle, same as the other
show_*flags) showing what's due this week, and a hotspot that's overdue can be tapped-to-mark-done (reusesallow_checkin). - Seed catalog — ship a starter set of common household hotspots with sane default cadences (HVAC filter 90d, dryer vent 365d, smoke batteries 365d, fridge filter 180d) so a family isn't staring at a blank canvas. Opt-in per item.
Guardrails
- Household ops, not a landlord dashboard. This is a family keeping its own home up, not a tool for monitoring someone. No exact addresses required; a room is a label.
- A hotspot is an invitation, not a nag. Same rule as growth nudges — due items surface calmly; no guilt streaks. (Inherits FAMILY_INTENT.md.)
- Reorder links are opt-in and honest — shown only where a real consumable exists, labeled as an affiliate link, never injected as an ad.
Sequence
- ✅ "Manage wall devices" entry + personal/shared badge (shipped 2026-07-26).
- ✅
family_maintenance_items+ the seed catalog + freshness (migration 586,/dashboard/family/upkeep). - ✅ Rooms + house-map editor (migration 588,
family-rooms.ts,/dashboard/family/house) — draggable + resizable room tiles (the AisleAsk store-map primitive, reused), hotspots pinned to rooms viaroom_id(FK added in 588,ON DELETE SET NULL), each room colored by the worst freshness among its items (getHouseView→{ rooms: [...worst-of...], unassigned }). Assign items to rooms from the map. - ✅ Wall "🏠 Home upkeep" panel (migration 587) — overdue/due-soon items ambient on the wall.
- Follow-on: painterly/floorplan background behind the map (store-map has one), tap-to-done directly on a room tile, chore spawning, affiliate reorder links, and a unified personal+household Upkeep view.