Schedule
This page covers the weekly planner and daily view that track homeschool work. These are complementary to the Google Calendar integration: calendar events are time-bound appointments; schedule items are daily to-do items that track work completion.
School Platform series
- School Platform
- Architecture
- AI features
- Calendar integration
- Programme
- Explainers
- Schedule - You are here
- Integrations
- Deployment
Two paired surfaces
The schedule feature has two views designed for different audiences:
| Route | Audience | Purpose |
|---|---|---|
/schedule | Parent | Week grid with seven day columns plus a weekly-plan column. Drag-drop between days, repeat-across-week, item CRUD. |
/today | Child | Daily to-do list for the current Perth date. Merges today's items, incomplete items carried forward from prior days, and any started AvE tasks. |
/schedule/plan | Parent | Long-range view grouping week blocks into terms. |
How it works
Data model
| Model | Purpose |
|---|---|
PlanPeriod | Multi-week term or block with start/end dates |
WeekBlock | One per ISO week (Monday start, Perth timezone). Holds weekly goals and theme. |
DailySchedule | One row per calendar day that has items. Created lazily. |
DailyScheduleItem | Single to-do row on a day. Polymorphic via kind and linking columns. |
Item kinds
The ScheduleItemKind enum covers all sources of scheduled work:
| Kind | Represents | Link mechanism |
|---|---|---|
CUSTOM | Free-text parent-typed item | No link |
ACTIVITY | Platform Activity | activityId FK |
STUDY_UNIT | AI-generated study unit | studyUnitId FK |
AVE_TASK | Single AvE programme task | External ref to AveTask.id |
AVE_MODULE | AvE module reminder | External ref to AveModule.id |
EUKA_LESSON | Euka lesson (auto-scheduled) | External ref with Euka % score |
MATHSPACE_TOPIC | Mathspace topic (auto-scheduled) | External ref |
SCRATCH_PROJECT | Scratch project | External ref |
The UI renders each kind with a distinct colour pill and label.
Key behaviours
Drag-drop between days
Every item on /schedule is draggable with HTML5 drag-and-drop. Day columns accept drops and PATCH the item's date server-side. A grip icon signals the draggable affordance and reveals on hover.
Repeat across the week
The repeat icon on each row clones the item across the remaining days in the current week. Already-existing duplicates are skipped server-side.
Carry-forward on /today
The daily view merges three sources into one list:
- Items dated today
- Incomplete items from prior days (carried forward until completed)
- Synthetic items for any AvE task that is started but not completed and has no existing schedule item
Ticking a carried-forward item marks it complete wherever it originated. Unticking an AvE-linked item resets the task's completion state so it reappears the next day.
Auto-scheduling from integrations
When the Euka or Mathspace scraper detects a lesson has been started or completed, it automatically creates an Activity and a DailyScheduleItem dated to the Perth calendar day the work was first observed. See Integrations for the full scraper lifecycle.
Compact week view
The week grid uses a compact layout:
- Source pills (Euka 75%, AvE, Mathspace) shown as coloured badges
- Redundant prefixes stripped when the source badge is already visible
- Grip, repeat, and delete icons hidden until hover (checkbox remains always visible)
- Task titles wrap naturally below the meta row
Timezone handling
All schedule dates are stored as UTC but represent Perth midnight (Australia/Perth, UTC+8, no DST). The helper perthStartOfDay normalises dates so timezone changes never shift an item to a different calendar day.