Vera is a workspace for small home care agencies: one place to manage visits, caregivers, and the record of care each patient receives. Every visit is backed by evidence (who was there, when, and what care was delivered), so the moment a visit is verified, the claim is ready to submit. No chasing paperwork, no double data entry.
Live demo: vera-homecare.vercel.app
Small home care agencies mostly run on software that is broad, expensive, and disconnected. From interviews with agency owners in Philadelphia, their top pain points were managing caregiver onboarding documents, knowing when caregivers are actually with patients, and collecting patient signatures. Vera focuses on one clean, connected flow from scheduled visit to billable record, built caregiver-first, because caregivers are the bulk of the workforce and the source of every record the office depends on.
The visit verification core is modeled on Electronic Visit Verification (EVV), which is federally required for Medicaid-funded home care under the 21st Century Cures Act.
Demo disclaimer: this is a portfolio MVP inspired by EVV. It is not certified EVV software, it makes no HIPAA claims, and all data is fictional. Data lives in memory and resets on refresh by design.
For the administrator:
- Dashboard: every visit with its pipeline status, needs-review visits first
- Visit detail: check-in and check-out times, assessment, and signature; a flagged visit derives and lists exactly what evidence is missing
- Billing: ready-to-bill visits with hours worked and estimated cost, one-click mock claim submission, and a submitted-claims register with claim references
- Caregivers: team roster, add-caregiver form, and a per-caregiver onboarding document checklist (signed, pending, expiring) with a derived cleared-to-work badge; pending documents accept a cursive signature capture
For the caregiver (phone-width surface, one primary action per screen):
- Check in on arrival; the system stamps the time and records the device's location when the caregiver allows it. A refused or unreachable location is recorded as unavailable, with the reason, and never blocks the check-in
- Check out with a visit assessment and the patient's typed signature
- Checking out without a signature warns first, then flags the visit for review instead of blocking the caregiver from leaving
- Missing evidence can be supplied later, which is the only way a flagged visit becomes billable
Around the app:
- Home: product intro and a simulated sign-in (no account needed)
- About: the home care industry in numbers, from cited primary sources
- Responsive layout: tablet breakpoint, and a phone breakpoint where the sidebar collapses behind a menu button
scheduled → in progress → ready to bill → billed
↘ needs review ↗
Every transition has a cause: check-in, check-out with an evidence check, evidence supplied, claim submission. Three rules are enforced in the service layer:
- A visit is billable only when all four pieces of evidence exist: check-in time, check-out time, assessment, signature. Anything missing routes it to needs review.
- Only supplying the missing evidence clears a flag. There is no admin override, because clicking a button does not create a signature.
- Timestamps are stamped by the system when the event happens, never typed by a user. A typed timestamp would be fabricated evidence.
- Vite + React (JavaScript), React Router, CSS Modules. No UI libraries.
- All data access goes through a service layer (
src/services). Components never import mock data directly. The services expose async functions with realistic latency, so a real backend can replace the mock internals without changing a single component. - Mutations are domain verbs (
checkInVisit,checkOutVisit,supplyEvidence,submitClaim,addCaregiver,signDocument), and state transition rules live inside them, not in components. - Derived state over stored flags: the missing-evidence panel and the cleared-to-work badge are computed from the data at render time, so they can never disagree with the record.
locationServicesits alongside the data services but is a device adapter, not a repository: no backend will ever replace it, because the device is the only authority on where it is. It resolves a result object rather than rejecting, since a refused permission is an ordinary outcome of a real check-in and not an exception.
npm install
npm run dev
Production build: npm run build.
Automated testing was out of scope for this phase, so testing is a scripted manual pass run before each merge:
| Scenario | Steps | Expected |
|---|---|---|
| Check-in | Open a scheduled visit's caregiver flow, tap Check In | Status moves to in progress everywhere; time recorded |
| Check-in, location allowed | Allow the browser's location prompt | Coordinates and accuracy recorded; caregiver flow and visit detail both show them |
| Check-in, location refused | Block or dismiss the location prompt | Check-in still succeeds; both surfaces read Unavailable with the reason, never a placeholder position |
| Check-out, full evidence | Fill assessment and signature, check out | Visit becomes ready to bill; Billing total increases |
| Check-out, no signature | Leave signature blank, check out | Warning appears; Check Out Anyway flags the visit needs review |
| Supply evidence | Open a flagged visit's caregiver flow, add the missing signature | Visit becomes ready to bill; Billing updates |
| Unresolvable visit | Open a visit missing its check-out time | Panel explains office follow-up is needed; visit stays flagged |
| Add caregiver | Submit the form with name and phone | Caregiver appears in the roster with pending documents; form clears |
| Add caregiver, blank name | Submit with no name | Inline error from the service; nothing added |
| Unknown routes | Visit a bad URL or a bad visit id | 404 page inside the app shell; not-found message with a way back |
| Demo sign-in | From the home page, submit the sign-in form | Lands on the dashboard |
| Submit claim | On Billing, submit a ready-to-bill claim | Confirmation with a claim reference; row moves to Submitted claims; both totals update |
| Sign document | On Caregivers, sign a pending document | Signature renders in cursive; pill flips to signed; badge flips to cleared when it was the last one |
| Expiring document | Check an expiring document's row | No Sign button; expiring is not signable by design |
| Responsive | Narrow the window below 640px | Sidebar collapses behind the menu button; menu opens, navigates, and closes |
- A distinct status between verified and billable once payer and authorization rules arrive with a real backend
- Persistence: localStorage first, then a real API behind the same service contracts
- Location at check-out as well as check-in, and a review surface that surfaces visits whose location was never captured
- Drawn signature capture
- Document expiration dates, with the expiring status derived from them and a renewal flow
- A caregiver home screen ("my visits today") and role-based views
- Patient records: standing concerns, and prescriptions under a future skilled-care path
- Real claim submission and remittance (837 and 835) to a payer or clearinghouse, replacing the mock
- Stripe test-mode collection for private-pay clients
- Automated tests: Vitest and React Testing Library for services and components, Playwright for the visit flow end to end