No description
- D 90.7%
- Rust 8.9%
- TypeScript 0.2%
- Makefile 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .github/workflows | ||
| assets | ||
| src | ||
| startos | ||
| target | ||
| .dockerignore | ||
| .gitignore | ||
| .prettierrc | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| Dockerfile | ||
| icon.svg | ||
| instructions.md | ||
| LICENSE | ||
| Makefile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| UPDATING.md | ||
Chore Wheel
A family chore rotation app for StartOS that uses weighted random selection to fairly assign chores.
What It Does
Chore Wheel helps households distribute chores fairly using a visual "wheel" system. Each chore has a weight based on how overdue it is, and spinning the wheel randomly selects a chore proportional to its weight. Overdue chores have a higher chance of being selected.
Features
- Weighted Random Selection: Chores that are more overdue have higher weights and are more likely to be picked
- Visual Wheel: Animated canvas wheel showing chore weights as slice sizes
- Member Management: Track multiple household members and their completion history
- Chore CRUD: Add, edit, and remove chores with configurable intervals
- History & Tallies: View recent completions and per-member statistics
- Basic Auth: Simple username/password protection for LAN use
Technical Stack
- Backend: Rust with axum (web framework) and sqlx (SQLite)
- Frontend: Server-rendered HTML with htmx for dynamic updates
- Database: SQLite persisted to StartOS volume
- Authentication: HTTP Basic Auth (configurable via environment variables)
How It Works
Weight Calculation
A chore's weight is calculated as:
weight = max(0, days_since_last_completion - interval_days) + 1
New chores or never-completed chores use their created_at as the baseline, giving them a weight of 1.
Spinning
When you spin the wheel:
- All chores are sampled via weighted random selection
- The selected chore is displayed
- You can mark it as complete, which updates
last_completed_atand resets its weight
Configuration
Environment Variables
AUTH_USERNAME: Basic auth username (default:admin)AUTH_PASSWORD: Basic auth password (default:password)
Set these in your Dockerfile or container configuration before building.
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | / |
Main UI with wheel, member picker, and chore list |
| POST | /spin |
Weighted random chore selection (JSON: {chore_id, member_id}) |
| POST | /complete |
Mark chore complete (JSON: {chore_id, member_id}) |
| GET | /chores |
List all chores with weights |
| POST | /chores |
Create new chore (form: name, interval_days) |
| PATCH | /chores/:id |
Update chore (form: name, interval_days) |
| DELETE | /chores/:id |
Delete chore |
| GET | /history |
Recent completions with member tallies |
Building
make
This produces a .s9pk file ready for installation on StartOS.
Development
# Build Rust backend
cargo build --release
# Run locally (for testing)
AUTH_USERNAME=admin AUTH_PASSWORD=password ./target/release/chore-wheel
License
MIT