PickedPlate
A family meal-versioning app: every meal is a living version: cook it, rate it around the table, save what worked as the new normal. KMP core, Compose Multiplatform, native SwiftUI iOS, Cloudflare backend. Also the first project planned and built through Shipyard.
PickedPlate is a family meal app built around one idea: every meal is a living version. Cook it, rate it privately around the table, tweak it, and save what worked as the new normal. The greats get retired into a Hall of Fame.
Features
- Meal versioning. Each dish carries its history: v1 → v4 with per-version notes (“marinade overnight, Dad”, “pineapple +½ cup”), ratings, and cook counts. Family members can branch a spin-off (“Mia’s spicy version”) without losing the canonical line.
- Table ratings. Everyone rates privately after cooking; the version’s score is the family’s honest aggregate, not one loud opinion.
- Hall of Fame. Retire a perfected dish with a small ceremony; records and streaks keep the game fun.
- Guest events via QR. Dinner guests scan a code and leave feedback for the night’s menu without an account.
- Ingredient catalog. A public, CDN-hosted static catalog (~344 records) synced into the clients for structured ingredients rather than free text.
- Chef tier (schema-ready). The data model anticipates a creator tier without complicating the family core.
System design
One Kotlin Multiplatform core, three front ends, and a small edge backend:
| Layer | What |
|---|---|
:db / :client / :sync | KMP core: SQLDelight storage, Redux-style state, sync engine |
:ui + :composeApp | Compose Multiplatform UI targeting Android, iOS, desktop preview, and Wasm |
:webApp | Adaptive Compose/Wasm web frontend with real route URLs and history |
iosApp | Native SwiftUI host over the shared core (SKIE-bridged) |
api/ | Cloudflare Worker backend; ingredient catalog served as a static public CDN API |
Stack: Kotlin 2.3 · Compose Multiplatform 1.11 · SQLDelight · SKIE · Cloudflare Workers. UI correctness is held by a golden-snapshot suite (the screenshots above are the actual test goldens, deterministic fixture data by construction), plus an enforced module-boundary check in the fast test tier.
The other half of the project
PickedPlate has a co-primary purpose: it is an agentic-operation laboratory: the first project to run its planning and build loops end to end on Shipyard. Specs, ADRs, and work items are the operating system of the repo; agents execute against them and the decision layer (40+ accepted ADRs) is the durable record of why the product is shaped the way it is. Builds reach my test devices through Shipyard Deploy.