React Native app for guided coffee brewing. Project root for Metro / Expo is this directory.
V1 navigation: two tabs — Home (recipes → recipe detail → brew session) and More (placeholder). No login required to use the app.
Recipe catalog: bundled JSON at src/data/recipes.json (edit + ship with releases). User-created recipes are stored in AsyncStorage separately.
Brew history: Completed sessions are appended to a local log (brewHistoryService, key brew_master_brew_history_v1). Not synced — device-only. Optional tasting notes are a later feature.
Polish (v1): Safe areas for notched devices, 44pt minimum primary button height, basic VoiceOver labels on main actions, alerts when local history save fails, retry on home list load errors. Complete a device smoke pass before wide TestFlight (see checklist Phase 6).
- Model: Countdown per step. The duration comes from the step’s
timefield (M:SS→ seconds), with a small floor so the control stays usable on short steps. - Backgrounding: The UI uses a wall-clock deadline (end timestamp). When you come back to the app, remaining time is recomputed from that deadline, so brief interruptions don’t silently “lose” ticks. The OS may still throttle or suspend JS in edge cases—treat the timer as a guide, not a precision instrument.
- Flow: Timers do not auto-start when you open the brew — tap Start when you begin each step. When the countdown hits zero, the session advances automatically to the next step (or completion). Skip ahead / Finish early uses a light impact haptic for the optional shortcut.
- Feedback: When the countdown hits zero, the app fires haptic success (with vibration fallback) before advancing.
From this directory:
npm install
npm run startThat runs the Expo dev server (Metro). Press i for iOS Simulator, a for Android emulator, or scan the QR code with Expo Go on a phone.
This project uses npm. Keep package-lock.json as the only lockfile.
npm run checkThe aggregate check runs TypeScript, Expo ESLint, Prettier formatting checks, Jest, and Expo Doctor.
For focused local checks:
npm run typecheck
npm run lint
npm run format:check
npm test -- --runInBand
npm run doctorUses TypeScript strict mode (tsconfig.json).
- Install Expo Go from the App Store.
- Connect the phone to the same Wi‑Fi as your Mac (or use USB with Expo’s tunnel mode if the network blocks LAN discovery).
npm run start, then scan the QR from the terminal or Dev Tools in the browser.- For TestFlight / App Store builds later, you will use a development or production build (e.g. EAS Build) with the bundle id set in
app.json— Expo Go is only for development.
| Setting | Value |
|---|---|
| Display name | Brew Master (app.json → expo.name) |
| Expo slug | brew-master |
| URL scheme | brewmaster |
| iOS bundle id | com.brewmaster.app |
| Android application id | com.brewmaster.app |
Change the bundle / package identifiers before shipping if you use your own reverse-DNS domain (e.g. com.yourname.brewmaster).
Icons and splash live in assets/. Replace icon.png, splash-icon.png, and adaptive-icon.png when you have final branding; keep Expo’s recommended sizes.
- V1 scope:
docs/v1_phase0_scope.md - Checklist:
docs/v1_solo_checklist.md - Deferred (post–v1) code index:
docs/v2_backlog.md