🏋️ The Murph × ⚡ WHOOP

Bring WHOOP insights
into every Murph workout.

The Murph is an iOS app for athletes training the Murph CrossFit hero workout. We want to integrate WHOOP so users can see their recovery before the workout and their strain after — giving them the context they need to push safely.

📱 iOS only (native Swift) 🎖️ Military aesthetic 🔐 OAuth 2.0 + PKCE 📅 Live in App Store

Three touchpoints where WHOOP data will appear.

We only fetch WHOOP data when the user explicitly opts in (via Settings → Connect WHOOP) and only display it in three specific places — nowhere else.

1

Connect in Settings

User taps "Connect WHOOP." OAuth 2.0 flow with PKCE. One-tap, standard iOS sheet.

2

Pre-workout recovery

Recovery score (0–100) shown on the Home screen so users can gauge readiness.

3

Post-workout strain

Strain, avg HR, max HR shown in workout summary after the WHOOP workout syncs.

What users actually see.

Mockups styled to match The Murph's existing design language — warm neutrals, army-green accents, Bebas Neue typography, and monospaced counters.

The Murph
12
Total Murphs
3
This Month
44:12
Best Time
⚡ WHOOP Recovery
78
Recovery
You're recovered.
Push hard today.
+
Home → Recovery Card Matches existing "Total Murphs / This Month / Best Time" layout.
Settings
Connections
Apple Health Connected
Heart Rate Strap Not paired
WHOOP Not connected
⚡ WHOOP

Connect your WHOOP to see recovery before workouts and strain after.

CONNECT WHOOP
Settings → Connections Users opt in explicitly. Can disconnect anytime.
Workout Complete
47:23
The Murph · 20# vest
100
Pull-ups
200
Push-ups
300
Squats
2mi
Run
⚡ WHOOP
Strain
15.8
Calories
712
Avg HR
162
Max HR
184
Post-workout → Summary WHOOP card sits below Murph's existing stat tiles.

The scopes we request — and why.

We request the minimum scopes required to display the three screens above. No data is sent to third parties. Data is stored only in the user's iCloud and a user-scoped Firestore collection.

read:workout

Workout data

Strain, average HR, max HR, and calories for the workout the user just completed.

Why: Shown in the post-workout summary card.
read:recovery

Daily recovery

Today's recovery score (0–100) pulled on Home screen load.

Why: Pre-workout readiness context on the Home screen.
read:body_measurement

Max HR & weight

User's max HR for percentage display, and weight for calorie accuracy.

Why: Show "88% of max" alongside raw HR numbers.
read:profile

Basic profile

First name + WHOOP user ID to associate the OAuth tokens with our user.

Why: Required to map WHOOP account to The Murph account.
offline

Refresh tokens

Allows our app to refresh access tokens in the background.

Why: So users don't have to re-authorize every hour.

How the integration is built.

OAuth 2.0 + PKCE

Native iOS app uses OAuth 2.0 Authorization Code flow with PKCE (no client secret shipped in the binary). Redirect URI: themurph://whoop/callback

Secure token storage

Access and refresh tokens stored in the iOS Keychain, encrypted with the user's device passcode + Secure Enclave. Never sent to any server other than WHOOP.

No webhooks, no backend

The Murph pulls data on demand (Home load and workout save). No server middleware. No third-party analytics see WHOOP data.

Disconnect = full cleanup

Tapping "Disconnect WHOOP" revokes the token with WHOOP's API, deletes local tokens, and clears cached data.