BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Tools and utilities for managing/coaching the Madison ultimate frisbee team
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A web application to track signup progress for Madison Middle School Ultimate Frisbee players.
.nvmrc)Clone the repository
git clone <repository-url>
cd madison-ultimate
Install dependencies
npm install
Set up Google API access (see Google API Setup below)
Start the development server
npm run dev
Next.js will print the URL (e.g. http://localhost:3000). Run this in a terminal in the foreground (not as a background task). When you’re done, stop the server with Ctrl+C in that terminal. The dev server shuts down cleanly when it receives SIGINT (Ctrl+C), so the port is freed for the next run. If the server was started in the background (e.g. by an IDE), it may not receive a signal when you “stop” elsewhere—use the IDE’s Stop button for that task so the process is terminated.
Open your browser Navigate to the URL Next.js printed (typically http://localhost:3000).
npm run dev - Start development server (with hot reload). Stop with Ctrl+C in the same terminal for a clean shutdown.npm run build - Build the application for productionnpm run start - Start production servernpm run lint - Run ESLint for code quality checksdocs/adr/0001-player-identity-model.md)madison-ultimate/
├── src/
│ ├── app/ # Next.js app router pages
│ │ └── api/ # API routes for data processing
│ ├── components/ # Reusable UI components
│ ├── lib/ # Utilities and API integrations
│ └── styles/ # Global styles
├── tmp/ # Cached data files (development)
├── public/ # Static assets
└── *.md # Documentation files
This project uses conventional commits with emojis for fun! Please format your commit messages as:
type(scope): description with emojis
Examples:
feat: add player signup status table ⚽
fix: resolve data matching issue
docs: update setup instructions 📖
/signup: webapp-native season signup (player identity lookup/creation, profile form, Final Forms status, Buttondown newsletter, photo upload) — the primary family-facing entry point each season./player/[playerId]: a Progressive Web App (PWA) player portal where students and families can view player info and status, mark availability for practices and games, and access season info and team news.See CONTEXT.md for the current domain model and docs/adr/ for the identity/signup architecture decisions.
The portal supports more than one game on the same calendar date (multiple events on a given calendar day; e.g. a double-header). Games are ordered from Game Info top to bottom: the first row for a date is game 1, the second row with the same date is game 2, and so on.
M/D Availability, M/D Note, and M/D Activation Status for the first game that day, and M/D Availability (Game 2), M/D Note (Game 2), M/D Activation Status (Game 2) for the second (and (Game 3) if needed). The player app matches columns using that naming; duplicate headers like two columns both called 5/9 Availability are not supported.(Game 2) pattern).This application requires access to Google Sheets and Google Drive to fetch player signup data. Follow these steps to set up API access:
madison-ultimate-serviceService account for Madison Ultimate app data access.google-service-account.jsonYou must share each Google resource with the service account email (found in the JSON key file):
For Google Sheets:
[email protected])For Google Drive Folders:
For Roster Sheet (Stage 2):
Copy .env.example to .env.local:
cp .env.example .env.local
Update .env.local with your configuration:
# Google API Configuration
GOOGLE_SERVICE_ACCOUNT_KEY_FILE=./.google-service-account.json
# Data Source IDs
ADDITIONAL_QUESTIONNAIRE_SHEET_ID=1f_PPULjdg-5q2Gi0cXvWvGz1RbwYmUtADChLqwsHuNs
SPS_FINAL_FORMS_FOLDER_ID=1SnWCxDIn3FxJCvd1JcWyoeoOMscEsQcW
TEAM_MAILING_LIST_FOLDER_ID=1pAeQMEqiA9QdK9G5yRXsqgbNVzEU7R1E
# Single workbook for roster and all related tabs (Roster, Practice Info, Game Info, Practice/Game Availability)
ROSTER_SHEET_ID=1kV3Y_GST_Y-X9PZFXu9yFkCzGWvhk9f7G24Y8QNuayU
.google-service-account.json file contains sensitive credentials.gitignore)This application uses dual authentication for different Google APIs:
For complete authentication setup instructions, see AUTHENTICATION_SETUP.md. For a checklist of what to set or decide each season (roster sheet, portal labels, Additional Info Form visibility, signup birth-year window, etc.), see SEASON_SETUP.md.
Set these in Vercel Dashboard → Project → Settings → Environment Variables:
# Service Account
GOOGLE_SERVICE_ACCOUNT_KEY=<full-json-content-as-string>
# Optional: Buttondown API key (subscriber write) for newsletter status and Join / Leave
# BUTTONDOWN_API_KEY=<your-buttondown-api-key>
# Resource IDs
ROSTER_SHEET_ID=<sheet-id>
SPS_FINAL_FORMS_FOLDER_ID=<folder-id>
ADMIN_SECRET=<long-random-string> # Basic Auth password for /admin and /api/admin
TEAM_MAILING_LIST_FOLDER_ID=<folder-id>
ADDITIONAL_QUESTIONNAIRE_SHEET_ID=<sheet-id>
The Vercel project is connected to the BigLep/madison-ultimate GitHub repository. Every push to main automatically triggers a production deployment — no manual steps required.
To set this up on a new Vercel project: Project → Settings → Git → Connect Git Repository → select the repo → set Production Branch to main.
If you need to deploy manually (e.g. without a GitHub push), use the Vercel CLI:
vercel --prod
Complete authentication setup following AUTHENTICATION_SETUP.md
Update OAuth redirect URI in Google Cloud Console:
https://madisonultimate.org/api/auth/callbackSet environment variables in Vercel dashboard
Connect GitHub repository for auto-deploys (see above)
Test:
curl https://madisonultimate.org/api/team-updates