BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Personal NFL betting-analysis product for Jonathan Mehalic. This README is written for a reviewer doing a check-and-balance pass: what exists, what it claims, and how to verify every claim independently. Built Sep 20–24, 2026 by Claude (Claude Code session); everything below is reproducible from this repo.
A phone-first web board that pulls FanDuel's live NFL market, strips the vig
out of every price, runs its own graded prediction model on each game, and
builds parlays four ways (safest-N, safety-target, payout-goal, and
"Build my own", where any moneyline, spread, total, alt rung, prop or TD
scorer can be tapped onto a ticket)
— every ticket opening in the user's own FanDuel app via one-tap
addToBetslip links. It tracks saved tickets for multiple users, settles
them automatically, keeps a season memory of everything it predicted, and
grades itself weekly. Nothing here is betting advice, and the board says so.
| Surface | URL | What it is |
|---|---|---|
| Full app | https://claude.ai/artifact/SuKFMDPsudMcWBdYktJ9sE | Board + tracker + crew standings + weekly read ("anyone with the link"; saving needs a Claude login) |
| Public mirror | https://nfl-parlay-inky.vercel.app | Static copy, no login, no tracker; redeploys automatically on every push to this repo (web/index.html, vercel.json). Installable to the Home Screen (web/manifest.webmanifest, icons, web/sw.js: network-first, last board offline). On open, on return to the app, and every 5 min it re-fetches itself and, if the board changed, shows what matters (finals, starters ruled Out/Doubtful, new QB docks, new upset calls, favorites flipping, prices moving 3+ pts); Refresh keeps the user's ticket. |
| Repo | github.com/pristinepoolspgh/nfl-parlay | Everything: code, ledgers, docs |
| Push alerts | Supabase project parlay-board (phxacgxbhphnvrbcrbtr), edge function parlay-push | Stores Home Screen app subscriptions and sends alerts; see "Push alerts" below |
nfl_parlay.py CLI (slate, parlays, props, FanDuel one-tap links)
board/make_snapshot.py Board generator: fetches everything, runs the model,
writes the page + prediction/closing-line logs
board/template.html The page (all UI logic; data spliced at /*__DATA__*/)
board/elo.py Elo ratings from real finals (+ nflverse EPA fetch)
board/sim.py The model ("sims"): margins, totals, win prob,
p_cover/p_over for any rung. VERSION history in header
board/backtest.py 12-season backtest vs the closing line
board/tune.py Parameter experiments on the same harness
board/residual_test.py Does the model add information beyond the close?
board/upset_test.py Do the sims' upset calls win? (Upset watch record)
board/dvp.py Defense vs position tables + stability test
board/market_model.py v7 research harness + memory/market_model.json builder
board/learn.py Grades favorites, leans, sim log (per version), crew
board/settle.py Grades saved tickets against ESPN finals
board/crew.py Folds all users' tickets into the season ledgers
board/player.py Any player's career/season numbers (ESPN APIs)
board/epa.py Team offensive EPA/game table (nflverse)
memory/ Append-only ledgers (see "Ledgers")
docs/research-playbook.md Owner-supplied research doctrine + repo mapping
docs/backtests.md Every backtest run, tables, decisions taken
web/index.html The mirror copy of the current board
FanDuel public API (board, props, alt lines, TD scorers, in-play), ESPN
public APIs (scoreboard/week, injuries, news, athlete stats), NFL.com news
page, Rotowire NFL news feed, nflverse (games.csv incl. closing lines
1999→, weekly team/player stats), Open-Meteo (stadium weather). Not
used: any paid tool (OddsJam, PFF, etc.), X/Twitter (login/paid API;
Rotowire relays the same reporters with attribution), NFL Next Gen Stats
(requires auth).
Full notes in board/sim.py's header; evidence in docs/backtests.md.
docs/backtests.md.board/market_model.py, docs/backtests.md
eighth pass.Upset watch: games where the results rating (Elo) picks the underdog outright. Backtest (249 games): the dogs won 40.2% vs 40.3% implied, so the section prints that record and calls them live dogs, not locks. Every game has a "player props" panel: all of FanDuel's main O/U props and anytime-TD prices for every player, each tagged with what the opposing defense allows to that position this year and last (context, not a model input; see docs/backtests.md seventh pass). Build-my-own allows one spread, one total, one ML side per game and one side per prop (tapping another rung swaps it); TD scorers stack.
Honest standing: the closing line beat the scores-only model (Brier .2084 vs .2175 on the backtest), and nothing tested on top of the line beat the line (eighth pass). So v7 is anchored to the market by design. It adds validated outcome shapes for pricing alt lines and flags where FanDuel's own prices disagree with each other. "Sims' calls" is now that ladder check and is often empty. Every version is graded in memory/simlog.jsonl, so any regression shows.
board/player.py lookups; roster questions
defer to the live market over anyone's memory.memory/)pregame.jsonl / close.jsonl — first-seen and latest pregame line per
game (open-vs-close movement; closing-line value for leans).simlog.jsonl — every model prediction, logged pregame, version-
tagged; learn.py grades winner accuracy / margin MAE / Brier per
version, so model upgrades must beat their predecessors on the same
scoreboard.results.jsonl + insights.json — market calibration by probability
bucket, upsets, crew section. Week 2: market said 68.8%, favorites won
66.7% (15 games).judgments.jsonl — the weekly "read": notes + at most 1–2 gradeable
leans, never edited after the fact (material news appends dated notes).
Record so far: 1–2.upsets.jsonl: every "Upset watch" call (sims ≥50% on the dog and
≥10 pts over market), first sighting, graded by learn.py.tickets.jsonl / picks.jsonl — every user's saved tickets and legs,
kept even if deleted from the board; feeds crew standings/calibration.| When (ET) | What |
|---|---|
| Tue 9:00a | Grade last week (incl. CLV review), settle, roll board to new week |
| Thu/Mon 7:00p | Refresh + optional 1-lean read (after inactives) |
| Sun 11a, 12p, 1p, 3p, 5p, 7p | Refresh, weekly read (≤2 leans), live prices, settle; the noon run exists to re-check 11:30a inactives |
Every cycle publishes the artifact and pushes web/index.html, which
redeploys the mirror. Routine prompts point at board/sim.py's header and
docs/ rather than hardcoding model claims.
The Home Screen app (Vercel mirror) pulls supabase/functions/parlay-live
on open, on return to the app, and every 15 minutes while it's on screen:
ESPN scores, FanDuel in-game ML/spread/total and live anytime-TD prices,
and current pregame moneylines for games not yet started. It updates
those in place (tickets keep their legs, repriced) and shows "Live scores
& prices updated HH:MM". The function is read-only and caches 60 seconds.
Injuries, props, sims and the read still come from the scheduled rebuilds.
Home Screen app users (iPhone: iOS 16.4+, installed from Safari) can tap Turn on alerts. Pieces:
supabase/functions/parlay-push/: webpush.ts (VAPID + aes128gcm
encryption on WebCrypto, checked against the http_ece reference
decryptor), diff.ts (what counts as alert-worthy), index.ts
(subscribe / unsubscribe / test / check).parlay-board (free plan, separate from the
business's pristine-tracker): tables push_subs, push_keys (VAPID
pair, generated server-side on first use), push_state (last board
seen), push_log (every alert sent, with counts). RLS on, no
policies: only the function's service role can read them.pg_cron job parlay-push-check posts {"action":"check"} every 10
minutes. The function fetches the public board; if its generated
stamp changed, it diffs against the last one and alerts only on:
a starting QB (one FanDuel prices passing props for) newly Out/Doubtful, another player newly Out/Doubtful whose TD
price was 30%+, a new sims QB dock, a new upset call, a flipped
favorite, a 5+ point moneyline move, or a new week's board. Each
Out/Doubtful alerts once per week. Quiet 11 PM-8 AM ET (changes wait
until 8 AM).Check it: select * from push_log order by at desc and
select count(*) from push_subs in that project.
Artifact db rules: any signed-in viewer reads everything and writes only
their own tickets (owner-tagged; each user sees "My tickets" vs "Friends'
tickets"); only the owner/automation writes the model docs (meta/*) —
verified by a simulated lower-privilege write being refused. The Vercel
mirror is public read-only by design.
python3 board/backtest.py # 12-season table vs closing line (~2 min)
python3 board/tune.py # SD/K/HFA grids, rest, QB-dock validation
python3 board/elo.py # ratings + model-vs-market edges
python3 board/sim.py # today's projections vs market
python3 board/player.py "case keenum"
git log -p memory/judgments.jsonl — leans
never edited after grading, only dated notes appended.nfl_parlay.py remains a standalone, dependency-free CLI, superseded by
the board for daily use:
python3 nfl_parlay.py slate # today's games + win probs
python3 nfl_parlay.py parlay --legs 4 # safest parlay, fair-payout math
python3 nfl_parlay.py parlay --target 0.90 # aim for 90% combined
python3 nfl_parlay.py parlay --pay 500 # most likely +500 ticket
python3 nfl_parlay.py props DEN # priced player props (--alts, --type)
python3 nfl_parlay.py slate --demo # offline sample data