Inspiration Caregivers worry about two things: did they take it? and did they take the right one? Pill bottles look alike, doses get doubled or skipped, and the person responsible often finds out hours later, or when the bottle is empty. We wanted a bottle to be checkable by holding it up, with the caregiver told the moment something goes wrong.

What it does MedCheck has a patient phone and a caregiver phone.

The patient holds a bottle up to the camera. MedCheck reads the label, matches it against the prescription, and says whether it is the right medicine, at the right time, at the right strength. A scan never records a dose. The patient confirms with I took it or Skip. A bottle that is not due yet, the wrong strength, or not a tracked medicine gets a red Don't take this yet warning. The caregiver phone pops up when a dose is taken, skipped, missed or late, when a wrong bottle is caught, and when pills are running low. Skipped and missed doses are saved on the hub, so the web dashboard shows them too. How we built it iOS app (SwiftUI): one app with a patient/caregiver mode, camera scanning, and in-app pop-ups with local notifications. Web dashboard (React): the caregiver view for desktop. Hub (Flask + PostgreSQL/TimescaleDB): dose schedules, stock, alerts and a fail-closed bottle check. Label reading: a RapidOCR/ONNX pipeline, with OpenFDA used to confirm medication names. The supply maths is deliberately simple. With $p$ pills left, $a$ units per dose and $n$ doses a day:

$$d = \frac{p}{a \cdot n}$$

When $d$ falls under the caregiver's thresholds (7, 5 and 3 days by default), the hub raises the alert.

Challenges Reading is not identifying. The OCR read "FLUOXETINE 20 mg CAPSULES" perfectly, but a name outside its word list came back as "Pharmacy". We used OpenFDA as a fallback, and we made the scanner refuse any name it is only "unsure" about, rather than guess. No push notifications. Without a paid Apple Developer account we cannot send real push, so we used in-app pop-ups, local notifications and a polling watcher. Making three clients agree. The iOS, web and hub teams each had their own idea of the data. The real hub also sent things the shared contract did not describe, such as a wrong bottle with no medication id. Demo data that looked real. An early build said "Connected" while still showing scripted demo answers. We changed the status chip to say so plainly. What we learned Safety rules belong in the design: "a scan alone never marks a dose taken" and "unsure means don't". Test against the real backend early. Fixtures and mocks hid problems that only showed up on the real hub. Error messages from the hub, shown verbatim, were more useful than anything we could write on the client. What's next Meta glasses as the camera for the patient, posting to the same hub endpoints. Real lock-screen push through APNs. A larger medication word list for the OCR.

Built With

Share this project:

Updates

Submission history