Offseason Hub Guide

How to manage rosters, build schedules, and set up a new season

πŸ“‹ Overview

The Offseason Hub is your central command center for preparing the next season. It brings together six tools that handle everything from roster building to schedule creation and season publishing.

πŸ—ΊοΈ The Offseason Tools
  • πŸ‘₯ Offseason Roster Management
    Drag-and-drop interface for assigning players to teams, managing trades, and handling new/returning players.
  • 🐍 Snake Draft
    Live draft room for distributing unassigned players across teams. Supports real-time multi-user drafting with a pick timer, draft board, and automatic roster updates.
  • 🎲 Schedule Generator
    Automatically creates balanced schedules for summer (23 games) or fall (12 games) seasons.
  • βš–οΈ Schedule Balancer
    Fine-tune a generated schedule by adjusting dates, times, opponents, and home/away assignments.
  • πŸ“… Schedule Analyzer
    Upload a schedule file and view detailed breakdowns by team β€” opponents, game times, day patterns, and home/away splits.
  • ✏️ Schedule Editor
    Edit individual games in a published season β€” change dates, times, or fields and share updates via WhatsApp.
  • πŸ† Season Setup Wizard
    Guided step-by-step setup to create and publish a new season to Firebase.
πŸ”’ Who Can Access?
The Offseason Hub and its tools require elevated permissions. You must be an πŸ‘‘ Admin, πŸ“‹ League Staff, or ⚾ Captain to access these pages. If you see a "Permission Denied" screen, contact a league administrator.
1 Offseason Roster Management

The offseason roster management page gives you a league-wide view of every team's roster with drag-and-drop functionality for moving players between teams. Open Offseason Roster Management

πŸ“₯ Loading Rosters

When you first open the page, you can start from scratch or load rosters from a previous season:

  • Load from Season
    Use the dropdown at the top to select a past season. This pre-populates all teams with their rosters from that season, giving you a starting point for the next one.
  • Start Fresh
    If no season is selected, you begin with empty rosters and can build teams from the ground up.
πŸ”„ Drag-and-Drop Player Management

Moving players between teams is as simple as dragging their card:

πŸ‘† Drag a Player
Click and hold on any player card, then drag it to a different team's roster column. The target area highlights when you hover over it.
πŸ“‹ Unassigned Pool
New players or players imported without a team assignment appear in the Unassigned Players zone at the bottom. Drag them onto any team to assign them.
🚫 Unavailable Players
Players who won't be returning can be moved to the Unavailable section. This keeps them out of active rosters while preserving them in the system.
βž• Adding Players & Teams
  • Add Player to Team
    Each team column has an + Add Player button. Choose from past players or type a new name to add them directly.
  • Create New Team
    Need to add an expansion team? Use the + Create Team button to set up a new team with a name and color.
πŸ’Ύ Saving & Changelog

All changes are tracked and saveable:

πŸ’Ύ Save Changes Saves the current roster state to Firebase so others can see your updates.

πŸ“œ Changelog View a log of all roster moves β€” who was moved, by whom, and when. Great for tracking trades and decisions.

πŸ’‘ Active Editors
The page tracks who is currently editing rosters in real-time. You'll see other users' names at the top if they're also on the page β€” helpful for avoiding conflicting changes during draft meetings.
πŸ—‘οΈ Resetting Roster Data
The roster planner saves to an isolated Firebase collection (offseasonRosters/current) that is completely separate from live season data. If you want to start fresh β€” for example, after a test run or to redo planning β€” go to Admin Content β†’ Offseason Data tab and click Wipe Offseason Roster Data. This is safe to do at any time and will not affect player stats or published seasons.
2 Snake Draft

The Snake Draft room lets captains and league staff distribute unassigned players across teams in a live, real-time drafting session. It reads directly from the offseason roster's unassigned pool and writes picks back to it when complete. Open Snake Draft

πŸ“¦ Prerequisite β€” Unassigned Pool
The draft pool is pulled from the Unassigned Players section of the Offseason Roster Planner. Players must be in that pool before the draft can start. If the pool is empty, go to the Roster Planner and move any unsigned players into the unassigned zone, or use League Staff Admin β†’ Roster Import to upload a new signup list.
βš™οΈ Setup Phase

Before the draft begins, you configure three things:

