OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證UCI downhill and race content, all in one place. Let's walk this sucker.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
"Ok dudes, let's walk this sucker." — Cru Jones, RAD (1986)
A mobile-first PWA that aggregates UCI downhill race content into one clean, bookmarkable feed. No algorithm. No notifications. No unread count. Just racing.
Trackwalk pulls from the best sources in the game — YouTube channels, Pinkbike, podcasts, and race film outfits like Sleeper — filters out everything that isn't UCI DH, and serves it as a card-based digest you can bookmark on your phone home screen.
Feels like a newspaper. Opens like an app. Updates itself.檢視完整 README ↗trackwalk.racing — UCI downhill, without the noise.
A mobile-first PWA with two halves: a filtered feed of DH race content, and a results database covering every UCI World Cup and World Championship round from 2009 to 2026.
No algorithm. No notifications. No unread count. A newspaper, not an inbox.
Feed — YouTube channels, Pinkbike and podcasts, scored against a DH keyword list and served as a flat chronological card feed. Anything older than 30 days drops off, so it's always current. Categories: race runs, analysis, films, paddock, news, plus a shorts strip.
Results — 18 seasons, 145 rounds, 2009–2026. Qualifying and finals, men and women, with DNF/DSQ/DNS riders kept rather than silently dropped. Search any rider for their full career history grouped by venue.
Riders — follow a personal list and see only their results. 212 elite riders with Instagram links.
Pits — teams, media, podcasts, UCI links, and where to watch by region.
Installable to a phone home screen, works offline, no app store.
No server and no database. GitHub Actions fetches, filters and commits static JSON; GitHub Pages serves it.
GitHub Actions
├── refresh.yml twice hourly — YouTube + RSS → public/cache.json
├── fetch-results.yml every 10 min — current-season results
├── live-results.yml race-day polling, dispatched
├── dataride-fetch.yml every 6h — UCI DataRide backfill
└── preflight.yml weekly — source health check
trackwalk.racing (GitHub Pages)
└── index.html reads public/cache.json + public/results/<year>.json
A Cloudflare Worker proxies the Pinkbike RSS feed, which doesn't send CORS headers.
Items are scored against a weighted keyword list in scripts/content-filter.js.
MIN_SCORE | 6 — below this an item is dropped |
BOOST_SCORE | 4 — added for trusted sources |
| Untrusted threshold | 10 (MIN_SCORE + 4) |
MAX_AGE_DAYS | 30 |
Venue names are high-signal and weighted so a venue alone can't carry an item over the line. XCO is excluded at weight 15 — high enough to beat the sum of every boost. Enduro (EWS, EDR) is excluded too: Trackwalk is DH only.
The UCI MTB World Series channel is deliberately not trusted, because it posts XCO and enduro alongside downhill.
node scripts/test-filter.js # suite
node -e "const {scoreItem}=require('./scripts/content-filter.js'); console.log(scoreItem({title:'TEST'}))"
17 YouTube channels and RSS feeds — official race coverage, team channels, film outfits like
Sleeper, and podcasts. The authoritative list lives in
scripts/youtube-fetcher.js and
scripts/rss-fetcher.js; it changes often enough that duplicating it
here just creates something else to go stale.
Results come from the UCI's own systems — DataRide, ChronoRace and Tissot.
YouTube's free tier allows 10,000 units/day. Trackwalk reads each channel's uploads playlist
(playlistItems.list, 1 unit per channel) rather than search.list (100 units per query), so a
full refresh costs roughly 20 units — well under the daily limit even at twice-hourly.
git clone [email protected]:bscharenberg/trackwalk.git
cd trackwalk
npm install
cp .env.example .env # add YOUTUBE_API_KEY
node scripts/build-cache.js # rebuild the feed
npx serve . # index.html is at the repo root, not in public/
See docs/dev-workflow.md for the full workflow, and
docs/architecture.md for how the pieces fit.
No accounts, no login, no personal data collected. Your rider list and preferences live in your own browser's localStorage and are never sent anywhere. Analytics are aggregate only. No ads.
Proprietary — all rights reserved. See LICENSE.
The source is public to read for personal and educational reference. It is not open source: commercial use, redistribution, hosting, and reuse of the results database or filtering logic all require written permission. Licensing enquiries: [email protected]
Built by a saddle donkey, for saddle donkeys.
© 2026 Bryon Scharenberg.