Thanks for helping make grade boundary data more accessible to students everywhere! This guide covers everything you need to get started.
Important: All contributions go to
GradeBoundaries-devonly.
Pull requests toGradeBoundaries-stablewill be closed without review — that repo hosts the live site at gradeboundaries.com and is managed exclusively by maintainers.
- Ways to Contribute
- Getting Started
- Contributing Data (CSV)
- Contributing Code
- Submitting a Pull Request
- Issue Labels
- Code of Conduct
| Type | Description |
|---|---|
| 📊 Data | Add missing grade boundaries (sessions, years, exam boards) |
| 🐛 Bug Report | Report broken pages, wrong data, or display issues |
| ✨ Feature | Suggest or build new site functionality |
| 🎨 UI/Design | Improve the look and usability of the site |
-
Fork
GradeBoundaries-devand clone your fork:git clone https://github.com/YOUR-USERNAME/GradeBoundaries-dev.git cd GradeBoundaries-dev -
Install dependencies (only needed if you're touching HTML or CSS):
npm install
-
Compile Tailwind so styles render locally:
npm run build
This runs
tailwindcss -i ./src/input.css -o ./dist/output.css --minify. -
Open
index.htmldirectly in your browser — no dev server required for most changes. -
Make your changes on a new branch:
git checkout -b your-branch-name
-
Commit, push, and open a Pull Request against
GradeBoundaries-dev.
This is the most impactful way to help. Each exam board has its own CSV file with a slightly different structure — match the correct one exactly.
| Column | Description | Example |
|---|---|---|
year |
4-digit year | 2025 |
session |
Session name | Jan, Jun, Oct |
code |
Unit code | WPH14 |
unit |
Unit name | Unit 4: Further Mechanics... |
max_mark |
Maximum mark | 90 |
a*–u |
Grade boundaries | 80 |
| Column | Description | Example |
|---|---|---|
SubjectCode |
Subject code | 9702 |
Subject |
Subject name | Physics |
Series |
Exam series | june-2025 |
Component |
Component number | 11 |
MaxRawMark |
Maximum mark | 40 |
A–E |
Grade boundaries | 29 |
| Column | Description | Example |
|---|---|---|
year |
4-digit year | 2025 |
session |
Session name | June, January |
code |
Unit code | CH01 |
unit |
Unit name | CHEMISTRY UNIT 1 |
max_mark |
Maximum mark | 70 |
UMS_CAP |
UMS cap (gold line on chart) | 69 |
A*–E |
Grade boundaries | 55 |
Similar structure to Edexcel. Open the existing file to confirm exact column names and casing before adding rows.
- Data sourced directly from the official exam board PDF (link it in your PR)
- No rows duplicated from what's already in the CSV
- All columns present and in the correct order
- Session/series casing matches existing rows (e.g.
Junnotjunefor Edexcel;june-2025for CIE) - File opens without parse errors in a plain text editor
| Layer | Technology |
|---|---|
| Markup | Plain HTML5 |
| Styling | Custom CSS (style.css) + Tailwind CSS v3 → dist/output.css |
| Tables | jQuery 3.7 + DataTables 1.13 |
| Charts | Chart.js (CDN) |
| CSV parsing | PapaParse (CDN) |
| Build | npm run build (Tailwind CLI) |
| Testing | Playwright |
| Analytics | Plausible + GoatCounter |
/
├── index.html # Homepage
├── dashboard-engine.js # Shared chart + table logic (all 4 board pages)
├── style.css # Design tokens, components, dark mode
├── src/input.css # Tailwind entry point
├── dist/output.css
├── tailwind.config.js
├── postcss.config.js
├── Edexcel/
│ ├── index.html
│ └── Edexcel.csv
├── CIE/
│ ├── index.html
│ └── CIE.csv
├── OxfordAqa/
│ ├── index.html
│ └── OxfordAqa.csv
├── OCR/
│ ├── index.html
│ └── OCR.csv
├── Contact/index.html
└── Privacy/index.html
- Keep it vanilla — no npm runtime packages or JS frameworks
dashboard-engine.jsis shared across all four board pages — changes there affect everything, so test all four boards after editing it- Run
npm run buildlocally to verify Tailwind styles, but do not commitdist/ - Test in Chrome and Firefox before submitting
- Comment non-obvious logic
- Make sure your branch is up to date with
mainonGradeBoundaries-dev - Fill in the PR template completely
- Link related issues with
Closes #123 - Be responsive to feedback — PRs with no activity for 2 weeks may be closed
Maintainers review, then promote approved changes to GradeBoundaries-stable for live deployment.
| Label | Meaning |
|---|---|
good first issue |
Great for new contributors |
help wanted |
Maintainers welcome a PR |
data-needed |
Missing CSV data for a specific board/session |
bug |
Something is broken |
enhancement |
New feature or improvement |
board: Edexcel / board: CIE / board: OCR / board: OxfordAQA |
Board-specific issue |
Be kind and constructive. This project was built by students, for students — keep that spirit in everything you do.
Questions? Join us on Discord or email allgradeboundaries@gmail.com.