1
Draft Pool β€” The page shows a count of unassigned players, total teams, and open roster spots. You can preview every player in the pool with their new/returning status.
2
Participating Teams β€” Teams are shown with their current roster size vs. max. Full teams are greyed out automatically. Click a team to include them, then adjust how many picks they need (defaults to their number of open spots).
3
Draft Order β€” Once at least one team is selected, a drag-and-drop order list appears. Drag teams to set the Round 1 order. Use 🎲 Randomize for a random draw or πŸ”„ Reverse to flip the list.
4
Pick Timer (optional) β€” Enable a countdown timer per pick (60s, 90s, 2 min, or 3 min). When the timer expires the pick is automatically skipped.

When ready, click πŸš€ Start Draft to lock in the configuration and enter the live draft room.

🐍 Live Draft Room

The draft room has three panels running simultaneously:

  • πŸ“‹ Player Pool (left panel)
    All undrafted players sortable by name, batting average, or BPI. Use the search bar to find a specific player. Click any player card to open the pick confirmation modal.
  • πŸ“Š Draft Board (center panel)
    A grid showing every pick slot by round and team. Completed picks are filled in; the current pick slot is highlighted. Makes it easy to see the snake pattern and where each team picks next.
  • 🏟️ Rosters (right panel)
    Live roster cards for each participating team, updating in real time as picks are made. Shows the running count of drafted players per team.

The clock bar at the top always shows which team is currently on the clock, the round, pick number, and available player count. If a timer is active, it counts down here.

Skip ⏭ Skips the current pick slot β€” the team passes and the player stays in the pool for later rounds.

🐍 How Snake Order Works

A snake draft reverses the pick order every round, ensuring fairness:

  • Round 1: Teams pick in the order you set (e.g. Green β†’ Blue β†’ Red β†’ Black)
  • Round 2: Order reverses (Black β†’ Red β†’ Blue β†’ Green)
  • Round 3: Reverses again (Green β†’ Blue β†’ Red β†’ Black)
  • ...alternating each round

Teams that pick last in one round get first pick in the next.

βœ… Completing the Draft

Once all picks are made, the βœ… Complete Draft button appears. Clicking it:

  • Moves each drafted player from the unassigned pool onto their new team in offseasonRosters/current
  • Logs a draft_completed entry in the offseason roster changelog
  • Shows a final summary screen with each team's picks

From the completion screen, go back to the Roster Planner to review full updated rosters, or click πŸ—‘ New Draft to reset and run another round.

πŸ”„ Resuming an Interrupted Draft

If the page is closed mid-draft, it automatically resumes where it left off when reopened β€” the full draft state is stored in Firebase in real time. All picks, the order, and the current pick index are fully restored.

Multiple users can have the draft open simultaneously and all views update live as picks are made β€” great for in-person draft events where captains are watching on their own devices.

πŸ—‘οΈ Resetting Draft Data
The draft saves to the isolated drafts/current collection. To wipe it entirely β€” for a re-do or after testing β€” go to Admin Content β†’ Offseason Data tab β†’ Wipe Draft Data. This is safe and will not affect any published season data.
πŸ’‘ Draft Day Tips
  • Have captains open the draft room on their own devices β€” everyone sees picks update in real time
  • Enable the pick timer to keep things moving β€” 90 seconds is a good pace for most groups
  • Use the BPI sort to quickly see the highest-value available players
  • The draft can be run remotely β€” captains don't need to be in the same room
  • After the draft, return to the Roster Planner to review final rosters and make any manual adjustments
3 Schedule Generator

Automatically create balanced schedules with time slot assignments. The generator walks you through a multi-step wizard. Open Schedule Generator

πŸ“ Step-by-Step Process
1
Choose Season Type β€” Select Summer (23 games, Mon–Thu with Fri if 12 teams, double headers at 7:45 & 8:45 PM) or Fall (12 games, Sundays, 8:00 AM–12:00 PM). This determines the number of games and available time slots.
2
Select Teams β€” Choose which teams are participating. Use "Select All" for a full league or pick specific teams. You'll see a warning if the number of teams is odd (byes required).
3
Set Parameters β€” Pick a start date and select which time slots to include. You can also add restrictions (e.g., "Team A cannot play on Mondays" or "Team B cannot play the 8:45 slot").
4
Generate & Review β€” The system creates a balanced schedule and shows you the results with a balance score indicating how evenly matchups and time slots are distributed.
πŸ“Š Balance Score

