How Sky Score works, in plain English
The full guide: what it is, what happens when you type a postcode, where the numbers come from, the Amazon pieces, the assistant, the checks, the money · 2026-09-21
In one breath: Sky Score turns a postcode into a score out of ten for how liveable that spot is, using eight kinds of official government data. The website does the sums on your own laptop. Businesses get the same sums from a service on Amazon. A small AI assistant can explain a score in a sentence - and forty lines of ordinary code throw its answer away if it contains a number it wasn't given.
What's in this guide
1 What it is, and who it is for
2 What happens when the page opens (2a), and when you type a postcode (2b)
3 Where the eight numbers come from
4 How eight numbers become one score
5 What happens when a business calls
6 The assistant, and the forty lines
7 The Amazon pieces, and why each is there
8 How new data gets in
9 The 57 checks
10 How it was built with a coding assistant
11 What it costs, and what it charges
12 Privacy, safety and the phone app
13 How to show it live
Appendix and words used
1 - What it is, and who it is for
A postcode goes in. A score from 0 to 10 comes out. The score says how liveable that spot is, built from eight things: aircraft noise, road noise, air quality, flood risk, house prices, crime, school results and transport.
Every one of the eight comes from an official dataset - the government departments and agencies that publish these things - and every number can be traced back to the file it came from. That is the whole idea: not opinion, but arithmetic over public data, with the working shown.
It has two front doors, because it has two kinds of user:
- People use the website: a map of a city's boroughs, coloured by score, with a search box. Type a postcode and a panel opens with the score, what's behind it, the nearest stations, recent sales, energy ratings and the closest GP. It covers ten city regions in England (London, Manchester, Birmingham, Leeds, Sheffield, Liverpool, Newcastle, Bristol, Leicester, Teesside) and New York.
- Businesses - a property portal, a lender, a relocation firm - use the API. An API is a way for one program to ask another for data, with no person and no screen in between. Their software sends a postcode; numbers come back; they show them wherever they like. The API covers two more cities than the website (Cardiff and Nottingham).
The website is the shop window; the API is the product. Both give the same answer for the same place, and an automatic check makes sure they keep agreeing.
The map is ours. It is drawn from our own outlines of the boroughs, in your browser. There is no Google Maps underneath, no map company being paid per view, and the site still works with no internet once it has loaded once. A street map would also suggest a precision we do not have - every number is about a borough, not a street.
2a - What happens when the page opens
Before you have typed anything, the page has already fetched everything it will need to draw the map and score a search. Here is that first second, measured on a fresh browser with nothing stored: thirteen requests, quiet after 1.3 seconds.
Your browser -> skyscore.co.uk"The page, please."
The nearest of Amazon's copies hands over one file. The whole website is that file; everything else it needs, it asks for next.
Your browser, to itself"I need the drawing tool, the typefaces, and the address of the API."
Three small fetches from the website's own shelf: the library that draws maps, two font files (ours, not Google's, so no visit is reported to a third party), and a one-line file holding the API's address, so every page agrees on where it is.
Your browser, to itself"Now the map: London's outlines, the little UK map, and the table of numbers."
Three data files. The 33 borough shapes for London (the city it opens on). The small map of the UK with the city markers. And the reference book: one table holding every borough's inputs for every city, which is what the search in 2b looks up. Plus one picture: a see-through image of the government's aircraft-noise contours, laid over the map.
Your browser -> helper ("favourites")"Any saved places for this device?"
The device sends a random token it made up for itself, not a name or an email. On a first visit the answer is an empty list.
Your browser -> the visit counter"One visit."
A cookieless counter that records the page and the screen size, nothing about you.
Your browser, to itself"Draw the map. Colour every borough by its score. Show the search box."
The colours come from the same sums as a search, done for all 33 boroughs at once from the table. Nothing was asked of Amazon for those numbers.
Your browser, to itself, a moment later"Keep a copy of all this on the device."
The page installs a small helper, the offline worker, which quietly stores the page, the drawing tool, the fonts, the outlines for all eleven cities and the table of numbers on your device.
The second visit is the point. Measured on the same browser: thirteen requests again, but ten of them are answered from the device's own store without touching the network. Only the visit counter and the saved-places check go out. That is why the site opens in under a second on a repeat visit, and why it still opens with no signal at all. Switching to another city fetches nothing either; its outlines were stored on the first visit.
Two things that are not fetched at load, on purpose: the aircraft-noise readings and the station list. They are only needed once you search, so they are fetched the moment you start typing (2b, first line), not before. A page that fetches everything it might ever need is slow for everyone to serve the few who search.
2b - What happens when you type N1 7SX
Think of your browser as a person at a desk with a reference book. Here is the conversation it has, in the order it happens. The whole thing takes about a second.
Your browser, to itself"Someone's typing. I'll fetch the three lists I'll need in a moment: the aircraft-noise readings for London, the same for the regions, and the list of stations."
Three files come down from the website's own shelf. This happens once per visit.
Your browser → postcodes.io (a free public service)"Where is N1 7SX?"
Answer: "Latitude 51.53, longitude −0.09. It is in Hackney." postcodes.io is a free lookup built on the government's postcode register. It knows where every UK postcode is.
Your browser, to itself"Hackney. My table has a row for Hackney: house prices, crime, schools, transport, air quality, road noise, flood risk. I'll do the sums."
The score is worked out right here, on your laptop. The table of numbers came with the page when it loaded. Nothing is sent anywhere for this step.
Your browser, to itself"For aircraft noise I can do better than the borough. Is N1 7SX in the noise-readings list?"
If the government measured aircraft noise at this exact postcode, that reading is used. If not, the browser estimates it from how far the postcode is from the flight paths. This is the only number that is about your exact postcode; everything else is about the borough, and the page says so.
Now it knows the location, so it sends four questions at the same time, to four small helpers I run on Amazon:
Your browser → helper 1 ("transport")"Which stations are near this spot, and are the lines running?"
"Angel, 780 m. Essex Road, 848 m. Old Street, 916 m. Northern line: good service."
Your browser → helper 2 ("nhs")"Any GPs, pharmacies or clinics within a 20-minute walk?"
"Prebend Street Surgery, 407 m. St Peter's Street Medical Practice …"
Your browser → helper 3 ("sold-prices")"What has sold at this postcode?"
"Windsor House, Wenlock Road: £490,000 in 2015; £190,000 in 2011 …" (from HM Land Registry)
Your browser → helper 4 ("epc")"Any energy certificates at this postcode?"
"79 of them. Average band C." (from the government's energy-certificate register)
Your browser, to itself"Got everything. Draw the panel."
Score and the four component scores at the top (from its own sums), then stations, sales, energy, NHS (from the four helpers).
your browser, on its own a free public service a small helper I run on Amazon
The important thing it did not do: it never asked anyone for the score. The score is sums done on your laptop, over numbers that were worked out weeks ago from government files. No artificial intelligence is involved anywhere on the website.
What ends up on the screen for N1 7SX
5.4 / 10 - Mixed
"Mixed picture. This location scores well on some factors but is held back by high prices."
Quiet Skies (aircraft noise)7.0 / 10
Affordability1.1 / 10
Growth (prices, adjusted for inflation)3.8 / 10
Liveability (crime, schools, transport, healthcare)7.8 / 10
Environment (air, road noise, flood)5.2 / 10
Under the scores it says: "Quiet Skies uses your location's noise data. Other scores are Hackney borough averages." That sentence is the honesty line: it tells you which number is about your postcode (one) and which are about your borough (the rest).
3 - Where the eight numbers come from
Each of the eight inputs is a real measurement, published by a named public body, turned into a number per borough by a script on my computer. Here is each one: what it measures, who publishes it, and how it becomes a mark out of ten.
| Input | Who publishes it | What is measured, and how it becomes 0–10 |
| Aircraft noise | DEFRA (the environment department), plus airport positions | DEFRA's noise maps give a decibel reading for about 42,000 postcodes near airports. Where they exist, that reading is used. Elsewhere, the distance from the flight paths stands in - and the scale is set per airport by how big its measured noise footprint is, so a small regional airport is not scored like Heathrow. |
| Road noise | DEFRA | The share of a borough's postcodes where road noise is above the World Health Organisation's guideline (53 decibels). 0% of postcodes over the line scores 10; 100% scores 0. |
| Air quality | DEFRA | Two pollutants, nitrogen dioxide and fine particles, each compared with the WHO guideline. The worse of the two counts. At the WHO level scores 10; at the UK legal limit scores 0. |
| Flood risk | Environment Agency | The share of postcodes at medium-or-high risk of flooding from rivers or the sea. 0% scores 10; 10% or more scores 0 (the Agency's own cut-off). |
| House prices | HM Land Registry (its monthly price index) | The borough's typical price, compared with every borough in the country - not just the same city. See "affordability is national" in Part 4. |
| Price growth | HM Land Registry, and ONS for inflation | How much prices moved in the last twelve months, after taking off inflation. A borough whose prices rose 3% while inflation was 3% has not really grown. |
| Crime | ONS (the statistics office), from police records | Offences per 1,000 residents in the year. Fewer is better. |
| Schools | Department for Education | "Progress 8": how much progress pupils make between age 11 and 16 compared with pupils who started at the same level. A measure of how good the teaching is, rather than how well-off the intake is. Not published for Wales, which is why Cardiff has no schools score. |
| Transport | Department for Transport (its register of every station and stop) | The share of postcodes within 800 metres - about ten minutes' walk - of a railway, underground, metro or tram stop. |
| Healthcare | NHS (its list of GP surgeries) | The share of postcodes within 500 metres of a GP surgery. 500 m was chosen by measurement: at 1 km nearly every borough scored top, which is true and useless. |
Two honest limits. First, most of these are about the borough, not your street - Hackney is Hackney whether you live by the canal or by the A10. Only aircraft noise is measured per postcode. Second, DEFRA's noise maps were made in 2021, a year with far fewer flights than normal, so the aircraft readings are on the quiet side. The methodology page says both of these out loud.
4 - How eight numbers become one score
The eight inputs are first grouped into five components, each a mark out of ten. Then the five are blended with weights that depend on who is asking.
| Component | What is inside it |
| Quiet Skies | Aircraft noise alone. The headline of the product - it started as a flight-path map. |
| Affordability | House prices, compared nationally. |
| Growth | Price growth after inflation. |
| Liveability | Crime, schools, transport and healthcare, blended together. |
| Environment | Air quality (45%), road noise (35%) and flood risk (20%). |
Weights: the same numbers, different people
A retired couple and a landlord care about different things, so the site offers buyer profiles. Each profile is just a different set of weights over the same five components. "Balanced" is the default. The weights always add up to 100%.
| Profile | Quiet Skies | Affordability | Growth | Liveability | Environment |
| Balanced (default) | 32% | 27% | 0% | 27% | 14% |
| Family | 18% | 18% | 0% | 46% | 18% |
| First-time buyer | 16% | 43% | 0% | 27% | 14% |
| Investor | 9% | 26% | 34% | 17% | 14% |
| Quiet life | 48% | 19% | 0% | 19% | 14% |
| Renter | 26% | 30% | 0% | 30% | 14% |
| Commuter | 21% | 30% | 0% | 35% | 14% |
| Later life | 36% | 14% | 0% | 32% | 18% |
Notice that growth counts for nothing in every profile except Investor. A rising market is good news for a landlord and bad news for a first-time buyer, so it is not a "liveability" quality at all - it is only scored for the one person it helps.
A worked example: N1 7SX, Balanced
7.0 × 32% + 1.1 × 27% + 3.8 × 0% + 7.8 × 27% + 5.2 × 14% = 2.24 + 0.30 + 0 + 2.11 + 0.73 = 5.38, shown as 5.4. The sums are done with the unrounded components and rounded once at the end, so if you redo them from the rounded figures on the screen you can be out by up to a tenth. The methodology page says so, and a check makes sure that bound stays true.
Three design choices worth knowing
- Affordability is national, on a curve. A borough's price is placed between the 5th and 95th percentile of every borough in the country, on a logarithmic scale - which is a way of saying the gap between £150,000 and £300,000 counts the same as the gap between £300,000 and £600,000. Before September 2026 it was compared only within its own city, which made the cheapest borough in a dear city look "affordable" (Barking scored 10) and the dearest in a cheap city look "unaffordable" (Stockton scored 0). Now Barking is 4.4 and Stockton 9.5, which is what the prices actually say.
- Growth is after inflation, and against the whole country. Same reasoning: a city with four boroughs would always have one at the top and one at the bottom, whatever the numbers, so the comparison is national.
- A missing input is left out, not faked. If a borough has no schools figure (Wales) or no flood data (New York), that component is dropped and the other weights are scaled up to fill the gap. The response says which weights were actually used. Nothing is ever filled in with an average and passed off as measured.
5 - What happens when a business calls
The website does the sums itself. A business cannot - its software has no table of numbers - so it asks the API, and the sums are done on Amazon. Same conversation format, different building.
The business's software → api.skyscore.co.uk"Score for SW11 1AA, please. Here is my pass."
The "pass" is an API key - a long code that says who is calling. Sent with every request.
The receptionist (API Gateway)"Pass is valid. That's your 4,212th call this month, under the 10,000 free. You're not calling too fast. Sending you to the score worker."
Amazon runs this receptionist. It also refuses calls from a pass that is over its allowance, and slows down anyone hammering the door.
The score worker (a Lambda) → the index-card box (DynamoDB)"The card for SW11 1AA, please."
Back comes: latitude, longitude, and the borough - Wandsworth. 2.7 million cards, one per UK postcode, from the government's own register. This is the API's version of asking postcodes.io.
The score worker → the noise-readings box"Any aircraft-noise reading for SW11 1AA?"
"Yes: measured." The same DEFRA readings the website carries, held here as cards.
The score worker, to itself"Wandsworth's row, the noise reading, Balanced weights. Sums. Round once."
The same arithmetic the website does. It comes out at 5.0 for this postcode.
The score worker → the business"Score 5.0. Quiet Skies 6.4, Affordability 0.3, Growth 3.2, Liveability 7.8, Environment 5.6. Weights used: 32/27/0/27/14. Sources: HM Land Registry price index, July 2026; ONS crime; ONS postcode register; DEFRA noise mapping; DfT station register; NHS … Methodology version 5.2."
Every answer carries its sources and its version, because the business's own auditors will ask. The terms require them to pass the sources on to their users too.
Two things the business gets that the website does not: a machine-readable answer it can store or display anywhere, and a way to ask about many postcodes at once (on the paid plans). One thing it does not get: the four helpers - stations, sales, energy, NHS - which are for the website's panel.
Why the website and the API must agree. Two copies of the same arithmetic, in two languages, on two machines. Twice in the project's history they disagreed while every input matched - once because the website had never loaded a city's numbers at all. So before any change is saved, a check drives the real website, reads the score it draws for every one of 91 boroughs, and compares it with the API's answer. The score you see and the score a business is charged for are the same number, and that is a checked fact, not a hope.
6 - The assistant, and the forty lines
There is one place AI is used: an assistant on the API that explains a score in a sentence. Here is one question going through it - and the part of Sky Score most worth understanding.
A business → the assistant ("/v1/chat")"Is SW11 1AA quiet?"
The assistant worker → the score worker"Score for SW11 1AA, please."
Asked directly, worker to worker, not over the web - so the data it gets is exactly what the API would return, with nothing in between to drift.
The assistant worker → the AI model (Nova 2 Lite, through Bedrock)"Here is the data - the ONLY thing you may use. Here is the question. Explain the numbers. Never state a number that is not in the data."
The model is a small, cheap one. Its whole job is reading numbers back in English. It is allowed about three sentences.
The model → the assistant worker"SW11 1AA is moderately quiet, with a quiet component score of 6.4. Road noise is 73.6 dB, above the WHO guideline of 53 dB."
The forty lines of code (verify_answer)"Numbers in the answer: 6.4, 73.6, 53. Numbers in the data: … 6.4 … 73.6 … 53 … All present. Ship it."
Answer goes back with grounded: true.
And when the model goes beyond the data
A business → the assistant"What is the score out of 100?"
The model"The score is 5.0 out of 10, which is 50 out of 100."
Correct arithmetic.
The forty lines"Numbers in the answer: 5.0, 10, 50, 100. Is 50 in the data? No. Is 100 in the data? No. Throw the answer away."
What goes back instead: "I can't answer that from the data I have for this location," with grounded: false, and a line in the logbook naming the refused numbers.
It just discarded a true answer. That is the cost of a rule that cannot tell a number the model worked out from a number the model made up - and on a service about someone's home, the cost is worth paying. A warning next to a made-up number would still ship the number, and people read the number.
Why it is built this way
- An instruction is not a control. The written instructions to the model say, in capitals, never invent a number. The third real question the assistant ever got was "what will prices be in 2030?" - and the model gave a figure. Instructions are requests. The forty lines are the control.
- It is deliberately dumb. It does not understand the sentence; it only checks that every number in it was handed over. That is why it works with any model and needs no second AI to judge the first. A judge would be another instruction.
- It had three holes, and nobody noticed for five weeks. For a while it ignored every whole number from 0 to 10 - the very scale it exists to protect. Each hole was closed by writing a test that failed first, then fixing the code. Which is the subject of Part 9.
7 - The Amazon pieces, and why each one is there
Sky Score runs on Amazon Web Services (AWS) - Amazon's business of renting out computers and storage by the minute. We rent nine kinds of thing. None of them is a computer that sits switched on all day. Each is described the same way: what it is, in everyday terms; what we use it for; and why this and not something else.
S3 the filing cabinet
- What it is
- A place to keep files. You put a file in; it stays there until you take it out.
- What we use it for
- Every file the website is made of: the page itself, the map outlines, the table of borough numbers, the noise readings, the station list, and 100 small pages, one per borough.
- Why
- A website that is just files is the cheapest and hardest-to-break kind there is. There is no program running to crash. Storing all of it costs pennies a month.
CloudFront photocopies in every city
- What it is
- A network of Amazon buildings around the world that each keep a copy of your files. A visitor gets the copy nearest to them.
- What we use it for
- Serving skyscore.co.uk. Someone in Manchester gets the page from a copy in the UK, not from the filing cabinet in London every time. It also keeps a copy of the little score badge that other websites can embed.
- Why
- Speed and cost: copies close to the visitor arrive faster, and the filing cabinet is bothered less. It also lets us add the security settings every serious website needs, in one place.
API Gateway the receptionist
- What it is
- The front desk for the business side. Every request from a business, or from the website's four helpers, comes through here first.
- What we use it for
- Checking the caller's pass, counting calls against the free allowance (10,000 a month), slowing anyone who hammers the door, and sending each request to the right worker.
- Why
- Because these jobs are boring, important and easy to get wrong. A receptionist that Amazon runs and that never sleeps is better than one I write myself.
Lambda workers on call - eight of them
- What it is
- A small program that does not run all the time. It is woken up when there is a job, does the job in a fraction of a second, and goes away again. You pay per job, not per day.
- What we use it for
- Eight jobs, one worker each: score (the business API), chat (the assistant), signup (handing out passes), favourites (saved places), and the four helpers the website uses: transport, nhs, sold-prices, epc.
- Why
- A normal server is like renting an office 24 hours a day even when nobody is in it. Workers on call cost nothing when nobody is asking, and there is no office to clean, patch or restart. For a service that is quiet most of the time, this is the cheapest way there is.
DynamoDB the index-card box
- What it is
- A very fast box of index cards. Give it a card's number and it hands you the card at once, however many cards there are.
- What we use it for
- Five boxes. The big one holds 2.7 million cards, one per UK postcode. Another holds the noise reading per postcode. The other three are small: saved places, sign-ups, and sign-ups waiting to be confirmed.
- Why
- We only ever ask one question of it: "the card for this postcode, please." We never need to search across cards or add them up. So we do not need a full database with a program running all day - just a fast box, paid for by the lookup.
Bedrock the door to the AI model
- What it is
- Amazon's service for talking to AI language models without running one yourself. You send text in, text comes back.
- What we use it for
- One thing only: the assistant in Part 6. Only the chat worker is allowed to knock on this door.
- Why
- Reading numbers back in English does not need a clever model - a cleverer one invents more fluently, not less. This is also the only piece of Sky Score outside the UK: the model lives in Amazon's Virginia region, so the question and the score numbers travel there. Nothing personal does, and the privacy page says so.
CloudWatch the logbook
- What it is
- Every worker writes down what it did. CloudWatch is where those notes go, kept for 30 days.
- What we use it for
- Finding out what happened when something goes wrong - and seeing the forty lines catch the model. Each catch is one line, with the numbers that were refused.
- Why
- Workers on call leave nothing behind when they finish, so without a logbook there would be no way to look back. Thirty days is enough to investigate and short enough to keep the privacy promise.
IAM the keys and passes
- What it is
- Who is allowed to do what. Every worker, and every person, has a written list of what they may touch.
- What we use it for
- One "deploy" identity, with one written list, may put new versions in place. Each worker is allowed only what its job needs.
- Why
- If something is broken into or goes wrong, the damage is limited to what that one identity was allowed to do. It also means the coding assistant I build with cannot change the live system by accident - going live needs my explicit go-ahead.
CloudFormation, via "SAM" the blueprint
- What it is
- A single document that describes every piece above. "Deploying" means telling Amazon: make the real thing match this document.
- What we use it for
- Everything on the business side is set up from that one file. Nothing was clicked together by hand and then forgotten.
- Why
- A thing set up by hand cannot be rebuilt, reviewed or checked. A blueprint can be read, tested, and put back exactly if something is lost.
Two things we deliberately do not rent
- No always-on computer. There is no server to log into. Every piece above either stores files or wakes up for a job.
- No map service. See Part 1: our own outlines, drawn in the browser.
What got taken out, and why
In March there were five AI features on the website: a chat panel, an automatic AI summary on every postcode, photo analysis, document analysis and a generated report. In May all five were removed in one go. The main reason: an AI summary on top of a carefully checked score adds an answer that varies and is sometimes wrong. The second reason: they were costing about $80–115 a month in credits. What came back in August is the one narrow assistant in Part 6, for about 25p per thousand questions.
8 - How new data gets in
The numbers on the site are not fetched live from the government. They are computed on my computer, checked, and then published - on a rhythm set by whoever publishes each dataset.
| Dataset | How often it changes | What a "roll" involves |
| House prices (Land Registry index) | Monthly, mid-month | Download the new month; recompute every borough's price and growth; add the month's inflation figure; deploy the API first, then the site, so the two never disagree in between. |
| Postcodes (ONS register) | Every three months (Feb, May, Aug, Nov) | Reload the 2.7-million-card box (about an hour), then re-run every script that reads the file, because several of the borough numbers are shares of postcodes. Sky Score reloads when an edition's changes are worth it - the August 2026 one added 5,494 postcodes and moved 72,554 a few metres. |
| Crime (ONS) | Quarterly | Download the table; compare every borough's rate against it; update and deploy. |
| Schools (DfE) | Yearly | Same pattern. The 2023/24 figures are the last with a "Progress 8" score for some years, because the pandemic removed the baseline tests. |
| Noise and air maps (DEFRA), flood (EA), stations (DfT), GPs (NHS) | Rarely (noise every five years) | Re-sample the maps at every postcode; recompute the shares. |
The four steps of every roll
- Download the official file from the publisher.
- Compute each borough's number from it, with a script that is the same every time.
- Check: a second mode of the same script re-derives the published numbers from the source and fails loudly if any has drifted. Several of these checks run before every change is saved, so a stale number cannot slip through.
- Deploy, in a fixed order: the API first (because the site's copy of the numbers must never be ahead of the API's), then the site, then confirm from the live address that what is served matches what was written.
Why the order matters, with a real example. On 19 September the station list moved out of the page into its own file. Deploying the page first would have put a page that needs the file live before the file existed - every search would have said "station list could not be loaded" for a few minutes. Deploying the file first leaves no gap. The written instructions had it backwards in three places; the comment in the deploy script had it right. Reading the script rather than the notes is what caught it.
9 - The 57 checks
Before any change to Sky Score is saved, a checklist of 57 automatic checks runs. 45 must pass or the change is refused; 12 only warn. I call it "preflight". It takes about a quarter of an hour.
| Kind of check | What it does, in plain terms |
| Code tidiness | Reads every file for mistakes a compiler would not catch - an unused name, a misspelt variable. |
| Unit tests | Runs hundreds of small tests of the arithmetic: "given these inputs, the score must be 5.4". Includes the ten tests of the forty lines. |
| The website, driven by a robot | Opens the real page in a real browser, clicks every city, opens the panels, resizes to phone sizes, and checks nothing is off-screen, covered, or unreadable. Also runs an accessibility scan to the international standard. |
| Website equals API | The check from Part 5: 91 boroughs, score on the page versus score from the API. |
| Numbers equal their source | The unusual ones. Prices equal Land Registry's. Crime equals ONS's table. Flood equals what the Environment Agency's own service says at sample points. Progress 8 equals DfE's. If a published number has drifted from its source, the change is refused. |
| Promises equal reality | The privacy page says logs are kept 30 days; a check asks Amazon and fails if they are not. The documentation's worked example is recomputed against the live API. |
| Deployed equals written | 134 files on the live site are compared with the versions on disk. |
The rule that makes the checks worth having
A check that has never gone red has not been tested. Before a new check is trusted, the thing it guards is broken on purpose, the check is watched turning red, the break is undone, and the check is watched turning green. Only then does it count.
That rule exists because twelve checks in this project's history turned out to be green for months while checking nothing. Nobody switched them off. One piped its results into a command that always succeeds, so the whole checklist said PASS while running nothing. One scanned only the home page and only for the most severe faults, so every real fault was invisible. One had a minimum of "at least 17 files" the day after the 18th file was added - so it could no longer notice that one file going missing. Each decision was sensible on its own; together they made a check that could not fail. Asking "what would this check miss?" is how they were found.
10 - How it was built with a coding assistant
Most of the code was written over six months with a coding assistant called Claude Code - an AI that reads and writes the project's files under direction. Here is the working arrangement, because it is different from "the AI wrote it".
- I own the judgement; it owns the typing. What to score, what to throw away, what counts as grounded, which datasets are trustworthy - mine. The code that carries those decisions out - mostly its.
- The check comes first. I describe what must be true when the work is done; the assistant makes it true; the check decides whether it is. If we disagree about whether something works, neither of us settles it - the check does.
- It cannot go live on its own. Putting a new version live needs my explicit go-ahead. On one occasion its own safety layer refused a production deploy, and I ran the step myself.
- It keeps notes between sessions, and the notes must record checks, not facts. "The tests pass" is a fact, and it was false the day it was written. "Prove a check can fail before you trust it" is a check, and it is still true. About eighty such notes exist for this project; the useful ones are all of the second kind.
What this is and isn't. It is not "vibe coding" - accepting whatever comes out. It is closer to directing a very fast, very literal junior who never gets tired and never remembers yesterday unless you write it down. The 57 checks are what make that safe.
11 - What it costs, and what it charges
What it costs to run
Because nothing is switched on until asked, a quiet month costs very little: file storage is pennies, the workers and the index cards are paid per job and per lookup, and the copies-in-every-city are paid per visit. The one figure worth remembering is the assistant: about 25p per thousand questions. For contrast, the five AI features removed in May were costing $80–115 a month at modest traffic - most of it the bigger model they called.
What it charges
| Who | Price | What they get |
| People using the website or the phone app | Free | Everything on the map and in the panel. No account needed. |
| A business trying the API | Free tier | 10,000 scores a month with a self-issued pass. No batch requests. |
| Professional | £499 a month | A much larger allowance and batch requests (many postcodes in one call). |
| Pilot | £2,500 for 90 days | Working alongside a first customer to fit the API to their use. |
| Enterprise | By agreement | Bulk scoring of whole portfolios, delivered as files. |
The data underneath is all published under the Open Government Licence, which allows commercial use as long as the source is credited - which is why every API answer carries its sources, and why the terms require customers to pass them on.
12 - Privacy, safety and the phone app
What leaves your device, and where it goes
- On the website: the postcode you typed goes to postcodes.io (to find it) and to the four helpers (for the extras). Nothing else. No account, no cookies; the visit counter is a cookieless one that keeps no personal data.
- Saved places ("favourites") are stored against a random token your device makes up, not a name or an email.
- Through the API: the postcode and the caller's pass. Through the assistant: the question and the score numbers go to the AI model in Virginia - the only thing that leaves the UK - and the answer comes back. Nothing personal is sent, and the model is not allowed to remember anything.
- Logs are kept 30 days, and a check confirms that is really what Amazon is doing.
- Sign-ups for an API pass keep an email address. A stricter "confirm by email first" path is built and switched off until the sending address is verified.
Keeping the door shut
- Every business request needs a pass; every pass has an allowance; every route has a speed limit, sized from measured traffic.
- The badge that other websites can embed is an image, not a script, so a portal's own security settings cannot block it and it cannot run anything on their page.
- Anything typed by a user is checked before it is used - a postcode must look like a postcode, a question is capped at 500 characters.
The phone app
It is the same page, three ways. On the web, as-is. As an "installable" website on Android and iPhone (Add to Home Screen), which also works offline once loaded. And as a native iPhone app on the App Store, which wraps the same page and adds one native feature: a "score where I am" button that uses the phone's location. Web changes go live at once; the App Store version needs a new build and Apple's review, so it is refreshed every few weeks rather than every day. An Android version is built but not yet in the Play Store.
13 - How to show Part 2b live in 30 seconds
- Open skyscore.co.uk in Chrome. Press F12. A panel opens: click Network at the top of it, then the Fetch/XHR button so only data requests are shown. Click the small 🗑 icon to empty the list.
- Type N1 7SX in the search box and press Enter.
- Watch the list fill: three files, postcodes.io, then the four helpers landing together. Read them out. Then: "and notice there is no request for the score."
- Tip: drag the panel to the right-hand side (the three dots in its corner → Dock side) so the map and the list are visible together. Zoom the page to 150% at most on a 1366-wide screen, or it switches to its phone layout.
Appendix - the nine requests as the browser writes them
Captured live on 2026-09-21 while searching SW11 1AA; the same nine appear for any UK postcode.
| # | What the browser asked for | Plain English |
| 1 | /data/aircraft-quiet-london.json | London aircraft-noise readings (35,352 postcodes) |
| 2 | /data/aircraft-quiet-regions.json | the same for seven regional airports (7,339 postcodes) |
| 3 | /data/stations.json | the station list (1,390 stops, ten cities) |
| 4 | api.postcodes.io/postcodes/SW111AA/autocomplete | the suggestions as you type |
| 5 | api.postcodes.io/postcodes/SW111AA | "where is this postcode?" |
| 6 | /transport?lat=51.464&lon=-0.164 | helper 1: stations and line status |
| 7 | /nhs?lat=51.464&lon=-0.164 | helper 2: GPs and clinics nearby |
| 8 | /sold-prices?postcode=SW11 1AA | helper 3: recent sales |
| 9 | /epc?postcode=SW11 1AA | helper 4: energy certificates |
Words used above
- Browser
- Chrome, Safari, Edge - the program you view websites in. It does more than display pages; it can do sums and ask questions of other computers.
- Request
- One question the browser sends over the internet, and the one answer that comes back.
- API
- A way for one program to ask another for data, without a person or a screen in between. Sky Score's API: send a postcode, get numbers back.
- API key / pass
- A long code that identifies who is calling, so their usage can be counted.
- Component
- One of the five marks out of ten (Quiet Skies, Affordability, Growth, Liveability, Environment) that are blended into the score.
- Weights / profile
- How much each component counts. A profile is a named set of weights: Balanced, Family, Investor, and so on.
- Percentile
- Where a value sits in a line-up. The 95th percentile price is dearer than 95 out of every 100 boroughs.
- Deploy
- Put a new version live.
- Roll
- Bringing in a new edition of a dataset and recomputing everything that depends on it.
- Check / gate
- One of the 57 automatic tests that run before a change is saved. "Red" means it failed; "green" means it passed.
- Region
- One of Amazon's clusters of buildings. Sky Score uses London; the AI model is only in Virginia.
- Open Government Licence
- The licence most UK public data is published under: free to use, including commercially, if you say where it came from.