BikeControl (SwiftControl)
Zwift Click과 Shimano 컨트롤러를 MyWhoosh와 Rouvy와 Zwift에서 쓴다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Same stack and philosophy as nflprob: Vercel serverless functions + optional Supabase Postgres +
a single-file vanilla-JS frontend (app.html), free data only, every model output shipped with
its "why".
The core idea: one Monte Carlo tournament simulator feeds every market, so finishing odds, top-N, make-cut, 2-balls and 3-balls can never contradict each other.
| Tab | What it shows |
|---|---|
| Finishing odds | Win / top 5 / top 10 / top 20 / make cut, fair odds, avg finish, draw (AM/PM) with weather cost, signals, confidence. Once the event starts, a Pos column shows leaderboard position, total to par and holes completed (sortable). Click a player for the finish distribution, recent rounds, tee times and reasoning. Upload book odds for an Edge column. |
| Best plays | Top bet targets in three sections, each with per-play reasons and a summary of what separates them from the rest of the slate: matchup targets (one per group), finishing position (Win / Top 5 / 10 / 20 / Make cut) and the best 3-, 4- and 5-leg finishing-position parlays (Top 10 / Top 20 / Make cut, priced inside the simulation). With uploaded book prices a section ranks by expected profit and only keeps plays at 3%+ EV with a realistic chance to hit; without prices it ranks by model strength and says so. |
| Matchups | Every 3-ball / 2-ball from the real tee sheet (R2 projected from R1 until posted), dead-heat-adjusted. Upload a CSV of book prices → de-vigged edges and a "best prices" list ranked by EV. Parlay builder: tap players to add legs; legs are priced together inside the simulation (shared wave, same player both rounds), with fair odds and EV vs your book. Auto-build finds the best 2/3/4-leg parlays (by EV with book prices, else most likely). |
| DFS Optimizer | DK Classic projections (mean, floor, ceiling) from the same sims. Upload DKSalaries.csv → exact optimizer (6 golfers, $50k): Projection / Balanced / Ceiling, 1–150 lineups, exposure cap, min unique players, draw (wave) stacking, locks/excludes, exposure table, and a CSV in DK's upload format. |
| Weather | Draw verdict with ensemble agreement, day cards, hourly wind/gust chart with ensemble band and wave ribbons, direction strip, wind-by-wave compass, rain and temperature, a wave comparison table, and a full generated briefing. |
| Model & backtest | History data status, the live track record (each week's locked pre-tournament projection graded when final: market skill, winner rank, 3-ball favorites vs expected) and a leak-free backtest: Brier / log loss vs no-skill, calibration chart + table, per-event results. |
lib/store.js) — every completed round from ESPN (PGA + LIV + DP World by default,
TOURS env to change), stored in golf_rounds. Without a database it falls back to fetching
the most recent ~40 events live.lib/ratings.js) — two-way fixed effects
strokes = round difficulty + player ability, solved by alternating least squares, so a 68
against a weak field isn't worth a 68 at a major. Players who cross tours link the scales.lib/simulator.js) — 15,000 tournaments: a per-week form draw (plus skill
uncertainty), per-round noise, shared wave shocks, the cut (rule from ESPN → event name → field
size), integer scores so ties/dead heats/pushes happen naturally, playoffs. Completed rounds use
real scores; a round in progress uses strokes so far + only the remaining holes.lib/dk.js, lib/dk-optimizer.js) — each simulated round score becomes expected
DK hole points via tour-average par-3/4/5 outcome rates tilted to match the score (exact bogey-free
and birdie-streak probabilities over the real hole pars), plus finish points and the under-70 bonus
from the same sims. The optimizer is nflprob's exact knapsack (full prefix table), brute-force
verified; multiple lineups are each the exact best under exposure/uniqueness rules (branch and
bound), with exact dominance pruning. Runs in a Web Worker.lib/parlay.js) — legs settled per simulated tournament (3-ball dead heats, 2-ball
pushes), so the joint probability is counted, not multiplied.lib/grading.js) — the pre-tournament projection is re-saved on every visit until the
first tee time; finished events are graded on visit and by the weekly cron.lib/weather.js) — Open-Meteo hourly forecast + GFS 31-member ensemble. Each tee
time's cost averages ~5 hours of conditions (wind², gusts > 25 mph, heavy rain). Each sim draws
one ensemble member, so forecast uncertainty flows into the odds. Weekend tee order follows the
simulated leaderboard. lib/weather-writeup.js writes the briefing from the same numbers.npm test) on synthetic data with known ground truth: fixed effects recover
true skill across strong/weak fields, no leakage, probabilities sum correctly (one winner, top-10
dead-heat shares sum to 10), 3-ball prices match brute force, wave costs move the right players,
and an end-to-end run of every route with mocked ESPN/Open-Meteo./api/health, Oct 23 2026).
Findings applied: the leaderboard has per-round strokes / to-par / nine totals but no
hole-by-hole detail; the competition's round number lags the players' own; only the current
round carries a start hole. Rounds in progress are rebuilt from the course's hole pars + today's
to-par. Hole-by-hole (needed for DK scoring) will come from ESPN's core API in the DFS step.DATABASE_URL (or POSTGRES_URL, which Vercel's Supabase integration sets) to a Postgres connection string. In Supabase: Project Settings → Database → Connection string → URI, transaction pooler (port 6543). Tables create
themselves on first use./api/health to confirm ESPN + Open-Meteo shapes./api/sync?tour=pga&season=2025 (then 2026, and tour=liv,
tour=eur) repeatedly until each returns remaining: 0. A weekly cron keeps it current.Without a database everything still works — the model just runs on a shorter live history.
| Route | Purpose |
|---|---|
/api/tournament?tour=pga&event={id}&sims=15000 | Field, ratings, simulated odds, matchups |
/api/weather?tour=pga&event={id} | Forecast, waves, draw verdict, briefing |
/api/events?tour=pga&season=2026 | Season calendar for the event picker |
/api/backtest?tour=pga&events=8 | Leak-free backtest |
/api/sync?tour=pga&season=2025 | Backfill completed events into Postgres |
POST /api/parlay | Price a parlay {legs:[{round,id,dec}]} or auto-build {auto:{round,size}} |
POST /api/plays | Best plays {book:[{market,round,id,dec}]} |
/api/grades | Grade finished snapshots, return the live track record |
/api/status | History data status |
/api/health | Upstream checks + ESPN shape report |
lat/lon query params override the course location if the lookup is wrong.
market,round,player,odds
3ball,1,Scottie Scheffler,+150
3ball,1,"Aberg, Ludvig",+220
2ball,3,Xander Schauffele,-115
top10,,Rory McIlroy,+275
Markets: 3ball, 2ball, win, top5, top10, top20, make_cut. American or decimal odds.
Names match through accents, "Last, First", initials and Jr./III suffixes (an ambiguous name is never
guessed). Uploaded files stay in the browser (localStorage), per event.