Live scores, schedules, standings, and breaking news for Maine high school sports.
Follow every MPA game, team, and athlete across football, basketball, soccer, hockey, baseball, and more — with instant updates, scoreboards, and expert local coverage designed for fans on the go.
Today's Games
See allBreaking news
Read more🏆 Prediction Leaderboard
Follow Maine Preps
Live Scoreboard
Loading today's action…All games
Standings
Power rankings
Playoff brackets
Find a team
All articles
Maine Preps Admin
Log in to continue.
Gameday
Every game scheduled for today, in one screen — bump scores live without hunting through the full Games tab.
Games & Scores
Add a game, update the live score, or mark it final.
Add a game
For a match with more than two teams — common in golf. Home/Away above count as two of the teams; add one row per team beyond that.
All games
Suspicious scores
Flags a final score well outside the normal range for its sport — usually an extra typed digit (e.g. "210" instead of "21"). Not every flagged game is actually wrong; a genuine blowout can still trip this, so it's a prompt to double-check, not an auto-fix.
Missing Scores
Every final game with no score entered, filterable by sport and class and sortable by how long it's been sitting empty.
Standings
Win-loss and streak update themselves whenever you mark a game final with a score — edit here to override, or for a team with no games entered yet.
Add / update team record
Standings are sorted by Tour Indx, not win-loss — MPA seeds tournaments using the Heal Point tournament index for most sports (strength-of-schedule weighted; Prelim Indx is the intermediate step that feeds into it) and the Crabtree Ranking for football specifically (a single-step formula, so football has no separate Prelim number). Both are now calculated automatically from entered games — anything typed here gets overwritten the next time a game is saved for that sport. Use these fields (or Bulk Import) if you need to set a number by hand for a team with no games entered yet, or to correct it temporarily.
Current standings
W-L-T, Streak, and Index are all kept in sync automatically as games are added, edited, or deleted — this button rebuilds every team's numbers from scratch using every final game on file, for a first-time backfill or if something ever looks off. Football's Index uses the Crabtree formula (your win% + your opponents' combined win%, ×100); every other sport uses Heal Points (a two-step class-weighted strength-of-schedule formula). Both are computed straight from entered games, so they're only as accurate as the schedule actually entered is complete — Bulk Import or manual entry can still set Index by hand, but it'll be overwritten the next time a game for that sport is saved.
Start new season archives every team's current W-L-T/Streak/Index into that public year's history (so it stays visible on the site's Season picker forever), then resets the live numbers to 0-0-0 so the new season starts clean. Rankings are cleared the same way — Standings keeps its team roster since it's rebuilt automatically from games, Rankings you re-set by hand each week anyway. Games need no reset at all; each one already tags itself with the season it belongs to.
This table only ever holds the current season — past seasons live in the site's public Season picker once archived above, not here.
Power Rankings
Set weekly rankings — drag isn't required, just set the rank number.
Add / update ranked team
Auto power rankings
Suggests a full ranking order for the sport/class picked above, computed from data already on file — each team's Heal Points/Crabtree index (the same strength-of-schedule number Standings sorts by), a recency-weighted look at their last 5 games, and a bonus for their best quality win (beating a team ranked above them) or penalty for their worst bad loss (losing to a team ranked below them). Nothing is saved until you review the suggested order below and apply it.
Current rankings
This table only ever holds the current season — past seasons live in the site's public Season picker once archived from the Standings tab's "Start new season" button, not here.
Playoffs
Build a single-elimination bracket by hand — add Round 1 matchups, pick a winner as each is decided, then generate the next round from those winners.
Create a bracket
Seed a bracket from standings
Pulls the top teams from current Standings (ranked by Tour Indx) as a starting point, then lets you review it — reorder seeds, swap in a different team, or check a team off for a bye — before anything is created. Standard tournament seeding (1 vs. lowest seed, 2 vs. second-lowest, etc.) is used to pair whoever's left after byes are set aside.
Brackets
Team Logos
Upload a logo for a school and it'll show up next to that team's name everywhere on the site.
Official logos
Official logos for 140 of the 147 schools in your directory are applied automatically — they load from the logos/ folder next to this file and never overwrite a logo you've uploaded yourself. The remaining 7 (small schools with no findable official logo online) still show colored initials. Use the button below if you ever need to re-apply them (e.g. after a data reset).
Upload a logo
Tip: this field autocompletes from the official list of Maine high schools — pick a school from the dropdown instead of typing it freehand, and it'll match everywhere on the site automatically.
All logos
Articles
Write, edit, and publish news articles — shown on the homepage's Breaking News panel and the Articles page.
Weekly recap generator
Builds a draft recap of the last 7 days' final games for a sport — final scores plus the biggest upset (by ranking gap), if any — and drops it into the form below so you can review and tweak the wording before publishing. This host has no scheduled task runner, so it's a one-click generate rather than fully automatic; run it whenever you're ready to publish that week's recap.
Add an article
All articles
Updates
Publish what's new to the "What's new" popup fans see on the public site — a release-notes update, or a one-off message.
Publish
Every visitor sees this once, the next time they load the site — the popup pops up automatically, the same way it always has. Publishing a new one here doesn't require re-uploading anything. For an Update, each bullet gets a ✨ icon by default — start a line with a different emoji (e.g. "🏈 Football scores are live now") to use that one instead. Start a line with ## to turn it into a section header (e.g. "## Hot Streaks are here!") — shown bold and underlined, no icon needed — every bullet after it falls under that header until the next "## " line, so one update can cover several separate changes. Wrap text in **double asterisks** anywhere in a bullet or header to make it bold.
History
Bulk Import Schedule
Paste a standings + schedule block (like from a MaxPreps/power-rankings page) and import it in one shot.
1. Choose sport & class
Only used for the record/schedule and master-schedule formats below — a "Power Rankings" or "Standings" header line in the pasted text overrides this with its own sport/class.
2. Paste the text
Four formats are auto-detected. (1) Lines like "# Team Name W-L (index)" plus "Remaining: MM/DD Opponent (Tag: W-L), ..." build standings and upcoming games — home/away isn't specified in this format, so it's assigned arbitrarily; edit afterward if you need to fix it. Uses the Class/Division picked above for every row. (2) A full master schedule table (columns: GameDate, Time, Type, Home School, Away School, Site, tab-separated) imports games directly with real home/away, times, and locations — the Class/Division dropdown is ignored for this format, since a schedule normally spans every class at once; each game's class is instead filled in automatically from the class list for the selected sport. (3) A header line ending in "Power Rankings" (e.g. "Boys Soccer North A Power Rankings"), followed by lines like "1. Team Name" — imports straight into Power Rankings only for the sport/class named in that header, ignoring the pickers above. (4) A header line ending in "Standings" — imports straight into Standings, same header rule. Accepts either a plain "# Team Name W-L (index)" list, or MPA's own Heal Points "Qualifying Teams" report pasted as-is (rank, record, Prel Indx, Tour Indx, and each team's Wins:/Losses:/Remaining: detail): the W-L and both index numbers are taken directly from the report rather than computed from game scores, any "Remaining:" schedule becomes upcoming games (already-decided Wins:/Losses: games aren't added — this report gives no score for those), and the imported numbers are protected from being overwritten by the site's own auto-compute until a real final score is entered for that team. The sport in a header line must match one of your existing Sports & Schools sport names. Either way, games are matched across teams/imports automatically, so re-pasting doesn't create duplicates.
Import results
Bulk score entry — paste today's results
Paste a results page in either of two block formats. The multi-sport kind a lot of Maine schedule sites export lists the sport on every game — a day/date line ("THU 9/3"), then a time or status, then "Sport LevelVarsity", then each team as "Team - Class" with the score on the end, then a venue line. A single-sport "Scores" page export (a school or league's own results widget, one sport for the whole paste) works too — it states the sport and level once at the top instead ("2026-2027 Football Varsity," or a plain "HS Football" line), then just the date/time and the two team lines with no venue line; anything sitting between the time and the two teams — "Homecoming Game," "Scrimmage," a reschedule note, a stadium name — is kept as that game's note instead of being dropped, so a scrimmage still shows up clearly labeled. Only Varsity games are imported — JV, Freshman, and 9th Grade results in the same paste are skipped automatically. Only games where both teams show a score are touched — anything still blank (not played yet, canceled, postponed) is skipped automatically, and multi-team meets (golf/cross country blocks listing 3+ teams) are always skipped since those never carry a score in this format. A team name that's close to — but not spelled exactly like — one already on file (e.g. "Cony HS" vs "Cony High School") is matched onto the existing spelling instead of creating a duplicate team. If the scheduled date on file doesn't match this paste's date for the same two teams, the game's date is corrected to match rather than creating a second entry (skipped if those two teams have more than one still-unplayed game against each other). Preview first — nothing is saved until you confirm.
Round-robin schedule generator
Pick a sport and a list of teams, and this generates every matchup automatically instead of entering each game by hand — a full round robin (each team plays every other team once) or double round robin (home-and-away, each team plays every other team twice). Home/away is assigned automatically; edit any individual game afterward if you need to flip it.
Merge Duplicates
Finds team names that are probably the same school spelled differently, and games that got entered more than once.
Possible duplicate teams
Like "Messalonskee" from a bulk import vs. "Messalonskee High School" from the directory — so logos, records, and schedules all line up under one name. Schools that just happen to share a word (e.g. "Bangor" and "Bangor Christian Schools") are treated as different teams and won't show up here. "Merge all" uses whatever spelling is currently selected in each dropdown below (defaults to the official directory name where one matches).
Combine duplicate teams
For a duplicate the scanner above didn't catch — names too different to auto-match, like a nickname or misspelling. Enter both spellings and pick which one survives; every game, standing, ranking, and logo across every sport that used the other name gets moved onto the surviving name. If that leaves two entries for the exact same matchup (same sport, class, date, and both teams), the duplicate is deleted automatically.
Convert team to co-op
Use this when a team already has games/standings/rankings entered under its own name for a sport, but should actually be a co-op with another school (e.g. "Wiscasset" needs to become "Wiscasset/Morse Coop" for Volleyball only). This renames every game, standing, and ranking entry for that one sport only — the school's entries in every other sport are left alone, since a co-op is usually sport-specific.
Bulk duplicate game cleanup
Finds games entered twice with home/away reversed — same sport, same date, same two teams, regardless of which one is listed as home. This is the most common source of duplicate entries in team schedules (usually from importing both teams' schedules separately). Scan first to see a report; nothing is deleted until you confirm. A same-matchup pair on slightly different dates (a typo, e.g. "today at 3:30" vs. "tomorrow at 3:00") is flagged too, but only as a heads-up here — those aren't auto-deleted in bulk, since two different games could genuinely land that close together. Review those individually in "Possible duplicate games (manual review)" below.
Combined-name teams from schedule imports
Finds team names that are really several schools glued together with commas, like "Searsport HS, Washington Academy, Deer Isle-Stonington" — this used to happen when a meet-style master schedule row (cross country, track, swimming, etc.) listed multiple participating schools in one cell, and the whole cell got imported as one literal team name instead of the real schools involved. New imports are fixed automatically now, but any of these already sitting in your data from before need cleaning up by hand. Scan first to see a report; nothing is deleted until you confirm.
Un-suffixed co-op teams
Finds team names that look like a co-op but are missing the trailing "Coop" — e.g. "Wiscasset/Morse" instead of "Wiscasset/Morse Coop" — which used to happen when a master schedule listed a co-op that way. These are otherwise disconnected from the real "Coop"-suffixed team (no class match, not linked to the co-op elsewhere on the site), so this finds them and renames them onto the matching "Coop" name — an existing one already on file if there is one, or a freshly-suffixed one if not.
Possible duplicate games (manual review)
Same as the bulk tool above, but also catches the same two teams scheduled within 3 days of each other (not just the exact same date) — and reviewed one matchup at a time so you can pick exactly which entry to keep, since a wider date window means a few of these could turn out to be two genuinely different games. Useful for spot-checking after the bulk cleanup, or for ongoing use as new games come in.
Analytics
Page views tracked directly by the site itself — no third-party analytics service involved.
Overview
Daily views — last 14 days
Top pages — last 7 days
Error Log
Every PHP warning, uncaught exception, and fatal error from the backend — most recent first.
Audit Log
Who changed what, and when — games, standings, rankings, sports/schools, articles, logos, brackets, and settings, most recent first. Routine automatic recomputes (e.g. standings recalculating after a game score is saved) aren't included, only deliberate admin actions.
Reports
Issues fans have flagged via "Report an issue," plus proposed score corrections from "Report a score" on final games — open reports on top, most recent first. Accept a score report to apply it directly to the game, or Decline to dismiss it and leave the score as-is.
Sports & Schools
Manage sports, class/divisions, and the school directory used across the site.
Sports offered
Sets which season is "in season" right now — that season's sports sort to the top everywhere on the public site (sport pickers, a team's sport tabs), and Standings/Power Rankings default to an in-season sport instead of whatever's first in the list below. Other seasons' sports stay fully visible, just not first — use the 👁️ toggle below if you want a sport gone entirely instead. Flip this by hand at the start of each season.
Uncheck any of these for a sport that's schedule-only (e.g. Golf) — no standings, power rankings, or win/loss tracking, just games on the calendar. You can flip these later using the icons next to each sport below.
Classes / Divisions
Team class assignments
Which class/division each team actually plays in, per sport — this is the roster the "Verify team classes" and "Missing data" scanners further down this tab check games/standings/rankings against. Add any sport's teams here, not just the handful this site ships with a built-in reference list for — a sport with nothing assigned here simply won't show up in either scanner's sport picker. An assignment saved here always wins over the built-in list if the two ever disagree for the same team.
Saving an assignment also registers the team in Standings (0-0-0 to start) and Power Rankings (added to the bottom of that class) if it isn't there yet, and quietly corrects its class there if it's already present under the wrong one. A team already sitting in both under the correct class is left completely alone — no record or rank gets overwritten just because the assignment was re-saved.
Schools
This is the list used for autocomplete everywhere teams are entered. Removing a school here doesn't delete any games, standings, or logos already entered for it.
Data
Export data (top right) only covers games/standings/rankings/schools/logos/articles. Download full database backup below covers everything, including admin and fan accounts, follows, and notification history — download it periodically and keep the file somewhere safe. To restore, run the downloaded .sql file in phpMyAdmin's Import tab.
Restore from a backup
Every night's automatic backup lives here (12:00 AM daily), plus a safety snapshot taken automatically right before any restore. Restoring replaces everything currently in the database — games, standings, rankings, accounts, articles, logos, all of it — with that backup's contents; anything added or changed since then is gone. A fresh "before this restore" snapshot is always saved first, so a restore can itself be undone by restoring that snapshot afterward.
Push notifications
One-time setup for real push alerts (fans get notified even with the site closed) — generates this server's signing keys. Safe to leave alone once it says "Configured"; re-running it after that would break every fan's existing subscription, so it's blocked unless you explicitly force it.
Two-factor login
Requires a 6-digit code from an authenticator app (Google Authenticator, Authy, 1Password, etc.) on top of the password every time this panel is logged into — so a leaked or guessed password alone isn't enough.
Missing data
Checks the known team roster for the selected sport (Football, Field Hockey, Boys Soccer, Girls Soccer, Volleyball — the sports with a full team list on file, same source the class-mismatch check below uses) against the current season, and flags any team with no games, no standings row, or no ranking entered yet — so a gap gets caught before a fan notices it's missing.
Verify team classes
Checks standings, power rankings, and games against the class list on file for the selected sport, and flags any record whose stored class doesn't match — usually leftover from an import done before that sport's class list existed, or an old label from before a class was renamed (e.g. "A" → "Class A"). Teams not yet in the class list are skipped, not flagged, since we don't actually know their correct class yet. Each row can be fixed or dismissed on its own — "Not a mismatch" remembers that choice so re-scanning won't flag it again.