Case study · Personal project
Asthma Log
My daughter has asthma. Between a rescue inhaler, a twice-a-day nebulizer and two parents trading shifts, the question at 2am was always the same: when did she last have it, and can she have it now? I designed and built a small web app that answers that at a glance, on any family member's phone.
The problem
Three questions, asked half asleep
Asthma medication comes with timing rules. The rescue inhaler needs at least four hours between doses. The controller nebulizer is morning and night. When two people share the job, memory and sticky notes stop working fast.
Every night came down to three questions: when was her last dose, is it too soon for another, and did she get both nebulizer treatments today? At checkups the pediatrician adds a fourth: how often is she using her rescue inhaler?
Walkthrough
A morning, start to finish
It's 7:45 and the morning nebulizer is due. Log the dose with a note, see it land in History, add a new medication, and head back to Dosage, where its card is already waiting.
The core pattern
The answer first, the form second
The app opens on a Next dose card for each medication, before any form. A medication with spacing, like the rescue inhaler, shows the earliest next dose as a day and a time: Tomorrow, 12:30am, with a Too soon or OK to give label and a countdown.
A medication on a schedule, like the twice-a-day controller, works differently. It shows whether today's doses are done and when the next one is due, for example Completed and Tomorrow, Morning. One glance, no math.
Logging
One tap, even one-handed
Each medication is a button, so logging a dose is tap, check the time, save. A floating Log dose button stays at the bottom of every screen within thumb reach, and gets out of the way when the form is already on screen.
The model separates what a medication does from how it's given. Budesonide is a controller that happens to go through a nebulizer, and that distinction drives both the schedule and the chart.
History
A week at a glance, ready for the doctor
History puts rescue and controller doses side by side for the last seven days. A day with more red than usual is easy to spot, and that's the pattern a pediatrician asks about.
Copy 30-day summary turns the log into plain text that pastes straight into a message or a patient portal.
Sharing
Anyone can look, only family can log
Everyone who opens the link sees the same live log, so a grandparent can check the last dose without calling. Logging, deleting and changing medications take a family password, entered once per phone.
The password is checked by the database's own sign-in service, and its security rules refuse any change that doesn't come from the family account. Editing the page can't get around it.
Details
Built for 2am
Most doses get logged in a dark room by someone who just woke up. The small decisions were about that moment.
- A dark mode that doesn't light up the room, with a manual switch
- Source Sans 3, a humanist sans that stays readable at small sizes, and compact times like 12:30am
- Add to Home Screen, so it opens like an app, plus offline support that syncs once the phone is back online
- A Last Dose line under the title on every tab, naming the medication and how long ago
Process
Designed and shipped in one evening
I worked with Claude as a build partner. I set the direction and made the design calls, and Claude wrote the code. The app went from first idea to a live, shared tool in about two hours and a few dozen rounds of feedback, from renaming tabs and tightening spacing to moving the password check onto the server.
It's one HTML file hosted on GitHub Pages, with Firebase for the shared database and sign-in. That costs nothing to run and leaves very little to maintain.
Front end
One HTML file with CSS and JavaScript and no build step, installable to the home screen with offline support.
Data
Firebase Firestore keeps one shared log in sync live across every phone, with offline caching.
Security
Anyone can read, and only the family account can write, enforced by Firebase Auth and database rules.
Available for work