Local-first healthcare AI: clinical NER and HIPAA PII de-identification on hardware you control. 2,200+ medical models, 35 model-backed PII languages, and Python, MLX, Android and browser runtimes. Apache-2.0 SDK.
> /plugin marketplace add maziyarpanahi/openmed> /plugin install openmed-skills@openmed-skills
Repo: maziyarpanahi/openmed
What's inside
This iPhone example uses OpenMed's local runtime after the required model artifacts are available:
from openmed import analyze_text
result = analyze_text(
"Patient started on imatinib for chronic myeloid leukemia.",
model_name="disease_detection_superclinical",
)
for entity in result.entities:
print(f"{entity.label:<12} {entity.text:<28} {entity.confidence:.2f}")
# DISEASE chronic myeloid leukemia 0.98
# DRUG imatinib 0.95
A clinical NER model using the local runtime after its required artifacts are available.
From a source checkout, run the CPU-only synthetic contract demonstration:
python examples/v30_clinical_brief.py
# Optional: --model mlx, with the pinned model already cached on Apple silicon.
It de-identifies an embedded note, extracts and grounds a finding, then prints a cited brief, verdicts and a value-free review packet. NER/NLI providers are explicit synthetic test doubles, not trained-model or clinical validation. No external note input is accepted. The MLX option may refuse unsupported output; it never bypasses the guards. See the brief guide and demo script for the boundaries and local setup.
Start with the consumer agent-usage guide, or load the curated llms.txt documentation index. For callable local interfaces, use the MCP server, the typed tool registry, or the command-line interface. Ready-made cross-tool procedures live in the repository skills catalog.
| Deployment consideration | OpenMed SDK boundary |
|---|---|
| Core runtime | Processes locally after required artifacts are available |
| Optional network paths | Downloads, remote adapters, telemetry-enabled paths, and user integrations may use a network |
| Validation | Deployment owners validate model and dataset terms, privacy behavior, and clinical fitness |
| Interfaces | Python, Swift, Android, browser, and service surfaces where supported |
On supported Apple hardware, OpenMed can use MLX and OpenMedKit for local processing after required artifacts are available. Model acquisition and any user-configured remote integrations remain separate network boundaries.
// Add OpenMedKit to your app
dependencies: [
.package(url: "https://github.com/maziyarpanahi/openmed.git", from: "3.0.0"),
]
Expected result: Swift Package Manager resolves OpenMedKit and makes
import OpenMedKit available to your app target.
pip install --upgrade "openmed[mlx]".Guides: MLX backend · OpenMedKit (Swift) · CoreML export
OpenMedKit also ships as a native Android/Kotlin library for local document
intake, OCR handoff, PII redaction, and token-classification inference through
ONNX Runtime Mobile. Mobile model repositories include stable tensor names,
dynamic sequence axes, tokenizer files, labels, and Android-ready fp32, fp16,
INT8, and optional .ort outputs.
Add the scoped JitPack repository in settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url = uri("https://jitpack.io")
content { includeGroup("com.github.maziyarpanahi") }
}
}
}
Then use the immutable OpenMed v3.0.0 release:
dependencies {
implementation("com.github.maziyarpanahi:openmed:v3.0.0")
}
See the Android installation guide for local builds and publishing details.
val model = OpenMedKit.fromDirectory(modelDir)
val entities = model.analyzeText("Patient Alice Nguyen was seen in cardiology.")
model.onnx, model_fp16.onnx,
model_int8.onnx, tokenizer assets, labels, and openmed-onnx.json.Guides: Android ONNX export · Android span parity · OpenMedKit Android
from openmed import OnnxModel
model = OnnxModel.from_pretrained(
"OpenMed/OpenMed-PII-ClinicalE5-Small-33M-v1-onnx-android"
)
entities = model("Patient Alice Nguyen was seen in cardiology.")
npm install openmed @huggingface/transformers
import { loadOnnxModel } from "openmed";
const model = await loadOnnxModel(
"OpenMed/OpenMed-PII-ClinicalE5-Small-33M-v1-onnx-android",
);
const entities = await model("Patient Alice Nguyen was seen in cardiology.");
flowchart LR
A["Clinical text"] --> B["OpenMed<br/>(local-first)"]
B --> C["Medical entities"]
B --> D["PII detected"]
B --> E["De-identified text"]
style B fill:#0D6E6E,stroke:#0A5656,stroke-width:2px,color:#ffffff
style C fill:#D6EBEB,stroke:#0D6E6E,color:#0E1116
style D fill:#F7DCD8,stroke:#C5453A,color:#0E1116
style E fill:#F5E27A,stroke:#A9A088,color:#0E1116
Rendered result: a local clinical-text pipeline that returns medical entities, PII findings, and de-identified text without sending data to a cloud API.
The skills/ catalog ships portable Agent Skills for on-device de-identification, clinical NER, FHIR export, evaluation, and the healthcare workflows around them. The same SKILL.md folders work in Claude Code, OpenAI Codex, OpenCode, and compatible agents; the installer uses each client's skills directory plus the cross-client ~/.agents/skills convention.
git clone https://github.com/maziyarpanahi/openmed && cd openmed
./install-skills.sh # installs for Claude Code, Codex, OpenCode, and ~/.agents/skills
Then ask your agent for the pipeline using synthetic placeholders:
Build a local OpenMed pipeline that de-identifies a synthetic discharge note and extracts medication entities.
It loads the right skills and produces an on-device pipeline (openmed.deidentify(...) → openmed.analyze_text(...)). After the one-time model download, run that pipeline locally on real notes; do not paste real PHI into a cloud-hosted agent prompt. See the skills catalog and 30-second example.
# Core + Hugging Face runtime (Linux, macOS, Windows; CPU or CUDA)
pip install --upgrade "openmed[hf]"
# Add the REST service
pip install --upgrade "openmed[hf,service]"
# Apple Silicon acceleration (MLX)
pip install --upgrade "openmed[mlx]"
Expected result:
Successfully installed openmed-...
Python API
from openmed import analyze_text
result = analyze_text(
"Patient received 75mg "
"clopidogrel for NSTEMI.",
model_name=
"pharma_detection_superclinical",
)
print([(e.label, e.text) for e in result.entities])
Example output:
[('DRUG', 'clopidogrel'), ('CONDITION', 'NSTEMI')]
Showing a partial view of a very large repo.
FAQ
openmed is a Claude Code plugin with 74 hand-picked skills for security work, indexed on Flowy. Install it with the command on its page. It includes annotating-variants, ask-openmed, assembling-fhir-bundles. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it