OpenMed 1.8.0 is the cross-platform runtime, production service, privacy coverage, clinical extraction, and release-evidence release.
This release extends the v1.7 multimodal and browser foundation into a coordinated Python, Swift, Kotlin/Android, TypeScript, React Native, browser, REST, gRPC, and deployment surface. It also adds deeper clinical terminology and event extraction, broader multimodal privacy coverage, stronger privacy gates, and supply-chain evidence for containers and releases.
Release date: 2026-07-09.
Release target: release/openmed-180 at cdee44e77662c74c68967ec38f4a5b29ce4ec105.
Previous release: v1.7.0 at 82dece146bed8bbbae7fc731afee1448534b2b29.
Highlights
- Added Android OpenMedKit: Gradle project setup, Kotlin API types, span merger, BIO/BIOES decoder, ONNX and ORT Mobile inference, ML Kit OCR adapter, model catalog/download cache, document/image intake, Compose and scan demos, Android CI, parity fixtures, and guarded Maven Central publishing.
- Added browser and mobile JavaScript runtimes: typed OpenMedKit web package, ONNX Runtime Web loader for WASM/WebGPU, React Native bridge, TypeScript client parity, Swift-Kotlin API parity checks, and public runtime surface snapshots.
- Hardened production service paths with API-key/JWT authentication, request IDs, no-PHI JSON logging, OpenTelemetry tracing, gRPC, async jobs, webhooks, Helm deployment, multi-arch images, circuit breakers, retries/backoff, metrics, warm pools, batching, coalescing, priority queues, backpressure, and graceful readiness/liveness handling.
- Expanded structured and batch privacy pipelines across SMART-on-FHIR bulk ingestion, object storage, Spark, Dask, DuckDB, pandas, polars, lakehouse tables, streaming columnar redaction, dbt/warehouse redaction, and privacy-gateway redaction before external model calls.
- Added multimodal privacy coverage for DOCX text offsets, plain-image redaction, DICOM headers, burned-in DICOM pixel OCR redaction, redacted-PDF text-layer fidelity checks, EPUB extraction, vCard/iCalendar redaction, and PHI-safe document examples.
- Added new identifier coverage: UK NHS/NINO, IBAN, SWIFT/BIC, ICAO passport/MRZ, and validator-backed national-ID support for Slovak, Latvian, Malay, Filipino, and Danish locales. The model-backed PII language allow-list remains the 15 codes in
openmed.core.pii_i18n.SUPPORTED_LANGUAGES. - Deepened clinical extraction with normalized timelines, document assertion graphs, clinical event frames, medication attribute relations, coreference, concept normalization, UCUM units, free vocabulary grounding, RxNorm, ICD-10-CM, HPO, CodeableConcept export, OMOP CDM loader foundations, GDPR DSAR exports, and expanded domain label maps.
- Strengthened evaluation and release evidence with streaming token classification, speculative MLX PII decoding, QLoRA smoke recipes, leakage-weighted distillation, ONNX/Core ML/OpenVINO optimization, paged KV-cache attention, memory-budgeted scheduling, benchmark ledgers, active-learning queues, hard-negative mining, cross-lingual transfer gates, model-card/datasheet generation, flakiness control, conformal calibration/abstention, mobile performance benchmarks, comparator matrices, load tests, and training provenance gates.
- Added release and supply-chain hardening: trusted publishing, SLSA provenance, image signing, container SBOMs, vulnerability gates, baseline-aware secret scanning, pre-commit scanning, reproducible release metadata, and static OpenAPI version-surface checks.
Platform Runtimes
Android and Kotlin
Android is now a first-class OpenMedKit target. The release adds a standalone Gradle project, Kotlin API types, de-identification engine, token decoder, semantic-unit merger, ONNX token classifier, ORT Mobile export path, ML Kit OCR adapter, model catalog, offline cache manager, document/image intake, Compose demo, scan demo, parity fixtures, and Android CI.
Users building mobile apps can validate Python-to-Android span equivalence, exercise model download/cache behavior, and prepare AAR publishing through the guarded Central Portal workflow.
Browser, TypeScript, and React Native
The JavaScript surface moves beyond static export. The new typed web package wraps token-classification decoding and ONNX Runtime Web loading for WASM/WebGPU. React Native gains a bridge for on-device de-identification, and client parity tests keep generated REST client surfaces aligned with the committed OpenAPI document.
Swift and Apple
The Swift package remains the Apple-native surface. v1.8.0 adds Swift-Kotlin API parity checks, mobile benchmarking, Core ML residency gates, ONNX/Core ML optimization checks, and the OPENMED_MLX_MMAP toggle for debugging eager vs. memory-mapped MLX weight loading.
Service, Deployment, and Operations
The FastAPI service gained production controls around identity, observability, scale, and failure handling.
- API-key and JWT authentication middleware
- request correlation IDs and no-PHI JSON logging
- OpenTelemetry tracing with PHI-safe span attributes
- gRPC protobuf contracts and generated stubs
- async jobs and webhook callbacks for long-running de-identification
- priority queues, backpressure, dynamic batching, and request coalescing
- circuit breakers and retry/backoff around model loading and inference
- Helm deployment, multi-arch container builds, hardened distroless images, container SBOMs, signed images, SLSA provenance, and vulnerability scanning
Batch and data-platform integrations expanded through object-storage runners, SMART-on-FHIR bulk ingestion, Spark structured streaming, Dask accessors, DuckDB UDFs, pandas/polars accessors, streaming columnar redaction, lakehouse column redaction, and a dbt-style warehouse transformation package.
Privacy and Multimodal Coverage
v1.8.0 broadens both file-format and identifier coverage.
- DOCX text extraction with offset maps
- plain-image pixel redaction
- DICOM header de-identification and burned-in pixel OCR redaction
- redacted-PDF text-layer leakage and visual fidelity verification
- EPUB text extraction with inline whitespace preservation
- vCard and iCalendar PHI redaction
- UK health identifiers, IBAN, SWIFT/BIC, passport/MRZ, and validator-backed locale ID packs
The per-language PII extraction API still uses the 15 model-backed SUPPORTED_LANGUAGES entries: ar, de, en, es, fr, he, hi, id, it, ja, nl, pt, te, th, and tr. New validator-backed ID coverage is exposed through locale and national-ID provider paths where those languages are marked as ID-only.
Clinical Extraction and Interop
Clinical extraction moved from individual helpers toward a richer structured layer.
- normalized timeline resolution
- clinical event frames for medication and lab trends
- document assertion graph reconciliation
- medication attribute relation decoding
- clinical coreference and entity linking
- pluggable terminology concept normalization
- UCUM measurement normalization
- RxNorm, ICD-10-CM, and HPO linkers
- CodeableConcept builders and span mapping
- deterministic note-to-CDM extraction and OMOP CDM loader foundations
- GDPR DSAR subject-access exports
- severity/laterality, genomic variant, gastroenterology, endocrinology, nutrition/diet, anesthesia, and multilingual context cue coverage
Evaluation, Models, and Release Evidence
This release adds evidence infrastructure for model quality, privacy leakage, and reproducibility.
- streaming token classification and speculative MLX PII decoding
- QLoRA smoke recipe gate and leakage-weighted distillation primitives
- ONNX graph optimization, dynamic-shape validation, ORT Mobile, OpenVINO, Core ML residency, and ARM INT8 recall certification
- paged KV-cache attention and memory-budgeted model scheduling
- benchmark run ledger, comparator matrix runner, load-test harness, and mobile performance benchmark runner
- active-learning gate failure queues, context masking, and hard-negative mining
- cross-lingual transfer evaluation, multilingual context cues, and lexical grounding aliases
- model-card/datasheet generation from provenance-hashed evaluation artifacts
- flakiness quarantine, conformal calibration, conformal abstention, and training provenance reproducibility gates
Fixes and Hardening
Key fixes include replacing optimizer-stripped bare assert statements with explicit exceptions, adding explicit UTF-8 handling in MLX/Core ML and other file/subprocess paths, guarding JSON decoding and malformed manifest logging, chaining re-raised exceptions cleanly, pinning MLX Swift for iOS builds, fixing multilingual test span offsets, constraining DSAR matching by vault key, adapting HPO linker tests to the vocabulary loader, keeping Pages deployments from canceling in-progress docs publishes, and completing F401/F541 cleanup after the large v1.8 merge train.
Security
v1.8.0 adds and strengthens no-raw-PHI logging, offline mode socket blocking, privacy-gateway redaction before external LLM calls, policy compiler coverage proofs, DP surrogate budgeting, k-anonymity/l-diversity/t-closeness enforcement, membership-inference defenses, adversarial de-identification robustness, federated leakage evaluation, secret scanning, pre-commit hook scanning, and vulnerability gates.
Migration Notes
- Update package references from
1.7.0to1.8.0in Swift Package Manager, Docker image tags, Helm values, and deployment runbooks. - The Python package version is
1.8.0; the committed OpenAPI spec is regenerated fromopenmed.__version__and reports1.8.0. - Helm defaults now use image tag
1.8.0and chartappVersion: "1.8.0". - Swift demo bundle versions are updated to
1.8.0. - The model-backed PII language allow-list remains 15 codes:
ar,de,en,es,fr,he,hi,id,it,ja,nl,pt,te,th, andtr. Additional locale work in this release adds validator-backed national-ID paths rather than full default PII model entries for every new locale. - Service operators can adopt auth, tracing, batching, coalescing, metrics, and Helm settings independently. Review
docs/serving/anddocs/deploy/helm.mdbefore enabling them in production. - Android, browser, and React Native paths now have runnable packages and parity tests, but mobile apps should still validate target-device performance, model cache behavior, and redaction quality with local synthetic fixtures before release.
- New privacy-gateway paths are designed to redact before external model calls; they do not change the local-first default for PHI workflows.
Release Evidence
- Release branch:
release/openmed-180 - Release target commit:
cdee44e77662c74c68967ec38f4a5b29ce4ec105 - Last release tag:
v1.7.0at82dece146bed8bbbae7fc731afee1448534b2b29 - Total commits reviewed since
v1.7.0: 434 - Merge commits reviewed: 223
- Non-merge commits reviewed: 211
- First-parent commits reviewed: 79
- First-parent merge commits reviewed: 41
- Unique PR links in GitHub generated notes for
v1.7.0...v1.8.0: 144 - Aggregate diff reviewed: 631 files changed, 114,993 insertions, 1,396 deletions
Validation
scripts/release/check_release_version.py --version 1.8.0scripts/release/check_repo_policy.pyuv lock --checkmake lintmake format-checkmake docs-build.venv/bin/python -m pytest tests/ -q(3915 passed, 37 skipped)make buildswift testinswift/OpenMedKit./gradlew :openmedkit:assembleDebug :openmedkit:testDebugUnitTest --stacktraceinandroidnpm testinjs/openmedkit-webnpm testinjs/openmedkit-react-nativescripts/export_openapi.pygit diff --check- Hugging Face Space visibility safety scan
Non-blocking validation notes: MkDocs reports existing docs pages that are intentionally not in nav, Swift skips local MLX artifact smoke tests when private local artifacts are not configured, Gradle reports deprecation warnings from the current Android toolchain, and the web package has one low-severity dev-only esbuild audit advisory while production npm dependencies report zero vulnerabilities.
What's Changed
- fix(mlx,coreml): add encoding='utf-8' to open() calls in model conversion and inference by @AlexFucuson9 in #1094
- fix(core,processing): add 'from e' to re-raised exceptions and remove redundant IOError by @AlexFucuson9 in #1096
- fix: replace bare assert with proper exceptions in production code by @AlexFucuson9 in #1091
- fix(core): guard json.loads against JSONDecodeError in manifest parsing by @AlexFucuson9 in #1095
- Add Slovak PII language pack by @alberthammerich in #1093
- feat: add Latvian (lv) PII language pack with personas kods validator by @prakashiitp in #1098
- load-test harness by @coolstick784 in #1097
- feat: add nutrition_diet domain to NER catalog and label maps (#951) by @AlyanPremani05 in #1087
- fix: pin mlx-swift for iOS builds by @maziyarpanahi in #1100
- Scaffold the android/ Gradle project and openmedkit Kotlin library module by @maziyarpanahi in #1114
- Create a versioned agent tool-schema registry by @maziyarpanahi in #1081
- Add an Android-tuned ONNX export profile for token-classification families by @maziyarpanahi in #1117
- Add Android ML Kit OCR adapter by @maziyarpanahi in #1124
- Add Pandas and Polars deidentify accessor by @maziyarpanahi in #1109
- Migrate PyPI publishing to OIDC trusted publishing with signed attestations by @maziyarpanahi in #1104
- Add multi-arch amd64/arm64 container builds with manifest lists in CI by @maziyarpanahi in #1138
- Add Gradle build config and version catalog for the android/ project by @maziyarpanahi in #1115
- Build Android model catalog from manifest by @maziyarpanahi in #1156
- docs: cover v1.6 and v1.7 release features by @maziyarpanahi in #1145
- Add Android CI workflow for build and Robolectric unit tests on PRs by @maziyarpanahi in #1155
- Enforce no-raw-PHI logging guard by @maziyarpanahi in #189
- Add the free-text dataset-redaction runner over CSV/JSONL/Parquet rows by @maziyarpanahi in #352
- Add the public OpenMedKit Kotlin API mirroring the Swift surface by @maziyarpanahi in #1119
- Add Malay MyKad detection and anonymization support by @Binary67 in #1163
- Add OPENMED_OFFLINE local-only mode with a socket-blocked CI test by @maziyarpanahi in #190
- Add anesthesia domain label map and tests by @kashvipeehu24 in #1160
- Wire the openmed benchmark CLI command into the eval harness by @maziyarpanahi in #209
- Add DICOM header de-identification per PS3.15 by @maziyarpanahi in #1106
- Add DuckDB scalar UDFs for de-identification by @maziyarpanahi in #1110
- Publish an npm package wrapping the Transformers.js export with a typed de-identify API by @maziyarpanahi in #1132
- Complete l-diversity metric selection for tabular risk reports by @maziyarpanahi in #1169
- Add request correlation IDs and structured no-PHI JSON logging to the REST service by @maziyarpanahi in #1176
- Add draft-model speculative decoding for on-device PII generation by @maziyarpanahi in #1003
- Add QLoRA offline recipe scaffold and synthetic smoke corpus by @maziyarpanahi in #1009
- Add leakage-weighted distillation loss primitives by @maziyarpanahi in #1014
- Build a joint span-pair relation decoder for medication attribute linking by @maziyarpanahi in #1019
- Reconcile section-scoped assertion axes into a document assertion graph by @maziyarpanahi in #1025
- Add concept normalization with a pluggable terminology backend and caching by @maziyarpanahi in #1026
- Add DP surrogate budget accountant by @maziyarpanahi in #1034
- Implement a corpus-level re-identification risk upper-bound estimator with provable k-anonymity, l-diversity, and t-closeness enforcement by @maziyarpanahi in #1035
- Add membership-inference defense and trained-attacker evaluation by @maziyarpanahi in #1037
- Add reversible pseudonymization with a rotating surrogate vault by @maziyarpanahi in #1048
- Add benchmark run ledger schema by @maziyarpanahi in #1054
- Build PHI-free gate failure labeling queue miner by @maziyarpanahi in #1062
- Generate model cards and datasheets from eval artifacts with provenance hashing by @maziyarpanahi in #1065
- Extract n-ary clinical events for medication changes and lab trends by @maziyarpanahi in #1086
- Add plain-image PNG/JPEG/TIFF PHI redaction with pixel box drawing by @maziyarpanahi in #1108
- Add UK NHS Number and National Insurance health-ID validators by @maziyarpanahi in #1112
- Port the de-identify engine with mask, remove, replace, and hash actions by @maziyarpanahi in #1120
- Port the BIO/BIOES token-classification decoder to Kotlin by @maziyarpanahi in #1121
- Add a privacy-gateway pipeline that de-identifies text before external model calls by @maziyarpanahi in #1127
- Add log-pipeline redaction filter by @maziyarpanahi in #1136
- Convert Android ONNX models to ORT mobile format with a minimal-build op config by @maziyarpanahi in #1146
- Add a Python-to-Android span parity validation test for exported models by @maziyarpanahi in #1148
- Add on-device document and image intake to text with offsets for the Android library by @maziyarpanahi in #1150
- Add container image signing and verification with sigstore in CI by @maziyarpanahi in #1153
- Add Android model download and offline cache manager by @maziyarpanahi in #1161
- Add Maven Central (Central Portal) AAR publishing workflow with signing and guarded release by @maziyarpanahi in #1162
- Add the [grounding] extra and a free vocabulary loader by @maziyarpanahi in #1170
- Add DICOM burned-in pixel-text OCR redaction by @maziyarpanahi in #1174
- Add an ONNX Runtime Web loader supporting wasm and WebGPU backends by @maziyarpanahi in #1178
- Add core policy compiler coverage proofs by @maziyarpanahi in #1047
- Add React Native bridge for on-device de-identification by @maziyarpanahi in #1177
- Build streaming incremental token-classification inference by @maziyarpanahi in #1002
- Add ONNX graph optimization, operator fusion, and dynamic-shape handling for token-classification export by @maziyarpanahi in #1015
- Build a memory-budgeted multi-model scheduler with hot-swap and eviction by @maziyarpanahi in #1018
- Build document-level coreference and entity linking for clinical mentions by @maziyarpanahi in #1022
- Build a UCUM measurement and unit normalization engine with range reasoning by @maziyarpanahi in #1027
- Create an adversarial de-identification robustness trainer and evaluator that hardens recall against obfuscation, typo, and format attacks by @maziyarpanahi in #1036
- Implement a federated leakage-evaluation harness that runs untrusted detectors out-of-process and bounds information escaping the boundary by @maziyarpanahi in #1043
- Mine hard negatives at corpus scale with dedup and difficulty scoring for the gate fixture set by @maziyarpanahi in #1063
- Add deterministic note-to-CDM extraction and concept mapping by @maziyarpanahi in #1079
- Add a stateful multi-step workflow orchestration tool to the MCP server by @maziyarpanahi in #1084
- Add DOCX text extraction with char-offset map by @maziyarpanahi in #1107
- Port the semantic-unit span merger and overlap resolution to Kotlin by @maziyarpanahi in #1116
- Add Android ONNX token classifier by @maziyarpanahi in #1118
- Add Android Compose de-identification demo by @maziyarpanahi in #1122
- Add Swift-Kotlin OpenMedKit API parity checks by @maziyarpanahi in #1123
- Add agent-framework tool adapters generated from the registry by @maziyarpanahi in #1126
- Add a Helm chart for deploying the de-identification service on Kubernetes by @maziyarpanahi in #1131
- Generate a CycloneDX SBOM for the container image and attach it to releases by @maziyarpanahi in #1144
- Add Android scan demo with CameraX OCR and de-identification by @maziyarpanahi in #1149
- Calibrate decision thresholds under distribution shift with coverage-guaranteed conformal bands wired into the gates by @maziyarpanahi in #1055
- Add API-key and JWT authentication middleware to the service by @maziyarpanahi in #1139
- Add INT8 dynamic quantization for ARM with per-family recall-delta certification by @maziyarpanahi in #1147
- Evaluate cross-lingual transfer and zero-shot language generalization by @maziyarpanahi in #1064
- Add longitudinal corpus model and linkage upper-bound estimator by @maziyarpanahi in #1042
- Add a gRPC service with protobuf contracts for de-identify, analyze and extract by @maziyarpanahi in #1129
- Add a container and dependency vulnerability scan gate to CI by @maziyarpanahi in #1141
- Implement a normalized clinical timeline engine with relative-date resolution by @maziyarpanahi in #1105
- Optimize CoreML Neural Engine residency with fp16 and palettization plus parity gates by @maziyarpanahi in #1016
- Add SLSA build-provenance attestation for release artifacts in CI by @maziyarpanahi in #1154
- Control multi-seed variance and quarantine unstable gates with a flakiness controller by @maziyarpanahi in #1066
- Add an async job-queue API with webhook callbacks for large batch de-identification by @maziyarpanahi in #1130
- Add a Structured Streaming sink that de-identifies micro-batches to a target table by @maziyarpanahi in #1133
- Add an IBAN and SWIFT/BIC financial-identifier detector with ISO 7064 validation by @maziyarpanahi in #1128
- Add a hardened distroless production Dockerfile for the service by @maziyarpanahi in #1143
- Add a comparator benchmark matrix runner across interop adapters by @maziyarpanahi in #1113
- Add a Dask DataFrame accessor and map_partitions de-identification helper by @maziyarpanahi in #1152
- Add an OpenVINO export target and inference runtime by @maziyarpanahi in #1151
- Add a SMART-on-FHIR backend service with bulk-export ingestion at population scale by @maziyarpanahi in #1080
- Add object-storage batch de-identification runner for S3, GCS and Azure Blob by @maziyarpanahi in #1175
- Add circuit-breaker and retry with backoff around model load and inference by @maziyarpanahi in #1140
- Add a streaming columnar redactor with quasi-identifier profiling by @maziyarpanahi in #1179
- Build a privacy-gateway proxy that redacts before an external LLM and re-identifies after by @maziyarpanahi in #1082
- Add OpenTelemetry distributed tracing with no-PHI spans to the service by @maziyarpanahi in #1180
- feat: add per-label reliability and calibration curves to the eval harness by @pardeep-singh in #1164
- feat: add deterministic severity/laterality modifier extractor by @pardeep-singh in #1167
- feat: add clinical-genomics variant-mention domain with HGVS-style descriptor labels by @pardeep-singh in #1166
- Add Filipino PII language pack by @alberthammerich in #1171
- feat: add endocrinology zero-shot domain by @coolstick784 in #1184
- feat: add GDPR DSAR subject-access export helper by @pardeep-singh in #1183
- feat: add ICAO 9303 passport/ID MRZ detection with check-digit validation by @pardeep-singh in #1142
- feat: add negation-scope boundary detector for clinical spans by @pardeep-singh in #1182
- docs: add automated clinical domains markdown generator and doc-drift test by @SamBradley2024 in #961
- feat(examples): add interactive Gradio de-identification demo by @DrVelvetFog in #1023
- feat(mlx): add OPENMED_MLX_MMAP toggle for memory-mapped weight loading by @DrVelvetFog in #1024
- feat: add the RxNorm approximate-match linker for medication spans by @pardeep-singh in #1134
- feat: add the ICD-10-CM diagnosis linker for condition spans by @pardeep-singh in #1135
- feat: add the FHIR CodeableConcept builder and codes->span mapping core by @pardeep-singh in #1137
- feat: add the HPO phenotype linker for clinical-finding spans by @pardeep-singh in #1165
- Add a table-format column-level redaction job for lakehouse tables by @maziyarpanahi in #1185
- Add deterministic content-addressed sharding for batch de-identification by @maziyarpanahi in #1074
- Add exactly-once checkpointing and replay to the streaming de-identification connector by @maziyarpanahi in #1067
- Add a per-device throughput and latency benchmark runner by @maziyarpanahi in #1172
- Add conformal abstention risk control by @maziyarpanahi in #1056
- Add priority queues and backpressure to the async inference server by @maziyarpanahi in #1085
- Implement paged KV-cache attention for long clinical notes by @maziyarpanahi in #1017
- Add epub support by @Binary67 in #1186
- Feature/gastroenterology -i 894 by @VishnuPrasath-S-20 in #1187
- Add Danish PII language pack by @alberthammerich in #1173
- Add redacted-PDF text-layer leakage and visual fidelity verification by @maziyarpanahi in #1188
- Add a warehouse transformation package with a redaction model and macro by @maziyarpanahi in #1189
- fix: correct off-by-one span offsets in multilingual PII regression tests by @AlexFucuson9 in #1181
- Add zero-shot NER how-to docs link by @Binary67 in #1190
- fix: keep Pages deployments from cancelling by @maziyarpanahi in #1194
- fix: remove f-string placeholders and unused imports (F541, F401) by @AlexFucuson9 in #1158
- Add multilingual ConText cue lexicons by @maziyarpanahi in #1219
- Add training provenance reproducibility gate by @maziyarpanahi in #1220
- OM-751a: Add cross-lingual lexical grounding aliases by @maziyarpanahi in #1292
- Add OMOP CDM loader foundation by @maziyarpanahi in #1299
- vCard and iCalendar PHI redaction by @Binary67 in #1406
- Add secret scanning workflow and baseline by @Binary67 in #1405
- fix: replace bare asserts with explicit exceptions in service layer by @AlexFucuson9 in #1404
New Contributors
- @AlyanPremani05 made their first contribution in #1087
- @Binary67 made their first contribution in #1163
- @SamBradley2024 made their first contribution in #961
- @DrVelvetFog made their first contribution in #1023
Full Changelog: v1.7.0...v1.8.0