# Home category redesign — Overview | My Home | Phone Approved 2026-08-23 (mock B, "Rooms & Tabs"). Home absorbs Home & Phone and becomes a three-tab category. Phase-2 feature picks: rooms grouping, phone vitals, Today card. The reclaim-space prompt is removed. Deferred with reserved slots: Assist command box, phone notification inbox, scenes/climate/cameras, now-playing, HA todos. ## Taxonomy `SettingsRoutes` home category gains tabs; the `home-phone` category is deleted: ``` { page: "home", label: "Home", tabs: [ { page: "home", label: "Overview" }, { page: "my-home", label: "My Home" }, { page: "phone", label: "Phone" } ] } ``` `home` doubles as category id and first tab (the applications/users/privacy pattern). New leaf ids `my-home`, `phone`. A new alias map in `SettingsRoutes.resolve()` sends the retired `home-phone` id to `my-home` so muscle memory, old Vicinae commands, and `panama-action settings-page home-phone` keep landing correctly. In-repo callers are updated to the new ids anyway: `HomeControls.qml`, `panama-doctor`'s HA-warning target, `Health.qml`'s `settingsTargets`. ## Pages **HomePage.qml (Overview) — rebuilt.** Greeting header and weather lede stay. Then: - A five-tile quick-action grid (new `HomeQuickTile.qml`): Focus session (start/end), Do Not Disturb (live toggle state), Health (→ `services`), Snapshots (→ `snapshots`), Storage (→ `storage`). Fixed set, per the phase decision. - "This machine": the existing findings array unchanged (firewall exposure, security advisories, reboot-needed, health attention) plus the "Install N updates" row folded in as a finding when `Updates.total > 0`. The reclaim-space row is gone entirely. - Two glance cards linking into the sibling tabs: My Home ("2 lights on · Living Room, Kitchen") and Phone ("iPhone · 82% · nearby"), each `openSettings("my-home"/"phone")`. - "Today": `CalendarAgenda.nextEvent` with Join/Open; hidden when nothing upcoming or no calendar. Zero new plumbing — the service already streams. - "Weather": the existing card, unchanged. - The old Focus card and "Right now" containers card are retired (tiles and the System category cover them). **MyHomePage.qml (new, `objectName: "my-home-page"`).** Absorbs the Home-Assistant half of HomePhonePage: - "Rooms" card: every catalog light grouped by HA area, rendered as interactive tiles (new `HomeLightTile.qml`: power square, name, state, brightness track for dimmables, "Control Center" pill on the first four favorites). Toggle → `HomeAssistant.toggleEntity`, brightness → `setBrightness` (commit-on-release, like `HomeBrightnessSlider`). Falls back to a single flat "Lights" section when areas are unavailable. - "Accessories" card: the existing favorites editor (`HomeFavoriteCard` grid — alias, reorder, remove, Control Center badge) and the existing Available-lights search (`AvailableLightRow`), moved intact. - "Home Assistant" card: the existing connection card (URL, token, save/clear, refresh, open) moved intact. - Exposes `pageDiagnostics` (same shape as HomePhonePage's plus `rooms` summary); the IPC key in `settings status` renames `homePhone` → `myHome`. **PhonePage.qml (new, `objectName: "phone-page"`).** - Vitals strip: three stat blocks — Battery (% + charging), Signal (type + strength), Reachability — from the extended KdeConnect service. A stat whose datum is absent (unpaired, plugin missing) shows an em-dash, never an error. - "Reach it" card: Ring, Send clipboard, Send file (FileDialog, the quicksettings pattern) via existing service functions; transfer progress/cancel as in Control Center. - "Messages" card: BlueBubbles status + open (moved from HomePhonePage). - "Device" card: pairing/plugins handoff to `connectivity` (as Control Center does). `HomePhonePage.qml` is deleted. `HomeFavoriteCard`/`AvailableLightRow` survive under MyHomePage. ## Service contracts (pages are written against these; helpers implement them) **`panama-home-assistant areas` (new command).** REST-only: `POST /api/template` rendering a Jinja template that emits `[{ "id", "name", "entities": [...] }]` via `areas()` / `area_name()` / `area_entities()` / `tojson`. Same redacted error codes as the other commands. `HomeAssistant.qml` gains `areas: []` (fetched with refresh) and `rooms: [{ id, name, lights: [entity] }]` — catalog lights joined to areas, un-areaed lights in a trailing "Other" bucket; empty `areas` ⇒ `rooms` is one unnamed bucket. **`panama-kdeconnect status` (extended).** Per reachable paired device, read via `busctl get-property` from the plugin objects (paths exist only when paired+reachable — absence is data, not an error): `battery: { charge: int, charging: bool } | null` from `org.kde.kdeconnect.device.battery`, `signal: { networkType: string, strength: 0-4 } | null` from `...device.connectivity_report`. `KdeConnect.qml` surfaces `phoneBattery`, `phoneSignal` (null when absent). Unit tests extend the two bridge test files' fake busctl/CLI fixtures. ## Blast radius owned by this change - `SettingsShell.qml`: `my-home`/`phone` cases + components; `homePhoneDiagnostics` plumbing renamed and repointed at MyHomePage (`SettingsWindow.qml`, `shell.qml` status JSON key `myHome`). - `SettingsSearch.qml`: `home-phone` extraEntries re-pointed (`my-home` for Home Assistant entries, `phone` for phone entries); new entries for rooms, phone battery, ring, clipboard, Today. - Generators re-run: Vicinae commands (`settings-home-phone` → `settings-my-home` + `settings-phone`; `home` still skipped so Overview adds no command), `docs/settings.md`. - Contracts: `home-phone-settings-contract` rewritten as `my-home-settings-contract` (+ phone coverage), `control-center-contract` (Manage target), `health-ui-contract` / `panama-doctor-contract` (settings target), nav/jump/search/gnome-handoff/ panama-commands re-verified against the new route table. `home-preferences-contract` and `phone-messages-contract` unchanged. - Docs: settings README, manual chapter 05 (Home description), Welcome comment (fourteen categories). ## Non-goals (reserved slots, later phases) Assist box, notification mirror/reply, scenes, climate, cameras, now-playing, todos, HA WebSocket `--watch` streaming, customizable quick actions.