My mate and I both run parkrun. He's faster than me — comfortably, consistently faster. So when we started talking about making it competitive between us, the conversation lasted about three seconds. "What's the point? I'll win every week." He was right. And that bugged me.

Not because I'm a sore loser, but because we were both putting in the same effort on Saturday mornings. He'd finish in 24 minutes feeling like he'd coasted. I'd finish in 32 feeling like I'd given everything. Raw times don't capture that. They never do.

So I'm building something that does.

The Problem With Raw Times

Anyone who's been to parkrun knows the finish funnel tells you almost nothing about effort. The 18-minute runner at the front might be having a slow day. The 40-minute runner near the back might have just smashed a personal best. A runner doing a flat, fast course in London isn't comparable to someone grinding up hills in the Peak District.

If you want fair competition between runners of different abilities, at different courses, on the same Saturday morning — raw finish times are useless.

flowchart TD
    A[Saturday parkrun results] --> B{Compare raw times?}
    B -->|Same speed, same course| C[Fair enough]
    B -->|Different speeds| D[Faster runner always wins]
    B -->|Different courses| E[Hillier course penalised]
    B -->|Different ages| F[Younger runner has advantage]
    D --> G[Not a real competition]
    E --> G
    F --> G

A Handicap That Knows You

The idea behind HUB Leagues is simple: give every runner a personal handicap based on their recent parkrun history. When you finish a parkrun, the system adjusts your time using that handicap. The adjusted time is what counts — and suddenly the competition is about how hard you pushed relative to your own ability, not how fast you are in absolute terms.

Think of it like a golf handicap. A scratch golfer and a 20-handicapper can play the same course and have a genuinely close match, because the handicap accounts for the difference in their baseline ability. Same idea here, adapted for running.

The more parkruns you do, the better the system knows you. Your first few runs give it a rough picture. After a handful of events, it gets sharper. And once you've built up a proper history, your handicap reflects your true current form — not a lucky day, not an off day, but the real you.

There's also a built-in safety net that prevents any single unusual result from throwing your handicap off. Had an absolute shocker because you were recovering from a cold? Ran with the kids and walked half of it? The system accounts for that. Your handicap stays fair.

What It Feels Like

Here's what a typical Saturday would look like with HUB Leagues running in the background.

You turn up to parkrun. You run your run — same as always. You don't need to do anything differently. No app to carry, no buttons to press, no GPS watch required.

After the results are published, HUB Leagues picks up your time and applies your handicap. Now your 35-minute finish becomes an adjusted time that can be directly compared with your mate's 22-minute finish at a completely different parkrun.

flowchart LR
    A[You run parkrun] --> B[Results published]
    B --> C[System applies your handicap]
    C --> D[Adjusted time calculated]
    D --> E[Compare with anyone, anywhere]

The person who ran closest to their potential that day wins. Not the fastest runner — the one who gave the most relative to what they're capable of.

Imagine a 42-minute runner beating a 19-minute runner in a head-to-head. It's entirely possible. The slower runner has an outstanding day — a massive PB, running well above their recent form. The faster runner has a solid but unremarkable outing. The handicap catches all of that.

Your Mate Ran Bushy, You Ran Your Local Hilly One

This is where it gets really interesting. Parkrun courses are wildly different. Bushy Park is flat and fast — it regularly produces some of the quickest times in the country. Meanwhile, places like Llanelli or Killerton have hills that would make a mountain goat think twice.

HUB Leagues accounts for course difficulty. Each course has its own profile built from thousands of results, so the system knows that a 25-minute run at a hilly course represents a very different level of effort than a 25-minute run on a pancake-flat path.

That means you and a friend can run at completely different parkruns on the same Saturday and still have a fair, meaningful competition. You don't need to be at the same event.

flowchart TD
    A[Runner A: Hilly course, 28:00] --> C[Handicap adjusted]
    B[Runner B: Flat course, 23:00] --> D[Handicap adjusted]
    C --> E{Compare adjusted times}
    D --> E
    E --> F[Fair result regardless of course]

Turning Saturday Morning Into a Season

Head-to-head challenges are fun, but leagues are where it really comes alive.

The idea is simple: get a group together — your running club, a group of mates, your office, your family. Create a league, share an invite code, and you'd have a season-long competition that scores every Saturday automatically.

Each week, everyone's parkrun results are pulled in, handicaps applied, and the rankings updated. Points are awarded based on your position in the league that week — and because it's all handicap-adjusted, the leaderboard shifts constantly. The fastest runner doesn't just cruise to the title. You have to keep showing up and keep pushing.

A few things that make leagues work in practice:

  • Participation points — Even if you don't finish near the top, you get points for running. Miss a week, you get nothing. Consistency matters.
  • PB bonuses — Smash a personal best? Bonus points on top of your league position.
  • Minimum runner threshold — Leagues can set a minimum number of runners needed for a week to count, so one person running on a quiet week can't game the system.
  • Saturday evening emails — Every week, the league gets an automated email with the latest standings, who ran where, and how the leaderboard shifted. The kind of thing that could become a ritual — check the email, send the group chat message, start the banter.

Picture six friends spread across three different cities. They never run the same parkrun. They barely see each other in person. But every Saturday evening, the email arrives and the WhatsApp group lights up. That's the scenario I had in mind when I built this — it's not really about the technology. It's about giving people a reason to care about each other's Saturday mornings.

Who This Is For

If any of these sound like you, this is being built with you in mind:

  • Running clubs who want handicap-adjusted competition without spreadsheets
  • Friend groups scattered across different parkruns who want to stay connected
  • Couples or families with mixed abilities who want genuine competition
  • Office leagues where the competitive non-runners need a reason to start
  • Parkrun tourists who visit different courses and still want their times to count

You don't need to be fast. You don't need to be experienced. You just need to run parkrun.

What "Winning" Really Means

I started this project because my mate would always beat me on raw time. What I didn't expect was how building the handicap system would change the way I thought about parkrun.

When your competition is against your own recent history — not against someone else's natural speed — the whole mindset shifts. A "bad" parkrun where you still pushed hard can score better than a "good" one where you eased off. A PB at a tough course matters more than a fast time at an easy one. The person who improves the most over a season often beats the person who started fastest.

Parkrun's motto has always been that it's not a race. I agree with that. But I think there's a version of competition that's completely compatible with parkrun's inclusive spirit — one where a 35-minute runner can genuinely beat a 20-minute runner, and both of them feel like it was fair.

That's what I'm trying to build. I think we're getting there.