After generation, each schedule receives a balance score:

  • 90–100: Excellent
    Very evenly distributed matchups and time slots across all teams.
  • 70–89: Good
    Minor imbalances that are generally acceptable.
  • 50–69: Fair
    Noticeable unevenness β€” consider regenerating or using the balancer.
  • Below 50: Poor
    Significant imbalances β€” regenerate with different parameters.
πŸ“€ Export Options

πŸ”₯ Export to Firebase Saves the schedule directly to Firebase, ready to be used in the Season Setup Wizard.

πŸ“₯ Download CSV Export as a CSV file for offline review or manual editing.

πŸ”„ Regenerate Not happy? Generate a new schedule with the same parameters.

πŸ’‘ Best Practice
Generate a few schedules and compare balance scores before committing. If the score is below 70, try adding or removing time slot restrictions. You can always fine-tune the result in the Schedule Balancer afterward.
4 Schedule Balancer

After generating a schedule, use the balancer to make targeted adjustments before publishing. Open Schedule Balancer

πŸ“₯ Loading a Schedule

Upload a CSV file (from the Schedule Generator's export or your own file) by dragging it onto the upload zone or clicking to browse. The balancer reads the schedule and displays it in an editable table.

✏️ Making Adjustments

Click on any cell in the schedule table to edit it. Common adjustments include:

  • Change Game Date
    Click the date cell and pick a new date. The system warns you about scheduling conflicts.
  • Adjust Game Time
    Click the time cell to change when a game is played. Warnings appear if teams have back-to-back games with tight turnarounds.
  • Swap Home/Away
    Use the πŸ”„ Swap button on any game row to flip home and away teams instantly.
  • Change Opponents
    Click on a team name in the schedule to replace them with a different team.
⚠️ Warnings & Conflicts

The balancer automatically flags potential issues:

  • Back-to-back games β€” Teams playing with very little rest time between games
  • Time gap warnings β€” Unusually long or short gaps between consecutive games
  • Home/away imbalance β€” A team with too many consecutive home or away games
πŸ“Š Team Summaries

Below the schedule table, you'll see a summary panel for each team showing their total games, home/away split, and opponent distribution β€” helping you spot imbalances at a glance.

πŸ”₯ Export to Firebase πŸ“₯ Download CSV

5 Schedule Analyzer

Upload any schedule file and get a detailed statistical breakdown of how balanced it is. Great for reviewing a schedule before or after publishing. Open Schedule Analyzer

πŸ“‚ Uploading a Schedule

Drag and drop a CSV or Excel file onto the upload area, or click to browse. The analyzer automatically reads the file and extracts all game data.

πŸ”„ Reset to clear and upload a different file.

πŸ“Š MOLSKI Rating

Every team receives a MOLSKI (Mountainside Overall League Schedule Kindness Index) rating that measures how favorable or tough their schedule is. The league-wide rankings show all teams sorted by their MOLSKI score.

Factors include opponent distribution, time slot variety, rest days between games, and home/away balance.

πŸ” Team-by-Team Breakdown

Select any team from the sidebar to see their detailed schedule view:

  • Opponent breakdown β€” How many times they play each opponent
  • Game times β€” Distribution across time slots
  • Day of week β€” How games fall across the week
  • Home/Away split β€” Balance of home vs. away games
  • Full game list β€” Every game with date, time, opponent, and location
6 Schedule Editor

Once a season is live, use the Schedule Editor to make changes to individual games β€” rescheduling, time changes, or field updates β€” and notify players directly. Open Schedule Editor

πŸ“‹ Selecting a Game
1
Choose a Season β€” Select the active season from the dropdown.
2
Filter by Team β€” Optionally filter the game list to show only games for a specific team.
3
Select the Game β€” Click on a game in the list to load it into the editor panel.
✏️ Making Edits

With a game selected, you can change:

  • Date & Time
    Reschedule a rained-out game or adjust the start time.
  • Field / Location
    Update where the game will be played.

A live preview shows the notification message that will be generated based on your changes.

πŸ“² Save & Share

πŸ’Ύ Save & Share Saves the updated game data to Firebase and generates a formatted message.

πŸ“² Share to WhatsApp Opens WhatsApp with a pre-formatted message about the schedule change so you can quickly notify the league chat.

πŸ”’ Staff Access Only
The Schedule Editor requires League Staff or Admin access. Captains who need a game changed should contact league staff.
7 Season Setup Wizard

The final step β€” create and publish a new season with a guided wizard that ensures nothing is missed. Open Season Setup Wizard

πŸ§™ Wizard Steps
1
Season Details β€” Enter the season name, type (Summer/Fall), and year. A preview of the season key is generated automatically (e.g., "2025-summer").
2
Select Teams β€” Choose which teams are participating. Use "Select All" or pick individually. The wizard shows a count of selected teams.
3
Import Schedule β€” Choose your schedule source:
  • Upload CSV β€” Use a file exported from the Schedule Generator or Balancer
  • From Firebase β€” Pull a schedule that was previously saved to Firebase
A preview table shows the imported games for verification.
4
Review & Publish β€” See a summary of everything: season name, type, teams, and game count. When ready, click publish to create the season in Firebase.
πŸš€ Publishing

πŸ”₯ Create Season This creates the season document in Firebase with all teams, games, and metadata. The season becomes immediately visible on the website.

πŸ§ͺ Sandbox Mode β€” Test Before You Publish

Before running the wizard for real, you can do a full dry run without touching any production data. Sandbox mode saves everything to isolated seasons/sandbox-* documents that the live site ignores completely.

1
Open the Season Setup Wizard. In the header, click the πŸ§ͺ Test in Sandbox Mode button. A yellow banner confirms you're in sandbox.
2
Run through the entire wizard normally β€” enter season details, select teams, import your schedule CSV, and publish. The season ID will be prefixed with sandbox- (e.g. sandbox-2026-summer). The "Set as Active" checkbox is disabled automatically.
3
Verify everything looks right in the success screen. You can repeat the test as many times as needed by clicking Run Another Test.
4
When done testing, go to Admin Content β†’ Offseason Data tab and click Wipe Sandbox Seasons to clean up. Then run the wizard again without sandbox mode to publish for real.

You can also toggle sandbox mode on and off mid-session with the same button β€” it updates the season ID preview in real time.

⚠️ Before Publishing for Real
Double-check everything on the review screen. While individual games can be edited later via the Schedule Editor, the season structure (name, type, teams) is harder to change after publishing. Make sure the schedule CSV is final and all teams are correct. Use sandbox mode first if you have any doubt.
πŸ”„ Recommended Offseason Workflow

Follow this sequence for the smoothest offseason experience:

1️⃣ Build Rosters
Open Offseason Roster Management and load from the most recent season. Move returning players between teams, place new/unsigned players in the Unassigned pool, and handle any departures. Save when done.
2️⃣ Run the Snake Draft (if needed)
If there are unassigned players to distribute, open the Snake Draft. Select which teams are participating, set how many picks each needs, randomize the draft order, optionally enable a pick timer, and start. Picks save back to the offseason roster in real time. Skip this step if all rosters are already set.
3️⃣ Generate the Schedule
Use the Schedule Generator to create a balanced schedule. Pick the season type, select participating teams, configure time slots and any restrictions, then generate. Try a few iterations to get the best balance score.
4️⃣ Fine-Tune with the Balancer
Export the schedule as CSV and load it into the Schedule Balancer. Address any warnings, swap home/away assignments, and adjust dates or times as needed. Export the final version.
5️⃣ Analyze for Quality
Upload the final schedule into the Schedule Analyzer to verify MOLSKI ratings and team-by-team breakdowns. Make sure no team has an unfairly tough or easy draw.
6️⃣ Test in Sandbox First
Open the Season Setup Wizard and click πŸ§ͺ Test in Sandbox Mode. Run the full wizard with your finalized schedule to confirm everything imports correctly. The season saves as sandbox-* and has zero impact on production. Wipe it when done from Admin Content β†’ Offseason Data.
7️⃣ Publish the Season
Once the sandbox test passes, open the Season Setup Wizard again (without sandbox mode), import your finalized schedule, and publish to Firebase for real.
8️⃣ Manage In-Season Changes
When rainouts or rescheduling happens during the season, use the Schedule Editor to update individual games and share notifications via WhatsApp.
πŸ’‘ Pro Tips
  • Complete roster building before the draft meeting so captains can see who's returning
  • Generate 3–5 schedule variations and pick the one with the best balance score
  • Always run the Analyzer as a final check before publishing
  • Save schedule CSVs locally as backups before publishing to Firebase
  • Run a sandbox test of the Season Setup Wizard to catch any import issues before going live
πŸ§ͺ Testing & Cleanup

Every offseason tool that writes data has a safe way to test and reset. Here's a full map of what writes where and how to clean it up.

πŸ—‚οΈ Where Data Lives
  • πŸ“‹ Offseason Roster Planner
    Writes to offseasonRosters/current β€” completely isolated from live season data. Safe to wipe anytime.
  • 🎯 Draft Tool
    Writes to drafts/current β€” also isolated. Safe to wipe anytime.
  • 🎲 Schedule Generator / βš–οΈ Balancer / πŸ“… Analyzer
    No Firebase writes during normal use β€” data lives in memory until you explicitly export. Safe to use freely.
  • πŸ† Season Setup Wizard (Production)
    Writes to seasons/{id} β€” this is live production data. Use sandbox mode before running for real.
  • πŸ§ͺ Season Setup Wizard (Sandbox)
    Writes to seasons/sandbox-{id} β€” completely ignored by the live site. Safe to wipe anytime.
πŸ—‘οΈ How to Wipe Test Data

All cleanup is done from Admin Content β†’ Offseason Data tab. The tab shows a live status for each collection so you can see what currently exists before wiping.

1
Go to Admin Content and click the 🧹 Offseason Data tab.
2
Each section shows its current status β€” document exists, how many teams or picks, last modified date. This confirms whether there's anything to wipe.
3
Click the relevant wipe button. A confirmation dialog appears before anything is deleted.
  • πŸ—‘οΈ Wipe Offseason Roster Data
    Deletes offseasonRosters/current and its changelog/presence subcollections. Use to start roster planning fresh.
  • πŸ—‘οΈ Wipe Draft Data
    Deletes drafts/current. Use to reset a draft that was run for testing or to redo.
  • πŸ—‘οΈ Wipe Sandbox Seasons
    Deletes all seasons with IDs starting with sandbox-, including all their game documents. Use after testing the Season Setup Wizard.
⚠️ None of These Affect Live Data
All three wipe operations are scoped to isolated collections. They cannot touch published seasons, player stats, game scores, or any other production data. If in doubt, check the status readout on the tab before wiping β€” it tells you exactly what's there.
πŸ“Œ Quick Reference
⌨️ Common Button Actions

πŸ’Ύ Save Changes Save roster or schedule edits to Firebase

πŸš€ Start Draft Lock in draft settings and enter the live draft room

βœ… Complete Draft Save all picks to rosters and close the draft

Skip ⏭ Pass on the current pick β€” player stays in pool

🎲 Randomize Randomize draft order

πŸ—‘ New Draft Reset draft data and start fresh

πŸ”₯ Export to Firebase Push generated schedule data to Firebase

πŸ”₯ Create Season Publish a new season from the wizard

πŸ§ͺ Test in Sandbox Mode Switch wizard to sandbox β€” saves under sandbox-*, not production

πŸ—‘οΈ Wipe Offseason Roster Data Reset roster planner (Admin Content β†’ Offseason Data)

πŸ—‘οΈ Wipe Draft Data Reset draft (Admin Content β†’ Offseason Data)

πŸ—‘οΈ Wipe Sandbox Seasons Clean up wizard test data (Admin Content β†’ Offseason Data)

πŸ“₯ Download CSV Export schedule to a local CSV file

πŸ”„ Swap Flip home/away teams for a game

πŸ”„ Regenerate Create a new schedule with same settings

πŸ“² Share to WhatsApp Send schedule change notification

πŸ“œ Changelog View roster change history

πŸ”— Page Links

🎣 Offseason Hub β€” Central dashboard with all tools

πŸ‘₯ Offseason Roster Management β€” Drag-and-drop roster building

🐍 Snake Draft β€” Live draft room for distributing unassigned players

🎲 Schedule Generator β€” Automatic schedule creation

βš–οΈ Schedule Balancer β€” Fine-tune adjustments

πŸ“… Schedule Analyzer β€” Upload and analyze schedules

✏️ Schedule Editor β€” Edit live season games

πŸ† Season Setup Wizard β€” Guided season publishing

🧹 Admin Content β†’ Offseason Data β€” Wipe roster, draft, and sandbox data

Questions? Contact the admin team for assistance.
← Back to Offseason Hub