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.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A two-person NFL league scored against the spread. Each week a coin flip
decides who drafts first; the two of you draft 5 sides from that week's slate,
and whoever finishes the season with the most ATS wins takes it.README 전문 보기 ↗A two-person NFL league scored against the spread. Each week a coin flip decides who drafts first; the two of you draft 5 sides from that week's slate, and whoever finishes the season with the most ATS wins takes it.
SEA -3.5, not "Seattle."SEA -3.5, NE +3.5 isn't available to your
opponent either.5 - P.Next.js (App Router) + TypeScript + Tailwind, Prisma + Postgres (Neon), hosted on Vercel. Slate, spreads, and final scores come from ESPN's public scoreboard endpoint — no API key.
You need a free Neon Postgres database — there's no local SQLite file any more, so local development talks to the same database as production.
npm install
cp .env.example .env # paste your Neon URLs + pick a league password
npx prisma migrate dev
npm run db:seed # creates the two players
npm run dev
Open http://localhost:3000. Player names are set in
prisma/seed.ts — edit them before seeding.
DATABASE_URL must be Neon's pooled string (the host contains -pooler)
and DIRECT_URL the unpooled one. Serverless functions open a connection per
invocation, so queries go through the pooler, while prisma migrate needs a
direct connection.
DATABASE_URL, DIRECT_URL,
ADMIN_PASSWORD, and CRON_SECRET (generate with openssl rand -hex 32).CRON_SECRET value as a GitHub Actions repository secret
(Settings → Secrets and variables → Actions → New repository secret) so the
automated spread sync can authenticate — see How spreads freeze below.npx prisma migrate deploy and npm run db:seed once against Neon.package.json runs prisma generate on postinstall because Vercel caches
node_modules — without it the deployed Prisma Client can silently go stale
against a changed schema.
ESPN drops the odds once a game goes final — a line that isn't captured before kickoff is gone for good. So each game's spread stays live — re-syncing keeps it current with the market — right up until that game's own kickoff, then it locks permanently. Both players are always graded against that one frozen line, which guarantees exactly one side covers (or it's a push); no after-the-fact line movement can change that.
If ESPN has no line for a game, that game isn't draftable until you set one by hand under Games missing a spread in Admin.
Nothing needs to stay open for this — the site and database are fully hosted and run on their own 24/7. Re-syncing does need to be triggered, though, which .github/workflows/sync-spreads.yml does automatically:
Both call /api/cron/sync-spreads, authenticated with CRON_SECRET. This runs
on GitHub Actions rather than Vercel's own Cron Jobs because Vercel's Hobby
plan caps cron jobs at once per day — nowhere near frequent enough here.
You can still click Sync slate in Admin any time; it does the same thing manually, and is the only way to load a week that hasn't been synced yet (the automation only refreshes weeks that already exist).
With homeSpread stored as the home team's line (negative = home favored):
adjusted = homeScore + homeSpread - awayScore
adjusted > 0 → home side covers
adjusted < 0 → away side covers
adjusted = 0 → push
ADMIN_PASSWORD is a single shared league password. It gates entering picks
and every admin action; viewing the week and the standings is open to anyone
with the link. It keeps strangers out, but it does not stop the two of you
from entering each other's picks — there are no per-player logins.