schedulr4.0.2.mp4
- Requirements
- Where to get help or support?
- Installation
- Usage
- Project status
- Contributing
- Development Guide
- Tech Stack
- Changelog
- Privacy policy
- License
- Why this project?
- Buy me a coffee
- Credit
- Frequently Asked Questions (FAQs)
- MMU students with "Active" current student status ONLY, MMU Lecturers.
- Chromium-based browser or Firefox ONLY. (Safari might not work as intended)
Check if the encountered issues are mentioned in this documentation. If not, you can communicate with me through email, issue tracker, or discord.
- Go to the extension's page or search up "Schedulr" in Chrome Web Store.
- Click "Add to Chrome".
Note: Some steps after step 4 may vary depending on your target calendar.
- Go to "View My Classes/Schedule > By Class" in CliC. (Ensure all subjects are expanded)
- Go to "Instructor WorkCenter > My Weekly Schedule" in CLiC.
- Open the extension by using the shortcut key or by clicking the extension icon.
- An authentication window will appear, grant permission for both scopes and then reopen the extension.
- Select Transfer to Google Calendar, then click Confirm.
- Select all the necessary options.
- Press the Submit button to transfer timetable to Google Calendar.
- Select Download an .ics file, then click Confirm.
- Select all the necessary options.
- Press the Submit button to download the .ics file.
- Go to your target calendar and import the .ics file.
*Tip: An .ics file lets you import events into other calendar apps like Outlook.*
Schedulr version 4.1.0 is available on Chrome Web store as of now.
Schedulr is an open-source project designed to assist fellow MMU peers. I invite you to participate in various ways to contribute and enhance the project!
Feel free to explore the contribution guidelines below to get started. Your involvement is greatly appreciated!
You should be familiar with or have a basic understanding of these:
- HTML, CSS, Javascript
- Web Scraping
- Google Calendar API
- Cloudflare Workers
- Github action / Rollup (recommended in case you need to fix build processes)
- Chrome extension development, manifest v3.
βββ backend # contains backend (cloudflare worker, supabase) code
β βββ cloudflare-workers # cloudflare worker code and configs
β β βββ dist/ # stores cfw post built (distribution) files
β β βββ package.json # packages installed in cfw
β β βββ README.md
β β βββ src # all cfw code
β β β βββ index.ts # main file to handle cfw endpoints
β β β βββ lib/ # stores reusable functions
β β βββ tsconfig.json
β β βββ .dev.vars # environment variables for cfw (development)
β β βββ .dev.vars.prd # environment variables for cfw (production)
β β βββ wrangler.jsonc # wrangler config
β βββ db/ # database code
βββ docs/ # product website code
βββ frontend/ # extension's client side functions
β βββ dist/ # stores extension post built (distribution) file
β βββ src # all extension code
β βββ backgrounds/ # background (service worker) script
β βββ popup/ # stores extension popup related code
β βββ scripts # reusable functions
β βββ auth/ # authentication flow functions
β βββ calendar/ # google calendar functions
β βββ scraper/ # web scraping functions
β βββ utils/ # misc reusable functions
βββ images/ # images used for schedulr
βββ package.json # package manager config
βββ package-lock.json # package lock file
βββ rollup.config.js # rollup config file
βββ Makefile # shortcut commands for building extension
βββ .env # environment variables for frontend
βββ manifest.json # extension manifest file
The sequence diagram below illustrates both the authentication and import to calendar process in Schedulr:
In this schema, we treat each account as separate user despite being logged in from the same IP.
The relationship between each table are:
- users (one) - oauth_tokens (one): each user can have only one oauth token
- users (one) - sessions (one): each user can have only one session
Note
To clarify, each user can only have one oauth_tokens and sessions is because the program upserts (overwrites) previous oauth token and session when user logs in again. You can refer to backend/db/schema.sql for the table definitions.
Project secrets are stored as GitHub secrets and injected as environment variables during build time.
The build process is handled by GitHub Actions:
Note: This guide is based on Google Chrome's workflow, so some of the steps (especially manifest.json format) may not directly apply to other browsers. Please refer to the respective browser's documentation for more information.
-
Clone the Repository
git clone https://github.com/sycanz/schedulr
-
Load the Extension into based on your preference
Chrome
- Navigate to
chrome://extensions/ - Enable Developer mode (toggle switch at the top right)
- Click on
Load unpackedand select the cloned repository - The extension should now be loaded in your browser
Firefox
- Run
make package-firefoxin project root directory, this will generate firefox compatible file - Navigate to
about:debugging#/runtime/this-firefox - Click on "Add Temporary Add-on" and upload zip file
- Upload Zip File (make sure it's the firefox version with the
make package-firefoxcommand) - The extension should now be loaded in your browser
- Navigate to
IMPORTANT: For Chrome devs, take note of the extension ID, you'll need it for setting up the Google Calendar API.
- Create a new project in the Google Cloud Console.
- Enable the Google Calendar API by navigating to (APIs and services > Library > Google Calendar API > Enable)
- Create a new OAuth Client ID:
- On the left bar, navigate to APIs and services > Credentials > Create credentials > OAuth Client ID
- Select
Web Application - For chrome extensions, your authorised redirect URIs will be
https://<YOUR-APP-ID>.chromiumapp.org/oauth - For firefox extensions, add
http://127.0.0.1/mozoauth2/c413aa589786fe732e3d3587a8002ba3e5f48350
- Navigate to Audience on the left bar and add your email under
Test usersso you can access the GCP project, make sure you sign in with the same account when testing the extension. - Take note of the Client ID and Client Secret after creating OAuth ID.
- Create a new supabase project with Singapore region
- Copy entire content in schema.sql and paste it in Supabase's SQL editor to create tables (RLS recommended)
- Retrieve your
project urlandpublishable key
- Create
.envfile (frontend secrets) in the root directory and add the necessary variables by referring to .env.example - Create
.dev.varsfile (backend secrets) in backend/cloudflare-workers/ directory and add the necessary variables by referring to .dev.vars.example - Run
npm run setupin the root directory to install all dependencies - Run
npm run build:scraperornpm run watch:scraperin project root directory to bundle project - Start backend server with
npm run devinschedulr/backend/cloudflare-workers - Start contributing!
NOTE: In case of any error, check the server log or inspect the dev console when using extension for logs.
To test the latest changes before they are merged into production:
- Once you have changes, create a PR with
stgas the base branch and CI pipeline will run. - After CI runs successfully, code owner (sycanz) will merge the PR which executes CD pipeline
- After CD runs successfully, download
schedulr-chrome-stg-zipfor Chrome orschedulr-firefox-stg-zipfor Firefox from the Artifacts section at the bottom. - Load files on browser and test the extension.
- After validation is successful, the code owner will handle the final merge to
mainbranch for production deployment.
NOTE: Secrets for stg/prd are dynamically loaded through pipeline.
During commit, Husky is setup to automatically:
- Prettify code with prettier
- Run linter with eslint
npm run lintto run the linter.npm run lint:fixto run the linter and fix issues.npm run prettierto run prettier.npm run prettier:fixto run prettier and fix issues.
- Javascript
- Google Calendar API (GCP)
- Cloudflare Workers (Backend API)
- Supabase (Database & Auth)
- Rollup (Module Bundling)
- GitHub Actions (CI/CD)
- HTML, CSS
Detailed changes for each release are documented in the release notes.
Please read the Privacy Policy for this extension before proceeding.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE
If you've found this useful and want to support the project, you can send a TNG donation via the QR code below!
CLiC (MMU's student portal) sometimes shows incorrect start dates for classes. Even if the actual class day is a Tuesday, CLiC might show the preceding Monday as the start date.
As shown in the image above, the start date is listed as 30/03/2026 (Monday), but the day on the right clearly states Tuesday (which would be 31/03/2026).
If you notice this discrepancy in your timetable, select "Yes" for "Defected CLiC?" in the extension. This ensures that Schedulr correctly calculates the first class date based on the day of the week rather than the potentially incorrect start date provided by CLiC.
This project was developed at Hackerspace MMU. Also shoutout to a couple of friends who helped me out on this project.
Q: What browser does Schedulr currently support?
A: Google Chrome, Chromium-based browsers (Brave, Edge, etc.), and Firefox. (Safari is not fully supported yet)
Q: Do I have to pay for this extension?
A: No, Schedulr is free to use for all active MMU students/lecturers and open-source.
Q: Why are some of my classes not showing up in the timetable?
A: Ensure you have expanded all subjects in the "By Class" page.
Q: Do I need to grant permission every time I open the extension?
A: No. Once you've granted permission, your session will remain active for 30 minutes without needing to re-authenticate. This is by design to prevent session hijacking.
Q: Should I be worried about my privacy when using this extension?
A: No, the extension only reads your timetable and transfers it to your calendar. It does not store any personal data.
Q: Can I use this extension for other universities?
A: No, this extension is specifically designed for MMU students and lecturers only.
Q: Are there any plans to support other browsers?
A: Firefox is now officially supported! We are working on refining the experience. Safari is on the roadmap but not currently a priority.
Q: Can I rely on this extension for my timetable?
A: Somewhat, reason being CLiC might have unexpected bugs or changes that might affect the extension.
Q: How can I contribute to this project?
A: There are things like bug fixes, feature requests, code, and documentation that you can contribute to. Check out the contribution guidelines
Q: Where can I get any help or support?
A: Check if the encountered issues are mentioned in this documentation. If not, you can communicate with me through email, issue tracker, or discord






