Generates synthetic but realistic patient records (FHIR R4 bundles, C-CDA documents, CSV) with MITRE Synthea for development, CI fixtures, demos, and leakage-gate test sets — zero real PHI. Use when you need safe, shareable test data for an OpenMed pipeline, reproducible fixtures for tests, or a held-out set for de-identification leakage gates, instead of touching real clinical data. Synthea output feeds the FHIR/C-CDA ingestion skills and openmed.eval. Trigger keywords: Synthea, synthetic data, fake patients, test fixtures, demo data, FHIR bundle generator, synthetic EHR, no PHI.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
You cannot develop, test, or demo a clinical NLP pipeline on real PHI without a mountain of governance — and you shouldn't have to. Synthea (MITRE's Synthetic Patient Population Simulator) generates statistically realistic, fully synthetic patients: complete longitudinal records as FHIR R4 bundles, C-CDA documents, and flat CSV, with zero real-PHI risk. Use it for OpenMed dev fixtures, CI, demos, and — importantly — as held-out test sets for de-identification leakage gates, where you need known-synthetic "PHI" to measure recall.
openmed.deidentify removed them all.Synthea is a Java tool. Generate a small population in multiple formats:
# Requires Java 11+. Clone and build once.
git clone https://github.com/synthetichealth/synthea && cd synthea
./gradlew build -x test
# Generate 50 patients in Massachusetts as FHIR R4 + C-CDA + CSV.
./run_synthea -p 50 Massachusetts \
--exporter.fhir.export=true \
--exporter.ccda.export=true \
--exporter.csv.export=true \
--exporter.baseDirectory=./output
# Reproducible runs: fix the seed so fixtures are stable across CI.
./run_synthea -s 12345 -p 20 --exporter.baseDirectory=./fixturesOutput lands under output/fhir/, output/ccda/, and output/csv/. Feed the
FHIR bundles to parsing-... skills, or hand narrative straight to OpenMed:
import json, openmed
bundle = json.load(open("output/fhir/Patient_xyz.json"))
for entry in bundle.get("entry", []):
res = entry.get("resource", {})
div = (res.get("text") or {}).get("div", "") # narrative XHTML
if div.strip():
deid = openmed.deidentify(div, method="replace", policy="hipaa_safe_harbor")
result = openmed.analyze_text(deid.text, output_format="dict")Synthea data is synthetic, so de-identifying it is exercising the pipeline, not a privacy requirement — which is exactly what makes it a great test bed.
-p N sets population; the state/location
argument shapes demographics and addresses. Start small (10–50) for fixtures.exporter.fhir.export), C-CDA
(exporter.ccda.export), and/or CSV per your ingestion path. FHIR R4 is the
default and pairs with fetching-fhir-resources; C-CDA pairs with
parsing-ccda-documents.-s) for reproducible fixtures so test assertions are stable.-m "diabetes*" to filter); choose modules matching the entities your
OpenMed pipeline targets.openmed.deidentify recall with openmed.eval
(evaluating-with-leakage-gates). Because the "PHI" is synthetic and known,
you can measure misses without exposing anyone.tests/fixtures/synthea/) —
it is safe to version-control synthetic output.openmed.deidentify
→ openmed.analyze_text, via the fetching-fhir-resources and
parsing-ccda-documents skills.openmed.eval de-identification leakage gates — the daily-release thesis
gates on leakage, not F1 alone, and synthetic data lets you build that test
set without governance overhead.text.div narrative is generated from
templates, so it is more regular than dictated notes. For NER robustness,
supplement with varied real (de-identified) text where governance allows.-s, every run differs — CI fixtures
will churn. Always pin the seed for committed fixtures.-p 100000 produces gigabytes; size to need.80da98c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.