Project · 2026
← All workClario
Local-first symptom diary. A fine-tuned Gemma model reads the patient’s own timeline (notes, labs, photos) and flags patterns that are easy to miss in a 15-minute appointment.
Submission, Google $100K hackathon
Entity F1 0.42 → 0.71 after fine-tuning
- Python
- FastAPI
- React
- SQLCipher
- Ollama
- Gemma LoRA

Overview
Clario is a local-first symptom diary for people on a long diagnostic path. A fine-tuned Gemma model reads the patient’s own timeline and surfaces patterns across it. Data is encrypted at rest, with no account, no cloud, and no telemetry: nothing leaves the machine except a localhost call to a model the user runs themselves.
The problem
- Patients keep years of scattered data (photos, voice memos, notes) that every appointment starts without
- Health data has to stay private, so no cloud inference
- Spotting patterns that only show up over years of entries
What we built
- Fine-tuned Gemma LoRA served locally through Ollama
- FastAPI backend with a SQLCipher-encrypted database, React UI, one local process on one URL
- No account, no cloud, no telemetry by design
Results
- Fine-tuned extractor lifted entity F1 from 0.42 to 0.71 and accuracy on standard medical codes (HPO) from 0.31 to 0.66, on 200 hand-checked examples
- Submitted to the Google $100K hackathon
- Runs fully local and encrypted at rest
How it works
One local FastAPI process serves a React app on the user’s own machine. Entries (text, photos, voice memos, medical documents) go into a SQLCipher database whose key is derived from a passphrase with Argon2id.
A background worker asks a local Gemma model through Ollama to pull symptoms out of each entry, embeds them, and maps each one to a standard HPO code by vector search. The timeline becomes a graph of symptoms that co-occur or precede each other.
The extraction model is a QLoRA fine-tune of Gemma trained on about 500 synthetic diary entries and tested on held-out diseases. Red-flag questions such as dosing or emergencies are caught before the model runs. It never names a diagnosis: it answers with hedged pointers that cite the patient’s own entries.