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.