Care Abroad

a long oneHow this was built

also: the method · rebuilding this directory

One JSON file per thing, every field carrying where it came from, and a validator that refuses a price with no date.

The record shape, the provenance tiers, the price rule, the law rule, the harvests and their licences, the map projection and the editorial rules — set out so that somebody with none of these files could build the same thing and check this one. Nothing on this site is medical advice or legal advice, and the rules below are most of the reason it is not.

The story Inference

The unit is a record, not a page. One JSON file sits at data/nodes/<type>/<id>.json, the id is the filename, and thirteen types carry the whole subject: a country as a place people are treated in or leave, a city cluster, a procedure, a named hospital or clinic, one step of the journey, a risk, a rule, an organisation, a person, an event, a word, a dataset, and a longer piece of writing like this one. A schema at schema/node.schema.json states what a record must look like, and tools/validate.py runs it before anything is built: identifier against filename, type against folder, every kin target resolving, every source identifier existing, every country code ISO 3166-1 alpha-2, every price carrying a currency and a date and a source, every legality row carrying an instrument date and a source, every image licence on a free-to-use allowlist, and every provenance path pointing at a field the record actually has.

Provenance is the point of the project, so it sits on the record and on individual fields. Five tiers: cited, where a named source backs it; harvested, where a tool fetched it from an open dataset; tradition, which is how the trade works and is hedged in the prose; inference, which is this project reasoning from the above and says so; and field, meaning somebody stood there — nothing on this site carries it yet. A record declares a default and overrides per dotted field path, and the prose marks each stretch inline, so that plain prose is cited and the reasoning is labelled where it happens rather than in a footnote. Records also carry a confidence of high, medium or low and a needs_verification flag: of 330 records on disk, 175 are high, 129 medium and 26 low, and 160 are flagged for verification.

Kin is the spine and it is directional. Each entry says, in one sentence, what another node is to this one, written from here — not see also. The other record answers in its own words from its own page, so a pair of records produces two different sentences about the same relationship. There are 2,742 such edges across the 330 records, and a rich record carries five to twelve of them.

A price is a number somebody published, read off their own page. Not a quote a patient was given, not an average this project computed, not a range with no source: the schema has no field for an average, and the validator rejects a price with no date or no source outright. Each row carries the currency it was billed in, the date it was published or read, one of seven kinds — a provider's package, a single list price, a state tariff, an insurer's reimbursement, a published survey figure, a published estimate with its method named, or an advertised range — and the seller's own inclusion list and exclusion list in the seller's own words. Dollar figures are the row's own currency put through one table of mid-market rates whose date is printed on the page, because a 2019 lira price converted at a 2026 rate is not what that patient paid, and both dates sit on the row so the gap is visible. The price chart uses a logarithmic axis, because the published prices for one operation run over two orders of magnitude.

A legality row is one reading of one named instrument, in one jurisdiction, on one date. Six statuses: lawful, lawful with conditions, residents only, prohibited, unregulated, and not read by this project — which is hatched on the grid and is a statement about this directory rather than about the country. Law moves between the reading and the reader, so every cell carries the date it was read, and a stale row is a wrong row rather than an old one. Nothing on the site says what a reader should do about any of it.

Four harvests supply the charts, and each keeps its licence. Eleven World Bank series, one request each, CC BY 4.0, most recent non-null year per country with the year stored beside the value and the Bank's own regional and income aggregates dropped because their codes are not country codes. Every named hospital, clinic and dental surgery within a set radius of each hub, fetched through the OpenStreetMap Overpass API under ODbL 1.0 with attribution to OpenStreetMap contributors. Country outlines from Natural Earth, public domain in the publisher's own words: "No permission is needed to use Natural Earth." And one dated exchange-rate table from an open endpoint whose terms require attribution and forbid redistribution. The WHO repository is used under terms allowing non-commercial reuse with attribution. Every fetch date is stored in the file it produced.

Every map is drawn in Equal Earth, the equal-area pseudocylindrical projection published by Bojan Šavrič, Tom Patterson and Bernhard Jenny in 2018, implemented directly in tools/worldmap.py. Inference — the reason is specific to this subject. Most of these maps colour countries by a rate, and on Mercator the high northern latitudes swell to several times their true area — which is exactly where the patients come from rather than where they go, so the commonest projection would inflate the wrong end of every map on the site. On Equal Earth a square kilometre takes the same ink anywhere. What it trades away is shape: high latitudes are stretched east-west and squashed north-south, which is the price every equal-area projection pays, and Antarctica is cropped because nobody in this directory flies there. Distances elsewhere are great-circle kilometres on a 6,371-kilometre sphere, and the flying times printed beside them are that distance at 850 km/h plus 45 minutes — arithmetic rather than a timetable, and the page says so where it prints one.

