A household chore management app with recurring tasks, built with Bun and SQLite.
- Recurring Tasks: Every task has a custom repeat interval (e.g., every 3 days, every week)
- Task Status: Tasks show as Done (green), Due Today (yellow), or Overdue (red)
- Household Members: Add family members to assign tasks and track completions
- Categories: Organize tasks by room/area (Kitchen, Bathroom, Garden, etc.)
- Completion History: Track who completed what and when
- Simple Authentication: One account with named household members inside
- Runtime: Bun
- Backend: Hono
- Database: SQLite (Bun's built-in SQLite)
- Frontend: Alpine.js + Tailwind CSS (via CDN)
- Bun installed
# Install dependencies
bun install
# Seed the database with demo data (optional)
bun run db:seed
# Start the development server
bun run devThe app will be available at http://localhost:3000
# Build standalone binary
bun run build
# Run the compiled server
./dist/server# Build the image
docker build -t home-todo-planner .
# Run with bind mount (data persists on host)
docker run -p 3000:3000 -v ./data:/app/data -e ALLOW_SIGNUPS=true home-todo-planner
# Or use a named volume
docker run -p 3000:3000 -v todo-data:/app/data -e ALLOW_SIGNUPS=true home-todo-planner# Start the app
docker compose up -d
# View logs
docker compose logs -f
# Stop the app
docker compose downConfiguration is in stack.env:
ALLOW_SIGNUPS=true
PORT=3000
DATA_PATH=/path/to/local/data # Optional: use local path instead of Docker volume- Push this repo to GitHub/GitLab
- In Portainer: Stacks → Add Stack → Repository
- Enter your repository URL
- Deploy — Portainer will use
docker-compose.ymlandstack.env
To use a local mount path, either:
- Set
DATA_PATHinstack.envbefore pushing - Or add
DATA_PATHin Portainer's environment variables when deploying
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
DATABASE_PATH |
./data/chores.db |
SQLite database path |
ALLOW_SIGNUPS |
false |
Enable user registration |
SECURE_COOKIES |
true |
Set to false for local network HTTP deployments without TLS |
DATA_PATH |
todo-data |
Docker volume or local path for data persistence |
If you ran the seed script:
- Email:
demo@example.com - Password:
demo123
├── server/
│ ├── index.ts # Hono API server
│ └── db.ts # SQLite database setup
├── public/
│ └── index.html # Frontend SPA (Alpine.js)
├── scripts/
│ └── seed.ts # Database seeding script
└── package.json
GET /api/health- Health check endpointGET /api/config- Public configuration (e.g., signup status)
POST /api/register- Create new account (requiresALLOW_SIGNUPS=true)POST /api/login- Sign inPOST /api/logout- Sign outGET /api/me- Get current user
GET /api/tasks- List all tasks with statusPOST /api/tasks- Create taskPUT /api/tasks/:id- Update taskDELETE /api/tasks/:id- Delete taskPOST /api/tasks/:id/complete- Mark task as done
GET /api/categories- List categoriesPOST /api/categories- Create categoryPUT /api/categories/:id- Update categoryDELETE /api/categories/:id- Delete category
GET /api/members- List household membersPOST /api/members- Add memberPUT /api/members/:id- Update memberDELETE /api/members/:id- Remove member
GET /api/history- Get completion history (last 100)
MIT