Field note · 07 Nov 2026 · ~10 min

Saturn: Personal Health System for your family

Records what the family sends, watches between visits, reviews the history, prepares the next doctor's questions.

My mother has a serious heart condition. My parents live far from good doctors. Between visits, nobody is watching.

Saturn is what I built so that someone is.

It records everything my parents send to a Telegram group, keeps one honest history, and prepares the five questions for the next visit. It does not diagnose. It does not prescribe. Doctors decide. Saturn makes sure they decide with the whole chart in front of them.

Live since 27 October 2026. Self-hosted, for one family, on free tiers and a small home server. Code is public. The data is not, and never will be.

Code on GitHub Worker, nightly batch, knowledge base, site, diagnostic loop, design records. No health data, no secrets. Thirteen weeks of days; two are marked as doctor visits; the days between carry small dots for what happened at home.Thirteen weeks of days; two are marked as doctor visits; the days between carry small dots for what happened at home.

What it has done

Ten days in. Under observation, not proven useful. That is the honest line.

The problem, in one visit

Here is how a visit goes.

Everything a doctor knows about my mother lives on slips like the one in the folder. The next doctor never sees them.

Three constraints, non-negotiable.

What Saturn is

A self-hosted home health log for one family: the household's medical record kept by the household (documents, readings, voice notes and the facts pulled from them) in a private git repository the family controls (README). One Telegram group in. One private page out. One button for the hard thinking.

Input

  • Photos of the blood-pressure monitor
  • Prescriptions and lab reports
  • Voice notes in Hindi, about the day
  • My replies to the digest

Output

  • One honest history, every fact with its source
  • A private page: this week's plan, readings, medicines
  • Five questions per doctor, in order of stakes

Side effects

  • One digest to me each night
  • Signed commits to the private records repository
  • Nothing to the family group, ever

Three things it never does: diagnose; start, stop or change a medicine; send my parents anything a template did not write. Enforced, not promised: a pattern over every line the system writes fails the run on advice wording, and the bot cannot post to the family group at all (ADR 011).

Stacked bars per day of what the family sent: photos, voice notes, documents and text.
What the family actually sends: as many voice notes as photos.
Cost tiles: zero fixed cost, under a dollar a month to run, a twelve-dollar cap per loop run.
What it costs to run.
The overview page on a phone with the This week block first; covered areas are labelled REDACTED.
The overview on a phone. "This week" is first because it is the only thing I need at 23:30.

How it works

Once a night. In order.

  1. The family sends to the Telegram group.
  2. A Cloudflare Worker stores the raw message in D1 and the media in R2. It does nothing else. Twelve lines.
  3. The nightly batch commits the raw messages first, then transcribes audio with whisper.cpp and extracts facts in one prompt-in, JSON-out turn that holds no credentials (extract).
  4. The knowledge base is rebuilt and validated. One bad row fails the build (validate).
  5. Pages are regenerated. A numbered digest comes to me. I answer "3: yes" from the phone.
  6. The private site on my home network rebuilds within ten minutes.

The parts

Everything that exists when Saturn is running: who, where, what stores what, what talks to what, and what happens when something fails.

A running Saturn as four places: the parents' home with two phones, the cloud with the Telegram group, the Worker and GitHub, the owner's home with the family site, the Mac and the phone inside a private network, and the doctor with a printed packet. Six lines with verbs join them.A running Saturn as four places: the parents' home with two phones, the cloud with the Telegram group, the Worker and GitHub, the owner's home with the family site, the Mac and the phone inside a private network, and the doctor with a printed packet. Six lines with verbs join them. Part 1 of 2.Part 2 of 2.
A running Saturn: two phones at the parents' home send photos and voice notes to a Telegram group; a Worker in the cloud stores them; a nightly batch files facts into a GitHub records repository; the home laptop, inside a private network, pulls the records, rebuilds the family site, shows it on the owner's phone and prints a packet for the doctor. The meaning: nothing in the cloud thinks, only stores; every fact is signed and checked hourly; the only machine that hears the family's voice is at home; and a bell rings if a night is missed. Design notes.

Three side jobs: a Mac that re-transcribes each voice note with speaker labels when it is awake; a review page where I correct a transcript and mark it heard; and the button that runs the loop.

The pipeline from the family's phone through Telegram, the Worker with D1 and R2, the nightly batch, the git knowledge base and the generated pages to the private site, with three side jobs.
Once a night. The Worker only stores. The batch reads, extracts and commits. Pages are rebuilt from the knowledge base. Design notes.
A synthetic daily digest message in Telegram style; the reading and the question are covered by labelled REDACTED blocks.
The digest, with made-up content and the sensitive lines covered. Every line is a template filled from facts. The numbers are what my reply goes back against.

Where the data lives

Three repositories, by content, not by path.

Three files tie them: the product declares what it needs, the env pins which product commit runs, the records name the people. Another family needs two new repositories and nothing else (ADR 008).

Three repositories, product, env and records, with the three contracts between them.
Code public, config private, data private. Three small files join them. Design notes.

One rule for the record

