Building WhereToLearn: every UK nursery, school and university in one place
Posted under: Dev
tl;dr I built WhereToLearn, a directory of every nursery, school, college and university in the UK. It pulls inspection grades, exam results, admissions figures, parent and student surveys and graduate outcomes from 26 public data sources into one page per place.
Why?
We really like the nursery our eldest went to, but in between her leaving and our youngest reaching nursery age we heard from friends that it had started going downhill after the manager left, so we decided to shop around for somewhere new. This meant a few evenings with far too many tabs open: Ofsted’s site for the inspection reports, the council’s site for the list of nurseries, Google Maps to work out which were actually on the way to anywhere, endless WhatsApps to friends with young kids who’d been through it themselves, and of course combing through each nursery’s own website to find out what it was actually like.
We got there. But in a couple of years the eldest starts secondary school, and that’s the same exercise with a lot more info to absorb: Ofsted, exam results, how oversubscribed a school is, what they do afterwards. Nearly all of that is published, for free, by the government. It’s just spread across dozens of sites, in a dozen different formats. I found a few sites that organised some of this data, but very few that did it well, and none that covered the full nursery to university journey. So, I decided to have a go at building it myself.
So what does WhatToLearn do?
Every institution gets one page. For a school, that’s the latest Ofsted inspection, how many families put it as their first choice and how many of them got a place, what parents said in Ofsted’s survey, exam results compared with England and the local authority, where pupils go next, and the pupil numbers, attendance and money behind it. Nurseries lead with their inspection. Universities lead with their courses, then student satisfaction, graduate jobs and salaries, and research quality. And each has a compare mode that lets you put 4 side by side to get an overview of what what each does differently (or the same).

You can register and keep a shortlist, save a search and get a weekly email when something new opens nearby, and/or sign up for alerts when a school on your shortlist has a new Ofsted report published.
It covers all four nations: over 56,000 schools and colleges past and present, around 37,000 nurseries and childcare providers, and around 550 universities and other higher education providers with 30,000 courses between them. The full stack and every data source are on the project page.
Free, open and all slightly different
The good news is that almost all of this data is published under the Open Government Licence, so it’s free to reuse. The bad news is that no two sources publish it the same way.
Schools in England are identified by a URN from the DfE’s Get Information About Schools register. Universities use a UKPRN. Scotland has its own seed codes and Northern Ireland its own DENI references. When a school becomes an academy it gets a brand new URN, so its earlier exam results sit under a number it no longer has. Some data comes from proper APIs, some from CSVs, some from ODS spreadsheets and some from Excel workbooks with the formula behind each total written into the column heading. Files on gov.uk move to a new address with every release, so the importers have to read the publication page to find the latest one.
And just to keep things interesting, Ofsted replaced its grading system last November with report cards, after a year of inspections with no overall grade at all. So depending on when it was last inspected, a school has a report card, an old-style grade, a top up “just checking things haven’t changed” style grade, or none of the above. And the site has to explain all four.
Where Claude came in
Vibe coding as a concept gets a bad rap, but it’s important to remember what vibe coding is and isn’t – I’m a developer of 20 years, and I’m not using Claude to do things I can’t do – I’m using it as a tool to get things done quicker. Claude helped with the research and the data gathering, starting with a long look at what each nation publishes, what licence it’s under and how it can be joined to everything else. Then it built a lot of the automation: a Laravel import command for each source, each with its own quirks, along with the tests to prove it read the file correctly, ensuring that everything ended up in the database standardised.
That’s the part that makes a project like this possible at all. Twenty-six sources that were never designed to fit together is months of work, and between a job and two kids, and if I’m completely honest it probably would have ended up in the pile of side projects that never got finished. Instead, I was able to spend my time planning, designing, building, and deciding what was worth showing and checking it was right. Which, it turns out, is where a lot of the surprises are.
The town called Select
Not long after the first import, I looked up a school near us and found it listed as being in “Select”. There’s no Select anywhere near us. There’s no Select anywhere, as far as I can see (I did check Google maps).
It took a minute to click what had probably happened – most likely the register is kept up to date through a form, and the form has a dropdown for the town whose default option is “Select”. Somebody saved the form without picking one, and the placeholder went into the register as the school’s town. It isn’t just one school either: there are 11 rows where “Select” turns up in the town, locality or address fields.
The fix is one line that treats “Select” as empty, and then tries to infer what it should be from another part of the address. Finding it took rather longer, and I now look twice at any place name that sounds like it belongs on a button.
Somebody opened it in Excel
The DfE’s statistics files are mostly great to work with – well laid out and, for the most part completely standardised. For the most part. In one of the school census files, a school’s URN arrives as 1e+05.
At some point the file had probably been opened in a spreadsheet and saved again, and the spreadsheet decided a six-digit school ID would look better in scientific notation. The real number is gone: 1e+05 could be any URN from 100,000 to 149,999. Luckily, each row also carries the school’s LAESTAB, its local authority code plus establishment number, which survived the trip. So any URN that isn’t a plain number is looked up from the LAESTAB instead.
Some data doesn’t want to be downloaded
The destinations file for 16 to 18 year olds, which says where students went after sixth form or college, is a 1.8 GB CSV. That’s fine to stream, but a school’s rows are scattered all through the file rather than grouped together, so they can’t be rolled up into one record per school on the way past. Instead, they’re stored as they come, one row per measure, which currently comes to just over a million rows across both destinations files. The page pulls them back together when it needs them.
Then there’s HESA, who publish the data behind Discover Uni, the official course comparison site. Their site refuses scripted downloads, so two of the sources have to be downloaded by hand in a browser and dropped into a folder on the server. Everything else runs on a schedule, so the site now emails me when one of those manual downloads is due. Fully automated, apart from the bit where I grab the file and SCP it over to the web server.
So what’s next?
It’s soft launched, which mostly means it’s live and I’m still poking at it. For now I’m just trying to coax Google into indexing it and getting the SEO tasks out of the way, then I’ll be back thinking of features. It’s cool working on something I’ll use myself, because the ideas that come to me are generally things that I would find genuinely useful.
There’s also data I’d love to include that isn’t openly licenced. The plan is to show the people who hold it what the site does with everyone else’s data, and hope that persuades a few of them to let me use theirs on favourable terms.
A quick word of caution
Everything on the site comes from official sources, but official data runs behind. Exam results are for last year’s pupils, an inspection can be several years old, and a school can change a lot with a new head. Use it to build a shortlist, then go and visit.
Have a look
If you’ve got a nursery, school or university decision coming up, have a look at wheretolearn.uk. The stack and the full list of sources are on the project page.
If you spot something wrong for a place you know, or have an idea for what it should do next, I’d love to hear about it! Get in touch here.