Inspiration / the problem

Whoever runs pharmacy errands for a parent on several daily prescriptions ends up at the counter every few days, and a bottle still runs out on a Saturday night. Each prescription was filled on a different day, so each runs out on a different day, every month. Reminder apps tell you when the next bottle is due. They can't make the bottles come due together.

Who it helps

Family caregivers (often students and young adults) managing a parent's or grandparent's medications, and anyone on several chronic prescriptions who wants one pharmacy trip a month instead of five or six.

What it does

You copy each bottle's label: name, how many a day, days' supply, fill date (or a pill count). Muster shows the next 90 days of pickups as dots on a timeline. Press Line them up: it finds the pickup day that needs the fewest trips, skipping days the pharmacy is closed. It works out the one-time short fills (in tablets and days) that land every bottle on that day, and the dots slide onto a single amber line. It lists each trip of the changeover, sets aside bottles that shouldn't be split (controlled substances, inhalers, pens, liquids) with the reason, estimates short-fill copays at a daily rate, and prints a one-page card to hand the pharmacist. Many pharmacies already offer this as "medication synchronization"; Muster gives you the numbers to ask for it. In the example household: 19 trips in the next 90 days become 6, then 1 trip every 30 days instead of 6.

How I built it

Plain HTML, CSS and JavaScript modules: no framework, no build step, no network calls. The planner core (public/js/muster.js) is a set of pure functions. It computes run-out days and searches every candidate pickup day in the next cycle. For each candidate it computes short fills as (pickup day − run-out) mod cycle, uses early refills for bottles due just after a pickup day, and merges short fills into shared trips with a greedy interval cover. It moves trips off closed weekdays and keeps the plan with the fewest trips, then the fewest short-fill days. 15 unit tests cover the date math and rules. A headless-Chrome script drives the demo flow three times plus edge cases (48 checks). A small Node server serves it with one command. The brand (amber prescription vial, thermal-label paper, the "muster line" of dots against a bar) uses Atkinson Hyperlegible, a typeface designed for low-vision readers, and every colour pair is checked for WCAG contrast by a script.

Challenges I ran into

A 30-day cycle drifts across weekdays, so the second pickup day landed on a Sunday even though the first didn't. I now move every trip, before and after, to the nearest open day, and I added a 4-week cycle that keeps the weekday fixed.

Naive short fills meant one extra trip per bottle during the changeover. Treating each short fill as a window and merging the windows cut the transition trips.

One of my own tests passed for the wrong reason: the brand page was serving a 404 because a folder shadowed the page, and the "no failures" check passed on an empty page. I fixed the routing and made the test count real passes.

What I learned

The most useful fix sometimes already exists (med sync) and the product is the missing step: turning it into numbers a person can bring to the counter. Deleting the problem (out-of-step dates) beats managing it (reminders). Health-adjacent tools need to show their working and say plainly what they won't do.

Accomplishments

I built a working planner that turns real label data into a pharmacist-ready plan, an animation that makes the before and after visible in one second, and an honest set of rules for what shouldn't be synced.

What's next

I want to test it with caregivers and an independent pharmacy, then add label reading from a photo (with every field confirmed by the user), calendar export of the pickup day, and several people per household.

External resources

American Pharmacists Association, Appointment-Based Model (medication synchronization) McKesson, "Med Sync 101" eCFR, 42 CFR 423.153(b)(4): Medicare Part D daily cost-sharing for less than a month's supply Fonts: Atkinson Hyperlegible (Braille Institute), IBM Plex Mono (IBM)

Built With

  • css
  • eslint
  • html
  • javascript-(es-modules)
  • node.js-(static-server
  • node:test)
Share this project:

Updates

Submission history