React Native · Expo SDK 57 · TypeScript

A strength training log, as native app source code.

Repkivo is a complete iOS and Android app for people who log every set: build routines, run a workout with a rest timer, then compare today with last time. Data stays on the device. You get the source to rebrand and publish as your own app.

  • EditionNative frontend with local persistence — no backend required
  • PlatformsiOS 16.4+ and Android 7.0+ from one TypeScript codebase
  • RebrandName, bundle IDs, colours and icons from one config file
  • Tests49 Jest tests · 6 Maestro device flows
Repkivo workout screen on iPhone: Bench Press set rows with previous values, one completed set and the rest timer counting down
iOS · workout with rest timer
Repkivo Today screen on Android: this week's workouts, sets and volume, and routines to start
Android · today

Working journeys

Three things a lifter does every week — all implemented.

Every control in these flows works and saves. Nothing pretends to talk to a server.

01

Build a routine

  1. Search 38 built-in exercises or filter by muscle group; add your own.
  2. Set target sets, reps, weight and rest per exercise; reorder.
  3. Validation explains what is missing; unsaved edits ask before leaving.
Routine editor with a Barbell Row card, rest stepper and target set rows

02

Run the workout

  1. Sets are prefilled from last time; tap the previous value to copy it.
  2. Completing a set starts the rest timer: ±15 s, skip, optional local alert.
  3. Background, lock or close the app — the workout and timer continue.
Workout in progress with completed bench press sets filled in blue

03

Compare with last time

  1. Finish to see duration, sets, volume and new personal records.
  2. Open any workout for a set-by-set comparison with the previous one.
  3. Follow a lift's estimated 1RM, top set or volume over time.
Workout detail showing before, now and change columns for each set

Details that matter mid-set

Built like a logbook, not a feed.

Timers are timestamps

The workout start and rest end are stored as times, so the countdown is correct after the phone was locked or the app was killed.

Previous set on every row

Each row shows what you lifted last time for the same set, matched by set type, and copies it in one tap.

Plate maths with your plates

Pick the plate sizes you own; the calculator finds exact loads greedy loading misses and says how far off the closest load is.

Your data leaves with you

JSON backup and restore, plus CSV export in the column order Strong uses, through the system share sheet.

Honest numbers

Epley or Brzycki estimates for 1–12 reps only, labelled as estimates; warm-ups never count towards volume or records.

Accessible by default

Set rows read as “Working set 2 of 3, 80 kilograms, 5 reps, completed”; large text, dark mode and reduced motion are supported.

Real screens

Captured from the 1.0.0 build on a simulator and an emulator.

No mockups: these are screenshots of the app in this package, taken during native QA.

Inside the package

Layered so you can change one thing at a time.

repkivo/
├── app/
│   ├── app/            # expo-router screens = deep links
│   ├── src/domain/     # pure TS: sessions, records, maths
│   ├── src/state/      # store + persistence
│   ├── src/data/       # storage adapter + migrations
│   ├── src/services/   # notifications, files, haptics
│   ├── src/i18n/en.ts  # every string
│   ├── brand.config.json
│   ├── .maestro/       # device journey flows
│   └── __tests__/      # 49 Jest tests
├── docs/               # build, signing, rebrand, scope
└── showcase/           # this page, static

Stack

  • Expo SDK 57, React Native 0.86, React 19.2, TypeScript 6 (strict)
  • expo-router with typed routes and deep links (repkivo://workout)
  • AsyncStorage persistence behind a replaceable adapter
  • expo-notifications (local only), expo-file-system, expo-sharing
  • react-native-svg charts, Lucide icons, Schibsted Grotesk + JetBrains Mono (OFL)
  • Continuous Native Generation: no hand-edited ios/ or android/

Install

From ZIP to simulator.

Requirements: Node.js 22.13+. iOS: macOS with Xcode 26.4+. Android: Android Studio with SDK 36 and JDK 17. No accounts or paid services are needed to run it.

# unzip, then
cd repkivo/app
npm ci
npm run check          # typecheck + lint + tests

npx expo run:ios       # iOS simulator
npx expo run:android   # Android emulator or device

# release builds (bundle embedded)
npx expo run:ios --configuration Release
npx expo run:android --variant release
# rebrand: edit app/brand.config.json
#   appName, scheme, bundle IDs, colours
npm run brand:icons    # icons + splash
npx expo prebuild --clean

# native journeys on a running device
maestro test .maestro

Verification

What was tested, and where.

This web page is a showcase. It is not the app and it is not proof that the app runs — the native results below are.

TargetHowResult
Logic and screens49 Jest tests: domain maths, persistence, recovery, router journeysPassed
iOS simulatorClean Release build on iOS 26.5 (Xcode 27); 6 Maestro journeys including background, process kill and restore; largest accessibility text; Reduce MotionPassed
Android emulatorClean Release build on Android 16 (API 36); the same 6 journeys; 200 % font scale; animations offPassed
Physical iPhoneRelease build signed with a free personal team on an iPhone 14 Plus (iOS 26.6.2): the 6 journeys through Appium and XCUITest, including background, process kill and restore; Apple’s on-device accessibility audit; cold-launch and scroll-hitch tracesPassed
Physical Android phoneRelease build on a Samsung Galaxy A24 (Android 16, Turkish system language): the 6 Maestro journeys including background, process kill and restore; label and touch-target audit; frame timing, memory and cold startsPassed
Screen readersTalkBack on the Galaxy A24: start a routine, move through the workout, tick a set, hear the rest announcement, skip rest, open and cancel the finish dialog. VoiceOver on the iPhone: headings, control roles and states, the rest announcement and alert focus on every main screenPassed

Scope

What Repkivo does not include.

  • No account, login or cloud sync — data lives on the device and in exported backups.
  • No backend, API or database server.
  • No push notification server; the rest alert is a local notification.
  • No payments or subscriptions.
  • No Apple Health, Health Connect or wearable connection.
  • No exercise recognition, video, AI coaching or programme generation.
  • No medical, injury or nutrition advice.
  • No App Store or Google Play listing — you publish under your own developer accounts.

Questions buyers ask

Is this a website in a phone frame?

No. It is React Native source that compiles to native iOS and Android apps. This page only shows screenshots of those builds.

Do I need Expo's paid services?

No. Local builds with Xcode and Android Studio work out of the box. EAS Build is optional and has its own pricing.

Can I add sync or accounts later?

Yes. Storage sits behind a small adapter interface and the backup format doubles as a sync payload. Neither is included or pre-configured.

What does publishing to the stores cost?

An Apple Developer Program membership for the App Store and a Google Play developer registration. Nothing in the template is paid.