app · ios · running
bpm — Beats per Mile
Match your music's BPM to your running cadence. RN + Expo, ships through prototype/. App Store bundle com.LinoLabs.BPM, team P692X2XP7N.
Workflow guard: bpm has its own PRD-driven workflow. PRD.md §13 is the live execution checklist — this umbrella does not write to it. The "What's left to do" below is a read-only mirror.
What's left to do — bpm
synced from ~/dev/bpm/PRD.md §13 as of 2026-05-15 · open items only
M1 — Playback (needs device)
- M1.3a Token refresh path verified end-to-end (needs device)
-
M1.3b
[~]Play / pause / skip / queue-replace from JS — needs device verification after eas build --profile development - M1.3c Lock-screen + Control Center controls show track + work (needs device)
- M1.3d Audio survives screen lock for 20 min in pocket (needs device)
- M1.6 Verify: 20-min locked-pocket run, audio uninterrupted, controls responsive
M2 — Run loop polish
- M2.8 Verify: clean install, 3 runs no crash, summaries persist (needs device)
-
M2.13a
[~]src/pace.ts — cadence→stride model -
M2.13b
[~]src/usePaceProjection.ts — React hook exposingproject()/meterPerStep() - M2.12a EAS Android build pipeline: Play account, signing keystore, eas build --platform android
- M2.12b Spotify App Remote Android driver
- M2.12c Cadence sensor parity on Android
- M2.12d Background audio service for Android
- M2.12e Source picker shows Spotify only on Android
- M2.12f Verify on 2+ Android devices: 3 runs no crash, summaries persist
M3 — Paywall + RevenueCat
-
M3.1
[~]Pending: paste iOS public SDK key into app.json extra.revenueCatIosApiKey + expo prebuild - M3.2 App Store Connect product IDs created (pro.monthly, pro.annual, pro.lifetime) (needs ASC account)
- M3.10 Sandbox: trial → expire → convert → restore on fresh install
M4 — App Store assets + privacy
- M4.1 Final app icon
- M4.2 6 screenshots (6.7" + 6.1")
- M4.3 30s preview video
- M4.4 Store copy + keywords
-
M4.5
[~]Privacy policy at web/privacy.html — deploy to beatspermile.app/privacy - M4.6 Support URL live
- M4.7 Privacy nutrition label completed honestly
- M4.8 Age rating + export compliance
- M4.9 Internal dry-run submission — all fields green
M5 — TestFlight beta
- M5.1 Apple Music / MusicKit playback shipped (per D2)
- M5.4 Recruit 20 testers
- M5.5 ≥ 2 outdoor runs per tester logged
- M5.6 Crash-free sessions ≥ 99%
- M5.7 ≥ 50% of testers say "I'd pay $30/yr"
M6–M8 — Ship + revenue
- M6.1 Submit build
- M6.2 Pass review (budget 1 rejection cycle)
- M6.3 Day-1 install tracking armed
- M7.1 RevenueCat shows $100 gross cumulative
- M7.2 Identify the channel driving installs
- M8.1 Month 1 ≥ $300 net
- M8.2 Month 2 ≥ $300 net
- M8.3 Month 3 ≥ $300 net — PRD complete
Where it lives
Building| Repo | open ↗~/dev/bpm |
| Prototype | open ↗bpm/prototype/ |
| Marketing site | open ↗bpm/web/ |
| PRD (read-only here) | open ↗bpm/PRD.md |
| Ship status | open ↗bpm/SHIP-STATUS.html |
| Pitch | open ↗bpm/pitch.html |
klip feed
How bpm pipes signal back to klip:
- Replace like/save on run summary with a single klip button
- Klipped runs auto-create a klip profile post
- Music tracks the runner klipped become a klip-feed signal
Umbrella-level integration goals — implementation lives in the bpm + klip repos.
Landmines
- bpm/prototype/ — active Expo build dir; do not move.
- Bundle id com.LinoLabs.BPM is registered in App Store Connect. Don't rename.
- PRD.md edits must follow bpm/CLAUDE.md rules — surgical only. Umbrella never writes to PRD.md.
Lino Labs · bpm · status