HomeRhythm is an open-source web application for tracking recurring home maintenance tasks. It helps homeowners stay on top of seasonal and annual maintenance like gutter cleaning, HVAC servicing, garden prep, and more.
- Multi-user support with JWT authentication
- Household collaboration - Share tasks with family members and roommates
- Task management - Create, edit, and delete maintenance tasks
- Flexible recurrence patterns - Daily, weekly, monthly, yearly, or seasonal
- Task categories - Organize by exterior, HVAC, appliances, garden, plumbing, electrical, and more
- Priority levels - Low, medium, and high priority tasks
- Task completion tracking - Mark tasks as complete with notes and photos
- Photo uploads - Document your work with before/after photos
- Completion history - View all past completions for each task
- Task template library - 30+ pre-populated common home maintenance tasks
- Email notifications - Optional reminders for upcoming and overdue tasks
- Notification preferences - Customize when and how you receive notifications
- Activity feed - Track household task completions and updates
- Search and filtering - Find tasks by name, category, or priority
- Responsive design - Works on mobile, tablet, and desktop
- Internationalization - Support for multiple languages (English, Norwegian)
- Clean, modern interface built with Tailwind CSS
- List view with color-coded categories
- Task details modal with full completion history
- Template library browser
- Real-time search and filtering
- Node.js with Express and TypeScript
- SQLite3 with better-sqlite3 (file-based database)
- JWT authentication with bcrypt password hashing
- Zod for input validation
- express-fileupload for photo uploads
- React 18 with TypeScript
- Vite for fast development and building
- React Router for navigation
- Zustand for state management
- Axios for API calls
- Tailwind CSS for styling
- Lucide React for icons
- Docker with docker-compose for easy deployment
- Multi-stage builds for optimized production images
- Docker and Docker Compose (recommended)
- OR Node.js 20+ and npm (for local development)
-
Clone the repository
git clone https://github.com/yourusername/homeRhythm.git cd homeRhythm -
Create environment file
cp .env.example .env
-
Edit
.envand set your JWT secretJWT_SECRET=your-secure-random-secret-key-here
-
Build and run with Docker Compose
docker-compose up -d
-
Access the application Open your browser to
http://localhost:3000 -
Create an account and start tracking!
-
Install dependencies
npm run install:all
-
Set up environment variables
cp .env.example .env # Edit .env with your configuration -
Start the development servers
npm run dev
This starts:
- Backend on
http://localhost:3000 - Frontend on
http://localhost:5173
- Backend on
-
Access the application Open your browser to
http://localhost:5173
# Build both frontend and backend
npm run build
# Start the production server
npm starthomeRhythm/
├── backend/ # Express backend
│ ├── src/
│ │ ├── config/ # Configuration files
│ │ ├── database/ # Database setup and migrations
│ │ ├── middleware/ # Express middleware (auth)
│ │ ├── routes/ # API routes
│ │ ├── types/ # TypeScript types
│ │ ├── utils/ # Utility functions
│ │ └── index.ts # Main entry point
│ ├── package.json
│ └── tsconfig.json
│
├── frontend/ # React frontend
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── lib/ # API client and utilities
│ │ ├── pages/ # Page components
│ │ ├── store/ # Zustand stores
│ │ ├── types/ # TypeScript types
│ │ ├── App.tsx # Main app component
│ │ └── main.tsx # Entry point
│ ├── package.json
│ ├── tsconfig.json
│ └── vite.config.ts
│
├── data/ # SQLite database (created on first run)
├── uploads/ # Photo uploads (created on first run)
├── docker-compose.yml
├── Dockerfile
├── .env.example
├── package.json
└── README.md
POST /api/auth/register
Content-Type: application/json
{
"email": "user@example.com",
"password": "securepassword"
}POST /api/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "securepassword"
}GET /api/auth/me
Authorization: Bearer <token>GET /api/tasks?category=hvac&priority=high&search=filter
Authorization: Bearer <token>GET /api/tasks/:id
Authorization: Bearer <token>POST /api/tasks
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Clean gutters",
"description": "Remove leaves and debris",
"category": "exterior",
"recurrence_type": "yearly",
"recurrence_interval": 2,
"recurrence_config": "{\"seasons\": [\"spring\", \"fall\"]}",
"priority": "high",
"estimated_time": 120,
"estimated_cost": 50,
"notes": "Use ladder safety equipment"
}PUT /api/tasks/:id
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Updated title",
"priority": "medium"
}DELETE /api/tasks/:id
Authorization: Bearer <token>GET /api/completions/task/:taskId
Authorization: Bearer <token>GET /api/completions/task/:taskId/last
Authorization: Bearer <token>POST /api/completions/task/:taskId
Authorization: Bearer <token>
Content-Type: application/json
{
"completed_at": "2024-03-15T10:30:00Z",
"completion_notes": "Everything looks good"
}POST /api/photos/completion/:completionId
Authorization: Bearer <token>
Content-Type: multipart/form-data
photos: [file1, file2, ...]GET /api/photos/:id
Authorization: Bearer <token>DELETE /api/photos/:id
Authorization: Bearer <token>GET /api/templates?category=hvac
Authorization: Bearer <token>GET /api/templates/by-category
Authorization: Bearer <token>id- Primary keyemail- Unique email addresspassword_hash- Bcrypt hashed passwordcreated_at- Timestamp
id- Primary keyuser_id- Foreign key to userstitle- Task namedescription- Detailed descriptioncategory- Task categoryrecurrence_type- once, daily, weekly, monthly, yearly, seasonalrecurrence_interval- How often (e.g., every 3 months)recurrence_config- JSON config for complex patternspriority- low, medium, highestimated_time- Minutesestimated_cost- Dollarsnotes- Additional notescreated_at,updated_at- Timestamps
id- Primary keytask_id- Foreign key to taskscompleted_at- Completion timestampcompletion_notes- Notes about the completioncreated_at- Timestamp
id- Primary keycompletion_id- Foreign key to task_completionsfile_path- Path to photo filecreated_at- Timestamp
id- Primary keytitle- Template namedescription- Template descriptioncategory- Task categorysuggested_recurrence_type- Suggested recurrencesuggested_recurrence_interval- Suggested intervalsuggested_recurrence_config- Suggested configis_system_template- System vs user templatecreated_at- Timestamp
Create a .env file in the root directory:
# Server Configuration
PORT=3000
NODE_ENV=production
# Database
DATABASE_PATH=./data/homeRhythm.db
# JWT Configuration
JWT_SECRET=your-secret-key-change-this-in-production
JWT_EXPIRES_IN=7d
# Upload Configuration
UPLOAD_DIR=./uploads
MAX_FILE_SIZE=10485760
# CORS
CORS_ORIGIN=http://localhost:5173
# Email Configuration (for notifications)
EMAIL_ENABLED=false
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_SECURE=false
EMAIL_USER=your-email@gmail.com
EMAIL_PASSWORD=your-app-password
EMAIL_FROM=your-email@gmail.com
EMAIL_FROM_NAME=HomeRhythm
# Notification Configuration
NOTIFICATION_DUE_SOON_DAYS=3
DIGEST_DEFAULT_TIME=09:00
EMAIL_MAX_RETRIES=3HomeRhythm supports email notifications for upcoming and overdue tasks. To enable email notifications:
- Set
EMAIL_ENABLED=truein your.envfile - Configure your SMTP settings:
- For Gmail: Use an App Password
- For other providers: Use your SMTP server details
- Set your email credentials:
EMAIL_ENABLED=true EMAIL_HOST=smtp.gmail.com EMAIL_PORT=587 EMAIL_SECURE=false EMAIL_USER=your-email@gmail.com EMAIL_PASSWORD=your-app-password EMAIL_FROM=your-email@gmail.com EMAIL_FROM_NAME=HomeRhythm
Notification Settings:
NOTIFICATION_DUE_SOON_DAYS=3- Days in advance to send "due soon" notificationsDIGEST_DEFAULT_TIME=09:00- Default time for daily digest emails (24-hour format)EMAIL_MAX_RETRIES=3- Maximum retry attempts for failed emails
Users can customize their notification preferences in the app settings.
The docker-compose configuration creates two volumes:
./data- SQLite database file./uploads- Uploaded photos
These directories are gitignored and persist across container restarts.
- Change the JWT secret in production to a secure random string
- Use HTTPS in production (configure a reverse proxy like nginx)
- Regular backups of the
datadirectory - File upload limits are enforced (10MB default)
- SQL injection protection via parameterized queries
- Password hashing with bcrypt (10 rounds)
- JWT expiration (7 days default)
# Backend tests (to be implemented)
cd backend
npm test
# Frontend tests (to be implemented)
cd frontend
npm test# Format code with prettier (to be implemented)
npm run formatMigrations run automatically on server start. To run manually:
cd backend
npm run migrate- Clone the repository on your server
- Set up your
.envfile with production values - Run
docker-compose up -d - Set up a reverse proxy (nginx/Caddy) with SSL
- Build the project:
npm run build - Set up a process manager (PM2, systemd)
- Configure nginx as a reverse proxy
- Set up SSL with Let's Encrypt
Future features under consideration:
- Dark mode
- Push notifications (web and mobile)
- Data export (JSON/CSV)
- Task dependencies
- Calendar integration (Google Calendar, iCal)
- Mobile apps (React Native)
- Task assignment to specific household members
- Weather-based task scheduling
- Cost tracking and budgeting
- Recurring expense tracking
- Vendor/contractor management
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Report bugs or request features via GitHub Issues
- For questions, start a GitHub Discussion
- Built with modern web technologies
- Inspired by the need for better home maintenance tracking
- Icons by Lucide
Made with ❤️ for homeowners everywhere