OpenMed 2.0: Local-First Health Intelligence for Agents, Skills & Privacy
OpenMed v2.0.0 is here, expanding the local-first healthcare privacy and clinical AI platform across Python, Swift, Kotlin/Android, JavaScript, MCP, REST, and container deployments.
This major release adds 34 built-in PII language codes, deterministic identifier and safety-sweep paths, native-script surrogates, offset-preserving CJK and Indic processing, structured-data privacy-risk analysis, exact reference-population assessment, signed expert-review evidence, richer clinical extraction, new interoperability adapters, and broader on-device support.
OpenMed 2.0 also introduces radiology extraction, serial measurement trends, longitudinal document linking, clinical coreference and temporal normalization, multilingual relations, flowsheets, lab panels, discharge structures, typed MCP tools, watchOS and visionOS targets, Android span metadata, WebGPU and GGUF guidance, and reproducible release-evidence workflows.
The documented v1 Python entry points remain available, the REST surface retains the same 15 paths and 12 component schemas, and the static public Python inventory grows from 14,488 to 20,538 symbols with 6,050 additions and no removed, narrowed, or newly deprecated public symbols.
Install or upgrade:
pip install --upgrade "openmed==2.0.0"
npm install openmed@2.0.0Swift Package Manager:
.package(url: "https://github.com/maziyarpanahi/openmed.git", from: "2.0.0")Android through JitPack:
implementation("com.github.maziyarpanahi:openmed:v2.0.0")Container:
docker pull ghcr.io/maziyarpanahi/openmed:v2.0.0Release notes: https://openmed.life/docs/release/v2.0.0/
Migration guide: https://openmed.life/docs/migration/1.9-to-2.0/
Full changelog: v1.9.1...v2.0.0
Release scope
The audited v1.9.1..v2.0.0 candidate contains 540 reachable commits, including 142 merge commits and 299 first-parent commits, with 1,025 files changed. The release inventory maps 197 merged pull requests and every direct, integration, and release-preparation commit to the exact Git ancestry recorded in CHANGELOG.md.
The release contains 255,162 insertions and 12,770 deletions across the Python package, tests, documentation, examples, website, Swift, Android, JavaScript, service, MCP, deployment, evaluation, security, and release-engineering surfaces.
Highlights
- Multilingual privacy: OpenMed now routes 34 built-in PII language codes and adds deterministic identifier, date, phone, address, safety-sweep, and surrogate capabilities across Chinese, Indic, African, Nordic, Central and Eastern European, Russian, Urdu, Vietnamese, and regional Arabic workflows.
- Offset and script integrity: Full-width and half-width text, native digits, Simplified and Traditional Chinese, Chinese numerals, Indic graphemes, legacy encodings, cross-script transliteration, Hinglish, and mixed-script confusables are handled with source-aligned offsets.
- Regional privacy policy: China PIPL, India DPDP and ABDM, South Africa POPIA, Nigeria NDPA, Kenya DPA, Egypt PDPL, Morocco Law 09-08, the Malabo Convention, GDPR, the EU AI Act, ISO 27701/27001, consent tags, and data-residency evidence gain explicit local workflows.
- Structured-data privacy risk: New offline workflows cover quasi-identifier discovery, reviewer overrides, patient-level k-anonymity, distinct and entropy l-diversity, variational t-closeness, bounded generalization and suppression search, materialized-output revalidation, and rollback-safe publication.
- Reference-population assessment: Callers can evaluate k-map, exact-linkage risk, and delta-presence against an explicit row-level or longitudinal reference population while keeping aggregate reports free of raw profiles and privacy-unit values.
- Expert-review evidence: Structured-risk dashboards, the strict
openmed risk gatecommand, deterministic review records, and expert-authored Ed25519 attestations bind conclusions to data, schema, policy, integrity, and freshness evidence without claiming automated Expert Determination. - Clinical extraction: Radiology sections and findings, BI-RADS and Lung-RADS capture, serial measurement trends, longitudinal document linking, coreference, temporal normalization, abbreviation disambiguation, multilingual relations, flowsheets, lab panels, discharge summaries, procedures, pulmonology, and pediatrics expand the local clinical toolkit.
- Interoperability: OpenMRS, DHIS2, OpenHIM, ODK Central, CommCare, KoBoToolbox, WHO SMART profiles, PySpark, Prefect, scrubadub, LlamaIndex, scispaCy, QuickUMLS, and offline ICD-11 integration points support deployment inside existing health-data environments.
- Agent Skills for healthcare workflows: OpenMed 2.0 ships 72 portable Agent Skills across 14 categories for Claude Code, OpenAI Codex, OpenCode, and compatible agents. They cover local de-identification, clinical NER, FHIR and OMOP handoffs, evaluation, compliance, document intake, analytics, and deployment, with a safe one-command installer that preserves existing user-owned entries.
- MCP and agent tooling: A typed MCP registry, structured tool outputs, the
openmed-mcpentry point, an MCP-enabled container, andllms.txtdocumentation feeds make OpenMed easier to use from local agents without moving PHI into a hosted control plane. - On-device SDKs: OpenMedKit adds watchOS and visionOS targets, grapheme-safe Swift span parity, compact on-device segmenters, Android
OpenMedSpanandEntityPredictionmetadata, and guidance for WebGPU, WebAssembly, GGUF, and constrained ARM devices. - Release engineering: Multilingual golden fixtures, adversarial-PHI checks, parser fuzzing, throughput and latency budgets, model-integrity verification, API compatibility output, vulnerability policy, SBOM and provenance workflows, and signed evidence contracts strengthen the release path.
Agent Skills: from a prompt to a local pipeline
OpenMed 2.0 includes a 72-skill catalog that works unchanged in Claude Code, OpenAI Codex, OpenCode, and compatible agents. The multi-agent onboarding delivered in #1866 installs every skill in one command and safely preserves existing files, directories, and unrelated symlinks.
git clone https://github.com/maziyarpanahi/openmed
cd openmed
./install-skills.shOr install for one client:
./install-skills.sh claude # ~/.claude/skills/
./install-skills.sh codex # ~/.codex/skills/
./install-skills.sh opencode # ~/.config/opencode/skills/
./install-skills.sh agents # ~/.agents/skills/Then ask the agent for a concrete local workflow using synthetic input:
Build a local OpenMed pipeline that de-identifies a synthetic discharge note and extracts medication entities. Keep the example synthetic.
The agent can combine deidentifying-clinical-text and extracting-clinical-entities into runnable OpenMed code:
import openmed
note = "Synthetic patient Jane Example (MRN 12345), seen 2024-03-02, started on metformin 500mg BID."
deid = openmed.deidentify(
note,
method="mask",
policy="hipaa_safe_harbor",
)
meds = openmed.analyze_text(
deid.deidentified_text,
model_name="pharma_detection_superclinical",
)After the one-time model download, inference runs locally. Keep real PHI out of cloud-hosted agent prompts, logs, and copied examples.
Multilingual privacy and de-identification
The language-pack catalog is now the shared source of truth for runtime routing, model-backed languages, deterministic identifier-only packs, locale capabilities, service metadata, CLI reporting, fixtures, and documentation.
Chinese processing adds word-aware Pinyin romanization, Simplified and Traditional conversion through OpenCC, source-aligned numeral parsing, mixed-variant detection, address handling, name surrogates, and tone-insensitive consistency keys. Indic processing adds native-digit folding, grapheme-safe offsets, ISO 15919 transliteration, ITRANS and Harvard-Kyoto parsing, and cross-script name linkage.
African coverage adds Hausa, Yoruba, Igbo, Swahili-oriented documentation and safety sweeps, regional locale providers, Nigerian and Nigerien identifiers, context-aware clinical patterns, and data-residency evidence. Arabic coverage gains explicit Gulf, Levant, Egyptian, Algerian, and Moroccan locale routes with conservative fallbacks.
Russian and Vietnamese receive full local PII packs, while Czech, Hungarian, and additional regional routes add validator-backed national identifiers. Pattern-only packs remain explicit about their capabilities and do not silently claim a default neural model.
Surrogate generation preserves locale and script behavior where supported, validates checksum-bearing identifiers, and maintains deterministic identity consistency without writing raw identifiers into release evidence.
Structured privacy and quasi-identifier risk
The new structured release workflow separates advisory quasi-identifier discovery from reviewed policy. Every source column requires an explicit disposition, and every materialized output is revalidated before publication.
Patient-level privacy units can span multiple rows. The risk engine supports k-anonymity, distinct and entropy l-diversity, variational t-closeness, bounded hierarchy search, whole-unit suppression, utility constraints, and conservative failure behavior.
Reference-population analysis requires an explicit caller-supplied population and explicit thresholds. It does not infer that an available table represents the attack population, and it records separate data, schema, policy, and integrity digests.
Aggregate dashboards and audit artifacts report counts, hashes, provenance, thresholds, and risk scores rather than raw quasi-identifier values. Expert attestations verify authorship and evidence binding but do not replace qualified legal, statistical, or privacy review.
Clinical extraction and interoperability
Radiology workflows can segment sections, extract findings, bind laterality, measurements, and anatomy with provenance spans, and capture only explicitly stated BI-RADS or Lung-RADS categories.
Longitudinal tooling adds deterministic near-duplicate clustering, amendment relationships, retained superseded documents, source provenance, serial measurement normalization, timeline ordering, and conservative handling for incompatible units.
Clinical relation extraction expands to Chinese and Hindi with source character offsets, assertion propagation, constrained graph decoding, and language-specific evaluation. Additional domains cover procedures, devices, pulmonology, pediatrics, immunization, flowsheets, laboratory panels, and discharge summaries.
Interoperability adapters remain optional and local. Large frameworks, licensed terminologies, gated datasets, UMLS, SNOMED CT, CPT, MIMIC, i2b2, and n2c2 assets are not bundled.
Python, service, MCP, and CLI
The documented root imports remain stable:
from openmed import OpenMedConfig, analyze_text, deidentify, extract_piiCLI commands now expose consistent --json success and error envelopes for automation while keeping human-readable output as the default.
The typed MCP registry provides annotations and structured outputs through openmed-mcp. Existing MCP clients should refresh cached schemas, and applications pinned to an older MCP runtime should retest against the new optional mcp>=1.27,<2 route.
The REST/OpenAPI contract retains the same 15 paths and 12 component schemas as v1.9.1. Regenerating clients is optional when only the release metadata is needed.
Swift, Android, browser, Node.js, and deployment
Swift OpenMedKit continues to use the repository-root package and adds watchOS and visionOS alongside iOS, iPadOS, and macOS. Span handling remains source-aligned and gains grapheme-safe parity across supported Apple platforms.
Android OpenMedKit adds OpenMedSpan, richer EntityPrediction metadata, immutable JitPack installation, and offline ONNX guidance while retaining the existing package coordinate.
The public npm package remains the unscoped openmed package and provides ESM and CommonJS exports for browsers and Node.js.
The service container, MCP container path, Compose configuration, Helm chart, multi-architecture image workflow, image SBOM, and provenance paths are synchronized on v2.0.0.
Security and hardening
- Telemetry remains off by default, runtime PHI processing remains local after explicit artifact download, and no raw PHI belongs in logs, caches, temporary files, or audit evidence.
- Model downloads and manifests gain stronger integrity, signature, digest, cache, and provenance checks.
- Mixed-script, confusable-text, direct-identifier, leakage, span-integrity, and adversarial-PHI defenses gain dedicated deterministic tests and evidence structures.
- ONNX-producing optional routes now require ONNX 1.21+ and spaCy 3.8.9+, with incompatible scispaCy and ONNX environments intentionally separated.
- Release images exclude generated SBOM, audit, vulnerability, and JavaScript dependency artifacts from their Docker build contexts.
- Dependency, license, workflow-reference, secret-scan, vulnerability, artifact-content, and reproducible-lock policies remain explicit release gates.
- Indic segmenter resources pin their ICU 57.1 source revision, use the SPDX
ICUidentifier, and carry the complete ICU notice in Python distributions
and every standalone converted-model bundle.
Compatibility and migration
The static public Python comparison against v1.9.1 records 6,050 additions, no removals, no narrowed callable signatures, and no newly deprecated symbols.
The new DEVICE canonical label is additive. Applications that treat canonical labels as an exhaustive enum or switch must add DEVICE; applications that accept arbitrary canonical-label strings require no change.
Pattern-only language packs no longer imply a neural default. Pass an explicit model identifier when combining deterministic language capabilities with model-backed inference, and validate that model against local fixtures before deployment.
The optional ONNX and multimodal routes require ONNX 1.21+ and are isolated from the scispaCy NumPy 1.x route. Applications needing both should use separate environments.
Structured-data release workflows now require explicit column dispositions and reviewed quasi-identifier policy. Existing text-only deidentify, extract_pii, and analyze_text calls are unaffected.
MCP clients should refresh cached schemas, closed label enums must recognize DEVICE, and custom CLI automation should select --json rather than scrape human-readable output.
See the complete migration guide at https://openmed.life/docs/migration/1.9-to-2.0/.
Validation completed during final release preparation
- Complete ancestry inventory: 540 commits represented, including 197 merged pull requests plus all direct, integration, and release-preparation commits.
- Python: 8,685 tests passed and 58 were skipped; the structured QI-risk scope passed 658 tests.
- Static API compatibility: 14,488 to 20,538 public symbols, 6,050 additions, zero breaking removals or narrowed signatures, and zero new deprecations.
- REST/OpenAPI: 15 paths and 12 component schemas retained; generated OpenAPI output matched the candidate checkout.
- Release suite: 71 release, provenance, policy, changelog, and workflow regression tests passed on the final local release branch.
- Documentation and examples: strict MkDocs builds, localized documentation trees, LLM documentation feeds, website checks, and structured-risk examples passed.
- Python artifacts: wheel and source distribution built successfully, passed
twine check, passed content inspection, and installed and imported successfully in clean isolated environments. - Swift: formatting, lint, resolve, build, and 70 tests passed with 14 expected local MLX-resource skips.
- Android: AAR assembly and unit tests passed.
- JavaScript: the browser and Node.js package passed 9 tests, audit with zero vulnerabilities, and dry-run packaging; the React Native package passed 4 tests, audit, and dry-run packaging.
- Helm: default and CI values passed lint and template validation.
- Security: dependency and container scanning evaluated 174 findings under repository policy with 23 accepted unfixable base-image findings and zero blocking findings.
- Container: the production image built successfully after the Docker context was reduced from 139 MB to 307 KB by excluding generated evidence and JavaScript dependencies.
- Version preflight: all 19 active release surfaces matched 2.0.0, and the v2.0.0 tag was unused locally and on origin at the time of preparation.
Registry availability, live documentation, immutable consumer coordinates, and published release assets are verified after the tag-driven release workflows complete.
Privacy and clinical boundaries
OpenMed keeps local processing as the default, but no de-identification system can guarantee zero residual risk. Validate direct-identifier recall, critical leakage, span integrity, language and script coverage, policy behavior, quantized-model deltas, and device behavior against deployment-specific fixtures before production use.
Clinical extraction is assistive software, not a medical device or a source of clinical ground truth. Outputs require qualified review and must not automatically trigger diagnosis, treatment, billing, or other clinical decisions.
Build hashes and package checksums establish artifact identity; they do not prove model quality. Model-specific evidence should be evaluated independently for each selected model, language, quantization, and runtime.
Contributor and change inventory
Thank you to every contributor whose work is included in this release. The complete pull-request and commit inventory, including every merged branch commit and every direct release-preparation commit, is recorded in CHANGELOG.md.
What's Changed
- feat: add full-width/half-width normalization with offset preservation by @pardeep-singh in #1547
- feat: add Indic native-digit folding with offset preservation by @pardeep-singh in #1548
- feat: add Unified Social Credit Code recognizer and MOD-31-3 validator by @pardeep-singh in #1596
- feat(ner): add pulmonology domain with spirometry and respiratory labels by @PouyanJay in #1595
- feat: add Estonian (et) PII language pack with isikukood validator by @PouyanJay in #1592
- feat: add Hungarian TAJ language pack by @thangldw in #1593
- feat: add Serbian (sr) PII language pack with JMBG validator by @PouyanJay in #1597
- feat: add Croatian (hr) PII language pack with OIB validator by @PouyanJay in #1598
- feat: add Bulgarian (bg) PII language pack with EGN validator by @PouyanJay in #1599
- feat: add Finnish (fi) PII language pack with HETU validator by @PouyanJay in #1600
- feat: add Czech (cs) PII language pack with rodne cislo validator by @PouyanJay in #1602
- Fix/social cards fix by @maziyarpanahi in #1612
- test(security): add telemetry-off-by-default enforcement guard (OM-099) by @PouyanJay in #1617
- feat(android): add EntityPrediction description and OpenMedSpan data model by @PouyanJay in #1613
- test: cover help for every CLI command by @ShiHuiwen-creat in #1618
- fix(clinical): scope experiencer cues across contrastive clauses (#277) by @PouyanJay in #1614
- docs: add per-language PII de-identification guide by @cycsmail in #1615
- docs: decide and document the on-device Android tokenization strategy by @PouyanJay in #1608
- docs: add Android quickstart covering setup, model load, and redaction by @PouyanJay in #1606
- feat: add Greek (el) PII language pack with AMKA validator by @PouyanJay in #1603
- feat: add Portuguese NIF validator distinct from Brazilian CPF by @PouyanJay in #1605
- test(eval): add per-language i18n golden fixtures for all wired languages by @PouyanJay in #1616
- feat: sign release distributions and attach verifiable evidence by @DrVelvetFog in #1604
- feat(locales): add regional Arabic Faker-locale overrides (OM-285) by @chawki-nasrallah in #1549
- feat: add Vietnamese PII language pack by @thangldw in #1601
- fix: raise TypeError for malformed policy argument types by @abdouloued in #687
- feat: add pediatrics growth-parameter domain to NER model and labels map by @mrfeathers in #1611
- docs/examples: add synthetic datasets walkthrough by @otmanm in #1702
- feat: add inter-annotator agreement metrics for extraction gold sets by @pardeep-singh in #1697
- feat: add synthetic multi-annotator gold corpus and consensus loader by @pardeep-singh in #1698
- feat: add gold-corpus quality report and evidence-bundle output by @pardeep-singh in #1700
- feat: add Prefect task and flow for batch de-identification by @RonitGandhi in #1716
- feat: add flowsheet and vitals time-series structurer by @pardeep-singh in #1746
- feat: add lab-panel structurer mapping results into analyte rows by @pardeep-singh in #1744
- feat: add portable Agent Skills catalog for building with OpenMed by @maziyarpanahi in #1743
- test: locate py.typed through importlib.resources by @lntutor in #1778
- fix: format skills catalog test by @maziyarpanahi in #1840
- docs: add v1 to v2 migration guide by @lntutor in #1755
- docs: define detector plugin SDK stability by @lntutor in #1762
- Add language pack registry foundation by @maziyarpanahi in #1586
- feat: add MCP console entry point by @lntutor in #1761
- feat: make language packs source of truth by @maziyarpanahi in #1844
- feat(cli): uniform --json output, error envelopes, and a tool-schema drift guard by @PouyanJay in #1780
- feat(core): add language-pack coherence validation and capability coverage by @PouyanJay in #1779
- docs: add Windows uv installation steps by @maziyarpanahi in #1845
- build: consolidate dependency updates by @maziyarpanahi in #1850
- feat: generate llms.txt and llms-full.txt by @vamshiss in #1839
- feat: add offset-safe Indic Unicode normalization by @maziyarpanahi in #1566
- Add Indic Unicode script routing metadata by @maziyarpanahi in #1573
- Script-aware span decoder for no-whitespace CJK and grapheme-cluster Indic by @maziyarpanahi in #1587
- Non-Latin-script leakage evaluation harness with per-script recall floors by @maziyarpanahi in #1588
- Add pluggable Chinese word segmentation by @maziyarpanahi in #1558
- Defend de-identification against confusable and mixed-script evasion by @maziyarpanahi in #1669
- Add token- and document-level language routing by @maziyarpanahi in #1665
- Resident ID (居民身份证) recognizer, MOD-11-2 validator, and locale-correct surrogate generator by @maziyarpanahi in #1563
- Add Chinese personal-name detection and locale-correct surrogates by @maziyarpanahi in #1564
- China PIPL de-identification policy profile by @maziyarpanahi in #1565
- Add India DPDP Act de-identification policy profile by @maziyarpanahi in #1575
- India ABDM/ABHA-aware health-record de-identification mode by @maziyarpanahi in #1576
- Add Nigeria NIN and BVN recognizers with +234 mobile prefix validation and deterministic surrogates by @maziyarpanahi in #1620
- Add Ghana Card and Kenya identity recognizers by @maziyarpanahi in #1621
- Add Swahili language pack with Sheng clinical note handling by @maziyarpanahi in #1623
- Add isiZulu and isiXhosa PII packs with South African ID validation by @maziyarpanahi in #1625
- Add MasakhaNER African-language NER evaluation suite by @maziyarpanahi in #1626
- Add South Africa POPIA policy profile by @maziyarpanahi in #1627
- Add Nigeria NDPA 2023 policy profile by @maziyarpanahi in #1628
- Add Kenya Data Protection Act 2019 policy profile (ke_dpa) with health-data handling posture by @maziyarpanahi in #1629
- feat: add de-identified DHIS2 district exporter by @maziyarpanahi in #1631
- feat(clinical): radiology report section parser with stated RADS capture by @PouyanJay in #1849
- Add resilient integrity-checked model downloads by @maziyarpanahi in #1632
- feat: add Urdu RTL PII language pack with Pakistani CNIC validation by @AlyanPremani05 in #1852
- Add CPU-only low-resource de-identification profile by @maziyarpanahi in #1634
- Add crash-safe batch checkpoints and resume by @maziyarpanahi in #1635
- Add Chinese clinical NER evaluation foundation by @maziyarpanahi in #1562
- Add Indic grapheme-safe span offsets by @maziyarpanahi in #1567
- Aadhaar recognizer hardening: Verhoeff validation, UIDAI masking rules, and checksum-valid surrogates by @maziyarpanahi in #1574
- Add synthetic India code-mixed clinical de-identification corpus by @maziyarpanahi in #1581
- feat: add Chinese and Indic optional extras by @maziyarpanahi in #1589
- Audit PII tokenizer script coverage by @maziyarpanahi in #1590
- Verify cached model artifacts and signed manifests by @maziyarpanahi in #1591
- Add South African ID and mobile phone recognizers by @maziyarpanahi in #1619
- Add Egypt and Morocco identity recognizers by @maziyarpanahi in #1622
- Amharic language pack with Ethiopic script detection and grapheme-safe offsets by @maziyarpanahi in #1624
- OpenMRS adapter: de-identify REST and FHIR2 handoffs locally by @maziyarpanahi in #1630
- Add offline installation kit builder by @maziyarpanahi in #1633
- feat: add SMS short-text de-identification by @maziyarpanahi in #1841
- Add clinical abbreviation and acronym sense disambiguation by @maziyarpanahi in #1636
- Build a shared free-vocabulary lexical matcher engine and loader registry by @maziyarpanahi in #1637
- Add tamper-evident audit chains for de-identification runs by @maziyarpanahi in #1638
- Add a HIPAA Safe Harbor attestation report generator by @maziyarpanahi in #1639
- Add clinical coreference resolution linking entity mentions and pronouns by @maziyarpanahi in #1640
- Normalize TIMEX3 temporal expressions to ISO values by @maziyarpanahi in #1641
- Render a public auto-published benchmark leaderboard from archived eval reports by @maziyarpanahi in #1642
- Add a k-anonymity engine for tabular outputs by @maziyarpanahi in #1643
- Add an eval-result provenance and reproducibility-hash ledger by @maziyarpanahi in #1644
- Add Chinese sentence segmentation honoring CJK punctuation by @maziyarpanahi in #1647
- Add Chinese terminology grounding for user-supplied dictionaries by @maziyarpanahi in #1648
- Chinese address de-identification across province/city/district hierarchy with consistent surrogates by @maziyarpanahi in #1649
- Add Chinese mobile, bank-card, and travel-document recognizers by @maziyarpanahi in #1650
- Add cross-script Indic transliteration with ISO 15919 by @maziyarpanahi in #1651
- Add Indic danda-aware sentence and word tokenization by @maziyarpanahi in #1652
- Add optional Indic NER and 11-language evaluation by @maziyarpanahi in #1656
- Add code-mixed Hinglish de-identification pipeline by @maziyarpanahi in #1658
- feat: add India health-ID de-identification mode by @maziyarpanahi in #1660
- Add India code-mixed clinical NER by @maziyarpanahi in #1661
- India AYUSH and Indian drug terminology grounding (user-supplied, license-aware) by @maziyarpanahi in #1662
- India locale-correct surrogate providers by @maziyarpanahi in #1663
- Add consistent India transliterated-name surrogates by @maziyarpanahi in #1664
- Add license-aware CMeEE and Naamapadam eval suites by @maziyarpanahi in #1666
- Multilingual surrogate framework with script-correct providers and cross-document consistency by @maziyarpanahi in #1667
- Package compact on-device segmenters for MLX, CoreML, and ONNX by @maziyarpanahi in #1668
- Bring Simplified Chinese README to full parity and add translation drift check in CI by @maziyarpanahi in #1670
- Bring Hindi README to parity with a synthetic Hinglish example by @maziyarpanahi in #1671
- docs: add China mirror and offline-cache onboarding by @maziyarpanahi in #1673
- docs: add India DPDP onboarding guide by @maziyarpanahi in #1674
- Add Chinese and Hindi de-identification examples by @maziyarpanahi in #1675
- Add multilingual de-identification Space demo by @maziyarpanahi in #1676
- Add API-surface migration completeness gate by @maziyarpanahi in #1678
- Add East African national ID recognizers by @maziyarpanahi in #1679
- Add pan-African mobile phone patterns and prefix-preserving surrogates by @maziyarpanahi in #1680
- Add M-Pesa transaction code protection for Kenya and Tanzania by @maziyarpanahi in #1681
- Add mobile-money billing reference recognizers by @maziyarpanahi in #1683
- Add Kenya KMHFL and Nigeria HFR health-facility code support by @maziyarpanahi in #1684
- Add Hausa Boko and Ajami PII pack by @maziyarpanahi in #1685
- Add deterministic radiology finding extractor by @Udaytaneja in #1855
- Yoruba language pack with combining-diacritic-safe span offsets by @maziyarpanahi in #1686
- Add Igbo language pack for Nigerian clinical text by @maziyarpanahi in #1687
- African French and Portuguese locale surrogate providers by @maziyarpanahi in #1688
- Add Egypt PDPL and Morocco Law 09-08 profiles by @maziyarpanahi in #1689
- Add Africa data-residency deployment guide and attestation reports by @maziyarpanahi in #1690
- Add African healthcare-context safety-sweep terms by @maziyarpanahi in #1691
- OpenHIE mediator packaging: run the de-identification service as an OpenHIM mediator by @maziyarpanahi in #1692
- feat: de-identify community health worker form exports by @maziyarpanahi in #1694
- feat: add WHO SMART Guidelines FHIR profile checks by @maziyarpanahi in #1695
- Add model size budget command by @maziyarpanahi in #1696
- Add Swahili README and African developer onboarding by @maziyarpanahi in #1701
- Add ARM SMS latency benchmark and budget gate by @maziyarpanahi in #1703
- Add Simplified/Traditional Chinese conversion with offset-preserving alignment by @maziyarpanahi in #1645
- Add Chinese numeral normalization for dates, IDs, and quantities by @maziyarpanahi in #1646
- Add token-level Hinglish language routing for de-identification by @maziyarpanahi in #1657
- Add Indian multi-identifier recognizer pack by @maziyarpanahi in #1659
- docs: add Chinese and Hindi site locales by @maziyarpanahi in #1672
- Harden multilingual ingestion boundaries by @maziyarpanahi in #1677
- Add offline ICD-11 MMS snapshot grounding by @maziyarpanahi in #1693
- Add mirror and proxy installation guidance by @maziyarpanahi in #1699
- Build an adversarial-PHI red-team corpus and harness for the redactor by @maziyarpanahi in #1842
- Fix PharmaDetect entity boundaries and medication filtering by @maziyarpanahi in #1858
- Add Nordic PII language packs (Swedish, Danish, Norwegian) by @maziyarpanahi in #1704
- Add GDPR and EU AI Act compliance templates by @maziyarpanahi in #1705
- Add LlamaIndex node redaction postprocessor by @maziyarpanahi in #1707
- Add a WASM/WebGPU browser inference demo and load-time benchmark page by @maziyarpanahi in #1708
- Add a synthetic gold-corpus annotation toolkit with BRAT and CoNLL IO by @maziyarpanahi in #1752
- Add ISO 27701/27001 control-evidence pack generator by @maziyarpanahi in #1753
- Add consent and data-use tag enforcement by @maziyarpanahi in #1754
- Add an AWQ grounding embedder recall gate by @maziyarpanahi in #1756
- Add a per-language leakage dashboard renderer over benchmark runs by @maziyarpanahi in #1757
- Add a discharge-summary section structurer with typed slots by @maziyarpanahi in #1759
- Add a synthetic tabular-data generator preserving column distributions by @maziyarpanahi in #1760
- Add ISCII and legacy-font Devanagari conversion by @maziyarpanahi in #1763
- Add conservative Indic morphology boundary refinement by @maziyarpanahi in #1764
- Add transliteration-robust Indian name matching by @maziyarpanahi in #1765
- feat: Added Russian (ru) PII language package by @mrfeathers in #1860
- Add optional MuRIL and IndicBERT encoder backbones by @maziyarpanahi in #1766
- feat: add scrubadub adapter to openmed.interop by @affanhamid in #1857
- feat(eval): add release-readiness gate aggregating shippability checks (#1814) by @JonthanaHanh in #1859
- Add scispaCy/QuickUMLS approximate-linker adapters by @maziyarpanahi in #1706
- Add a model-sharding and streaming weight loader for low-RAM devices by @maziyarpanahi in #1751
- Add coverage-guided fuzzing for document format parsers by @maziyarpanahi in #1846
- Add regression escape tracker dashboard by @maziyarpanahi in #1758
- Add multilingual clinical relation extraction by @maziyarpanahi in #1847
- Add Central and Eastern European PII language packs by @maziyarpanahi in #1767
- Add GGUF embedding-backbone export for grounding retrieval by @maziyarpanahi in #1768
- Add a Nix flake for reproducible builds and dev shells by @maziyarpanahi in #1769
- feat: add watchOS and visionOS OpenMedKit targets by @maziyarpanahi in #1777
- Build exact Chinese character-to-word offset mapping by @maziyarpanahi in #1865
- feat(clinical): add serial measurement and trend extractor by @PouyanJay in #1854
- feat: add procedures zero-shot domain and DEVICE canonical label by @RonitGandhi in #1885
- feat: add PySpark pandas_udf for batch de-identification by @affanhamid in #1892
- Document ONNX and WebGPU export by @alberthammerich in #1893
- Add grapheme-safe scalar span parity for Swift de-identification by @maziyarpanahi in #1869
- Add Marathi PII language pack by @maziyarpanahi in #1873
- Add a consumer agent-usage guide and ready-to-use repository skills by @maziyarpanahi in #1888
- Add Afrikaans PII language pack via Dutch pattern transfer by @maziyarpanahi in #1889
- Add CJK-aware span decoding for Chinese text by @maziyarpanahi in #1867
- Add Tamil PII language pack with native surrogates by @maziyarpanahi in #1872
- Add path-filtered CJK and Indic fixture CI job by @maziyarpanahi in #1879
- Add Chinese and Indic throughput release gates by @maziyarpanahi in #1880
- Publish Chinese and Indic PII registry metadata and model cards by @maziyarpanahi in #1882
- Ship an MCP-enabled container image and compose service by @maziyarpanahi in #1887
- Add pan-African Malabo baseline and policy coverage eval by @maziyarpanahi in #1890
- African deployment reference: facility EMR to national HMIS synthetic demo by @maziyarpanahi in #1891
- Add Pinyin romanization and deterministic Chinese name surrogates by @maziyarpanahi in #1883
- Add an Odia (or) PII language pack with native or_IN surrogates and Bengali-script confusion guards by @maziyarpanahi in #1884
- Add Assamese PII language pack with Bengali-script disambiguation by @maziyarpanahi in #1886
- feat(clinical): add longitudinal document near-duplicate hash and cop… by @eslam-ahmed43 in #1894
- docs: one-command multi-agent install and quickstart for the skills catalog by @maziyarpanahi in #1866
- Render the MCP server from the tool registry with annotations and structured output by @maziyarpanahi in #1900
New Contributors
- @PouyanJay made their first contribution in #1595
- @thangldw made their first contribution in #1593
- @ShiHuiwen-creat made their first contribution in #1618
- @chawki-nasrallah made their first contribution in #1549
- @mrfeathers made their first contribution in #1611
- @RonitGandhi made their first contribution in #1716
- @lntutor made their first contribution in #1778
- @vamshiss made their first contribution in #1839
- @Udaytaneja made their first contribution in #1855
- @affanhamid made their first contribution in #1857
- @JonthanaHanh made their first contribution in #1859
- @eslam-ahmed43 made their first contribution in #1894
Full Changelog: v1.9.1...v2.0.0