Inspiration
Joining a clinical trial is a pile of paperwork before any care happens. You search a registry built for researchers, then read dense eligibility text, then enter the same medical details into one form after another. If you’re on medication, you also have to look out for prerequisites of doses taken. Many people give up before they even reach a coordinator.
Wise’s Max Ease theme asks us to remove friction from a complicated process and make it accessible. We chose this one because the people who most need to understand a medical form are often the least able to spare the effort. What if you fill in your details once, and every step after that is done for you?
What it does
PhaseZero is one patient profile that connects three things people normally do in separate places:
- Fill in once. A three-step profile (about you, your conditions, your location) is reused everywhere. There is no re-typing.
- Scan instead of type. Photograph a prescription. Gemini reads the medicine, strength, dose and how often.
- A schedule that builds itself. A confirmed prescription becomes a weekly blister-pack calendar. Tap a dose to mark it taken, and tap again to undo. Each type of medicine (tablet, inhaler, injection, cream) gets its own icon and animation.
- Trials in plain English. We find recruiting studies on a free API from ClinicalTrials.gov and break each study’s criteria into short statements. For each one we show whether it appears to apply to you: yes, no, or unknown. We list the questions to ask the study team. We never say whether you are eligible.
- A daily diary. Log how you feel with a note. Presage tracks your breathing rate and heart rate to monitor your vitals.
How we built it
Frontend: Next.js, React, TypeScript and Tailwind. Backend: Python FastAPI, SQLAlchemy 2, Alembic migrations, and Pydantic validation on every request. Database: Postgres hosted on Tiger Data. It stores profiles, medications, dose events, check-ins and bookmarks. Gemini: read prescription photos into a strict JSON schema, and explain trial criteria in plain language. ClinicalTrials.gov API v2: live search for recruiting studies, with a local cache of real records as a fallback. Auth: signed, HTTP-only session cookies. Our sign-in is a clearly labelled demo mode; magic-link email isn’t set up yet.
Challenges we ran into
Not trusting the model. Early on, Gemini’s output couldn’t be used as-is. Some schema keywords were rejected, and a label with no clock times invites a made-up “9am” after the time has already passed, making it impossible to take the dose. We integrated the calendar more strongly made the model return only what’s printed.
Eligibility is a safety line. A friendly “you qualify!” would be wrong and risky. We built it so the model assesses individual criteria, the app works out the overall status with plain rules, and every quote is checked against the original text. We always strive to put the highest ranking applications on there.
Four people, one database. We split ownership by file and kept one migration history. The frontend was built ahead of the backend, so contracts drifted until we tested the real flow end to end.
Time is messy. Daylight saving changes, “today” versus the patient’s timezone, and what counts as a missed dose all took careful decisions.
A bug that only appeared end to end. Running the full flow against a real database showed that some bad input caused a server error instead of a clear message
Accomplishments that we're proud of (robust data handling)
We never invent medical details. Gemini’s output is validated: only real HH:MM times survive, frequency must be one of a fixed list, and a missing dose or duration is shown as “we couldn’t read this” so you fill it in.
Trial explanations are checked. Every explained criterion is verified against the study’s own text, the overall status comes from rules rather than the model, and names and emails are kept out of the AI prompt (covered by a test).
Your data is only yours.
Schedules behave. They are timezone- and daylight-saving-aware (tested). Doses already past when you scan are skipped, overdue doses become “missed” by themselves, and the week runs Monday to Sunday.
Honest numbers. Adherence is always “marked taken”, never verified. There are no invented match percentages. Logging a dose early updates the dashboard immediately.
Privacy by design. No camera video is stored, secrets live in environment variables, and every error uses one consistent format.
What we learned
Friction removal is mostly about what you leave out. Every field we pre-filled was one the person no longer had to read, type or remember.
AI helps most when it’s boxed in. Structured output, validation and human confirmation made Gemini useful instead of risky. In healthcare, the wording is part of safety.
“Possible match” and “needs more info” are different promises from “eligible”. Integration tests catch what unit tests miss, as the error-handling bug showed.
AI Transparency
In the product: Gemini reads prescription photos and explains trial criteria, and ElevenLabs creates the voice audio. Claude (Anthropic) helped generate the repo scaffold, and the tests. The backend and frontend was researched thoroughly and built from scratch with Claude assisting debugging.
Built With
- alembic
- docker
- fastapi
- node.js
- python
- react
- tailwindcss
- tiger
- typescript
Log in or sign up for Devpost to join the conversation.