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.



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.



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