Inspiration Nurses still hand off shifts with verbal recaps, sticky notes, and half-read charts. In busy wards like a med-surg unit, critical details — a pending drug, an uncheckable drain, a report nobody signed — slip between shifts. We built ShiftHandoff to turn the handover into a structured, verifiable moment instead of a memory test.
What it does A bedside tool that turns a nurse's handoff into a structured SBAR report (Situation–Background–Assessment–Recommendation). The nurse types or dictates in English, Hindi, or Marathi, and the app produces a clean, signed-off report the next shift can open, read back, and act on.
Beyond the handoff itself:
Ward Board — a live view of all patients, their stability, risks, and who still needs a handoff. Patient Analytics — a plain-language view of vitals trends, risk flags, and care priorities for one patient. Reminders — an automatic list of pending care tasks, handoffs due, and unsigned reports, plus voice-saved reminders; sorted by urgency. Profile — the nurse's own shift history. Voice everywhere — read aloud and dictate; a global voice assistant navigates the app by voice. How we built it React + Vite front end, react-router for navigation, and the Web Speech API (SpeechRecognition + speechSynthesis) for dictation and read-back with en-IN / hi-IN / mr-IN locales. All data is stored locally on the device (localStorage) — the app runs entirely client-side, so it works at the bedside without a network. The UI is deliberately plain and flat: system fonts, clear buttons, no decoration, because a clinical tool should look like a tool. We ship with a project report (PDF) covering architecture, data model, and run steps.
Challenges we ran into Vite's native-bundler build failing because npm silently skipped optional native bindings (a known npm/cli issue) — we fixed it by installing the correct platform binary directly. Getting the speech hooks to coexist across several pages (dictation + read-back + a global voice assistant) without feedback loops or permission clashes. Pinning down a blank Reminders page: it crashed at runtime because one helper (getDismissedIds) was used but never imported — caught with automated headless-browser rendering, not eyeballing. Keeping the interface simple on purpose — stripping gradients, emojis, and decorative flourishes until it reads like a clinical product, not a demo. Accomplishments that we're proud of Reminders that assemble themselves from care plans, pending handoffs, and unsigned reports — no manual entry needed. Three-language voice input/output with a global "ask the app by voice" navigation. A lint-clean, build-green codebase (0 warnings, 0 errors) with a report PDF documenting the whole system. What we learned Clinicians don't need more screens — they need fewer, simpler ones that aggregate what they already know. Voice is the fastest input at the bedside, and offline/local storage removes a whole category of trust issues. Also: a page that looks fine in the editor can still be dead at runtime — automated rendering caught a crash static review missed.
What's next for ShiftHandoff Data export and a printable handover sheet for offline shifts. Multi-device sync behind a real (read-only) patient record, e.g. FHIR, with consent-aware sharing. Medication-time scheduling that turns a care plan's timings into live alerts. Shift-level analytics — workload, follow-up closure rates, and repeated risk flags across the ward.
Built With
- accessibility
- api
- app
- css
- data
- healthcare
- html5
- javascript
- localstorage
- modules
- multilingual
- nursing
- offline-first
- patient
- react
- router
- speech
- speechrecognition
- speechsynthesis
- storage
- ui
- visualization
- vite
- web
- workflow
Log in or sign up for Devpost to join the conversation.