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.
Your fantasy football front office.
Translation pending
Sports & fitnessTypeScript · PLpgSQLGitHub @Jacob-RollinOnlineOwner 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 fantasy football headquarters for drafting, managing, and researching your leagues. Sync your Sleeper, ESPN, or Yahoo leagues, or run a league natively, and get draft tools, trade and waiver analysis, weekly research, and league history in one place. Half-PPR is the default scoring format.Read the full README ↗A fantasy football headquarters for drafting, managing, and researching your leagues. Sync your Sleeper, ESPN, or Yahoo leagues, or run a league natively, and get draft tools, trade and waiver analysis, weekly research, and league history in one place. Half-PPR is the default scoring format.
/m.DATABASE_URL) for player_warehouse, synced league snapshots, and research aggregates (CDN-cached /api/data/* routes)You need Node.js and npm — install with nvm.
git clone <this-repository-url>
cd TheLeagueOffice
npm i
npm run dev
Create a .env file in the project root:
# Database A (primary — auth, profiles, site)
VITE_SUPABASE_URL=
VITE_SUPABASE_PUBLISHABLE_KEY=
# Server-only (Database A)
SUPABASE_URL=
SUPABASE_PUBLISHABLE_KEY=
SUPABASE_SERVICE_ROLE_KEY=
# TiDB Serverless (player warehouse + synced snapshots + research aggs)
DATABASE_URL=mysql://USER:PASS@GATEWAY/league-office-native
# Cron / webhook auth
CRON_SECRET=
# Yahoo league sync
YAHOO_CLIENT_ID=
YAHOO_CLIENT_SECRET=
# Press Room + weekly Front Office desks (optional — templates when unset)
GROQ_API_KEY=
# Optional failover / model overrides
GEMINI_API_KEY=
# GROQ_PRESS_ROOM_MODEL=openai/gpt-oss-120b
# GEMINI_PRESS_ROOM_MODEL=gemini-2.0-flash
Set the same variables in your Vercel project settings for deployments.
Retired: Supabase project league-office-brain (Database B) and env vars
VITE_SUPABASE_URL_B / VITE_SUPABASE_ANON_KEY_B. Warehouse + brain hydration
are TiDB + snap-cdn only — see scripts/tidb/CUTOVER.md.
Full guide: scripts/tidb/CUTOVER.md.
DATABASE_URL on Vercel (Production + Preview). Prefer a URL ending in /league-office-native.export APP_URL="https://www.theleagueoffice.app"
export CRON_SECRET="from-vercel"
curl -X POST "$APP_URL/api/admin/tidb-migrate" \
-H "Authorization: Bearer $CRON_SECRET" \
-H "Content-Type: application/json" \
-d '{"action":"migrate"}'
GET /api/admin/tidb-migrate shows playerWarehouseCount ≈ 4000+, and curl -s "$APP_URL/api/data/players-export" | head -c 200 starts with {"ok":true,"v":7./api/webhooks/sync and /api/cron/* — never wire host events to repository_dispatch.| Command | Description |
|---|---|
npm run dev | Start the dev server |
npm run build | Production build |
npm run preview | Preview the production build |
npm run lint | Run ESLint |
npm run format | Format with Prettier |
Supabase migrations live in supabase/migrations. Admin access is granted through profiles.role = 'admin'.