Dokita is a voice-driven health triage system built for the way Nigerians actually speak. A patient describes their symptoms in Pidgin, Yoruba, Hausa or English. An AI agent asks follow-up questions in the same language, scores urgency against clinical red flag rules, and routes the case to a doctor.
# Sahara Voice Triage — web patient app
Browser port of `apps/patient` (the Expo/React Native app) — same voice-triage
call flow (record → transcribe → agent reply → repeat → hand off to a
doctor), same backend, built with Vite + React instead of Expo. See the
root `CLAUDE.md` for the overall system; this app talks to the same
`backend/` API as `apps/patient`.
## Setup
```
cd apps/web
npm install
cp .env.example .env # edit VITE_API_BASE_URL if the backend isn't on localhost:4000
npm run dev
```
The backend must already be running (`docker compose up` from the repo
root — see the root `CLAUDE.md`).
Microphone access requires a secure context: `localhost` works for dev;
any other deployment needs HTTPS.
## Commands
- `npm run dev` — Vite dev server with hot reload
- `npm run build` — type-check (`tsc -b`) + production build
- `npm run preview` — serve the production build locally
## Notes
- Ported from `apps/patient/src` — see that app's files for the reference
implementation. `useRecorder.ts` (MediaRecorder + Web Audio API) and
`useSpeech.ts` (HTMLAudioElement) are web-native rewrites; everything else
(`api.ts`, `types.ts`, `theme.ts`, `useVAD.ts`, `useVoiceAgent.ts`,
`VoiceOrb.tsx`, `CallScreen.tsx`, `DoneScreen.tsx`) is a direct or
near-direct port.
- Orphaned mobile-app files (`PhoneConfirmScreen`, `ChatBubble`,
`NumericKeypad`, `PrimaryButton`, `BrandMark`, `audioMap.ts`) were **not**
ported — they're dead code in the reference app too (nothing imports
them).