pauzer

Pauzer

Minimal iOS gym rest timer. Tap a preset, hear a buzzer, lift again.

Stack

Expo SDK 54, React Native, TypeScript. iOS-only v1. No backend, no analytics, no auth.

Run locally

npm install
npx expo start

Then press i to open the iOS simulator, or scan the QR with Expo Go on a device.

Build for TestFlight / App Store

  1. Install EAS CLI: npm install -g eas-cli
  2. Log in: eas login
  3. Configure (first time): eas build:configure
  4. Build: eas build -p ios --profile production
  5. Submit: eas submit -p ios --latest

Project structure

Privacy

Data Not Collected. No analytics, no crash reporting, no remote calls. AsyncStorage is the only persistence; it stays on the device.

App Privacy questionnaire answers (App Store Connect): Data Not Collected.

Required-reason APIs (PrivacyInfo.xcprivacy, auto-generated by Expo):

No additional entries needed. Verify the generated manifest in the .ipa via unzip -p Pauzer.ipa Payload/Pauzer.app/PrivacyInfo.xcprivacy.

Submission checklist

Things the developer must still do manually:

Scope guard

If tempted to add a feature, don’t. This app is intentionally boring. Widgets, Live Activities, Watch companion are explicitly v2.

E2E tests (Maestro)

One-time setup (developer machine):

  1. Install Maestro CLI: curl -fsSL "https://get.maestro.mobile.dev" | bash
  2. Build a native iOS dev client: npm run ios:dev (runs npx expo run:ios). This compiles a .app with bundle id com.tomasmach.pauzer and installs it in the simulator.

Run tests (after the app is installed in the booted simulator):

npm run test:e2e

Flows live under .maestro/:

Known caveats: