Forward-looking commitments only — the phased build plan and concrete TODOs being tracked now. Companion file
BACKLOG.mdholds wishes (Ideas + brainstorm parking lot) and history (shipped milestones). Keeping commitments and wishes apart stops commitments from looking negotiable and ideas from looking promised.
The Inventory Android client (Kotlin/Compose). Authoritative spec lives in
inventory-laravel/docs/specs/; this file tracks build work.
Markers: 🟡 TBD · 🔲 TODO · 🛠 in progress · ✅ done (shipped work moves to BACKLOG.md).
| Phase | Status | Scope |
|---|---|---|
| 0 — Project skeleton | ✅ shipped 2026-06-23 | Single-activity Compose app + Hilt + Retrofit + Frost theme (palette in docs/design/). |
| 1 — Auth | ✅ shipped 2026-06-23 | Email/password + native Google Sign-In; secure token storage; auth interceptor + 401 recovery. |
| 2 — Households | ✅ shipped 2026-06-23 | List / switcher / create / join-by-code / leave; invite (copy link + QR). |
| 3 — Inventory | ✅ shipped 2026-06-23 | Storage overview → shelves (tab strip + swipe) → products; add/remove/move; global search. |
| 4 — Settings + polish | ✅ shipped 2026-06-24 | Theme (System/Light/Dark), household mgmt, account/sign out; empty/error/offline states. |
| 5 — Phase 2 | ✅ shipped 2026-07-10 | Unlocked 2026-07-10 (user decision): barcode scanning ✅, low-stock tile ✅, filter/sort ✅ (backlog sweep), household color/icon theme ✅, live-updates client ✅ (server Reverb config completed + verified 2026-07-10). |
| 6 — Storage architecture editing UI | ✅ shipped 2026-07-15 (v0.1.9 prerelease) | Nav rework, edit mode, up/down reorder, delete-strategy dialog, tabs⇄list toggle, the client-minted deletion_batch_id + snackbar Undo, the per-location Unsorted system shelf. Backend spec: inventory-laravel/docs/superpowers/specs/2026-07-13-storage-architecture-editing-design.md. |
| 7 — Household roles UI | ✅ shipped 2026-07-17 | Role badges, promote/demote/remove (Members screen), transfer-ownership, household delete with typed name confirmation; every edit-mode pencil gates on server-computed can_restructure/can_manage_members. Backend spec: inventory-laravel/docs/superpowers/specs/2026-07-17-household-roles-design.md. |
| 8 — GAP audit waves 4-8 + round-2 gap closers | ✅ shipped 2026-07-17 through 2026-07-19 | Iterative parity/stability audits (BACKLOG.md → Done). 2026-07-19: fixed a logcat credential leak, a backup-restore crash-loop, and a repository-cache race (BUG-1..3); closed the recently-deleted-browser and native-export (GAP6-M6) parity gaps — see PARITY below. |
Detailed build order: CLAUDE.md and docs/android-plan.md.
App complete (MVP + Phase 2), CI-green, running against the production backend — see
BACKLOG.md→ Done for history. Nothing further committed; the checked items below are the shipped record.
- Households screen — list / create / join (shipped 2026-06-23, CI-green).
- Storage overview — locations list + create (with type), tap-through from households (shipped 2026-06-23, CI-green). Shelf/item counts + tap → shelves come with the shelves screen.
- Shelves — list + create under a location, tap-through from storage overview (shipped 2026-06-23, CI-green). Tab-strip + swipe-pager presentation is a later refinement.
- Products — per-shelf list + create + add/remove steppers (shipped 2026-06-23,
CI-green).
move()is in the data layer; its shelf-picker UI is a follow-up. - Search — global product search with the location › shelf path (shipped 2026-06-23, CI-green); reachable from the storage overview.
- Invite — join code + shareable link + QR (shipped 2026-06-23, CI-green).
- Settings — in-app theme toggle (System/Light/Dark, persisted + applied app-wide) + sign out (shipped 2026-06-23, CI-green). Household management in settings is a later add.
All core screens shipped. Remaining is refactor/polish + dependency-gated work. Pattern per screen: repository + Retrofit API + ViewModel + Compose UI, JVM unit-tested via fakes.
- Navigation-Compose — typed routes + NavHost replacing the state-based nav; auth transitions clear the back stack (shipped 2026-06-23, CI-green).
- Product move UI — shelf-picker dialog wired to
ProductRepository.move(shipped 2026-06-23, CI-green).
App is functionally complete. What's left is polish + one dependency-gated item.
- Shelves-as-tabs + swipe-pager location detail (Frost D-020) — shipped 2026-06-24, CI-green.
- Plus Jakarta Sans / Space Mono fonts — bundled TTFs, applied app-wide; join codes in Space Mono (shipped 2026-06-24, CI-green).
- Barcode scanning — shipped 2026-07-10. Scan FAB on the location detail screen
opens a CameraX + ML Kit scanner; a code matching a product on the active shelf
increments it by one, an unknown code is attached to the next product created on
that shelf (create now sends
code). Camera permission degrades gracefully (the camera is an accelerator, never a requirement). Result travels back via the nav back-stack savedStateHandle; matching logic unit-tested. - Low-stock "running low" tile — shipped 2026-07-10. Dashboard card listing
products at/below their
low_stock_threshold(backend field shipped the same day), with a numeric threshold field on the product detail screen (empty = off). Missing items (mandatory + qty 0) are excluded — one warning per item. Also fixed a latent PATCH bug: cleared fields were omitted from the body and silently kept their old server value (UpdateProductRequest now always encodes every field).
- Recently-deleted browser — shipped 2026-07-19.
GET .../households/{household}/deleted(new API endpoint, sameSupport\RecentlyDeletedthe web view uses) feeds a new screen reachable from the household edit page, with a Restore action per batch. Closes the gap where the snackbar Undo was the only way back once it timed out. - Native household export (GAP6-M6) — shipped 2026-07-19.
HouseholdApi.export()streams the JSON directly instead of opening the web export page in a browser; the bytes are written to a cache file (server's Content-Disposition filename) and handed to a share-sheet chooser via the existing FileProvider.
- CI live and green — wrapper validation +
testDebugUnitTest+ lint pass. - Google Sign-In device smoke-test (release gate) — passed 2026-07-10 on a
Pixel 7 Pro (Android 16, Play Services) against the deployed backend: Credential
Manager account picker → consent → Google ID token →
POST /auth/google→ Sanctum token → authenticated dashboard with real household data. Re-verify on device after any change to the Google OAuth client config or the Credential Manager integration. - ktlint/detekt style gating in CI (wave-2 W19) — shipped 2026-07-10. detekt 1.23.8 +
ktlint-gradle 12.1.2, baselines generated against the real codebase and committed
(
app/detekt-baseline.xml,app/ktlint-baseline.xml), gatingktlintCheck detektstep inci.yml. Fails only on NEW violations; regenerate baselines only after an intentional cleanup (./gradlew detektBaseline ktlintGenerateBaseline), never to paper over findings. - Tag-driven release build — confirmed 2026-07-10: pushing
v0.1.5built and attached a debug-signedapp-debug.apkto a GitHub prerelease (the workflow's intended preview behavior; the DEBUG_KEYSTORE_* secrets are in place). Automated end-to-end 2026-07-27:scripts/release.sh+/releaseskill (bump → tag → CI → app-release feed publish), tag≠versionName guard in the Release workflow, canonical debug keystore local+CI — see BACKLOG2026-07-27. Still ahead of any Play Store upload: a real release signingConfig + AAB output.
- App update notifications — shipped 2026-07-24. Periodic (24h) WorkManager
check + on-open popup against
GET /api/v1/app-version; optional vs breaking (hard-block) releases, keyed per-release so a dismissed optional doesn't suppress a later one; single"app_updates"notification channel; releases publishable viainventory-mcp'screate_app_release/list_app_releases/update_app_releasetools. Device-verified end to end (dialog, notification, in-app APK install). Spec:inventory-laravel/docs/superpowers/specs/2026-07-24-app-update-notifications-design.md. - Daily missing-items reminder — shipped 2026-07-24. User-timed (Settings
toggle + time picker), once-daily WorkManager check against a new account-wide
GET /api/v1/missing-items/countendpoint; skips entirely when count is 0; own"missing_items_reminder"notification channel (separate from"app_updates"); tapping the notification deep-links to the Missing tab (cold-start and already-running paths both handled viaMainActivity.onNewIntent). Narrow, dated carve-out from the "no reminders" scope guardrail — see CLAUDE.md. Spec:inventory-laravel/docs/superpowers/specs/2026-07-24-daily-missing-items-reminder-design.md.
- Storage edit surface (RESOLVED/shipped 2026-07-27) — a standalone
full-page editor (
StorageEditScreen, option 1 from the earlier wireframes), reached from StorageOverviewScreen's edit-mode pencil exactly the wayShelfEditScreenis reached from ManageShelvesScreen's. Editable there: name, type (now editable after creation for the first time — aSTORAGE_TYPESchip row, the same chips the add-storage sheet already used), and a colour/icon theme (same 8+8 key palette as households/shelves, via the sharedColorSwatchPicker/IconSwatchPicker). No danger zone on this page — delete stays on StorageOverviewScreen's multi-select + strategy dialog, unchanged. Went with option 1 rather than the 2026-07-26 lean toward option 3 (richer edit-mode sheet): the task that unblocked this explicitly asked for the shelf-editor shape verbatim, for consistency withShelfEditScreenand the households edit page, rather than a third, sheet-shaped pattern. Backend contract:inventory-laravelcommits 53059a9 + c80dfd3 (nullablecolor/icononLocationResource,PATCH .../locations/{location}accepting both plus the already-existingtype). Wireframes kept for history: https://claude.ai/code/artifact/eb5c6b14-cdf6-4ad4-b3fa-2fe9edb4d49c.
- CodeQL SAST + dependency review CI — shipped 2026-07-13.
codeql.ymlruns static security analysis over the Kotlin/Java source on push/PR tomainplus a weekly schedule (results in the repo's Security > Code scanning tab);dependency-review.ymlblocks PRs introducing new high-severity-vulnerable dependencies. Complements the existinggitleakssecret scan and Dependabot. -
SECURITY.md— shipped 2026-07-13. Documents supported versions, how to report a vulnerability privately (GitHub Security Advisory or maintainer email), and scope (client vs.inventory-laravelbackend).