Mealvoro
REVIEW BUILD Every screen below is a capture from this app running on the iOS Simulator or Android Emulator. This page is a showcase; it does not run the app.

React Native · Expo SDK 57 · TypeScript

A pickup-preorder app for one restaurant, as real iOS and Android source.

Menu search and allergen filters, dish options that enforce their own rules, a docket that adds up in whole cents, and pickup slots that know the kitchen's hours, time zone and capacity. Orders are saved on the phone as clearly labelled local demo orders until you connect your own POS.

  • PlatformsiOS 16.4+ · Android 7.0+
  • StackRN 0.86 · Expo Router
  • Screens10 + allergen sheet
  • Tests77 Jest tests
Menu screen on iPhone: Fennick Kitchen header with open status, search, filters and a featured pinsa photo
iOSMenu
Dish options on Android: sesame poke bowl with base and protein chosen and the running price on the add button
AndroidDish options

Three customer journeys

What actually works on the device

01

Discover the menu

  1. Search across dish names and ingredients.
  2. Filter vegetarian or vegan; hide dishes with chosen allergens.
  3. Open a dish for ingredients and illustrative allergen information; deep links open dishes directly.
Menu
Menu scrolled to the morning plates and bowls with the sticky section rail
Roast tomato soup opened from a deep link

02

Customise with rules

  1. Required groups say so; the add button names the missing choice and jumps to it.
  2. Single and multi-choice limits, sold-out options and price changes.
  3. The docket merges identical lines, edits, undoes removals and totals in cents.
Sesame poke bowl with the base group highlighted as required
Poke bowl with base and protein chosen
Docket with three items, subtotal, sales tax and total

03

Plan pickup, place a local demo order

  1. ASAP or a 15-minute slot within opening hours, lead time, breakfast windows and capacity.
  2. Name and phone are validated next to the fields; the slot is re-checked at the moment of ordering.
  3. The ticket is saved on the phone, survives restarts and can be reordered.
Pickup checkout with ASAP and time slots
Checkout showing field errors for name and phone
Order ticket FK-0001 with pickup time and LOCAL DEMO stamp

Install

From the ZIP to a simulator

The app is a native Expo project built with expo run; it does not run in Expo Go or in a browser.

Requirements

  • Node.js 20.19 or newer (verified with 24.21)
  • iOS: macOS with Xcode 27 and an iOS Simulator
  • Android: Android SDK 36, JDK 17, an emulator or device

Rebrand in four files

  • src/config/brand.json — name, scheme, bundle IDs, colours
  • src/config/restaurant.ts — time zone, hours, pickup rules, tax
  • src/data/menu.ts — dishes, modifiers, allergens
  • assets/brand/ — icon and splash (SVG sources included)
cd mealvoro/mobile
npm ci
npm run check          # types, lint, 77 tests
npx expo run:ios       # iOS Simulator
npx expo run:android   # Android emulator

# release-like builds
npx expo run:ios --configuration Release
npx expo run:android --variant release

# optional end-to-end journeys
maestro test e2e/

Honest scope

Included, needs your backend, not included

Works on the device

  • Menu search, diet filters, allergen hiding, favourites
  • Modifier rules, quantities, kitchen notes
  • Docket totals in integer cents, tax rounded once
  • Opening hours in the kitchen's time zone
  • Pickup slots: lead time, windows, capacity
  • Order history, reorder, cancel, share
  • Persistence, reset, JSON export, light and dark
Local demo

Needs your backend

  • Sending orders to a kitchen or POS (typed gateway included)
  • Real slot availability (demo capacity is simulated)
  • Verified allergen and ingredient data

Not included

  • Payments and card forms
  • Accounts, sign-in, loyalty
  • Live order status, push notifications
  • Delivery, couriers, kitchen or admin apps
  • App Store or Play Store submission

Verification

What was tested, and where

Simulator and emulator results are not physical-device results; both are listed separately.

CheckEnvironmentResult
TypeScript, ESLint, 77 Jest unit and journey testsExtracted buyer package, Node 24.21Passed
Expo Doctor (SDK 57 dependency set)Extracted buyer package21/21 passed
iOS Release build and 3 Maestro journeysiPhone 17 simulator, iOS 26.5, Xcode 273/3 passed
Light, dark and largest-accessibility-text captures; reduced-motion pickup journeyiPhone 17 simulator16/16 captures, passed
Android release APK and 3 Maestro journeysAndroid 16 emulator (API 36)3/3 passed
Light, dark and 2× font captures; reduced-motion pickup journeyAndroid 16 emulator (API 36)15/15 captures, passed
Signed Release build for a physical iPhoneiPhone 14 Plus, iOS 26.6.2Built and code-signed
Journeys on physical phonesiPhone 14 Plus, Galaxy A24Pending: phones must be connected and unlocked