Skip to main content
All data lives in a private GitHub repository, separate from the code. A snapshot is addressed by its date and time, and each class inside it by a slug from the scraper’s configuration.
  • 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/ and index/synthetic/. The frontend’s DATA_PREFIX setting 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
string
required
Assignment name as shown in the portal. Together with due_date, it identifies the assignment across snapshots.
string
required
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.
string
Grading category, such as homework or tests.
string
Score text exactly as displayed, for example 47.7/60. Kept alongside the parsed numbers so nothing is lost in normalization.
number | null
Parsed from score_raw. Null when the assignment is not yet scored (--/60) or when score_raw is not in earned/possible form.
number | null
Parsed from score_raw.
number | null
Percentage shown by the portal.
string | null
Letter grade shown by the portal.
boolean
True when the teacher has left a comment on the assignment.
object
Status markers from the portal. Each is true when its icon appears in the row.

metadata.json

One per snapshot. Built by n8n from the scrape response and committed after the class files.
metadata.json
string
required
Snapshot date, YYYY-MM-DD.
string
required
Snapshot time, HHMMSS.
string
ISO 8601 timestamp of the scrape.
object
required
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
string | null
The date/time this entry was diffed against. Null for the first snapshot.
object
Counts from comparing this snapshot with previous_snapshot.
object
A summary of each class in the snapshot: course, final grade, final percent, and assignment count.
number | null
Weighted GPA on a 4.0 scale. Honors classes add 0.5 and AP classes add 1.0. Weights come from the scraper’s class configuration. Null when no class has a gradeable letter grade.