A smart pill organiser that reads the physical act of taking medication — and an AI layer that rates it normal, risky or uncertain without ever deciding for the person.
They open the wrong compartment, take a dose twice “just in case”, or skip it and can’t recall whether they took it. A normal pill box senses none of this; a medical app demands screen attention that isn’t there in the moment. What’s needed is a physical object that understands the interaction itself — and responds clearly, without becoming a box that decides for the person.
At 19:00 “Morning” is opened instead of “Evening”. The AI sees wrong_slot + a large time delta → RISK_WARNING, and asks for confirmation rather than hard-blocking.
40 s later the same compartment is opened again. She may have forgotten she already took it → CONFIRMATION_REQUIRED: “You already took this. Take it again?”
Naming a law is easy. Below, each one is small print — the weight is on the exact decision it shaped in Drug Dozy, with the state, number or test result that proves it.
Always show the current state.
At 19:00 the EVENING lid physically pulses — light plus a soft buzzer tone — and the device ring carries one colour per state: amber “reminding”, purple “Checking…”, green “taken”. Nina reads status with no screen at all.
REMINDER_PENDING → LED pulse + toneKeep response fast and, above all, steady.
I pinned RISK_EVALUATION to a fixed ~1.5 s and captioned it “Checking…”. My usability test proved why it matters: when that time drifted, people tapped again — so the top P0 change I logged was a steady timer with a progress cue.
≈1.5 s fixed · P0 fix from testingMore options, slower decisions.
Of four compartments, only the one that’s due lights up; the other three stay dim. At intake time there is exactly one obvious action — nothing to read, nothing to choose between.
1 of 4 lit at a timeBigger, closer targets are faster and safer to hit.
The hit targets are the physical lids themselves, plus oversized “Yes / Cancel” buttons on the device. Testing with a reduced-vision participant pushed me to enlarge and boost their contrast further — logged as a P1 change.
Full lids + P1 · larger buttonsDon’t make people remember; let them recognise.
The box remembers “did I take it?” for her. Re-open the same compartment within 60 s and it asks “You already took this — take it again?” instead of leaning on Nina’s memory. Try it in the demo below.
repeat_open < 60 s → CONFIRMPrevent slips; when they happen, offer a way back.
A wrong compartment never hard-blocks. It flows RISK_WARNING → CONFIRMATION_REQUIRED, and “Cancel” returns to REMINDER_PENDING — the dose simply isn’t counted. An error is a fork, never a dead end.
wrong slot → ask → back, never blockedMatch controls to the real world.
Four physical compartments map one-to-one to MORNING / NOON / EVENING / NIGHT, laid out top-left to bottom-right in reading order. The layout is the schedule — there is nothing to decode.
4 lids = 4 times of dayWhen the smart layer fails, the core must keep working.
Flip “AI offline” in the live demo: the device drops to SAFE_MODE and the on-board RTC still reminds on schedule. The base safety of intake never depends on the cloud or the AI.
SAFE_MODE · try it in the demo ↓Calm. Waits for the time trigger, dim light.
It’s time: the active compartment pulses + soft sound.
The highlight guides the hand to the correct lid.
The AI rates the sequence: normal / risky / uncertain.
Right compartment in window — green confirmation.
A different intake was opened — enters risk evaluation.
Red signal: the action looks risky, attention needed.
Unsure — asks the person to confirm intent.
Reminder ignored past grace — a miss is recorded.
AI/network unavailable — only the base rule reminder.
The person controls directly; dose marked manually.
Event (without PII) written to the local log.
Not “the system shut down”, but deliberate safe behaviour: a simple time-based reminder stays. The screen says “Running without AI — reminding on schedule.”
The “Taken manually” button is available in any state. The person can always record a dose themselves; the log stores manual_confirmed: true.
An error is never a dead end. After a warning or a failed confirmation, the system returns to a clear state and explains the next step instead of silently blocking.
| Input (event) | Check | Decision | Action (state + feedback) |
|---|---|---|---|
| reminder_time(evening) | RTC timer, no AI | trigger | REMINDER_PENDING · pulse + sound |
| lid_opened(evening) | rule: right slot + window | normal | OPEN_CORRECT · green, logged |
| lid_opened(morning) @19:00 | AI: wrong_slot, Δ −660 | risky ≈ 0.91 | RISK_WARNING → CONFIRMATION |
| multiple_slots <10s | AI: unusual_sequence | uncertain ≈ 0.58 | CONFIRMATION · amber |
| lid_opened(evening) +40s | rule: cooldown/debounce | uncertain | “Already took this. Again?” |
| reminder_ignored > grace | rule: minutes elapsed | missed | MISSED_DOSE · notify daughter |
| confirm_pressed | person confirmed intent | override | MANUAL_OVERRIDE → OPEN_CORRECT |
| ai_unavailable / offline | gate: health-check failed | fallback | SAFE_MODE · base reminder |
| manual_override (anytime) | person controls directly | override | MANUAL_OVERRIDE · dose marked |
Dim, waiting for the time.
Compartment pulses + sound.
A hand reaches the lit lid.
Purple: system evaluating.
Green: dose counted.
Red + clarify: wrong slot.
Its input is a short structured event (expected slot, opened slot, time delta, opens in 10 min, whether there was a miss); its output is one of three verdicts with a confidence and a reason. Rule gates run BEFORE the AI; it only runs when the case isn’t trivially right or wrong. On low confidence it asks the person — it never secretly decides.
Confirms quietly, green.
Warns + requires confirmation.
Asks — doesn’t decide alone.
“Edge” means the logic runs on the device itself — locally and offline — instead of in the cloud.
Medication-intake data is sensitive, so each threat gets a concrete mitigation — not just “encrypt everything”.
The log stores only slot-id + time + risk rating. No medication names, dosages or diagnoses — data minimisation.
Edge-first — all base logic on the device. Sync is optional, anonymised, over TLS. Offline it’s fully functional.
Explicit consent at setup; the push carries the minimum — “evening intake missed”, no medication details.
The log is anonymised and low-value alone; the key stays on-device, retention limited (~30 days) with auto-purge.
Thresholds + a confirmation step, no auto-escalation; escalation only on repeated risk or a miss.
The right to view and delete the log, and to turn off caregiver notifications and sync at any time.
Pick the active time of day, fire the reminder and open a compartment. The verdict and confidence are computed deterministically by the rules above. Try the five scenarios in the hints.
Each participant got 4 tasks (normal intake, wrong compartment, repeat, offline) and had to act with no instruction. I recorded success, time, errors, repeats and whether they understood the state.
| Participant | Success | Time | Wrong opens | Repeats | Understood? | Confidence |
|---|---|---|---|---|---|---|
| Mari | 4/4 | ~7 s | 0 | 0 | yes | 5 |
| Pavlo | 4/4 | ~12 s | 1 | 0 | partly | 4 |
| Sashko | 3/4 | ~18 s | 2 | 1 | partly | 3 |
A ~1.5 s average delay is fine on its own. The key thing: when RISK_EVALUATION occasionally took longer, people started pressing again. It’s not the average but the variability of response (jitter) that most destroys the sense of control — so the evaluation time must stay steady, even if that means showing progress.
The AI should ask, not decide silently — that’s the main ethical line, and it’s what earns trust.
Physical feedback (light + sound + touch) reads faster than any screen — the whole product rests on it.
Privacy by default: a log without medication names is both enough and safe. Predictability beats “magic”.