A lightweight browser app for tracking your degree average as you go, with a running weighted average (RWA) that updates the moment you add a grade.
No install, no build step - just open index.html.
- Tracks module grades across any number of years, each with configurable credit weightings
- Computes a running weighted average normalised to the years that have data (so if you've only entered Year 2 grades, the RWA reflects Year 2 alone, not a half-baked weighted sum)
- For each target grade (default: 70%, 75%, 80%), shows the average you need across all remaining credits to hit it
- What-if: type a hypothetical grade and see your projected final RWA instantly
- Lets you name each module and edit grades in place without deleting and re-adding
- Undo accidental deletions with a dismissible toast
- Export your grades as CSV or JSON, and import a previously exported JSON file to restore or move between browsers
- Persists everything in browser local storage - grades survive page refreshes
- Dark mode toggle in the header, with preference saved across sessions
open index.html
Or double-click it in Finder. That's it.
Each year has a weighting (e.g. Year 2 = 40%, Year 3 = 60%). The RWA is the weighted average of the year averages, normalised by the total weight of years that have any grades entered:
RWA = Σ(weight_i × year_avg_i) / Σ(weight_i)
where the sums are only over years with at least one grade. This means the RWA is always a meaningful percentage, not a partial weighted sum.
The required average calculation works backwards: given how much of the degree is already locked in, what average do you need across all remaining credits (across all years) to reach the target?
The what-if calculation works the other way: fill every remaining credit with a hypothetical grade and compute the resulting RWA across all years.
Click Settings to change:
- Year weightings, total credits, and custom labels per year (e.g. label Year 2 as "2023/24"); years can be added or removed - useful for integrated masters, medicine, or dentistry courses
- Grade boundaries for First, 2:1, 2:2, and Third class (defaults: 70/60/50/40)
- Target grades shown in the analysis panel
- Export your data as CSV or JSON, and import a JSON backup to restore grades or switch browsers
Press ? anywhere in the app to open Settings without reaching for the mouse.
Weightings don't need to sum to 100. Settings are saved in local storage alongside your grades.
index.html - app shell and settings modal
style.css - all styling, no framework
app.js - UniResults class + UI logic
The defaults are Year 2 (40%) and Year 3 (60%), each with 120 credits. You can change any of this at runtime via Settings without touching the code, or update the defaults in app.js:
const DEFAULT_STATE = {
weightings: { 2: 0.4, 3: 0.6 },
totalCredits: { 2: 120, 3: 120 },
...
};