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.
Analyze sports betting slates and drill into game details for MLB, NBA, NFL, and more
AI summary · README
Sports & fitnessJavaScript · HTMLGitHub @ch4ngs4n1tyOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
A dark-mode sports betting intelligence dashboard with an HUD / sci-fi aesthetic.
Pick a sport → browse today's slate → drill into a game for deep analysis across
matchup, form, roster, and sport-specific modeling tabs.Read the full README ↗A dark-mode sports betting intelligence dashboard with an HUD / sci-fi aesthetic. Pick a sport → browse today's slate → drill into a game for deep analysis across matchup, form, roster, and sport-specific modeling tabs.
MLB · NBA · WNBA · NFL · NHL · NCAAB
The only machine-learned component is the MLB first-5-innings money line model
(XGBoost, trained offline in CI). Every other "model" in the app is transparent,
inspectable arithmetic — Log5 matchups, Binomial/Poisson distributions, additive
scoring — and each score carries a why string or a methodology entry naming its
source, endpoint, inputs and formula.
Frontend — no build step, by design.
React 18 + Babel Standalone from a CDN; .jsx files are transpiled in the browser.
No bundler, no TypeScript, no npm-installed React. Fonts are Orbitron (display) and
Space Mono (everything else).
Backend — zero dependencies.
Pure Node http + https on port 3001. No npm packages at all, in-memory caching
(10-second minimum for the live game feed, 2 min for other MLB data,
15 min for historical BvP). Live updates use SSE with a polling fallback.
Data sources. ESPN's public API (no key), the MLB Stats API, and Baseball Savant. Claude (Haiku) is called directly from the browser with a user-supplied key.
# 1. Backend (port 3001, no install step — there are no dependencies)
./server/start.sh # daemonizes, logs to server/server.log
# or: node server/index.js # foreground
# 2. Frontend — any static server from the repo root
python3 -m http.server 8000
Open http://localhost:8000. The frontend auto-detects localhost and points at
http://localhost:3001, ignoring the production backend URL, so local dev works
without editing anything.
Check the backend is up:
curl http://localhost:3001/api/health
To use AI Plays, paste an sk-ant-… key into the input in the top nav. It is stored
in localStorage and sent only to Anthropic.
index.html Shell: CDN scripts, nav, API-key input, global CSS
frontend/
data/ Fetchers + models, split shared/ + per-sport
shared/ui-atoms.jsx Primitive UI components (HudCard, Sparkline, …)
shared/tabs/ Sport-agnostic tabs
shared/screens/ Home / Games / GameDetail
sports/{mlb,nba,nfl}/ Sport-specific tabs
server/
index.js Node HTTP server (port 3001)
mlb/ nba/ Per-sport services and endpoints
data/f5_model.json Committed XGBoost model (CI writes this)
ml/ Offline Python training pipeline (runs in CI, not the app)
Note:
data-layer.js,tabs.jsx,screens-v2.jsxandui-atoms.jsxin the repo root are dead legacy files left over from a reorg.index.htmldoes not load them. Always edit underfrontend/.
Scripts communicate through window. With no bundler, each file ends with an
Object.assign(window, { … }) export and later scripts read from there. The load
order in index.html is load-bearing: data layer → atoms → tabs → screens → app.
Backend URL resolution (frontend/data/shared/core.js), in order:
window.PIQ_API_BASE → localhost shortcut → the <meta name="piq-api-base"> tag →
localhost fallback.
The F5 model's train/serve parity is a contract. Features are defined once in
ml/f5_common.py and server/data/f5_feature_spec.json, and must be computed
identically by the Python collector and the live buildF5Features(). Training
embeds parity samples so the Node scorer self-checks to ~1e-7. Change a feature on
both sides, then retrain.
render.yaml blueprint. On the free tier
the service sleeps after ~15 min idle, so the first request after a nap takes
~30s. After deploying, point <meta name="piq-api-base"> in index.html at the
service URL..github/workflows/train-f5.yml retrains weekly, commits the model
JSON, and Render auto-deploys it.:root in index.html; wrap card-shaped content in HudCard.Object.assign(window, …) export at the bottom
of their file, or the next script won't find them.CLAUDE.md holds the full blueprint: file-by-file responsibilities, per-sport
gotchas, and how to add a tab, data source, or sport.
PlayIQ is an analysis and research tool. Nothing it outputs is betting advice, and no model here predicts outcomes reliably. Bet responsibly, or don't.