Inspiration
Millions of people take several medicines every day, and it is easy to miss a dose or to combine drugs that interact. Some pairs are well known to be risky, like warfarin with common painkillers such as ibuprofen, which can raise the risk of serious bleeding. Most reminder apps only ring an alarm. I wanted one that also acts as a basic safety check and explains problems in plain language, without needing an account or sharing health data.
What it does
PillPal is a free web app that works on any phone and installs to the home screen.
- Add medicines by generic or brand name. Typing "Advil" or "Tylenol" maps to ibuprofen or acetaminophen.
- Checks every pair of medicines for known interactions and ranks them major, moderate or minor, each with a short explanation.
- Shows today's schedule with Taken and Skip buttons and an overdue marker.
- Sends browser notifications at dose times.
- Prints a summary to show a pharmacist.
- Works offline. All data stays in the user's own browser, with no account and no server.
PillPal is informational only. It tells users when a medicine was not checked, never says a combination is "safe", and always points people to a pharmacist or doctor.
How we built it
PillPal is built with plain HTML, CSS and JavaScript, so there is nothing to install or build. It uses localStorage for saving data, the Notifications API for reminders, and a service worker with a web manifest for offline use and home-screen install. It is hosted on GitHub Pages.
The app matches what the user types to a standard drug name, then looks up each pair in an interaction dataset of 30 drugs and 36 interactions, with severity levels and plain-language explanations. The dataset is stored as both JavaScript and JSON. I also wrote automated tests in Node.js that check the dataset for errors and duplicates, confirm the checker catches known dangerous pairs, and confirm it does not flag a pair with no entry. The design is mobile-first, with light and dark modes and large tap targets.
Challenges we ran into
- Finding interaction data. The National Library of Medicine shut down its free drug interaction API in January 2024, so there is no simple free source that gives severity levels. I built a curated dataset instead and documented where it should be verified, such as openFDA labels and DDInter.
- Matching names. People type brand names, doses and different spellings, so the app has to normalize them without guessing wrongly. Unknown medicines are shown as "not checked" instead of getting a false all-clear.
- Safe wording. In a health app, "no interaction found" can be misleading. I rewrote the messages so they never imply a combination is safe.
- Reminders without a server. Browser notifications only fire while the page is open, which limits reliability. I show overdue doses on the list as a backup.
Accomplishments that we're proud of
- A working, installable app that functions fully offline.
- Automated tests and a small evaluation of the interaction checker.
- A design that is honest about its limits, with a clear disclaimer and "not checked" handling.
- Privacy by design: nothing is collected, stored remotely or sent anywhere.
What we learned
- Free public APIs can disappear without warning, so health software needs a plan for its data sources.
- In medical tools, wording matters as much as code.
- Testing against known cases is a simple way to build trust in a small dataset.
- Offline-first design makes an app more useful for people with unreliable internet.
What's next for PillPal: Medication Reminders with Interaction Warnings
- Live drug-name lookup with RxNorm and label text from openFDA.
- Clinical review and a much larger, sourced interaction dataset.
- Caregiver sharing, so families can help older relatives manage medicines.
- Push notifications that work when the app is closed.
- More languages, and food and alcohol warnings.
- Dose-aware checks and a refill reminder feature.
PillPal is not medical advice. The interaction dataset is a small demonstration sample and has not been clinically validated.
Log in or sign up for Devpost to join the conversation.