- Announcements — general league-wide news (default for "league announcements").
- Scores — final score recaps after games.
- Schedule changes / Rainouts / Playoffs — self-explanatory.
- Pre-game reminder — 1-hour before game pings.
- Admin only — just you / fellow commissioners (score conflicts etc.).
is_admin flag here to let them receive Commissioner Alerts in the notifications page. Only signed-up players (with a Firebase Auth account) appear in this list. Removing a checkmark immediately clears the toggle on their device the next time the notifications page loads.
1. Weekly Rhythm (the punch list)
For a normal league week, the core job is keeping the Scores tab clean. Here's the rhythm:
- Morning after games: open Scores. Look for any game flagged "stats differ" — that means the two captains submitted different final scores. Click in, pick which number is right (or edit manually), hit Save. That locks the official score and pushes an updated Live notification.
- Mid-week check: any completed game still showing "No score submitted"? Ping the captain. Scores drive Standings and Stats, so missing ones leave the leaderboards wrong.
- Before each game day: scan the Schedule for anything that needs a rainout flag, field move, or time change. If it's going to rain, hit Banner / Alerts and publish a heads-up.
- On game day rainouts: use the "🌧️ Rain Out Day" button at the top of the Schedule tab to mark every game on a single date as rained out in one click — no need to edit games one by one.
- After the week: skim Standings to make sure they look right.
Everything below is the "when I need it" reference.
2. Dashboard
Landing tab. Shows:
- Activity log — every edit anyone made across the site (captains, admin, auto-pushes). Scroll back to see who touched what.
- Quick counts — games played, scores submitted, pending items.
If something looks off in Scores or Rosters, the activity log usually tells you who did it and when.
3. Scores — resolving discrepancies
When both captains submit their version of a game, the site compares them. If the final scores don't match, the game gets flagged.
- Green check — both captains agreed, score is final.
- Yellow warn — only one captain submitted. Waiting on the other side.
- Red "stats differ" — both submitted but the finals conflict. Click in, pick which score is correct (or edit manually), hit Save. That locks it in as the official.
Individual batting stats don't have to match between captains — each team owns its own players' stats. Only the final score must agree.
Score pushes go out automatically when you finalize a game — no extra button.
4. Schedule — games, rainouts, times
- Add a game — pick the week, away, home, time, field. Check "Notify subscribers" if you want a push to go out announcing the new game.
- Edit a game — click ✏️. Change date/time/field. Any change pushes a Schedule-category notification automatically.
- Rainout — click ✏️ on the game → toggle "Rained out." The game shows as rained out everywhere and a push goes out.
- Filter by team — top-right dropdown. Useful when a captain asks about one team's schedule.
Captains can edit their own games too. Their edits show up in the activity log.
5. Rosters
Pick a team from the dropdown → see every player with jersey, position, email, phone. You can:
- Add a player directly (no registration flow needed).
- Edit or remove anyone.
- Bulk import rosters from a spreadsheet if we're rebuilding a team.
Captains can also edit their own roster in the captain portal — same data, same Firestore collection.
6. Waivers
List of players who've signed the league waiver via registration.html. Use this to verify someone's legally OK to play before you approve them onto a roster.
7. Standings
- Standings — auto-computed from submitted scores. Shows W/L/T, PTS (3 per win + 2 per tie + 1 per loss, matching the public page), win pct, run diff. You can also set/rotate each team's player password inline here (that's the password players type on the Player Portal to unlock their team).
- Recaps — written per-game from inside each game's box score editor (same panel as stats). The standalone Recaps tab was removed since it was redundant. Recap text + Player of the Game + Stars of the Game still go live on the Recaps page of the main site.
8. Banner / Alerts
The banner is the yellow/red strip that appears across the top of the main site for everyone. Use for:
- Rain decisions ("All games cancelled tonight — field flooded")
- League-wide announcements ("Playoff brackets are up!")
- Emergency updates
Type the text, pick color (yellow = info, red = urgent), hit Publish. Banner appears instantly. Delete when resolved.
Publishing a banner does not auto-send a push — use the Push Notifications tab for that.
9. Push Notifications New
Send a push to players/captains/fans who have notifications turned on. Workflow:
- Category — pick which category this push falls under (Announcements, Live, Schedule, Pregame, Photos, Playoffs, Team Chat, Admin). Users only receive categories they've opted into.
- Target — leave blank for all subscribers, or type a team ID to target one team.
- Admin-only pushes — choose the "Admin" category → only you (and anyone with the admin flag) receives it. Used for conflict alerts from captains and signup notifications.
The yellow panel at the top of this tab has a "Manage my subscription" link — deep links into /notifications.html?admin=1 so you can toggle your own admin-only receipts from inside the PWA where there's no address bar.
Auto-pushes (no action needed from you):
- New live game starting → Live category
- Schedule change → Schedule category
- Score finalized → Live category (playoffs also hit the Playoffs cat)
- Pregame 1-hour reminder → Pregame category (fires via cron)
- New photo upload → Photos category
- New registration → Admin-only
- Score conflict detected → Admin-only
10. Contacts
Master directory of every player, captain, and captain-designate in the league with email and phone. Filter by team, export to CSV if you need a contact list.
11. Financials
Per-team breakdown of league-fee collection. Each captain marks their players paid/unpaid in the captain portal; this rolls everything up for you.
- Total outstanding — who still owes.
- Per-team breakdown — drill into a team to see individual players.
- You can override payment status from here if a captain didn't mark something.
12. Registrations
Players sign up via registration.html. Each submission lands here pending approval:
- Approve → player is added to the roster they picked.
- Reject → removed, no roster change. Use if someone signed up for the wrong team.
Every new registration pushes an admin-only notification so you don't have to keep checking the tab.
13. Email Blast (MailerLite) External
Send a real email (not a push) to everyone subscribed to the DVSL Players list in MailerLite. Good for longer-form announcements that need to sit in someone's inbox.
- Shows current subscriber count at the top.
- Type subject + body, hit Send. MailerLite delivers it.
Note: the old Firestore-based "Save Announcement" feature was removed — push notifications and email blast cover the same use case.
14. Captains
Manage who can log into the captain portal:
- Add a captain — pick team, enter name / email / phone. They can then log in as their team.
- Bulk import pulls every captain from the commissioner's spreadsheet.
- Delete removes their access (doesn't remove them from the team's roster if they're also a player).
15. Player Media
Every photo or video players uploaded to their team gallery shows up here. Use this to:
- Scroll through new content for the main photo gallery.
- Delete anything inappropriate or off-topic.
- Feature top photos on the homepage (coming soon).
16. Chat moderation New
You don't moderate chat from admin.html directly — it lives in the app where the messages do. Quick access:
- Team Chat (any team) — open
team-chat.html?team=<teamid>&admin=1. The?admin=1flag unlocks a red "Reset chat" button in the header and lets you delete any message (not just your own). The flag persists in localStorage once set. - Captains Chat — visible in captain.html after signing in as any team. Each captain can only delete their own messages there; the chat has no admin reset (intentional — commissioner shouldn't wipe private captain conversations on a whim).
If you need to wipe Captains Chat completely, it's a Firestore operation — open the Firebase console → captain_chat collection → delete all docs.
Emergency playbook
Captain reports wrong score posted.
Scores tab → find game → click ✏️ → update numbers → Save. Pushes a new Live-category notification.
Wrong player on wrong team.
Rosters → remove from wrong team → add to right team. Their stats travel with them automatically since stats key off player ID, not team.
Rain cancels the whole night.
Schedule → hit the "🌧️ Rain Out Day" button up top → pick the date → confirm. Every game that day gets flagged rained-out in one shot.
Banner / Alerts → publish red banner "All games rained out tonight."
Push Notifications → Announcement category, body "All games cancelled — rain." Send to all.
Someone's harassing in Team Chat.
Open team-chat.html?team=<teamid>&admin=1 → × the offending messages or Reset chat.
Any questions at all? Contact Adam Miller
If anything's broken, confusing, or you want a new feature — text, call, or email me. I push fixes fast, usually the same day.
Adam Miller (Commissioner / site builder)
Email: adam.miller.22@gmail.com
No question is too small. If something feels off, just tell me.