← ALL WORK

Mobile · AI coaching · Live on the App Store

PULSE

A premium multi-sport training app that interviews you like a coach, generates your program with AI, and then runs every live session — logging, rest timing, streaks, and rewards. I built all of it — product, brand, motion design, mobile client, and backend — and shipped it to the App Store.

  • React Native
  • Expo SDK 54
  • TypeScript
  • Reanimated
  • React Native SVG
  • Expo Haptics
  • Cloudflare Workers
  • Anthropic API
Role
Everything — solo
Platform
iOS (Expo)
Status
Live on the App Store
Languages
English + Arabic (RTL)

Overview

One app, ten sports, zero templates.

Most training apps hand you a static template and call it a plan. PULSE starts the other way around: a per-sport questionnaire feeds an AI coach that writes a program specifically for you — across ten sports, from calisthenics and powerlifting to BJJ, swimming, and football. The plan then becomes the app itself: your Today tab, your live sessions, your streak.

It began under a different name (REDLINE) and was renamed after a research pass through trademark crowding, competitor collisions, and phonetics. PULSE won — and the heartbeat became the brand: an ECG wordmark, an ECG generation sequence, an ECG design motif used only where it truly earns its place.

My role

The whole stack, carried alone.

  • Product & UX — onboarding flow, per-sport questionnaires, the tap-to-log session model, and the decision to delay monetization until the product earns it.
  • Mobile engineering — the React Native / Expo app: navigation, state, persistence, typography system, and a full EN/AR i18n layer with correct RTL behavior.
  • Motion design — a deliberate budget of hero moments built with Reanimated and SVG: the narrated ECG generation, the Day-1 stamp, the session-complete reward.
  • Backend & infrastructure — a Cloudflare Worker that fronts the Anthropic API with per-IP rate limiting and an app-token guard, so no key ever ships inside the app.
PULSE onboarding — wordmark and ECG
PULSE Today tab — next session, streak, program progress
PULSE live session — set-by-set logging
The shipping build — onboarding, the Today tab, and a live session.

Decisions

Constraints chosen on purpose.

The app runs on Expo Go with the SDK pinned — which means no custom native modules, no Skia, no Lottie, no confetti libraries. That constraint became the design system: every animation is built from Reanimated transforms, react-native-svg, and haptics, with spring physics and a 400–500ms budget. If a moment can't be made premium inside those rules, it doesn't ship.

The AI layer is deliberately thin on the client. The app talks to a single hardened Worker endpoint; the Worker holds the secrets, enforces a per-IP limit of 30 requests per minute, and rejects anything without the shared app token. Fast model for coaching responses, structured output for programs.

Monetization exists as a finished strategy — free-first, annual-led trial, paywall only after a first win — and is deliberately parked until the app has real users. Shipping the product comes first.

The build

What's actually in it.

  • AI program generation per sport — questionnaire → generation → personalized reveal with "receipts" showing exactly what the plan adapted to.
  • A narrated ECG generation sequence — the app draws a live ECG while it explains what it's building, turning dead waiting time into the product's signature moment.
  • Live workout logging — tap a set to accept the AI's target, expand to edit it; AMRAP sets auto-focus the rep field.
  • A rest timer with keep-awake, previous-performance prefill, a session progress ring, and a session-complete reward animation.
  • Streaks and session history, body-profile math (Mifflin-St Jeor), an AI recipe generator on the Food tab, and a typography system applied app-wide.
PULSE — sport picker across ten sports
PULSE — AI-generated Recomp Power & Volume program
PULSE — coach and chef onboarding
Sport selection, the generated 8-week program, and the coach + chef pitch.

Hard parts

Two bugs worth telling stories about.

Engineering highlight

The session latch

Completing a workout advanced the plan — which silently re-pointed the "current session" at tomorrow's workout while the completion screen was still on screen. The fix was a latch: the live session pins its identity at start and never resolves it again from "whatever is current," so completing, killing, or resuming the app can't corrupt what you just did. Half-logged sessions keep their data forever instead of being discarded as stale.

Engineering highlight

RTL that survives a reload

Arabic support isn't a translation file — it's a layout direction. Switching to Arabic worked until a reload quietly reverted the direction. The fix routed the language switch through Expo's reloadAppAsync so the RTL flag is applied at boot, followed by a native-speaker review pass and an i18n sweep that deleted 106 orphaned keys.

Status

Shipped.

PULSE is live on the App Store as Pulse: Workout & Meals. The full loop shipped — onboarding → sport pick → questionnaire → AI generation → Today tab → live sessions with streaks and history — with no account required and core tracking working fully offline. A companion brand site (Next.js 15 on Vercel, with a Supabase-backed lead funnel and admin dashboard) runs alongside it. Monetization stays deliberately off until the app earns real users.

Next case study

iSee