OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻译准备中
尚未检测到更新。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