Example project — Frond is not real.

Authored demo content for a fictional plant-care app, rendered by the same parsers and held to the same invariants as a real project's dashboard. This is the system in use, three months in.

docs/implementation/data-layer.mdCommitmentsactive2026-07-11Read when: before touching persistence, sync, or anything that reads a plant record

The data layer

Local store is the source of truth for reads; the network is an enhancement (decisions.md → 2026-06-27).

Shape

Plants, rooms, surveys and care events are four tables, mirrored locally. A care event is append-only: marking a plant watered writes a row, it never mutates a schedule.

Sync

Last-write-wins per record, with care events exempt because they are append-only and therefore mergeable. This is the whole reason the schema separates "what we believe about a plant" from "what happened to it."

The rule that keeps it honest

No screen may read from the network directly. If a view needs data, it needs a local query, and sync's job is to make that query's answer better later.