The knowledge base is newline-delimited JSON in git, rebuilt into SQLite every night. Three tables.

The rule: a fact is never edited. A correction is a new row that supersedes the old one: the new row points at the old one, the old one is marked superseded, nothing is deleted (schema header). A wrong reading can be shown as wrong instead of made to disappear.

Why it matters: in week one, two sources disagreed about which hand an episode had affected. Both rows are still there. One is marked superseded. The disagreement itself turned out to be the useful part, and an UPDATE statement would have erased it.

The knowledge-base model: a source produces facts of four kinds, facts refer to refs of three kinds, and a correction is a new fact that supersedes the old one.
Never edit. Add a row that supersedes. The example row is synthetic. Design notes.
Cumulative sources and facts by day, rising from 1 and 0 to 103 and 1,054 over ten days.
How the record grew, day by day.
Treemap of facts by kind, observations the largest, and refs by kind.
What the thousand facts are: mostly observations, then events, medicines and conditions.

Who may write what

Four writers touch the record: me, the nightly batch, the review page, the loop. Each machine has its own signing key. An hourly check verifies every commit and accepts each machine key only for the paths that job may write (note). None may touch a fact. My key on a commit means I approved it, and nothing else can look like that.

Hindi, on a phone, with the TV on

The voice notes carry the clinical content. When she felt low. What she ate. Which tablet she skipped. Thirty seconds to four minutes, in Hindi, at home.

A single voice-note page on a phone: audio player, editable transcript with speaker labels, two buttons. Covered areas are labelled REDACTED.
One voice note on the phone. Play it, correct the transcript, mark it heard. The batch re-reads the corrected text that night.

The loop

Recording was never the hard part. Meaning is. So, on an opt-in switch that lives in my records and nowhere in the product, Saturn runs a structured diagnostic review. The structure follows Microsoft Research's MAI-DxO (Nori et al., 2025): a panel of fixed roles that argue, with a blinded seat and a verifier. Saturn borrows the structure, not the accuracy claims.

The diagnostic-loop panel after MAI-DxO: five seats in debate, a blinded seat apart, a verifier, one inference record.
Seven seats, one record, after Microsoft Research's MAI-DxO. Every claim passes the verifier before it reaches the page, labelled agent-inferred. Design notes.
Counts of inference rows per probability bucket, active and superseded.
What the loop has written so far, by how sure it was. Most hypotheses sit in the middle buckets; that is what uncertainty looks like.

The rails matter more than the panel.

Evolution

Two weeks, seven things caught early. Each one was easy to miss.

A timeline of the system's first two weeks: live, bot out of the group, local transcription, term list, review page, loop button, endpoint lockdown.
Two weeks of catching things early. Dates are system events, not medical ones. Design notes.

How it got better

Measured, not felt. Every number below comes from the records' own evaluation files; the things I cannot measure yet are named as such.

Word error rate per engine, mean of three of the family's own clips, lower is better, with character error and key-term hits beside each bar.
Transcription error by engine on three of my mother's clips. The reconciled reading scores best, and it is also the one that once said more than she did. Small sample; it grows by one clip per correction.
A 24-hour ring of when the family sends messages, with the late-night window when the digest used to arrive.
When the family sends, and when the digest used to arrive. The gap is why the run moved to before bed.
Dot strip of hours from message to extraction on a log scale, median 2.2 hours, mean 20.8.
From message to fact. Most land within hours; the long tail is what the dead-man check and the earlier run now target.
Per active day, messages received and how many produced a fact: 41 messages, 20 with a fact.
Messages that became facts, per day: 20 of 41. Day one is zero because the bot was still learning who was who. Hand-entered documents are not counted.
Commits to the records by hand versus by machine, week one against week two.
A proxy for where the time went: commits by hand fell from 36 to 17, by machine from 21 to 12. Commits are not hours.
Cross-reference flags raised, 154, against flags acted on, zero.
Flags raised against flags acted on. The second number is measured, and it is zero. They are out of the digest until one earns its place.

What moved the needle.

Where it is going

Where it stands today, and what comes next. Ten days in; nothing here is finished.

Next, in order.

  1. Close the input loop. A document reader behind the same kind of button, so a photographed prescription becomes facts without me.
  2. Score the loop. Weekly runs, predictions scored against what doctors find. Keep it only if the calibration earns it.
  3. Give the family something back. One template line a day: received, and what to measure tomorrow.
  4. Protect the review hour. Agents produce faster than one person reads. Every new surface has to close a loop, or it does not ship.
  5. A second family. The three-repo split exists for this. It has not been tested by anyone but me.

Research this builds on

Saturn's methods lean on published work. The design record for the loop cites these; the ones that shaped it most are first.

The works that shaped it most (12)

The full list

Everything the loop's design record cites (28 more)

Grouped as the design record groups them. Accessed 31 October 2026.

Diagnosis with language models.

Failure modes.

Techniques.

Diagnostic error and the human side.

Automation bias, symptom checkers, uncertainty, the relationship.

Regulation.

The code and the design records are in the product repository. The records are not, and will not be.

Back to top · All posts