尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Plain-language running and paddling dashboard for intervals.icu, with a report to paste into Claude
翻譯準備中
正在載入完整 README。
檢視完整 README ↗A free, static page that turns your intervals.icu data into a plain-language training picture for running, paddling, biking and strength, and exports it as a report to paste into Claude for coaching.
.md file, and Download data saves the weekly rollups and activity list as .json.Try it without an account: open the page with ?demo on the end of the address.
i12345) and API Key (generate one if there isn't one).Just planning? Tap Plan without intervals.icu on the first screen instead. You get the Plan view and the printed calendar with no key: workouts, rest days, races, phases, export and share links all work, and workouts show their time. Load estimates, fitness, the weekly build/recover call and the report need intervals.icu, because they come from your heart-rate settings and history. To add them later, enter your Athlete ID and API key in Settings; the plan stays as it is.
Activities that reach intervals.icu only through Strava can't be read through its API. Connect your watch (Garmin, Coros, Suunto, Polar…) to intervals.icu directly.
Indoor bikes such as Peloton usually send rides to Strava, so they can't be read. Record the ride on your watch as well (an indoor cycling activity); it reaches intervals.icu with heart rate, and the page treats it like any other ride. The watch doesn't record the bike's power, so biking load and targets use heart rate.
The page opens on All sports. The other tabs are the sports you've done or planned; someone who only rides sees All and Biking.
Switch to Plan under the sport tabs. It lists your races, then this week and next (later weeks fold to one line until you open them), with every sport's workouts; a sport's tab lists its own first and adds its build/recover call to each week. Add a workout with Add workout or a day's +: pick the sport, then continuous or intervals (reps × work, with easy recoveries, warm-up and cool-down), with one target: a heart-rate zone, a heart rate or (running only) a pace. Strength is planned by duration alone. The title is optional. Tap Rest on an empty day to make it a rest day. Mark key sessions to highlight them on the calendar. Copy last week adds the previous week's workouts and rest days to the next one. Deleting, copying and importing can be undone from the message that follows.
Each week can have a phase (base, build, peak, taper, recovery). In a sport's tab the phase is checked against the load: one word when they agree, a sentence when they don't ("Planned as recovery, but load is up 12% on your 4-week average").
.json file that Import plan reads back. Copy share link puts the whole plan in a link, for another device or a friend. Opening it asks before replacing the plan that's there.Printing the calendar. Tap Print in the Plan view, pick All sports or one sport, the month and how many months, then Print or save as PDF. In the print dialog choose Letter, Landscape, and turn off headers and footers. On iPhone and iPad use Share → Print. Each month prints on one page: workouts with checkboxes (tagged R, P, B or S in All sports), rest days, days to the race, weekly totals, and for days already past, a tick with what you actually did.
Week start. Monday or Sunday, in Settings. It sets the 1-week tab, the plan's weeks and the calendar.
Fork the repo, then turn on Settings → Pages → Deploy from branch → main / root. There is no build step.
To run it locally, serve the folder with any static server (ES modules don't load from file://):
npx serve .
| File | Role |
|---|---|
index.html, css/styles.css | The page. Mobile stacks everything, with the summary first. Desktop puts the charts in a 2×2 grid. |
calendar.html, css/print.css | The printable monthly calendar, one letter-landscape page per month. |
js/config.js | What a fork would change: the sports and their activity types, presets, the coaching prompt, the API base URL. |
js/api.js | Calls to intervals.icu (Basic auth, username API_KEY). |
js/store.js | localStorage for credentials, preferences, a stripped-down cache with a daily refresh, and the plan. Plan-only mode stands in an empty set of training. |
js/data.js | Weekly rollups for one sport or all of them, the previous-period comparison, fitness/fatigue/form, zone settings, and the plan's weeks and forecast. |
js/plan.js | Planned-load estimates, calibration, the forecast, weekly verdicts, race countdowns, and the plan's file and share-link formats. |
js/text.js | The plain-language sentences shared by the page and the report. |
js/charts.js | The four Chart.js charts, with planned load hatched and the forecast dashed. |
js/report.js | Markdown and JSON export, plus Blob downloads and copying to the clipboard. |
js/planner.js | The Plan view: the week list and the workout and race editors. |
js/ui.js, js/icons.js | Small shared helpers (notices, the toast with Undo) and the sport icons. |
js/calendar.js | Builds the calendar pages from the same data and plan. |
js/demo.js | Synthetic data and a sample plan for ?demo. |
spike.html | Day-one diagnostic. It calls the API from the browser and shows the raw JSON and which fields are present. |
Data used. Each activity's icu_training_load, icu_hr_zone_times, pace_zone_times, distance and moving_time. Zones, threshold heart rate and threshold pace come from the athlete's sportSettings, and all-sports fitness from wellness ctl/atl. Planned workouts come from the plan in this browser, not from intervals.icu.
Fitness, fatigue and form. intervals.icu stores fitness and fatigue for all sports combined, and All sports shows those values as it reports them. A sport's tab calculates its own from intervals.icu's load on each of that sport's sessions, with the standard 42-day and 7-day weighted averages. It fetches 150 days of extra history so the lines have settled.
Weeks and days. Bars are 7-day blocks counted back from the last day of the range, so "last 4 weeks" always ends today. The 1-week tab is the calendar week so far (starting Monday or Sunday, your choice), charted by day and compared with the same weekdays of last week. Other ranges of 14 days or less also switch to daily bars. The previous period is always the same length, immediately before.
Sports. Running is Run, TrailRun and VirtualRun. Paddling is Canoeing, Kayaking, StandUpPaddling and Rowing. Biking is Ride, VirtualRide, GravelRide, MountainBikeRide and EBikeRide. Strength is WeightTraining. Activity types no sport lists still count in All sports. To add a sport, add an entry to SPORTS in js/config.js (and an icon in js/icons.js and a --sport-… colour in css/styles.css if you like); tracked: false keeps it off the tabs, and targets: false plans it by duration alone.
Open spike.html first. If requests fail before any response arrives, the browser is blocking cross-origin calls. In that case, deploy a Cloudflare Worker (free tier) that forwards /api/v1/* to https://intervals.icu/api/v1/*, passing through the Authorization header and adding Access-Control-Allow-Origin for your Pages domain. Then point API_BASE in js/config.js at the Worker.