Commissioner
Forgot password?
← Site
Dashboard
Overview of the DVSL season
Next Upcoming Game
Loading...
Notifications
Loading notifications...
Captains Chat
Loading...
Notifications
All activity across the league
Loading notifications...
Scores
Enter and manage game scores
Loading games...
Schedule
Manage the game schedule
Loading schedule...
Rosters
Manage team rosters
Waivers
2026 season waiver status by team
🔗 Registration Link
Select a team above to view waiver status
Standings
View and manage team standings
Loading standings...
Banner / Alerts
Create rich alerts with formatting, scheduling, and mandatory popup
Loading...
Message Editor
Emoji:
Background:
Live Preview
Preview will appear here
Scheduling (Optional)
Leave blank to publish immediately / never expire
Alert History (last 5 — click to reload)
Loading history...
Push Notifications
Send a push alert to everyone who's subscribed on their phone
🔔 Your notification preferences
Configure which pushes your device receives, and flip on Commissioner Alerts to get admin-only pings (score conflicts, new signups).
Open Notification Settings (Admin)
New Notification
📣 League-wide announcement? Set Category to Announcements, leave Team blank, write your message, hit Send. Goes to everyone subscribed to Announcements.
What does "Category" mean? It's which alert type the recipient opted into on their Notifications Settings page. A push only reaches a phone if that phone's category toggle is on. Pick the one that matches what you're sending:
  • 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.).
The recipient's Inbox now shows "📣 From DVSL League Admin" above the title for announcements / schedule / playoffs / rainouts / admin pushes, so it's clear the message came from the commissioner's office.
Manage Captains
Assign team captains for the Captain Portal
Captains enter captain.html by picking their team and signing in with their personal email + password (Firebase Auth). Records here are used for the directory, email blasts, and matching captain-submitted box scores. Email and phone are optional but recommended.
Loading captains...
Captain sign-ins (audit log)
Every email that has signed in to the captain portal, grouped by team. If someone wrong claimed a team, click Revoke — they'll have to sign in again on their next visit.
Loading sign-ins...
Player sign-ups
Every player who has created a Firebase Auth account and linked their roster spot. Header shows the totals per team — useful for nagging captains whose teams haven't signed up yet.
Loading sign-ups...
Manage admins
Flip a player's 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.
Loading...
Contacts
Player & manager directory — email anyone at once
Quick Email
✉ buttons open your mail client with recipients pre-filled as BCC (so captains/players can't see each other's addresses). 📋 buttons copy a comma-separated list to your clipboard so you can paste into Gmail, Outlook, or any other mail app.
Directory
Loading...
Financials & Payments
Track team dues and payments
Payment Log
Loading...
Registrations
Incoming team & free agent sign-ups from the registration page
Loading registrations...
Email Blast
Send an email to all DVSL Players subscribers via MailerLite
Loading subscriber count...
💡 Sent campaigns are managed at dashboard.mailerlite.com
Page Editor
Edit the content of any page on the site — no code required
Sections
Pick a Section
Select a section from the left to start editing
Player Media
Photos & videos posted by players via the Player Portal
Loading…
Submitted Scores
Score submissions from team captains
Loading submissions...
Admin Tutorial
How every tab works, what to check each week, and what to do when things go sideways.
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=1 flag 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.