Voice appointment line for a hospital outpatient desk. Emergency checks are code, not AI. Built on AssemblyAI's Dictation API.
HealthJavaScript · CSSGitHub @abhi20scConnection unstableOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A voice appointment line for a hospital outpatient desk. The patient says what's wrong out loud; CareLine asks a few short questions, fills in an appointment card, routes them to one of 12 departments at the right urgency, and books a free slot once they say yes. It never diagnoses or gives medical advice.
Emergency checks are code, not AI. Fixed rules read every reply before anything else. If a caller mentions chest pain, a stroke sign or suicidal thoughts, CareLine stops, shows "call 108" and never books.
Built at the London Voice AI Meetup: Build your own voice app, an AssemblyAI × Encode Club build night in London on 1 October 2026, on AssemblyAI's Dictation API.
Try it live (Chrome, with a microphone. The first load can take up to a minute while the free server wakes up.)
Watch the full demo video (28 s, with sound)
"Do you need an ambulance?" → problem → body part → how long → how bad (1-10) / getting worse?
→ name → age → phone (read back to check) → offers one free slot → "yes" books it
On every reply, before anything else:
red-flag rules run on the caller's exact words AND on the model's JSON
→ any match shows the 108 screen, asks about an ambulance, and never books
Staff open #staff (the Staff tab) to see every call, spot emergencies, and correct the
department or urgency.
Each patient reply is one request to AssemblyAI's Dictation API. That single request returns the verbatim transcript and an LLM rewrite, so there is no second model call:
llm_instruction turns free speech ("my right knee's been hurting for about a week") into compact JSON:
symptoms, body part, department, urgency.stt_prompt carries the question CareLine just asked, which helps the transcription of short answers.Short answers such as a name, an age or a phone number are parsed in plain code
(shared/careline-conversation.js), not by the model. "Something in the
evening" or "Monday" picks a different slot.
shared/careline-redflags.js holds 14
categories of emergency (chest pain, breathing, stroke signs, seizures, heavy bleeding, suicidal thoughts,
poisoning and more) in English and Hindi, in both Latin and Devanagari script. I measured why this matters: a
clip about "ending my life" came back from the model with urgency routine. The rules are deliberately
over-inclusive ("no chest pain" still matches), because a false alarm costs a phone call and a missed one can
cost a life. Suicidal thoughts also show the Tele-MANAS helpline, 14416.llm_error: "truncated" on a 69-character transcript. So the model returns short keys and leaves out anything
not said, and parseIntake() in shared/careline-intake.js expands it. The
instruction is checked against the API's 2,048-character limit before every request.shared/careline-booking.js: today gets the
earliest slot today (or first thing tomorrow, flagged as priority), this_week the earliest in the next
5 days, and routine the earliest from 2 days out.server.js is a small Express proxy that adds the
key and forwards the audio.render.yaml sets everything up on Render's free plan; it asks for your AssemblyAI key during
setup. The server caps use so a public link can't run up your bill: 40 replies per visitor per hour and 500
per day in total (a full call is about 10). Change them with DEMO_IP_LIMIT and DEMO_DAILY_LIMIT.
You need Node 20 or newer and an AssemblyAI API key.
npm install
cp .env.example .env # then paste your key into .env
npm start # http://localhost:3000
Open it in Chrome, press Start call and allow the microphone. CareLine speaks, then listens until you pause.
Add #staff to the address to see the staff dashboard.
npm test # 90 tests: red flags, booking rules, intake and answer parsing
server.js Express proxy: holds the key, forwards audio, applies demo limits
render.yaml one-click Render deploy
public/
careline.html/.js/.css caller screen and staff dashboard
schedule.json mock schedule: 28 doctors, 15-minute slots over the next 5 days
shared/
careline-redflags.js emergency rules (English and Hindi)
careline-intake.js the intake instruction and its JSON parser
careline-conversation.js question order and parsers for names, ages, phone numbers, times
careline-booking.js urgency rules and slot picking
wav.js browser recording → 16 kHz mono WAV
test/ node:test suite
docs/ demo video
This is a prototype, not a medical device.
localStorage).The speech plumbing (the proxy and WAV encoding) started from AssemblyAI's Dictation-HelloWorld starter. Font: Atkinson Hyperlegible Next.