Status: Production Ready - Open Source
Software for the people who care.
Open-source home healthcare management platform with state-specific Electronic Visit Verification (EVV) compliance for all 50 states.
Home healthcare agencies face a broken software market:
- Expensive: $500-2000/month for basic features
- Inflexible: Doesn't handle state-specific regulations (Texas HHAeXchange, Florida background screening, etc.)
- Vendor lock-in: Proprietary systems with no data ownership
Folk Care is different:
- β Free & Open Source - MIT license, full code access
- β State-Specific Compliance - Automatic EVV rules for TX, FL, and all 50 states
- β Full Data Ownership - Self-host or use our managed service
- β Modern Technology - TypeScript, React, PostgreSQL
- β Production Ready - Built in 28 days with AI assistance, deployed and tested
Built by Neighborhood Lab - community-owned software for the common good.
- Interactive Showcase β Start here - No login required, explore with realistic demo data
- Production SaaS - Full application (free 14-day trial)
Demo Logins:
Administrator: admin@folkcare.example / Care2024!
Coordinator: coordinator@tx.demo / demo1234
Caregiver: caregiver@tx.demo / demo1234
Family: family@tx.demo / demo1234
For Agency Administrators:
- π Real-time Dashboard - See active clients, caregivers, care plans, and open shifts at a glance
- π 60+ Clients, 35+ Caregivers - Comprehensive demo data showing production-scale capability
- β 98.2% EVV Compliance Rate - GPS-verified visit tracking with automatic state compliance
- πΊοΈ 50-State Support - Texas HHAeXchange, Florida Sandata, automatic geofence tolerances
- π± Mobile App - React Native caregiver app with offline-first EVV
For Caregivers:
- β° Quick Clock In/Out - GPS verification, geofencing, photo documentation
- π Offline Support - Works without internet, auto-syncs when connected
- β Task Checklists - Morning medication, blood pressure checks, PT exercises
- π Visit Notes - Document care provided with timestamps and signatures
For Families:
- π¨βπ©βπ§ Family Portal - Real-time updates on loved one's care
- π¬ Activity Feed - "Sarah M. clocked in 2 min ago", "Blood pressure: 128/82"
- π Visit Schedule - See upcoming visits and caregiver assignments
- β 4.8/5 Satisfaction - Transparent communication builds trust
- Discord - Chat with the community
- Substack - Updates, news and commentary
- Patreon - Support continued development
- Product Site - Marketing site
A human-scale alternative to enterprise care management systems. Folk Care emphasizes:
- π‘ Human-scale workflows - Not enterprise excess
- π Local autonomy - Runs offline and on-premises if needed
- π Interoperability by design - APIs, import/export, open schema
- π‘οΈ Privacy and consent first - Least-privilege access across roles
- π¦ Incremental adoption - Start with one vertical, add others later
Folk Care is structured as a set of independently deployable verticals that share a common core:
- Unified domain model shared across verticals
- Event-driven data flows for visit lifecycle
- Fine-grained permissions and perspective-based UI
- Durable offline data capture with conflict resolution
- Extensible APIs that allow community-developed modules
- Encryption for sensitive health and payroll-related data
- Automated validation, audit trails, and revision history
- Backend: TypeScript/Node.js with Express
- Database: PostgreSQL with JSONB for flexible data models
- Monorepo: Turborepo for efficient builds
- Validation: Zod for runtime type safety
- Testing: Vitest
folkcare/
βββ packages/
β βββ core/ # Shared core functionality
β βββ src/
β β βββ types/ # Base types and interfaces
β β βββ db/ # Database connection and repository
β β βββ permissions/ # Permission service
β β βββ audit/ # Audit logging
β βββ migrations/ # Database migrations
β
βββ verticals/ # Feature verticals
βββ client-demographics/ β
Implemented
βββ caregiver-staff/ β
Implemented
βββ scheduling-visits/ β
Implemented
βββ ...
- Client & Demographics Management - Foundational record system for individuals receiving care
- Caregiver & Staff Management - Secure directory of personnel providing care services
- Scheduling & Visit Management - Service patterns, automated scheduling, and real-time visit tracking
- Time Tracking & EVV - Electronic Visit Verification with GPS, geofencing, and state compliance (TX/FL)
- Shift Matching - ML-based automated caregiver-to-visit matching and schedule optimization
- Care Plans & Tasks - Structured care plans with goals, interventions, and task management (17 components + 7 pages)
- Family Engagement - Family portal with transparency, notifications, and messaging (implemented November 2024)
- Billing & Invoicing - Claims generation, invoice management, and payment tracking
- Payroll Processing - Timesheet processing, tax calculations, direct deposit (70% complete - backend done)
- Analytics & Reporting - Dashboards, KPIs, and compliance reports (70% complete - backend done)
- Quality Assurance & Audits - Quality metrics and audit workflows (40% - schema ready)
- Compliance & Documentation
- Care Notes & Progress Reporting
- Incident & Risk Reporting
- Referral & Intake Management
- Medication Management
- Training & Certification Tracking
- Communication & Messaging
- Document Management & eSignatures
- Inventory & Supplies Tracking
- HR & Onboarding
- Mileage & Expense Tracking
- Node.js 20+
- PostgreSQL 14+
- npm 10+
# Clone the repository
git clone https://github.com/neighborhood-lab/folkcare.git
cd folkcare
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env with your database credentials
# Run database migrations and seed with demo data
npm run db:reset:demo
# This creates 61 clients, 35 caregivers, 605 visits, and more Texas demo data
# Login with: admin@tx.folkcare.example / Demo123!
# Start development servers
npm run devπ See DEV_WORKFLOW.md for detailed development workflow documentation.
npm install
cp .env.example .env
npm run db:reset:demo
npm run dev
# Navigate to http://localhost:5173 and login with admin@tx.folkcare.example / Demo123!Create a .env file in the root directory:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=folkcare
DB_USER=postgres
DB_PASSWORD=your_password
DB_SSL=false
# Development Mock Authentication
MOCK_USER_PASSWORD=password123The development environment includes three mock users for testing:
| Password | Role | |
|---|---|---|
admin@example.com |
password123 |
ADMIN |
coordinator@example.com |
password123 |
COORDINATOR |
caregiver@example.com |
password123 |
CAREGIVER |
Note: These credentials are for development only. In production, proper authentication with hashed passwords and JWT tokens should be implemented.
Folk includes comprehensive seed scripts for generating realistic demo data:
# 1. Set up database schema and minimal data
npm run db:migrate
npm run db:seed
# 2. Generate comprehensive showcase data (900+ records)
npm run db:seed:showcase-comprehensive| Command | Records | Purpose | Time |
|---|---|---|---|
npm run db:seed |
~10 | Org, branch, admin user (required first) | 5s |
npm run db:seed:demo |
~20 | Small demo dataset for development | 30s |
npm run db:seed:showcase-comprehensive |
900+ | Full showcase with realistic data | 2-5min |
The db:seed:showcase-comprehensive script creates:
-
60 clients - Distributed across TX, FL, OH states
- Realistic demographics (ages 65-95)
- State-specific phone numbers and addresses
- Medicaid/Medicare coverage
- Emergency contacts
- Various diagnoses and mobility levels
-
35 caregivers - Mix of CNAs, HHAs, and companions
- Multiple certifications (CNA, CPR, Medication Aide, etc.)
- Specializations (Alzheimer's, Diabetic Care, Wound Care, etc.)
- Multiple languages
- Varying hourly rates and employment types
-
600 visits - Past, present, and future (-30 to +30 days)
- Completed visits with full EVV records
- GPS clock-in/out coordinates
- Visit statuses: completed, scheduled, in-progress, no-show, cancelled
- Visit notes for completed visits
-
50 care plans - ~83% of clients have active care plans
- Goals with progress tracking
- Compliance status
- Plan types: Personal Care, Skilled Nursing, Companion, Therapy
-
40 family members - ~67% of clients have family portal access
- Portal access levels
- Contact preferences
- Notification settings
-
30-50 invoices - Generated from completed visits
- Grouped by month per client
- Line items with hourly breakdowns
- Medicaid vs Private Pay
- Various statuses: Draft, Sent, Paid, Overdue
All demo data is tagged with is_demo_data = true for easy cleanup:
-- Clear all demo data
DELETE FROM visit_evv_records WHERE is_demo_data = true;
DELETE FROM visits WHERE is_demo_data = true;
DELETE FROM invoices WHERE is_demo_data = true;
DELETE FROM care_plans WHERE is_demo_data = true;
DELETE FROM family_members WHERE is_demo_data = true;
DELETE FROM caregivers WHERE is_demo_data = true;
DELETE FROM clients WHERE is_demo_data = true;Or reset and reseed:
npm run db:nuke # β οΈ Drops all tables
npm run db:migrate # Recreates schema
npm run db:seed # Creates org/branch/admin
npm run db:seed:showcase-comprehensive # Generates demo dataEdit packages/core/scripts/seed-showcase-comprehensive.ts to adjust:
const SEED_CONFIG = {
clients: 60, // Adjust number of clients
caregivers: 35, // Adjust number of caregivers
visits: 600, // Adjust number of visits
carePlans: 50, // Adjust number of care plans
familyMembers: 40, // Adjust number of family members
};Error: "No organization found"
- Run
npm run db:seedfirst to create the required org, branch, and admin user
Error: Database connection failed
- Check your
.envfile has correct database credentials - Ensure PostgreSQL is running:
pg_isready - Test connection:
psql -h localhost -U postgres -d folkcare
Seed script is slow
- The script generates 900+ records with realistic data
- Expected time: 2-5 minutes depending on your database speed
- Uses transactions for data consistency
Need different states?
- Edit the
generateClient()function to add/modify states - Default states: TX (Texas), FL (Florida), OH (Ohio)
# Run all packages in development mode
npm run dev
# Build all packages
npm run build
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Type checking
npm run typecheck
# Lint code
npm run lintInteractive API documentation is available via Swagger UI:
- Local Development: http://localhost:3000/api-docs
- Production: https://folk.care/api-docs
The OpenAPI 3.0 specification is available at:
- JSON Format: http://localhost:3000/openapi.json
Generate a Postman collection for API testing:
npm run docs:generateThis creates:
docs/openapi.json- OpenAPI 3.0 specificationdocs/postman-collection.json- Postman collection (if converter available)
Import docs/postman-collection.json into Postman for easy API testing and development.
The following API endpoints are documented with OpenAPI annotations:
- Authentication - Login, logout, token refresh, user profile
- Organizations - Registration, management
- Clients - CRUD operations, search, demographics, risk flags
- Care Plans - Create, update, search, activate
- Caregivers - Staff management
- Visits - Scheduling and tracking (see scheduling vertical)
All endpoints require authentication via JWT Bearer token (except login/register endpoints).
This project uses Codecov for tracking code coverage. Coverage reports are automatically generated and uploaded during CI runs. The project maintains a minimum coverage threshold of 70% across all packages.
To generate coverage reports locally:
npm run test:coverageCoverage reports are available in the coverage/ directory of each package.
This project uses GitHub Actions for automated CI/CD workflows:
-
CI (
ci.yml) - Runs on pull requests and pushes to main/develop- Linting and type checking
- Unit and integration tests with PostgreSQL
- Build verification
- Code coverage reporting
-
Deploy (
deploy.yml) - Automated deployments- Production deployments on main branch pushes
- Staging deployments on develop branch pushes
- Database migrations during deployment
-
Database Operations (
database.yml) - Manual database management- Run migrations, rollbacks, and seeding
- Support for staging and production environments
- Manual workflow dispatch with safety checks
-
Security and Dependencies (
security.yml) - Automated security- Weekly security audits
- Dependency updates with PR creation
- CodeQL analysis
-
Release (
release.yml) - Version management- Automated releases on git tags
- Changelog generation
- Version bumping and npm publishing
Configure these repository secrets for full functionality:
# Database connections
DATABASE_URL=postgresql://user:pass@host:port/db
STAGING_DATABASE_URL=postgresql://user:pass@host:port/staging_db
# Application secrets
JWT_SECRET=your-jwt-secret
STAGING_JWT_SECRET=your-staging-jwt-secret
# Optional services
CODECOV_TOKEN=your-codecov-tokenSome workflows can be triggered manually:
- Database Operations - Go to Actions β Database Operations β Run workflow
- Security Scans - Go to Actions β Security and Dependencies β Run workflow
- Release - Go to Actions β Release β Run workflow (or push a git tag)
# Run migrations
npm run db:migrate
# Seed database with sample data
npm run db:seed
# Seed TX/FL demo data (idempotent)
npm run db:seed:demo
# Check migration status
npm run db:migrate:status
# Rollback last migration
npm run db:migrate:rollbackFolk supports deployment to Vercel with Neon PostgreSQL for production-ready, serverless hosting.
π° Hosting Costs: Starting at $0/month (free tier) or $20-30/month for small agencies. See Hosting Costs Documentation for detailed pricing, scaling paths, and cost optimization strategies.
- Vercel Account - Sign up at vercel.com
- Neon PostgreSQL - Create a database at neon.tech
- Vercel CLI - Install globally:
npm install -g vercel
- Create a new project at console.neon.tech
- Create two databases:
folkcare_staging(for staging environment)folkcare_production(for production environment)
- Enable connection pooling for each database
- Copy the connection strings (with pooling enabled)
-
Install Vercel CLI:
npm install -g vercel
-
Login to Vercel:
vercel login
-
Link your project:
vercel link
-
Add environment variables to Vercel:
# For production vercel env add DATABASE_URL production # Paste your Neon production connection string (with pooling) # For staging vercel env add DATABASE_URL preview # Paste your Neon staging connection string (with pooling) # Add other secrets vercel env add JWT_SECRET production vercel env add ENCRYPTION_KEY production
# Deploy to preview (automatic on PRs)
npm run deploy:preview
# Deploy to staging
npm run deploy:staging
# Deploy to production
npm run deploy:productionThe project includes automated deployment workflows:
- Automatically deploy on every pull request
- Preview URL posted as PR comment
- Uses staging database
- Deploy to staging on
developbranch pushes - Runs database migrations automatically
- Health check validation
- Deploy to production on
mainbranch pushes - Runs database migrations automatically
- Health check validation
- Optional demo data seeding
Add these secrets in your repository settings (Settings β Secrets and variables β Actions):
# Vercel
VERCEL_TOKEN=<your-vercel-token>
VERCEL_ORG_ID=<your-vercel-org-id>
VERCEL_PROJECT_ID=<your-vercel-project-id>
# Database
DATABASE_URL=<neon-production-connection-string>
STAGING_DATABASE_URL=<neon-staging-connection-string>
# Application
JWT_SECRET=<random-secret-string>
STAGING_JWT_SECRET=<random-secret-string>
ENCRYPTION_KEY=<32-byte-random-string>After deployment, verify your application:
# Check production health
curl https://your-app.vercel.app/health
# Expected response
{
"status": "healthy",
"timestamp": "2025-11-01T12:00:00.000Z",
"environment": "production",
"uptime": 3600,
"responseTime": 45,
"database": {
"status": "connected",
"responseTime": 45
},
"memory": {
"used": 128,
"total": 256
}
}Migrations run automatically during deployment via GitHub Actions. To run manually:
# Set DATABASE_URL environment variable
export DATABASE_URL="your-neon-connection-string"
# Run migrations
npm run db:migrate
# Seed demo data (optional)
npm run db:seed:demo- Vercel Dashboard: View deployment logs and metrics
- Neon Console: Monitor database performance and queries
- Health Endpoint:
/healthfor uptime monitoring - Error Tracking: Configure Sentry DSN in environment variables (optional)
To rollback a deployment:
# List recent deployments
vercel ls
# Promote a previous deployment to production
vercel promote <deployment-url> --scope <team-name>- Database Pooling: Always use Neon's pooled connection string for serverless environments
- Environment Variables: Never commit secrets to git - use Vercel environment variables
- Migrations: Test migrations on staging before deploying to production
- Health Checks: Monitor the
/healthendpoint for database connectivity - Preview Deployments: Review changes on preview URLs before merging to main
- Technical Plan - Overall product vision and vertical descriptions
- Client & Demographics - Client management vertical documentation
- Caregiver & Staff Management - Caregiver and staff management documentation
- Scheduling & Visit Management - Scheduling and visit tracking documentation
- Care Plans & Tasks Library - Care plans, goals, interventions, and task management
- Family Engagement Platform - Family portal, transparency, and communication features
- Core Package - Core functionality documentation
Thanks to these wonderful people who have contributed to Folk Care:
Brian Edwards π» π π€ π |
Tove Bot π» π π |
Gaute Bot π» π |
This project follows the all-contributors specification. Contributions of any kind welcome!
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- Human-first design - Tools should reduce burden, not add it
- Privacy by default - Least-privilege access, explicit consent
- Offline-capable - Core functionality works without connectivity
- Auditable - All changes tracked for compliance and debugging
- Modular - Verticals are independent but share common infrastructure
- Open - APIs and data schemas are documented and accessible
See LICENSE for details.
- GitHub: neighborhood-lab/folkcare
- Issues: Report bugs or request features
Folk Care is brought to you by Neighborhood Lab π‘
Software for the people who care.