How a country becomes a pack
blueHealthcare is built so that a country is a configuration pack — never a fork. This page describes what that means today, precisely, including what is not true yet. This is the commercial implementation. A separate free, source-available edition with country pack templates and worked examples exists for eligible countries; see the open overview for how they differ.
Concept mockup, shown for the Philippines as one eligible country. Synthetic data. Not a product available in the Philippines or any other country today — the ph pack is a worked example, not code that runs. Concept mockup by MOBLUEHQ; not a product available in this country today.
A jurisdiction-neutral interface (JurisdictionPack, plus three pluggable Protocols: CodingSystem, PrivacyRegime, FhirProfile) with 17 fields covering coding, privacy, FHIR profile, compliance-rule identifier, policy-pack format, payer vocabulary, currency, locale, date/number format, data-residency flags, and five additional consent-related fields. See the full field list on the pack spec page.
Two packs are registered: us (real — the only pack any code path uses today) and xx (a deliberate, empty non-US stub proving the interface doesn't assume a US answer). The loader refuses an unknown pack id outright — there is no silent fallback to us.
We do not say "switch the pack and it runs in Germany." That would not be true. Here is the measured state instead:
- Two code paths read pack data:
core/consent/gate.pyloads each record's own pack (viaload_pack(record.jurisdiction_pack_id)) to decide whether secondary use is allowed under that record's jurisdiction, andresult/patient_release_policy.pyusesactive_pack()as a fallback when a caller doesn't pass a pack explicitly. - The rest of the platform's core still reads US-specific constants directly rather than through a selected pack. A standing test greps for exactly that and is deliberately red on purpose. This page doesn't quote the current count — see the roadmap's "measured, still open" section for why a number here drifts and gets corrected instead.
- A second standing test measures the dependency count from the platform's core to its application layer — again, see the roadmap for the one figure that's held stable across recounts; the broader totals have moved week to week and aren't repeated here.
- The addendum's own required demonstration — "switch to the
xxstub pack and boot the app with no US strings visible" — is not reachable yet, for the same reason: there is no boot path that reads from a selected pack.
We publish the migration counts, not a finish date.
Adding a new country means a new directory under core/jurisdiction/<xx>/ implementing the three Protocols and the 17 fields, then registering it by id in the pack registry. An unregistered directory does nothing — there is no filesystem-scanning magic, so a half-built pack can't silently activate.