The editorial rules are enforced by the same validator, as hard errors, and both lists are escapable the same way: put the words in quotation marks and name who said them. The first list is the fleet's, and the sixth entry on it is the field's own name for itself — which is why this site writes medical travel and cross-border care throughout, and why the familiar two-word compound appears only inside a quotation, inside a proper name, or on the word's own page, where the argument over it is the subject. That list also bars an adjective meaning truthful, on the ground that prose claiming the quality rarely has it. The second list is what this subject attracts: the brochure adjectives, the savings claim with no date attached, and the second-person instruction. A directory that tells a reader what to do about their own hip has become a clinic, and this is not one. Inference — two further rules follow from the same place. A number nobody published stays null and prints on the page as a gap rather than a zero. And a university hospital and a back-street hair clinic are described in the same voice, under the same evidence rules, with the arguments around both reported and neither joined.

How it works Inference

The pipeline runs in order from the repository root. python3 tools/validate.py — every record must pass, and BUILD_DRAFT=1 downgrades unwritten kin targets to warnings while records are still being drafted, which is not a state to publish from. python3 tools/build.py assembles records and harvests into build/api, the search tables, the price table, the legality grid and the country join. python3 tools/cards.py draws the share cards it is missing. python3 tools/site.py writes build/site — pages, maps, charts, search, JSON-LD, a sitemap, llms.txt, robots, and CSV and JSONL exports. python3 tools/serve.py serves it locally. The harvests refresh independently: harvest_worldbank.py, fetch_rates.py, fetch_geo.py and harvest_osm.py, each stamping its own fetch date into the file it writes. build/ is generated and safe to delete.

Today Inference

As of 17 September 2026 this site holds 330 records — 58 procedures, 52 countries, 40 city clusters, 34 hospitals and clinics, 26 words, 23 rules, 23 risks, 22 organisations, 17 journey steps, 13 datasets, nine longer pieces, eight events and five people — drawing on 762 registered sources, carrying 214 published price rows across 21 countries and twelve currencies, 151 legality rows, 166 evidenced tags and 2,742 kin edges. Fourteen records carry a default provenance tier other than cited. No record carries the field tier, because nobody has stood anywhere yet.

The particulars

kindmethod
regionEverywhere
linksEqual Earth projection · Natural Earth terms of use
confidencehigh · updated 2026-09-17

What it connects to

a long oneWhat the data cannot seeThe thirteen series this method draws on, and the sentence each of them cannot answer.a seriesNatural Earth country outlinesThe geometry every Equal Earth map is drawn from, and the codes that drop out of it.and of this page it says: The simplification, the rounding and the five patched codes are all in the method.a seriesThe dated exchange rate tableThe one dated rate table every dollar figure on the site passes through.and of this page it says: Why a rate is fetched once and stamped rather than looked up live.a seriesOpenStreetMap hospitals, clinics and dental surgeriesThe harvest that supplies the hub maps, under ODbL with attribution.and of this page it says: The Overpass query, the radii and the tag list are all in the method.a seriesCurrent health expenditure per personThe series behind the first world map, and the exemplar record this schema was written against.a long oneIs it cheaperThe price rule applied end to end to one operation.a long oneThe price that isn'tWhy every price row carries the seller's own exclusion list.a long oneCircumventionThe law rule applied across six subjects, one named instrument at a time.a long oneCounting patientsWhy a headline volume figure is never carried here without its unit and its collector.a long oneThe word itselfThe naming rule this method enforces, and where the argument over it is set out.and of this page it says: Where this rule is enforced, alongside the rest of the editorial rules.a wordPackage priceThe form most prices here take, and the reason two of them cannot be subtracted.a seriesThe JCI list of accredited organizationsCounted and never weighted, which is a rule rather than a judgement about any hospital.

Sources

Where it came from: Cited a source named here · Harvested pulled from an open dataset · Trade practice how the trade works, hedged · Inference this project's own reasoning · Field somebody stood there. This record as JSON.

Pass it on