-
-
study team/medical personnel side of the dashboard where they access patient symptoms
-
user facing app, home screen
-
sign in page for the user
-
drop down for user to select their preferred language
-
main page for user to submit their symptoms
-
profile, user can either sign out or change their preferred language
-
user symptom screen, they can fill out any gaps that their chat/voice message missed
-
post-submission screen
-
notification center for the user to receive news based on their symptom, to either follow-up with a doctor or if they're good to go
Inspiration
Clinical trials depend on participants accurately reporting side effects. But someone who doesn't speak English well may skip a report, downplay a symptom, or describe it in a way staff can't capture: "my stomach is burning and my head is spinning." Every missed or garbled report is a hole in the safety data, and participants who feel unheard are more likely to drop out.
We asked a simple question: what if a participant could just talk, in their own language, and the study team received a clear, verified English record?
We don't try to get people into trials. We make sure the people who are already in can be heard.
What it does
Symora is a voice reporter for clinical trial participants that translates the language they are most comfortable speaking into a structured English report for clinical trial use.
- The participant speaks in their own language (Spanish and Vietnamese in our demo).
- A voice agent asks short follow-up questions: when did it start, how bad is it, is it still happening?
- Gemini converts the conversation into a structured English report: symptom, onset, intensity, and ongoing status.
- The participant hears a read-back and confirms before anything is submitted.
- The confirmed report is saved to Postgres for the study team.
Symora is not a translation app. A translator converts words; Symora produces a trial record. Unknown details stay null, and we never guess a date, a severity, or a medication.
How we built it
- Gemini (structured JSON output) extracts and translates symptoms from the transcript, with a fallback model for when the primary model is busy.
- ElevenLabs powers the voice conversation, the entire participant interface.
- Tiger Data (PostgreSQL) stores participants, symptoms, and reports as timestamped records.
- Next.js serves the app and the API, with bearer-token authentication on every endpoint.
Challenges we ran into
- Making a language model trustworthy. Models can add details nobody said, so we built verification around the model instead of relying on the prompt alone.
- Real behavior vs. tests. Mocked tests passed while the live API still had bugs, so we learned to verify with real requests.
- Reliable multilingual support. Each language needed testing of its own, so we limited our demo to the languages we could verify.
- Teamwork across a fast-moving codebase. Several people built pieces at once, so we used branches and pull requests to keep everything working together.
What we learned
- Safety-critical AI needs verification layers around the model, not just a good prompt.
- Test with real requests, not only mocks.
- Being honest about what doesn't work yet builds more trust than hiding it.
What's next
- A coordinator dashboard that highlights urgent reports, with a human reviewing every report
- Support for more languages, including Mandarin
- Routing each report to the coordinator assigned to the participant's study site
- Real authentication and role-based access, plus HIPAA and IRB review before any real deployment
Safety and privacy
Symora is a prototype built with fictional data only. It gives no medical advice and never diagnoses. It stores a participant ID and nothing else: no names, and no immigration status. The original transcript is always preserved, and the participant confirms every report.
Built with
Next.js · TypeScript · Gemini API · ElevenLabs · Tiger Data (PostgreSQL) · Vercel
Built With
- elevenlab
- gemini
- next.js
- node.js
- postgresql
- react
- tailwind.css
- tigerdata
- timescaledb
- typescript

Log in or sign up for Devpost to join the conversation.