I built a football rating for every men’s international since 1872, then a model that turns the gap between two teams into match odds. It ran live on ballonpoor.com for the last 19 games of the 2026 World Cup. The bookies won the group stage, but the model called three of the five knockout ties where it and the bookies disagreed.
Here’s the live site after the final whistle. The whole knockout draw, then the score, scorers and stats from a quarter-final.
Ballon p’Oor / who’s on top
Who’s the best team in the world? Depends on the day.
I put every men’s international since 1872 through the same Elo engine that ran my World Cup site. Nineteen countries have had a turn at number one, and the 2026 final was #2 knocking off #1 for the top spot.
Since 1883, when a team first had the 20 matches you need to qualify, nineteen different countries have been number one. Brazil has spent the longest on top, 36.8 years all up, then England (27.7), Scotland (15.6) and Argentina (13.0). The 2026 World Cup final was #1 Argentina (2,245) against #2 Spain (2,233). Spain won 1–0 after extra time and is still number one.
How long each country has spent at world number one, March 1883 to October 2026
Nation
Years at #1
Separate spells
Longest spell
Brazil
36.8
59
Apr 1995 to Jul 2000
England
27.7
29
Apr 1891 to May 1902
Scotland
15.6
12
Mar 1883 to Apr 1891
Argentina
13.0
43
Jan 1941 to Jul 1943
Italy
11.2
16
Oct 1934 to Feb 1940
Hungary
8.5
13
Jun 1918 to Apr 1921
Germany (incl. West Germany)
8.0
22
Mar 1993 to Jul 1994
Netherlands
4.8
10
May 1915 to Oct 1917
USSR / Russia
4.6
16
Apr 1963 to Oct 1964
Spain
4.1
11
Jun 2012 to Jun 2013
Austria
3.2
5
Sep 1931 to Oct 1933
France
3.1
10
Jul 2000 to May 2002
Czechoslovakia
1.8
7
Sep 1927 to Jun 1928
Uruguay
1.1
2
Jun 1924 to Apr 1925
Mexico
54 days
1
Mar to May 1990
Belgium
36 days
2
Sep to Oct 2020
Denmark
14 days
1
Jun 1918
Sweden
6 days
1
Jun 1988
Czech Republic
4 days
1
Jun 2005
Every men’s international from 1872 to October 2026, rated by POOR. To be #1 you need 20 matches, one of them in the last four years.Ratings creep up as more teams join, so compare like with like. Before 1900 it’s mostly the four British teams playing each other.
There’s a lot hiding in a climb time.
Live at poursuivant.cc
Working out how hard the pros climb, in watts per kilo, from the comfort of my couch. Plenty of climbs never get hand-timed, so I piece the time back together from gap reports, kilometre splits and a bit of physics, and show my working. If a climb’s too short or too shallow for the maths to hold up, it doesn’t get published.
The live site. A stage profile, the estimated watts per kilo (each with its error band), and every recorded ride up Alpe d’Huez.
Poursuivant / up Hautacam, Tour de France 2025
The race data had no clock.
In the archived race tickers, 683 of 684 events are stamped zero. So Poursuivant pieces each climb back together from the gaps, the finish times and some physics, then checks its work against times clocked off the TV.
Every ticker event on this climb is stamped 00:00. Rebuilt from the gaps and Pogačar’s kilometre splits, his 35:07 climb comes out at 35:17, ten seconds out. For the nine riders below, the median miss is 27 seconds. Over 47 hand-timed summit-finish times it blows out to 69.
Hautacam, foot to summit, timed by hand and rebuilt by Poursuivant
Rider
Hand-timed
Rebuilt
Miss
Pogačar
35:07
35:17
+10 s
Vingegaard
37:17
37:44
+27 s
Lipowitz
37:30
37:41
+11 s
Johannessen
38:07
36:58
−69 s
Onley
38:07
36:58
−69 s
Vauquelin
38:40
37:38
−62 s
Evenepoel
38:42
37:38
−64 s
Gall
39:09
39:20
+11 s
Roglič
39:15
39:26
+11 s
A gap from the ticker or the finish
Joined up in between
Poursuivant’s time at the top
Gaps and splits come from public race reports, and the hand times from climbing-records.com. The rest is Poursuivant.Between reports the lines are a smooth guess. Summit gaps assume everyone hit the bottom of the climb together.
Every cent has to land somewhere.
In development · private pilot
Software for small strata buildings in NSW that look after themselves without a strata manager: levies, the books, meetings and records. It splits every levy to the exact cent (harder than it sounds). And when AI reads a document, a number only shows up if the words on the page actually say it.
localhost · fictional demo dataDev build, Oct 2026
This is a development build running on made-up data. A pretend building’s next 90 days, its levies, then an Agreement Check report.
Storey / splitting the bill
The last cent is the hard one.
Storey splits a strata levy between the lots by unit entitlement, down to the cent. Round each share on its own and the bills don’t add up. Hand the spare cents out fairly and every so often a bigger levy means someone pays less.
Six made-up lots, with unit entitlements of 15, 15, 17, 17, 18 and 18 out of 100, share a quarterly levy. At $6,000.50, lots 1 to 4 each owe exactly half a cent on top of their whole cents, but there are only two spare cents to go round. Ties go to the lower lot number, so lots 1 and 2 pay $900.08 and lots 3 and 4 pay $1,020.08.
Put the levy up a cent, to $6,000.51, and lot 2’s bill goes down to $900.07. And if you just rounded each lot, you’d bill $6,000.52 for the $6,000.50 levy.
Quarterly levy
$6,000.50
Arrow keys move the levy a cent at a time, Page Up and Page Down ten at a time.
Think of the coins as each lot’s last cent. The fuller the coin, the more of it they owe. Full ones get a spare cent.
Spare cents 0Biggest fraction first. Ties go to the lower lot.
A made-up six-lot scheme from Storey’s tests, split by the app’s actual allocation code.Across every levy from $6,000.00 to $6,999.99, rounding each lot gets the total wrong 61% of the time, and a one-cent rise trips the paradox 1% of the time.
A shop website the shop can maintain.
Live at vanillacycles.com
My local bike shop got hacked offline and quoted $20k for a new site, so I built them a Shopify theme instead, mostly over one weekend. They had almost no photos, so the design leans on type, cream bands and one brand blue. Nearly all the copy is editable in Shopify, so the shop can change it without calling me.
The live store. The homepage, X-Lab and the service menu, with the phone version alongside.
Vanilla Cycles / design for what you’ve got
Photos optional.
Most shop themes are built around big, beautiful photos. The shop didn’t have any, so I built a homepage that holds up without them.
Shopify’s Horizon demo store
65.5%photograph
2.3%type and colour
A full-bleed hero and eight product photos.
97.7% blank white. The type is all that’s left.
Vanilla Cycles
11.1%photograph
84.7%type and colour
Three photos, three striped placeholders. The rest is type and colour.
The photo slots go back to stripes, which is how the site looked on 23 June, before it had any photos.
Hover over or tap a page to see what’s what.
Both pages are the same width, but Vanilla’s runs 5,075 px to Horizon’s 1,926 px. It’s 2.6× longer and still 85% type and colour.
Photograph
Striped placeholder
Type
Colour band
White
Go through Horizon’s demo homepage cell by cell and it’s mostly a full-bleed hero and eight product photos. Take those away and it’s 97.7% blank white. Vanilla’s homepage is cream and sand bands, ink, teal and big type, so when its three photos go, the slots drop back to stripes and the page still holds up.
What each homepage is made of, share of cells
Painted as
Horizon demo
Vanilla Cycles
Photograph
65.5%
11.1%
Striped placeholder
0%
4.2%
Type
2.3%
9.9%
Colour band
0%
74.8%
White
32.2%
0%
Both live homepages, checked on a 20px grid at 1440px wide in October 2026.The photos here are blocky stand-ins for the real ones.
Writing
Occasionally I write up something from a recent side-quest.
Also on the workbench: AFL and horse-racing ratings, a lecture player that transcribes itself, an AI morning briefing, and a half-built test of whether quoting the pesticide register beats a chatbot on farm questions.
Where I’ve worked
Sonder
AI-enabled care
Group Product Manager · now
Where I spend my days, working out what hybrid human and AI care should look like.
Woolworths
Refresh:Food
Founding Head of Product
Built a food marketplace from scratch that did $3M+ for 100+ Australian farmers.
Canva
Developer ecosystem
Group Product Manager
Re-launched the Canva developer platform, which a wave of AI-native businesses now run on. If you’re a dev in Australia, you’ve probably seen my mug around from that.
The New York Times
Audio and growth
Product leadership
Built an onboarding product that brought 10M+ people to the Times.
Commonwealth Bank
Everyday banking
Senior Product Manager
My big-company years, on the everyday banking side of Australia’s biggest bank.
Before all that I started an ad agency with some friends, briefly thought I’d be an academic, and was one of the earliest employees at NEXTDC (in the good old days when normal people barely knew what a data centre was).