First run

Simulator vs. Expo Go vs. dev build.

6 mineasy

Time to actually run the app. Three modes — Expo Go (fastest), simulator (Mac iOS or Android emulator), dev build (most realistic). This lesson covers when to use which.

1. The first run on Expo Go

Terminal
$cd apps/mobile
$pnpm dev

You'll see a QR code in the terminal:

Metro Bundler ready
› Scan the QR code above with Expo Go (Android) or the Camera app (iOS)
› Press a │ open Android
› Press i │ open iOS simulator
› Press w │ open web
  1. Install the Expo Go app on your phone
  2. Make sure your phone is on the SAME Wi-Fi as your computer
  3. Scan the QR — your app loads on the phone

2. Simulator / emulator

Press i in the Metro terminal (Mac only — opens iOS simulator) or a (Android emulator, needs Android Studio installed and an AVD). The app loads in a window on your computer.

3. Dev build

Expo Go runs your JS but uses Expo's pre-bundled native modules. If you add a library that needs a custom native module (e.g., Bluetooth, BLE, camera with custom config), Expo Go can't load it — you need a dev build.

Terminal
$eas build --profile development --platform ios

Same QR-code workflow, but you scan with your dev build app instead of Expo Go. Once you've made a dev build, JS updates still flow live; only native changes require a rebuild.

When to graduate from Expo Go to a dev build: the moment you add a native module. Most apps spend their first few weeks in Expo Go and graduate when they need camera customisation, local notifications with custom sounds, BLE, or in-app purchases.

Same network, different APIs

When you scan with Expo Go, your phone runs the JS but tries to talk to your API. localhost won't work — the phone's localhost is itself, not your computer.

apps/mobile/lib/api.ts
// WRONG — won't work on a physical device
export const API_URL = 'http://localhost:8080'
// RIGHT — your computer's LAN IP, reachable from the phone
export const API_URL = 'http://192.168.1.42:8080'

Find your LAN IP: ifconfig on Mac/Linux, ipconfig on Windows. Look for the 192.168.x.x or 10.0.x.x address. The simulator can use http://localhost:8080 because it shares the host's network.

The dev menu

Shake your phone (or press m in Metro) to open the dev menu — reload bundle, toggle perf monitor, enable network inspector. You'll use this constantly.

Quick check

You scan the QR code on your phone. The app starts but every API call fails with 'network request failed'. What's the most likely cause?

Try it

Run your scaffolded app on BOTH a simulator/emulator AND a physical device:

  1. cd apps/mobile && pnpm dev
  2. Press i (Mac) or a (Windows/Linux with AVD) to open simulator
  3. Install Expo Go on your phone (App Store / Play Store)
  4. Scan the QR code with your phone
  5. Once both are running: take a screenshot of each. Paste both in notes.md.

That completes chapter 1's assignment.

What's next

Chapter 2 — Shared types + API client. We'll wire grit sync so your TypeScript types match your Go structs end to end.

Spot a typo? Have an idea?

Help us improve this lesson. One click opens a GitHub issue with the lesson URL pre-filled — suggest clearer wording, report a bug, or request more depth. The course keeps improving thanks to learners like you.

Suggest an improvement on GitHub