← All posts

Build Log: My daughter's app takes the next step

July 31, 2026 · 6 min read

Build log this week. This one is personal.

In May I wrote about a medication checker I built after an ER visit. My daughter Jessie has Rett syndrome and two independent sources of a heart condition called Long QT, which makes her medication avoidance list stricter than most. A doctor wrote up Afrin. My wife caught it from the couch, from a text I sent as a status update. The first version of the checker came together in days: a chat thread that could check a drug against her profile and tell me what the QT databases said.

That version answered a question. This is what it took to build something my wife and I can run our care on.

What I built. The checker is now an agent called med-check, one of three agents inside a personal iOS app I built for our family. Same stack I use for work: Pydantic AI for the agent, Supabase for the data, a FastAPI gateway on Railway, Flutter for the app on our phones.

When I type a drug name, it runs the same check every time, in the same order. Resolve the name through RxNorm, because "the pink one the ENT mentioned" has to become one specific drug before anything else matters. Load Jessie's current medication list. Pull the FDA label and read the QT language word for word. Check CredibleMeds, the database that maintains the QT risk categories cardiologists actually use. Search the Rett-specific literature, where "nothing found" is a normal answer. Then cross-check the new drug against everything she already takes.

A full check costs about 28 cents and finishes inside the app's two-minute window. The output is a report with sources, built for one purpose: walking into a pharmacist or cardiology conversation informed.

The rule that matters most. The May version returned a verdict. I wrote that sentence myself: "it returns a verdict with sources and alternatives." Building the production version, that became the thing I had to remove.

Here is the rule, straight from the agent's instructions:

You may affirm risk. You may report absence of findings. You may never affirm safety. Never say "safe", "safe to take", "cleared", "no risk", or "fine to take".

I didn't want a tool that replaces the diligence. I wanted the first layer of it. The agent's job is to steer us toward the right questions faster, not to answer the one question that belongs to her pharmacist and her cardiology team. A "no flag found" result is not a clearance. The tool's job is the first pass, never the final word.

One rule, enforced three times. It lives in the prompt. It lives in the eval suite, where "safe to take" appearing in any test reply is an automatic failure. And it lives in the app itself: the design spec bans green "all clear" badges, because a UI can imply a verdict the agent was built to refuse.

What surprised me. The hardest engineering wasn't the medical data. It was teaching the agent to fail out loud. "No FDA label found" and "the FDA lookup failed" look identical in a chat reply, and they mean opposite things. One is an answer. The other is a broken check wearing an answer's clothes. Every tool in the agent reports those separately now, and a check that only half-ran says so.

Same discipline in the health log the agent keeps. When I note that Jessie wouldn't use her right hand at dinner, it saves those words. Not "decreased right-hand utilization." Her doctors need our observations, not our translations. And when the agent generates her emergency sheet, the one-pager for an ER team that has likely never met a Rett kid, there's a hard gate in the code: if the Long QT warning isn't copied word for word, the document does not get written. Paraphrase it and the save fails.

What we got back. Rett comes with a long list of things to hold in your head, and the constant question of whether you're holding the right ones. The agent didn't shrink the list. It took over the remembering.

We make a note in the moment and know it's saved. Appointment prep stops being an act of memory: the agent assembles the timeline from what we log, and patterns it notices go in as questions for the doctor, never as conclusions. When family comes to town to help, we can hand them a document instead of a walkthrough, including who she is beyond the diagnoses. If care details change and the documents go stale, the agent notices on its own and nudges us to regenerate them.

And we can walk into an ER with a level of certainty we didn't have before, because the checkable things have been checked.

Jessie gets more present parents because we spend less time being her database.

That's the thesis of this newsletter, running at home instead of at work: the technology handles the remembering so the humans can do the noticing. Nobody would design it the other way around. But until you build the layer, you're doing both jobs.

P.S. CredibleMeds is the rabbit hole this issue: a freely accessible, clinician-maintained list of QT-prolonging drugs at crediblemeds.org. If a database that specific exists for this, one probably exists for the thing you're navigating too. If you're building tools around a complex diagnosis, reply. I'd like to compare notes.

Get new posts delivered to your inbox.

Join Infrastructure of Belonging. On building things that matter.

Read more posts →