Homeschool Tracker — daily activity and prize contest for five configured children. Bilingual EN/ES, persistent SQLite, 45-minute/movie prizes with share, postpone, hold, and redeem. U.S. Department of Education IES / NSF EHR eligible.
A daily activity tracker for homeschooled kids β with prizes (45 minutes, a movie) that can be shared with other kids, postponed, redeemed, or held onto. Multi-language. Permanent SQLite database, forward-compatible schema.
Launch the AppAdd each child. Log activity by category β study, reading, exercise, creative, chores, free play. Total minutes per day auto-calculated.
Award 45 minutes of screen time or a movie of any length. Each prize has a status β held, redeemed, postponed, or shared.
Split 45-minute prizes evenly among the winner and one or more other kids. The leftover minute (if any) stays with the original winner.
Move any prize to another date. Postponed prizes remain in the queue and appear when you view that future date.
Hold onto a prize β it stays in your kid's balance. Redeem it to mark it used.
English and Spanish today; new languages added by dropping a JSON file into locales/. No code changes.
Every day with activity is preserved. Click any previous date to see what was done, what prizes were awarded, and which were redeemed, postponed, or shared.
SQLite with WAL journaling, foreign-key enforcement, schema-version table. Exportable as JSON for portability.
Five tables. Foreign-key relationships. Indexes on the hot paths. WAL journaling. Forward-compatible.
| Table | Purpose | Key Columns |
|---|---|---|
kids | Each child in the household | id, name, birthdate, locale, created_at |
activities | Activity minutes per kid per day | id, kid_id, date, minutes, category, note |
prizes | Each awarded prize and its status | id, kid_id, date, prize_type, minutes_value, status, shared_with, postponed_to, redeemed_on |
settings | User-configurable key/value | key, value |
schema_version | Forward-migration tracking | version, applied_at |
Schema migrations live in data/migrations/. Each migration increments schema_version and runs idempotently. New tables and columns are added by appending a new migration file β old data is never rewritten.
PRIZE FLOW
Activity recorded
|
Daily progress reviewed
|
45-minute or movie prize awarded
|
Hold | Redeem | Postpone | Share eligible minutes
Movie prizes follow the same held, redeemed, and postponed lifecycle but are not divided. Shared minute prizes preserve the original total and keep an auditable household record.
RESTful JSON API. All endpoints require a valid kid_id context (selected via the UI).
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/kids | List all kids |
| POST | /api/kids | Add a kid ({name, birthdate?, locale?}) |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/activities?kid_id=&date= | Activities for a kid on a date |
| GET | /api/activities/dates?kid_id= | List all dates with activity for a kid |
| POST | /api/activities | Add activity ({kid_id, date, minutes, category, note?}) |
| DELETE | /api/activities/:id | Remove an activity |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/prizes?kid_id= | List all prizes for a kid |
| POST | /api/prizes | Award a prize ({kid_id, date, prize_type}) |
| POST | /api/prizes/:id/redeem | Mark prize as redeemed |
| POST | /api/prizes/:id/postpone | Postpone ({postponed_to}) |
| POST | /api/prizes/:id/share | Share 45-min prize ({shared_with: [kid_ids]}) |
| POST | /api/prizes/:id/hold | Return to 'held' status |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/locales | List available locale codes |
| GET | /api/locales/:code | Get locale JSON |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/settings/:key | Get setting value |
| PUT | /api/settings/:key | Set setting value |
| GET | /api/export | Full database dump as JSON |
PUBLIC ACCESS
The hosted application opens with the five existing children and persistent household data. No local installation is required.
LANGUAGES
Locale resources are separated from application logic so additional languages can be added without redesigning the tracker.