- Dates are flat ISO directories (
YYYY-MM-DD), not nested by year and month. - Times are
HHMMSS, so several scrapes per day sort correctly. - Test data uses the same layout under
snapshots/synthetic/andindex/synthetic/. The frontend’sDATA_PREFIXsetting chooses which tree it reads.
Examples on this page use generated test data. Names are invented.
assignments.json
An array with one object per assignment row in the class’s portal table.assignments.json
Assignment name as shown in the portal. Together with
due_date, it identifies the assignment across snapshots.ISO date,
YYYY-MM-DD. If the portal shows a date that is not in MM/DD/YYYY form, the original text is kept as is, and an empty date becomes an empty string.Score text exactly as displayed, for example
47.7/60. Kept alongside the parsed numbers so nothing is lost in normalization.Parsed from
score_raw. Null when the assignment is not yet scored (--/60) or when score_raw is not in earned/possible form.metadata.json
One per snapshot. Built by n8n from the scrape response and committed after the class files.metadata.json
Keyed by class slug. A class present in one snapshot and absent from the next is reported as a class-level change.
rolling_index.json
A single file with one entry per snapshot, oldest first. The calendar reads only this file, so it never has to fetch individual snapshots to color a month.rolling_index.json
A summary of each class in the snapshot: course, final grade, final percent, and assignment count.