Create a new issue on GitHub with this checklist after the finals every semester.
- Venue issues are created by Cloudflare workers, and the GitHub access token expires after 366 days. Update the personal access token on the Cloudflare dashboard and grant write permissions under Issues for the
nusmodsrepository.
-
Prepare "PR1"
- Update
packages/nusmods-academic-calendar/academic-calendar.jsonwith data for the new academic year so scraper and website Special Term overlap routing remains correct - Update with next year's holiday data from academic calendar to
website/src/data/holidays.json- Singapore & NUS Holidays (e.g. Well-Being day): https://www.nus.edu.sg/registrar/calendar - Update academic year in
scrapers/nus-v2/src/config.ts
- Update
-
Prepare "PR2"
- In
app-config.json, updateacademicYearandexamAvailabilityto include only the semesters where exam information is available - Update
packages/nusmods-academic-calendar/academic-calendar.jsonwith data for the new academic year - Add announcement to website by updating
website/src/views/components/notfications/Announcements.tsx - Leave
specialTermAcademicYearasnull— overlap with previous AY Special Term I and II is handled automatically until new AY Semester 1 starts (see PR3). Set manually (e.g."2024/2025") only if auto-detection from the academic calendar is insufficient - Update
semesterinapp-config.jsonand the ModReg schedule (see Every Semester)
- In
- Merge "PR1"
- Push PR1 to production
- Ensure that scraper is scraping next AY's data. You can do so by checking the locally published JSON files, or visiting
https://api.nusmods.com/v2/20XX-20XX/(e.g. https://api.nusmods.com/v2/2022-2023/) - On Vercel or
.env: Update academic year in export service's environment variables - Merge "PR2" to Master > Production
- Deploy! 🎉 🎉
- Monitor Sentry and Telegram for issues
PR2 is usually merged around July, while previous AY Special Term I and II run until new AY Semester 1 starts. During this window, sem 1–2 use the new AY and sem 3–4 continue to use the previous AY automatically — no action needed unless specialTermAcademicYear was set manually in PR2.
- Prepare "PR3"
- Ensure
specialTermAcademicYearisnull(overlap ends when Semester 1 starts perpackages/nusmods-academic-calendar/academic-calendar.json) - Add the previous academic year to
archiveYearsinapp-config.json
- Ensure
- Merge "PR3" to Master > Production
- Deploy and monitor Sentry and Telegram for issues
Reference PRs: PR #3286 and PR #3287
- Update semester in
website/src/config/app-config.json - Update the ModReg schedule in
website/src/data/modreg-schedule.json, and make sure the correct version is pointed to inwebsite/src/config/index.ts- Reference PR: PR #2764
- Update
ACADEMIC_YEARinscrapers/cpex-scraper/src/index.ts. It should be for the next semester - Create PR and merge to production
- Run scraper
For cpex-staging deployment
- Update
MPE_SEMESTERinwebsite/src/views/mpe/constants.tsto be the semester you're configuring CPEx for (usually the next semester) - Update dates in the ModReg schedule in
website/src/data/modreg-schedule.json - Enable the
enableCPExforProdandshowCPExTabflags inwebsite/src/featureFlags.ts - Push onto
cpex-stagingbranch (Ensure synced withmasterbranch first), then visit https://cpex-staging.nusmods.com/cpex and verify that NUS authentication is working
git checkout master
git pull
git switch cpex-staging
git reset --hard master
git push- Merge
cpex-stagingintomastervia PR - Deploy latest
mastertoproduction
- Disable the
enableCPExforProdandshowCPExTabflags inwebsite/src/featureFlags.ts - Merge into
master - Deploy latest
mastertoproduction