Skip to main content
Try data standardization with one command, or start the full app for document processing and health questions. To explore a synthetic health record before installing, open the Mirobody Web demo.

A · Use the library

Install uv, then run:
uv downloads Python and dependencies as needed. After the initial download, name and unit resolution work offline, with no model, API key or database.

Blood-test names in Chinese and Japanese resolve to the same LOINC code; a broad category is left unresolved

血红蛋白 and ヘモグロビン both resolve to LOINC 718-7. The broad category 血脂 is left unresolved to avoid assigning a code for the wrong test. For Python 3.12+ projects, install the library:
Include units when resolving readings: they can change which code applies. The base library depends only on numpy. It also imports Apple Health exports:
For PDFs, photos and spreadsheets, install pip install 'mirobody[parse]' and configure a model API key. For an MCP client, run uvx --python 3.12 mirobody mcp: vocabulary tools work offline over stdio; the document tool standardize_report requires [parse] and a model key. See standardization.md for symptom and diagnosis coding, unit conversion and FHIR output, or try the scripts in examples/.

B · Start the full app

The app includes the web client, server, background worker and Postgres with pgvector. Choose a cloud or local setup.

Try it in Codespaces

Open in GitHub Codespaces Create a codespace and wait for automatic setup to finish in its terminal. Open the HTTPS setup link it prints and enter your own model API key, such as OpenRouter or OpenAI. The setup page verifies it with a real request. Port 18060 is forwarded privately by default. The app and records are stored in GitHub’s cloud; documents and questions sent for model processing go to your model provider. Use the supplied synthetic data for this trial. Codespaces billing and model charges apply. Stop the codespace when finished; reopening it starts the app again.

Run it 100% locally

With Git, OpenSSL and Docker Compose installed:
Use a machine with 16 GB RAM and allocate at least 8 GB to Docker. No GPU or model API key is required. On Windows, run these commands in WSL 2. The first start downloads images and model weights; subsequent document and model processing stays on your machine. CPU responses can take minutes. See local-models.md for Mac and GPU setup. The script generates secrets in .env, selects the local models and prints the app link. The prebuilt image includes the LOINC bundle, so Git LFS is not needed for Docker deployment. To use a cloud model, run ./deploy.sh without a local profile. Open the setup link at http://localhost:18060 and enter a model API key. Records stay on your host; documents and questions sent for model processing go to that provider.

Sign in and try an upload

On the Email code tab, sign in as you@mirobody.ai with code 111111. No mail service is needed. Ask “How has my cholesterol changed?”, then upload a synthetic file from demo/upload/ on the Data page. Those files are not included in the seeded records, so uploading one tests document processing. Before the first start of a deployment for real data, set SEED_DEMO_DATA=false. Otherwise the app creates the two public demo accounts. You can also put a model key in .env: OPENROUTER_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY or ANTHROPIC_API_KEY. Use <PROVIDER>_BASE_URL for an OpenAI-compatible gateway. config.llm.yaml lists the variable each entry reads; store secrets in the environment, not that file. After changing .env, run docker compose up -d; restart does not reload it. Check the selected models and send a test request to each:

C · Develop from source

Start Postgres with pgvector, or use an existing instance:
From another terminal:
The response includes version. Run dev from the repository root to serve the web client in frontend/ alongside the API. The Python package alone does not include the web client. dev generates temporary secrets. To preserve sessions and encrypted configuration across restarts, set JWT_KEY and CONFIG_ENCRYPTION_KEY. For deployment, serve reads the shipped configuration and config.{ENV}.yaml and expects persistent secrets. On Debian or Ubuntu, scripts/install_native.sh installs PostgreSQL, pgvector and a Python environment without Docker; scripts/start_native.sh starts the worker and server on port 18060.

Troubleshooting

Next

Use the self-host guide for deployment, walkthrough.md for an app tour, or provider-setup.md to connect Garmin, Oura or Whoop. For development, see repository-layout.md and pipeline.md.