Course Management
Cached Courses
A course appears in the Dashboard only after it has been cached. Caching happens automatically when the overlay renders on a grades page, or you can trigger it manually with the Cache button.
Each cached course entry is stored under its course key (course:${classroomSectionID}) in chrome.storage.local. An index entry is also written to ICI_CACHE_INDEX:
{
"course:12345": {
"courseId": "course:12345",
"courseName": "AP CALCULUS BC",
"lastUpdated": 1699999999000,
"sourceUrl": "https://district.infinitecampus.org/campus/..."
}
}
Hiding a Course
(Available via the Dashboard's course card menu or options, if exposed in UI.)
If you want to suppress a course from the Dashboard without deleting its data, it can be added to the ICI_HIDDEN_COURSES array in storage. Hidden courses are filtered out during loadIndexCore() before card rendering. The course data and history remain intact; unhiding the course restores it.
Deleting a Course
Click the red Delete button on a course card in the Dashboard.
What gets removed:
- The course's snapshot entry (
course:${id}) - The course's cache-index entry (
ICI_CACHE_INDEX[key]) - The course's GPA weight from
ICI_GPA_WEIGHTS - The course's what-if state (
WI_${key})
What is not automatically removed (remains in storage):
- History snapshots (
ICI_HISTORY_SNAPSHOTS[key]) - these are cleaned up separately byHistorySnapshots.deleteAllSnapshotsForCourse(courseKey)when triggered - Permanent edits (
PE_${key}) and permanent adds (PA_${key}) - not deleted on course card delete - Saved scenarios (
ICI_SCENARIOS_${key}) - not deleted on course card delete - The backup entry (
${key}_BACKUP) - not deleted on course card delete
To recache a deleted course, simply navigate to it in Infinite Campus again.
Rollback / Backup
Before every cache update, the previous snapshot is copied to ${courseKey}_BACKUP in storage. If a cache write produces a 0% overall (e.g. the page hadn't finished loading), the update is silently rejected and the prior entry is preserved.
To manually roll back, use the data export/import feature in Options → Data Management, or access the backup key directly via the Chrome storage inspector.
Duplicate Course Merging
When the Dashboard loads, it checks all cached courses for name duplicates. If two entries share the same course name:
- They are sorted by
lastUpdated(most recent first). - The most recent entry is kept as the canonical entry.
- Quarters from all duplicate entries are merged (preferring the entry with more categories for each quarter ID).
- History snapshots from all duplicates are merged and deduplicated by snapshot ID.
- GPA weights from older entries are transferred to the kept entry if the kept entry has no weight set.
- All duplicate entries (and their index/weight entries) are deleted from storage.
This merging happens automatically and silently at Dashboard load time.
Bulk Refresh
The Refresh All (⟳) button on the Dashboard uses refresh-controller.js to sequentially re-open each course's saved source URL in a new tab, wait for the content script to parse it, then close and move to the next course. A pre-flight dialog explains what will happen and asks for confirmation. Progress is shown in the Dashboard UI. You can cancel mid-refresh.
Each course refresh includes a retry/backoff strategy (up to 3 attempts with 0s, 5s, and 20s delays) in case a course page fails to load.