A command-line application for intelligent scheduling of recurring household tasks based on effort levels and desired frequencies.
Chore Scheduler helps you maintain consistent completion of household tasks by:
- Automatically distributing tasks across days based on effort limits
- Prioritizing overdue and urgent tasks
- Maintaining a balanced daily workload
- Tracking completion history
- Smart Scheduling: Automatically schedules tasks to meet frequency requirements while respecting daily effort limits
- Priority System: Prioritizes overdue tasks and tasks approaching their due date
- Simple CLI: Easy-to-use command-line interface accessible over SSH
- SQLite Storage: Lightweight, single-file database with no external dependencies
- Cross-Platform: Single binary that runs on Linux, macOS, and Windows
- Unit Tested: Comprehensive test coverage for reliability
git clone https://github.com/user/chore-scheduler.git
cd chore-scheduler
make build
sudo make installDownload the latest release for your platform from the releases page.
For NAS deployment:
# Linux AMD64 (most common)
wget https://github.com/user/chore-scheduler/releases/latest/download/chore-scheduler-linux-amd64
chmod +x chore-scheduler-linux-amd64
sudo mv chore-scheduler-linux-amd64 /usr/local/bin/chore-scheduler
# Linux ARM64
wget https://github.com/user/chore-scheduler/releases/latest/download/chore-scheduler-linux-arm64
chmod +x chore-scheduler-linux-arm64
sudo mv chore-scheduler-linux-arm64 /usr/local/bin/chore-schedulerchore-scheduler config set max-effort 10# Format: add "task name" --effort <1-3> --frequency <days>
chore-scheduler add "Vacuum living room" --effort 2 --frequency 3
chore-scheduler add "Clean bathroom" --effort 3 --frequency 7
chore-scheduler add "Water plants" --effort 1 --frequency 2
chore-scheduler add "Wash dishes" --effort 2 --frequency 1
chore-scheduler add "Take out trash" --effort 1 --frequency 3chore-scheduler todaychore-scheduler complete 1chore-scheduler add "Task name" --effort <1-3> --frequency <days>
# Examples:
chore-scheduler add "Mop floors" --effort 3 --frequency 14
chore-scheduler add "Dust shelves" --effort 1 --frequency 7Effort Levels:
1- Quick task (5-15 minutes)2- Medium task (15-45 minutes)3- Long task (45+ minutes)
Frequency: Number of days between completions
chore-scheduler list
# Show only overdue tasks
chore-scheduler list --overduechore-scheduler update <id> [--effort <1-3>] [--frequency <days>] [--name "New name"]
# Examples:
chore-scheduler update 1 --frequency 5
chore-scheduler update 2 --effort 2 --frequency 10
chore-scheduler update 3 --name "Deep clean bathroom"chore-scheduler delete <id>
# Skip confirmation prompt
chore-scheduler delete <id> --forcechore-scheduler todayOutput example:
Today's Tasks (Effort: 7/10)
+----+------------------+--------+----------+
| ID | Task | Effort | Status |
+----+------------------+--------+----------+
| 1 | Vacuum living rm | 2 | Due |
| 3 | Water plants | 1 | Due |
| 5 | Take out trash | 1 | Due |
| 2 | Clean bathroom | 3 | OVERDUE! |
+----+------------------+--------+----------+
chore-scheduler upcoming
# Show more days
chore-scheduler upcoming --days 14chore-scheduler complete <id>This will:
- Record the completion
- Calculate the next due date
- Reschedule the task
- Display when the task is next due
chore-scheduler postpone <id>
# Postpone by specific number of days
chore-scheduler postpone <id> --days 2Generate a daily email with today's scheduled tasks. The command outputs a complete RFC 2822 email (headers + HTML body) to stdout, designed to be piped to sendmail.
# Set recipient (required)
chore-scheduler config set email_to user@example.com
# Set sender (optional, defaults to "Chore Scheduler <chore-scheduler@localhost>")
chore-scheduler config set email_from "Chore Scheduler <chores@nas.local>"# Add to crontab (e.g. daily at 6:45am)
45 6 * * * chore-scheduler email | sendmail -t# Output to terminal
chore-scheduler email
# Save as .eml file to check rendering
chore-scheduler email > digest.emlThe email includes a table of today's tasks with name, room, effort level, and an overdue badge for tasks past their due date.
chore-scheduler config list
chore-scheduler config get max-effortchore-scheduler config set max-effort 12chore-scheduler rescheduleUse this after:
- Changing max daily effort
- Completing multiple tasks
- Making significant changes to task frequencies
# Via flag
chore-scheduler --db /path/to/database.db today
# Via environment variable
export CHORE_SCHEDULER_DB=/nas/shared/chores.db
chore-scheduler todaychore-scheduler stats
chore-scheduler stats --days 30- Language: Go 1.21+
- Database: SQLite 3
- CLI Framework: Cobra
- Testing: Go testing + testify
chore-scheduler/
├── cmd/chore-scheduler/ # Application entry point
├── internal/
│ ├── db/ # Database layer
│ ├── models/ # Data models
│ ├── repository/ # Data access layer
│ ├── scheduler/ # Scheduling logic
│ └── cli/ # CLI commands
├── go.mod
└── Makefile
- tasks: Task definitions and scheduling metadata
- completions: Audit log of task completions
- scheduled_tasks: Daily task assignments
- config: Application configuration
make buildmake test
# With coverage
go test -v -cover ./...make run
# Or directly
go run cmd/chore-scheduler/main.go# For Linux AMD64
make build-linux-amd64
# For Linux ARM64
make build-linux-arm64-
Priority Calculation: Tasks are prioritized by:
- Overdue tasks get highest priority (1000 + days overdue)
- Tasks due soon get priority based on urgency (100 / days until due)
- Unscheduled tasks get medium priority (50)
-
Daily Assignment: For each day starting from today:
- Calculate remaining effort capacity (max effort - already scheduled)
- Assign highest priority tasks that fit within capacity
- Continue until capacity is full or all tasks are scheduled
-
Rescheduling Triggers:
- When a task is completed (reschedule for next due date)
- When a task is postponed (find next available day)
- When configuration changes (max effort adjusted)
- Manual reschedule command
Add Task → Initial Schedule → [Due → Complete → Reschedule] → (repeat)
↓
Postpone → Reschedule
Default database location:
- Linux/macOS:
~/.chore-scheduler/chore.db - Windows:
%USERPROFILE%\.chore-scheduler\chore.db
Override with:
--dbflag:chore-scheduler --db /path/to/db.sqlite- Environment variable:
CHORE_SCHEDULER_DB=/path/to/db.sqlite
- Start Small: Begin with 5-10 tasks and adjust effort levels as you learn
- Realistic Effort: Set max daily effort based on actual available time
- Adjust Frequencies: Fine-tune task frequencies after a week or two
- Regular Reviews: Run
chore-scheduler listweekly to review all tasks - Postpone Wisely: Use postpone for special circumstances, not as a habit
- Completion Habit: Mark tasks complete immediately after finishing
SQLite allows limited concurrent access. If running multiple instances:
# Enable WAL mode in database (better concurrency)
sqlite3 ~/.chore-scheduler/chore.db "PRAGMA journal_mode=WAL;"# Force reschedule
chore-scheduler reschedule
# Check if max effort is too low
chore-scheduler config get max-effortIncrease max daily effort or reduce task frequencies:
chore-scheduler config set max-effort 15- Web interface for mobile-friendly access
- JSON API for app integration
- Task categories and tags
- Multiple users/households
- Statistics dashboard
- Completion streaks
- Task dependencies
- Recurring patterns (e.g., "every Monday")
- Mobile push notifications
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Write tests for new functionality
- Ensure all tests pass
- Submit a pull request
MIT License - see LICENSE file for details
For issues, questions, or suggestions:
- Open an issue on GitHub
- Check existing issues for solutions
- Read the documentation in
/docs
Built to replace Sweepy with a lightweight, self-hosted alternative optimized for SSH access and terminal usage.