A Chrome extension that syncs your SubItUp work schedule to Google Calendar or Apple Calendar — no copy-pasting required.
SubItUp Sync on the Chrome Web Store — install and you’re ready to set up.
Select the shifts you want, then click Download .ics file. Open the downloaded file with any calendar app (Calendar.app, Outlook, Thunderbird, etc.). No account connection required.
In Settings (bottom of the popup), enable Auto-sync on page load to automatically sync every time you open your SubItUp schedule.
| Setting | What it does |
|---|---|
| Auto-sync on page load | Automatically syncs shifts whenever you open SubItUp |
| Timezone | Your detected local timezone (used for .ics exports and Apple sync) |
| Clear synced events | Removes all events the extension created and resets sync history |
No shifts appear in the popup
Google: “Auth failed” error
Apple: “Invalid credentials” or “AUTH_EXPIRED”
Events appear at the wrong time
Sync succeeded but events don’t appear
| Permission | Why it’s needed |
|---|---|
identity |
Signs you in to Google using Chrome’s built-in OAuth |
storage |
Saves settings, shift data, and sync history locally on your device |
webRequest |
Monitors SubItUp page loads to detect when new schedule data is available |
https://*.subitup.com/* |
Reads your schedule data from SubItUp pages |
https://www.googleapis.com/* |
Creates and manages events in Google Calendar |
https://caldav.icloud.com/* |
Creates and manages events in Apple Calendar via iCloud |
This extension processes your data entirely on your device. See PRIVACY.md for full details.
npm install && npm run buildmanifest.example.json → manifest.json, fill in your Chrome OAuth client IDsrc/config.example.ts → src/config.ts, fill in your Web OAuth client IDchrome://extensions → Developer mode → Load unpacked → select dist/The extension uses two separate OAuth client IDs from the same GCP project:
chrome.identity.getAuthToken() with the Chrome App client ID in manifest.json. Chrome manages the token silently; no redirect URI needed.chrome.identity.launchWebAuthFlow() with a Web Application client ID in src/config.ts. Requires a redirect URI (chrome-extension://<YOUR_EXTENSION_ID>/) added in GCP Console.Detection: chrome.runtime.getManifest().update_url is present only in published installs. The service worker uses this to pick the right flow automatically.
To set up both:
manifest.jsonchrome-extension://<YOUR_EXTENSION_ID>/ as an authorized redirect URI → paste its client ID into src/config.tsnpm run build # production build → dist/
npm run dev # watch mode
npm test # run tests