Client project
Caregiver Onboarding Platform
Hiring & records app for a US home-care agency
Caregivers apply once through a guided, autosaving application instead of paper forms and email. I built the .NET API and PostgreSQL schema, and most of the Next.js frontend.
- Role
- Full-Stack Developer
- Status
- Delivered
- Period
- Sep – Nov 2025
- ~6 weeksto build the backend
- 100REST endpoints in a layered .NET API
- 7 formsin the autosaving caregiver application
The problem
Home-care agencies onboarded caregivers on paper and through scattered PDFs and email: personal details, work history, certifications, references, tax forms, consents and signatures. It was slow, error-prone, and hard to see how far along each applicant was.
Overview
The platform gives caregivers one guided application and gives the agency one place to review it. Caregivers sign up with email or Google, verify their email with a one-time code, and fill in seven forms: personal information, employment type, experience, education, certifications, references, and a legal disclosure with a drawn e-signature. Everything autosaves, a dashboard shows what is done and what is next, and at 100% the caregiver submits the application for review, which locks it.
How it works
From sign-up to HR review
System architecture
What happens on every signed-in request
What I did
- Built the backend alone: an ASP.NET Core API on .NET 8 in layered projects (API, Infrastructure, Core, Shared), with EF Core, a repository and unit-of-work layer, and one response envelope and error mapping for every endpoint.
- Designed the PostgreSQL schema, with one table per application step and CHECK constraints for the domain rules, so the data stays valid even if application code has a bug.
- Built the authentication: email and password with account lockout, Google sign-in, one-time codes for email verification and password reset, and per-device sessions that users can see and sign out of.
- Gave every form a draft endpoint as well as a final submit, so partial answers are saved as the caregiver types and fully validated only on submit.
- Built document uploads to private S3-compatible storage, with type and size checks, per-user quotas, duplicate detection by content hash, folders, short-lived download links, and an hourly job that removes expired files.
- Added HR endpoints to search and manage applicants, lock accounts, and mark personal information as validated and tax forms as reviewed.
- Built most of the Next.js 16 frontend with React 19, TanStack Query, React Hook Form with Zod, and shadcn/ui on Tailwind, including the step-by-step application, progress dashboard and e-signature.
- Containerised the API and frontend with Docker, with the API running as a non-root user and all secrets supplied through environment variables.
- Met the deadline by using GitHub Copilot for implementation while I owned the architecture, the data model and the review of every change.
Key decisions
Short-lived tokens tied to server-side sessions, in HttpOnly cookies
A plain JWT can’t be revoked before it expires. Checking each token against a session row means logout, password changes and account locks take effect immediately, and no token is ever readable by JavaScript.
A draft endpoint for every form, separate from submit
Long compliance forms get abandoned, especially on a phone. Saving partial answers as the caregiver types means no one loses work, while the full validation still runs on submit.
One storage interface for any S3-compatible provider
The project started on one storage provider but needed a path to others. Switching between AWS S3, MinIO, DigitalOcean Spaces or Cloudflare R2 is a configuration change, not a code change.
Highlights
- Autosave every few seconds with a visible “Saved” state, so caregivers can leave and come back without losing anything.
- Once submitted, the whole application becomes read-only, enforced by the API as well as the interface.
- The same rules (minimum age, date order, “a current job has no end date”) are checked in the form, in the API and in the database.
- Sensitive data kept to a minimum: only the last four digits of a social security number are stored.
- Conditional questions only where they apply: work authorisation for non-citizens, military details for veterans, an explanation box when a conviction is disclosed.
Challenges
- One navigation bar driving many forms: the Next button lives in the layout, but a page can hold several independent forms. A shared context registers each form’s submit handler, runs them together and moves on only if every one succeeds.
- Keeping users signed in while they are active without any token handling in the frontend: the API refreshes an expired access token itself and returns new cookies on the same request.
- Turning .NET validation errors into messages on the exact form field the caregiver needs to fix.
Want something similar built? Get in touch →