A Chrome/Brave extension (Manifest V3) that syncs ICC WorkAxle roster shifts to Google Calendar and Apple Calendar (or any iCal-compatible app).
- Automatically captures WorkAxle auth tokens from your logged-in session
- Syncs shifts for the next 4 weeks to Google Calendar
- Live iCal feed via Cloudflare Worker for Apple Calendar (always on, no computer needed)
- Auto-pushes fresh tokens to Cloudflare whenever you open WorkAxle
- Account switcher — sign in/out of Google without reopening the browser
- Auto-syncs Google Calendar every hour in the background
- One-click Open Schedule button
- Works on Chrome and Brave
- Google Chrome or Brave browser
- A Google account with Calendar access
- Access to WorkAxle ICC (
https://icc.workaxle.com/)
- Go to Google Cloud Console
- Create or select a project
- Go to APIs & Services → Library → enable Google Calendar API
- Go to APIs & Services → OAuth consent screen
- Select External
- Fill in app name ("WorkAxle Sync") and contact email
- Add scopes:
calendar.events,calendar.readonly,userinfo.email,userinfo.profile - Add your Google account as a test user
- Click Save and Continue
Once ready for others to use, go back and click Publish App to remove the test user restriction.
- Go to APIs & Services → Credentials
- Click Create Credentials → OAuth client ID
- Application type: Web application
- Name it "WorkAxle Sync"
- Under Authorised redirect URIs add:
Replace
https://YOUR-EXTENSION-ID.chromiumapp.org/YOUR-EXTENSION-IDwith your actual extension ID (found atbrave://extensions/orchrome://extensions/after loading the extension) - Click Create and copy the Client ID
Note: Each computer/browser install gets a different extension ID. If you install on a second computer, add a second redirect URI with that computer's extension ID — you can have multiple on the same OAuth client.
Replace the client_id value in manifest.json:
"oauth2": {
"client_id": "YOUR-CLIENT-ID.apps.googleusercontent.com",
...
}Also update the same value near the top of service_worker.js:
const OAUTH_CLIENT_ID = 'YOUR-CLIENT-ID.apps.googleusercontent.com';Chrome:
- Go to
chrome://extensions/ - Enable Developer mode
- Click Load unpacked → select this folder
Brave:
- Go to
brave://extensions/ - Enable Developer mode
- Click Load unpacked → select this folder
Note your Extension ID shown under the extension name — you need it for the redirect URI in Step 3.
- Open
https://icc.workaxle.com/and log in - Refresh the WorkAxle schedule page — the extension captures your auth tokens automatically
- Click the extension icon — the token status dot should turn green
- Click Sign in to connect your Google account
- Select a Google Calendar and click Sync Next 4 Weeks
For a live always-on feed that works with Apple Calendar, Outlook, or any iCal-compatible app. No computer needs to be left on.
- Create a free account at dash.cloudflare.com
- Go to Workers & Pages → Create → Start with Hello World
- Click Edit code, delete everything, paste the contents of
cloudflare-worker.js - Click Deploy
- In Cloudflare go to Storage & databases → KV
- Click Create namespace, name it
TOKENS, click Add - Go back to your Worker → Bindings tab → Add
- Variable name:
TOKENS, select the namespace you just created - Click Save
Go to your Worker → Settings → Variables and Secrets → add each as type Secret:
| Secret name | Value |
|---|---|
FEED_SECRET |
Any password you choose, e.g. mypassword123 |
WORKAXLE_AUTH_TOKEN |
Your WorkAxle auth token (see below) |
WORKAXLE_CLUSTER_ID |
Your WorkAxle cluster ID (see below) |
WORKAXLE_COMPANY_ID |
1 |
To find your token values:
- Open WorkAxle in Brave with the extension installed and refresh the page
- Press F12 → Application → Extension Storage → WorkAxle to Calendar → Session
- Copy
workaxleAuthTokenandworkaxleClusterId
- Open the extension popup → Apple Calendar tab
- Enter your Worker base URL (e.g.
https://your-worker.workers.dev) - Enter your
FEED_SECRETpassword - Click ✓ to save
From now on, every time you open WorkAxle in Brave the extension will automatically push fresh tokens to your Worker — no manual updates needed.
You can also click Push Tokens to Worker Now to trigger it manually.
- Open Settings → Calendar → Accounts → Add Account → Other
- Tap Add Subscribed Calendar
- Enter your feed URL:
https://your-worker.workers.dev/?secret=mypassword123 - Tap Next → Save
Your shifts will appear in Apple Calendar and auto-refresh every hour.
- Go to Outlook Calendar → Add calendar → Subscribe from web
- Paste your feed URL
If you already sync to Google Calendar, the simplest way to get shifts on your iPhone is:
- On your iPhone open Settings → Calendar → Accounts → Add Account
- Tap Google and sign in with the same account used in the extension
- Make sure Calendars is toggled on
- Open the Calendar app — shifts appear within minutes and stay in sync automatically
- Click the extension icon
- At the top click Switch next to your current email
- Click Sign in to authenticate with a different account
- The calendar list reloads with the new account's calendars
The extension automatically syncs to Google Calendar every hour in the background while Brave is open. The last sync time is shown in the popup.
- Token capture — When you load WorkAxle, an injected script intercepts API calls and captures the
AuthorizationandCluster-Idheaders from your authenticated session - Token push — Fresh tokens are automatically pushed to your Cloudflare Worker so the iCal feed stays current
- Shift fetching — Uses captured tokens to call WorkAxle's REST and GraphQL APIs for the next 4 weeks
- Google Calendar sync — Creates/updates/deletes events using stable IDs to avoid duplicates. Only manages events it created (tagged
source=workaxle) - iCal feed — The Cloudflare Worker serves a live
.icsfile using the latest tokens stored in KV. Calendar apps poll this URL automatically
| Permission | Why |
|---|---|
identity |
Google OAuth authentication |
storage |
Token storage |
scripting |
Inject token-capture script |
activeTab |
Access current tab |
alarms |
Background auto-sync every hour |
tabs |
Open WorkAxle schedule tab |
| Host | Why |
|---|---|
https://icc.workaxle.com/* |
WorkAxle webapp |
https://api.app.workaxle.com/* |
WorkAxle API |
https://www.googleapis.com/* |
Google Calendar API |
https://accounts.google.com/* |
Google OAuth |
workaxle-sync/
├── manifest.json # Extension manifest (MV3)
├── service_worker.js # Core extension logic
├── content.js # Content script (message bridge)
├── inject.js # Main-world script (token capture)
├── popup.html # Extension popup UI
├── popup.js # Popup logic
├── popup.css # Popup styles
├── cloudflare-worker.js # Cloudflare Worker for live iCal feed
├── icons/
│ └── icon.svg
└── README.md
Token status is orange / "No tokens" Refresh the WorkAxle schedule page in Brave. The extension captures tokens automatically on page load.
redirect_uri_mismatch error when signing in
Your extension ID needs to be registered in Google Cloud. Go to Credentials → your OAuth client → add https://YOUR-EXTENSION-ID.chromiumapp.org/ to Authorised redirect URIs.
iCal feed shows "token expired" Open WorkAxle in Brave and refresh the page — tokens will be pushed to Cloudflare automatically. Or click Push Tokens to Worker Now in the popup.
Shifts not appearing in Apple Calendar
Check your feed URL works by opening it in a browser — you should see text starting with BEGIN:VCALENDAR. If you see a token expired error, see above.
MIT