BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
UCI downhill results, race videos, and rider profiles. Everything downhill, nothing else.
Translation pending
Sports & fitnessHTML · JavaScriptGitHub @bscharenbergOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
UCI downhill and race content, all in one place. Let's walk this sucker.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
"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.Read the full 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.