Kattis Tracker is a Manifest V3 browser extension that watches accepted Kattis submissions from its content script and sends them to a configurable backend endpoint.
The extension runs on https://*.kattis.com/*, detects the signed-in Kattis username, reads accepted submissions from the user's submissions tab, and submits newly discovered accepted submissions to the backend.
- Cross-browser WebExtension built with Parcel.
- Tracks accepted Kattis submissions per user.
- Performs a full sync periodically and lightweight incremental syncs otherwise.
- Configurable backend URL from the extension options page.
npm ciBuild once:
npm run buildWatch and rebuild on changes:
npm run watchThe built extension is written to distribution/.
Using web-ext is recommended during development. It starts a dedicated, temporary browser profile with the extension installed, so you do not have to load it into your normal Chrome or Firefox profile.
-
Install dependencies and build the extension:
npm ci npm run build
-
In another terminal, run one of:
# Chrome / Chromium npx web-ext run --source-dir distribution --target chromium --start-url https://open.kattis.com # Firefox npx web-ext run --source-dir distribution --target firefox-desktop --start-url https://open.kattis.com
-
For iterative development, keep Parcel rebuilding in one terminal and rerun or leave
web-extrunning in another:npm run watch
The same sourceDir and startUrl defaults are also recorded in package.json under webExt.
- Run
npm run buildor keepnpm run watchrunning. - Open
chrome://extensions. - Enable Developer mode.
- Click Load unpacked.
- Select the
distribution/directory.
- Run
npm run buildor keepnpm run watchrunning. - Open
about:debugging#/runtime/this-firefox. - Click Load Temporary Add-on....
- Select
distribution/manifest.json.
Open the extension options page to configure the backend URL. The default is:
https://api.cpleaderboard.com/kattis_submit
The content script sends a JSON payload like:
{
"username": "example-user",
"submissions": [
{
"problemId": "hello",
"submissionId": "123456",
"timestamp": 1710000000000
}
],
"isAll": false
}npm run build- Build the extension intodistribution/.npm run watch- Rebuild the extension on file changes.npm run lint- Run JavaScript and CSS linting.npm run lint-fix- Run lint autofixers.npm test- Run the build used by CI.
- Source files live in
source/. source/manifest.jsonis the Parcel entrypoint.source/content.jsperforms Kattis page scraping and backend submission.source/options-storage.jsowns option defaults.