Scoring rules: 1 pt show-up Β· 1 pt per hole won Β· 0.5 pts tied hole Β· Match bonus: Win+2 / Tie+1 / Loss+0 Β· 12 pts max per match Β· Hcp strokes on hardest holes Β· Ghost = par+2 for absences Β· Call-off capped at 5.5 pts Β· No-show/extended = 0 pts
π Recalculate points
Use this if hole hcp rankings were corrected. Fetches saved scores from the database and recalculates all points using the current hole rankings. Does not change any scores.
Select a week and match above to enter scores
π
Admin only
Score entry is managed by the league admin. Use the π± Player tab to submit your own scorecard.
ποΈ
View only
You have read-only access. Score entry is managed by the league admin. Use the π± Player tab to view match scorecards.
Season leaderboard
Call-offs shown per half (max 2) Β· Top 15 paid at playoffs
Loading standings...
Player roster
36 players Β· 2026 season
#
Player
Nick
Hcp
Tee
Skins
Greens
Cell
Contact
Loading roster...
2026 Season schedule
Click any week to expand matchups Β· Suncrest GC Β· Butler PA
First halfWeeks 1β9Playoffs Jun 30
Second halfWeeks 11β19Playoffs Sep 15
Skins & Greens
Skins: lowest gross on any hole Β· Greens: closest to pin on special holes
π― Skins
Lowest gross score on each hole Β· Opted-in players only Β· Tie = no winner
Loading...
π’ Greens
Closest to pin Β· Front: H3 tee shot, H9 tee shot Β· Back: H13 tee shot, H15 2nd shot
ADMIN β Enter greens winners
Loading...
Match scorecard
Your scores & your opponent's Β· Points update live as you enter
Loading your scorecard...
Admin tools
League management Β· 2026 season
Roster editor
Click any player to edit Β· Changes update the roster immediately
Add new player
Last name *
First name *
Nickname
Handicap
Tee
Skins
Greens
Status
Cell
Email
Note (e.g. contact via another player)
#
Player
Hcp
Tee
Skins
Greens
Status
Cell
Edit
Flag absence
Call-off (max 2/half): player notified in advance Β· ghost score applied Β· capped at 5.5 pts No-show: unannounced Β· ghost score applied Β· 0 pts Β· counts toward call-off limit Extended absence: illness/personal leave Β· 0 pts Β· does NOT count toward call-off limit Β· player stays on schedule
Player
Week
Call-off: max 2/half Β· 5.5 pts cap | No-show: 0 pts Β· counts toward limit | Extended: 0 pts Β· does NOT count toward limit
π
Bulk absence β flag multiple weeks at once
Use for players missing an entire half or extended period
Player
Absence type
Select weeks to flag
Handicap tools
π Weekly handicap update
Two options: (1) Auto-calculate from scores using the LM formula (avg of last 10 gross scores β par 36, rounded). (2) Manually enter hcps from LM's NHc column if you want to match exactly.
β or manually override below β
Hcps used starting after week
Enter the new handicap from the LM NHc column for each player. Leave blank to keep current.
New player starting handicap
Enter 2 practice round scores. Handicap = avg of 2 rounds β par 36. Updates the player's roster record.
Player
Rd 1
Rd 2
Update opt-ins
Update skins & greens opt-in status for any player mid-season.
Player
Skins
Greens
Tee change handicap adjustment (White β Gold)
When a player moves from White tees to Gold tees at age 65, their handicap adjusts using Course Rating and Slope. Moving to shorter tees gives an advantage so the handicap is reduced.
Edit any matchup for any week. Changes save to the database and take effect immediately everywhere in the app β schedule tab, reports, scorecards.
Only edit before the season starts or before that week is played.
First-time setup: Click "Seed schedule" to load the current schedule into the database. Only needed once β after that, all edits save automatically.
Select week
Edit the player names below. Use format: Last Name or First Initial. Last (e.g. Kozera or D. Walker). Click Save week when done.
Playoff bracket
Auto-seeded by half standings Β· Top 15 advance Β· Single match per pairing
Set up a new season
Starting a new season archives the current season's data and resets the app for a new year.
Player rosters carry over. You will update the schedule, dates, and any roster changes manually in the code.
π Checklist for new season
β Update SEASON_YEAR in the code (line ~454)
β Replace SCHEDULE array with new dates
β Update PLAYERS array β add/remove/update
β Run the SQL below to archive old data
β Upload new index.html to GitHub
β Vercel auto-deploys within 30 seconds
ποΈ Archive & reset Supabase
Run this SQL in Supabase β SQL Editor to archive the current season and start fresh. Replace 2026 with the season year you are archiving.
-- Archive current season (run once at season end)
CREATE TABLE IF NOT EXISTS match_results_archive AS
SELECT * FROM match_results WHERE season = 2026;
CREATE TABLE IF NOT EXISTS standings_archive AS
SELECT * FROM standings WHERE season = 2026;
-- Clear live tables for new season
DELETE FROM match_results WHERE season = 2026;
DELETE FROM standings WHERE season = 2026;
DELETE FROM absences WHERE season = 2026;
DELETE FROM round_history WHERE season = 2026;
DELETE FROM mobile_submissions WHERE season = 2026;
π Master schedule
Generate the full season schedule to email to all players. One page, landscape, full colour.
π Recalculate week scores
Use this if handicap hole rankings were incorrect when scores were entered. Re-reads all saved scores for a week, recalculates points with the current hcp hole values, and updates the database. Run this for Week 1 after the hcp hole fix.
Week to recalculate
User access management
Control what each user can do in the app. Two permission levels are available.
Admin access
Full access β enter scores, manage roster, run reports, flag absences, change settings, manage other admins.
Read-only access
View-only β see standings, leaderboard, schedule, roster, and their own scorecard. Cannot enter scores or change anything.
Add user access
Enter their email and choose a permission level. Use Invite if they don't have an account yet β they'll get an email to set their password. Use Grant if they already have an account.
Email address
Permission level
Current users with elevated access
All users not listed here are regular players (own scorecard only).
Loading...
The user must have already created an account in the app. Their email must match exactly. Regular players do not need to be listed here β they automatically get player-level access.
League settings
Configure scoring rules and limits. Changes save to the database and take effect immediately β no code changes needed. These values are used by all scoring, reporting, and absence enforcement throughout the app.
Generate, print, or email PDF reports to the league
π§ EmailJS setup β one time only
EmailJS lets the app send PDF reports directly to the league email list without a server.
Free plan allows 200 emails/month β plenty for weekly reports. Setup: Go to emailjs.com β create free account β
Add Email Service (Gmail) β Create Email Template β copy your IDs below.
Service ID
Template ID
Public Key
Recipient emails (comma-separated β your full league list)
Settings are saved in your browser automatically. Your email password is never stored β EmailJS handles delivery securely.
π
Weekly matches
Upcoming week matchup cards Β· Portrait Β· 1 page
π
Week results
Full standings with all scores Β· Landscape Β· 1 page
π―
Skins & greens
All scores with winners Β· Portrait Β· 1 page
π
Season standings
Full leaderboard with W/L/T/Pts Β· select half Β· Portrait
π
Master schedule
Full season schedule Β· Landscape Β· 1 page Β· ready to email
π₯
Roster & contacts
All players with hcp, tee, cell, email Β· Portrait