A 6-digit code has been sent to your registered email address. It expires in 10 minutes.
β Back to PIN
Set a 4-digit PIN to protect your Chain Tracker. You can reset it any time with an email code.
Enter the same PIN twice to confirm
CHAIN TRACKER
NOT CONNECTED
Waxed chain rotation system · not synced
Active Chain
1
0 km since wax
Chain is clean
0 km400 km
Chains —
Recent Rides
Chain Management —
Each chain has a full lifecycle. Set Active = put this chain on the bike right now. Log Wax = you just waxed it, resets the km counter. Retire = chain is worn out, archive it for reference.
All Rides
Strava Connection
Connected to Strava
Sign in with Strava to automatically sync your rides. No tokens or Terminal commands needed.
Sync Rides
Pick a start date to sync from. Leave blank to sync all history. Re-syncing is always safe — imported rides are never duplicated.
Sync from date
Leave blank for full history
Chain Settings
Wax interval
km before rotation reminder
Warning at
% of interval
Notifications
Google Sheets Backup
Deploy the Apps Script to your Google Sheet once, paste the Web App URL here. Auto-backs up after every sync.
Last backup: Never
Data
Setup Guide
Step-by-step instructions for getting everything configured.
SETUP GUIDE
Everything you need to get Chain Tracker running β from installing on your phone to automating Strava sync. Tap each step to expand it.
1
Host & install on iPhone
To do
The app is hosted on Cloudflare Pages. Deploy it from the project folder with npm run deploy (see SETUP.md).
Copy your app URL, e.g. chain-tracker.pages.dev
Open that URL in Safari on your iPhone (must be Safari)
Tap the Share button β scroll down β Add to Home Screen
Name it Chain Tracker β tap Add
The app opens full-screen with no browser chrome, just like a native app. All your data is stored privately on your device.
2
Connect Strava
To do
No Terminal needed. The app handles the full Strava connection with one tap.
Open Chain Tracker on your iPhone
Go to Settings
Tap Connect with Strava (the orange button)
Log in to Strava and tap Authorise
You'll be redirected back to the app automatically β done
Tap Fetch My Bikes from Strava to link your Strava bikes to your bike profiles
After connecting, go to Settings β Sync Rides and tap Sync from Strava once to import your full history. After that, new rides sync automatically via the webhook.
3
Set up your bikes & chains
To do
Go to the Bikes tab β you'll see Summer Bike pre-loaded
Tap Edit to rename it and paste in its Strava Gear ID (shown after fetching bikes)
Tap + Add Another Bike for your second bike
For each bike, tap Use next to whichever chain is currently installed, then tap Wax to set today as the last wax date
Set your wax interval in Settings β Chain Settings (default is 400 km)
4
Apple Shortcuts automation
To do
With the webhook running, Strava syncs automatically β you only need one shortcut now. Replace YOUR_APP_URL with your Cloudflare Pages URL.
Shortcut 1 β "Wet Ride π§"
Add this to your iPhone Home Screen. One tap rotates to the next chain.
Automatically opens the app each morning so you see chain status.
In Shortcuts β Automation tab β tap +
Choose: Time of Day β set to 8:00am β Daily
Add action: Open URLs β YOUR_APP_URL
Turn off Ask Before Running
The old manual sync shortcut is no longer needed β the Strava webhook pushes new rides to your Google Sheet automatically, and the app picks them up the next time you open it.
5
Google Sheets backup (optional)
To do
Create a new Google Sheet β name it anything
Go to Extensions β Apps Script, delete existing code, paste in the chain-tracker-sheets.gs script
Select setupApiKey in the function menu β Run, then copy the key from the Execution log
Click Deploy β New Deployment β Web App Execute as: Me Β· Who has access: Anyone
Copy the Web App URL and add ?key=YOUR_KEY to the end
In Chain Tracker β Settings β Google Sheets Backup β paste the URL β tap Backup Now
The script creates three tabs automatically: Chain Status (snapshot per backup), Ride Log (full history), and Raw Snapshots (JSON for recovery).
Daily Use
After a ride β nothing to do: Strava rides arrive automatically. Use + Log Ride for rides not on Strava. Wet weather β tap the π§ button on the dashboard (or the Home Screen shortcut) before heading out. It rotates to the next chain. Chain needs wax β the progress bar turns red and you get a notification. Mark it waxed in the Bikes tab and rotate back to it once dry. Multiple bikes β use the pill switcher at the top to switch context. Each bike tracks its own chains independently.
Dashboard
Chains
Bikes
History
Settings
Log Ride
Add a manual ride
Log Wax
Record that you waxed a chain — resets its km counter
Reassign Ride
Add Chain
Chains are numbered per bike. Add a name or brand to identify them.
Add Bike
Each bike has its own independent set of chains
Enables auto-assignment when syncing. Use "Fetch My Bikes" in Settings to find yours.
Strava Bikes
Assign each Strava bike to one of your profiles
Sheets Setup
One-time setup, takes about 2 minutes
1. Create a Google Sheet
Name it anything — "Chain Tracker Backup" works fine.
2. Open Apps Script
Extensions → Apps Script. Delete existing code and paste in the chain-tracker-sheets.gs file.
3. Deploy as Web App
Deploy → New Deployment → Web App.
Execute as: Me Who has access: Anyone
Copy the URL.
4. Create the API key
In the editor pick setupApiKey → Run, then copy the key from the Execution log. Add ?key=YOUR_KEY to the end of the Web App URL.
5. Paste the URL above
Settings → Google Sheets Backup → paste URL → Backup Now.
Restore from Sheets
Fetches the most recent snapshot and restores all data.
⚠️ This will replace all current data. Export a JSON backup first if needed.
CHAIN TRACKER
A waxed chain rotation system for road cyclists. Track mileage across multiple bikes and chains, sync with Strava, and get notified when it's time to rewax.
Looks like you're new here β start with the setup guide.