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.
Signup tracking for Madison Middle School Ultimate Frisbee team
Translation pending
Sports & fitnessTypeScript · JavaScriptGitHub @BigLepOnlineOwner 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
Tools and utilities for managing/coaching the Madison ultimate frisbee team
Taken from the repository README
Loading the full README.
Read the full 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