What can I run a marathon in?
A predicted range with 80% confidence, updated weekly.
Am I building too fast?
ACWR plus a 28-day form trend. Concrete, not a vibe.
When does my plan need to change?
A rolling 7-day plan that re-plans after every run.
distance_m distance_km distance_mi
moving_time elapsed_time
pace_sec_km pace_sec_mi
hr_avg hr_max
cadence_spm elevation_m
vo2max_est suffer_score
average_speed max_speedMath.sqrt(x) Math.log(x) Math.pow(x,n) Math.abs(x) Math.min(a,b) Math.max(a,b)
distance_km * hr_avg / moving_time: load densitydistance_mi / (moving_time / 3600): mph speedelevation_m / distance_km: grade per kmhr_avg / (pace_sec_mi / 60): cardiac cost per min/mivo2max_est * distance_mi: aerobic power score
| Date | Name | Dist | Time | Pace | Avg HR | Max HR | Cadence | Elev | VO2 ⓘ | Type |
|---|
| Athlete | Tier | Pro until | Reason | Cohort | Last sync | Actions |
|---|
| When | Admin | Target | Action | Details |
|---|
I'm Ryan. Physicist by training, quantitative researcher by day, a runner the rest of the time. Every other running app gave me the same five numbers and stopped there. I wanted prediction intervals, weather-corrected paces, and an honest readiness score that didn't require a $300 watch. So I built one.
Peregrine falcons nest on bridges and skyscrapers in New York and outpace everything they share the air with. The name fits the goal.
Peregrine takes your Strava activity history and produces three layers of analysis. The bottom layer is per-run metrics: workout type, grade- and heat-adjusted pace, a VDOT estimate per run. The middle layer is rolling state: Fitness, Fatigue, Form, readiness, race-time predictions with confidence intervals, personal pace zones derived from your own distribution. The top layer is narration: a daily Today card that frames the day, a What's New panel that surfaces what changed, and a rolling 7-day plan when you want one.
The math behind each layer is auditable. Every formula, every threshold, and every source citation lives on the full methodology page. If a number looks wrong on a Peregrine page, that's where to start.
Peregrine connects to Strava via OAuth and pulls your activity summaries: distance, time, pace, HR averages, dates. GPS streams aren't pulled; the analytics work on summary data. If you import GPX files, those are parsed in your browser and stored as additional run summaries.
Your data isn't sold, shared with advertisers, or used to train external models. It's stored to power your own analytics and nothing else. You can disconnect Strava or delete your account at any time via the footer links.
Formal details are in the Privacy Policy and Terms.
Bugs, weird numbers, feature requests, or general thoughts, all welcome. Email feedback@runperegrine.com. If something looks off about a specific calculation, screenshots and a description of what you expected help a lot.
Activity data via Strava. Charts rendered with Chart.js. Built by a runner, for runners.