A 5-on-5 hockey engine that plays a full game between the Boston Bruins and the Montreal Canadiens on a regulation rink. Real rosters, player ratings built from published 2025-26 statistics, selectable team systems you can change mid-game, line changes the way benches make them, three officials and the NHL's rules. It is a decision and physics model, not a scripted animation, and every number that drives it can be traced to its source.
The teams
Boston is the home team at TD Garden and attacks to the right in the first and third periods. Both clubs dress their 2026-27 opening lineups: four forward lines, three defense pairs and two goalies, with scratches and injuries listed on the roster sheets. Each skater's ratings come from his 2025-26 season as recorded by MoneyPuck: shooting from individual expected goals and finishing, passing from primary assists and on-ice expected goals, defense from on-ice expected goals against relative to his team plus takeaways and blocked shots, faceoffs from his real win rate, and a penalty tendency from his penalties per 60. Skating speed and acceleration scale with his rating against NHL EDGE tracking benchmarks. Goalies save by danger tier at their real 2025-26 rates and freeze the puck at their own observed tendency. Small samples are shrunk toward average, and players who changed clubs carry their previous club's numbers, noted per player.
How a game is played
The engine runs the clock in real time at 1x. Every tick, the player with the puck makes a read. Alone in front, he shoots. A clean look from the slot is a shot. A perimeter look goes through traffic, and a point man fires when the lane is there. A teammate with a step on the last defender gets sprung, a lead forward at the far blue line gets the headman pass, and otherwise he carries, chips or dumps the puck in according to his team's entry system. Under pressure in his own zone with no safe pass, he bangs it off the glass. Held too long with nothing on, he moves it to the nearest safe option. Passes lead the receiver and the receiver skates to meet them; long and hurried passes are harder to hit.
Everyone else takes a spot from the team's current system: breakout, neutral-zone attack, offensive-zone shape, forecheck, defensive-zone coverage, power play or penalty kill. The breakout is not a set of fixed spots. Once a team has the puck in its own end the forwards leave their support positions and burst north ahead of it, timing the rush so they take the pass in stride, and the carrier wheels out with speed. Through the neutral zone all three forwards are at full effort. In the offensive zone the cycle keeps moving: corner, half wall and net front rotate between the three forwards every few seconds, and nobody stands still on any shape. A dump and chase is a hard rim around the boards to the far corner with the weak-side forward already sprinting to beat the defense to it.
On the other side of the puck, the forecheck's first man pressures and the second man takes the next pass on a 2-1-2 or a left wing lock. Defensemen play gap control that reads the carrier's speed, never let an attacker behind them, box out the net-front man and step into shooting lanes. The center owns the slot and plays goal-side of the most dangerous man between the dots. Wingers shade the high men on their side. Man coverage has the defensemen take the forwards. Back-checkers caught above the puck sprint. Shots are blocked, miss, or reach the goalie, who is a line squared to the shooter; a shot that crosses the line is a save at that goalie's rate for the danger of the shot, rebounds go to the corner, and traffic in the crease makes him cover it up.
Line changes and fatigue
Forwards and pairs change separately, on the fly only when the moment is right: our carrier is through the neutral zone and can dump it in, or the other team is retrieving a puck deep in their own end. Nobody changes off a loose puck, during a rush against, or while the puck is in our zone. Each bench has two doors: forwards change through the door at the attacking end and defense through the door at the defending end, and both swap when the teams change ends for the second period. Forwards sit at their door's end of the bench and defense at theirs, the next unit stands at its door as a shift gets long, first man off nearest his door, replacement on once he is within a stick length. A tired skater near his door swaps himself out alone when play is at the far end, and a turnover mid-change can draw a too-many-men minor. At stoppages the visitors change first and Boston gets the last change and can match lines. Shifts target about 45 seconds for forwards and 55 for defense, the top lines and pairs get the most ice, the first power-play unit stays out longer, penalty killers go short, and the bench shortens late in a close game.
Shift length is not a hard rule. After about 30 seconds a skater starts to fade, losing top speed, acceleration and hands, so his passes and shots get sloppier and he is easier to strip, and by 65 seconds he is gassed. A unit stuck defending plays through it, which is where tired legs cost goals. A gassed unit clears the puck at the first chance, even at the cost of an icing, and takes the first half-decent window to get off. A ring around a skater shows how tired he is, amber when fading and red when gassed, and the roster sheet shows the seconds on his current shift.
Rules and officials
Offside with the tag-up rule and a delayed call. Hybrid icing judged at the end-zone dots, waived while shorthanded, and the team that iced cannot change. Minor penalties drawn at each player's real rate, with power plays and the penalty-box clock. Goalie freezes when there is traffic in the crease. Offside and icing calls are tuned to land at league rates per game. Three officials work NHL mechanics: the referee at the goal line in the zone, the lead linesman on the blue line for offside, the trail linesman on the red line for icing.
Physics and calibration
Skating is calibrated to NHL EDGE tracking: top speeds of 19 to 23 mph by skater, bursts on rushes, breakouts and chases, cruising otherwise. Wrist shots run 58 to 85 mph and point shots 80 to 100; the dump is about 85 mph around the glass. Every unblocked attempt gets an expected-goal value from a model fit on two seasons of MoneyPuck shot data: distance and angle to the net, shot type, rebound, and the strength on the ice, times the shooter's own finishing over those seasons. The danger tiers follow MoneyPuck's expected-goal thresholds, and a goal is scored against each goalie at that value scaled by his real save rate in the tier. The engine is balanced at the NHL-average settings, the tick mark on each slider; the defaults it ships with run hotter on speed and shot volume because that is more fun to watch. The reality check under Advanced compares the sim's per-game rates with each club's real 2025-26 rates and the league average, live or over a ten-game batch with the win record, and flags anything more than 50 percent off. That table is the honest statement of where the engine still differs from the real game.
The systems
Using it
Game: pause, speed, a new game, Effects and Sticks, with the box score and play-by-play. Effects are skate trails behind anyone moving fast, a streak on hard shots and passes, a ripple on takeaways and blocked shots, a flash on big saves, and the goal light with the scorer picked out. Sticks point at the puck when it is close; turned off, each skater shows a short heading tick. Each club's coaching card sits above its bench: seven systems and an aggression dial that you can change mid-game, taking effect on the next play. Hover any choice for what it does. The dial sets how hard the team plays on and with the puck: higher means checkers go after the carrier harder, with more takeaways and more penalties, skaters shoot more from ordinary spots, and the carrier holds the puck a beat longer looking for a play. It does not change the forecheck, gap control or line changes; those come from the systems. Rosters: who is on the ice, time on ice and current shift, goals and blocks, with each player's real stat line on hover. Advanced holds the reality check, the engine settings (multipliers for acceleration, speed, effort, passing, puck glide, goalie coverage and shot volume, with a tick at the value calibrated to real tracking data), and the list of data sources. Settings can be saved in your browser, exported to share, or made the defaults for everyone. The version number is at the bottom of the page.
What it is not
It is not a replay of real games. Player movement is a decision model, tuned against public aggregates, not tracking data, so the engine can be systematically wrong in ways the calibration table will show. Ratings reflect one season of results and a weak defensive proxy, and systems are drawn from coaching references, not from either club's actual playbook. Everything that drives it, from rosters to formation coordinates to the speed of a rimmed puck, is kept as plain data with its sources, so any of it can be questioned and corrected without touching the engine.
Where this could go
The architecture is built so that each of those gaps can be closed with better data, which is what makes it interesting beyond a toy. NHL clubs have access to puck-and-player tracking at roughly 60 frames per second for every game. Fed those frames, the same rink would replay a real game exactly as it happened, and the decision model could be scored against what the players actually did in the same situations, shift by shift. That validation is the step that would let a staff trust the model. From there the useful tools follow: a player-specific view that replays his shifts with the alternatives the model would have taken at each read (the pass he had, the lane he did not take, the change that came a beat late); a pre-scout mode that loads an opponent's observed systems and tendencies and lets a coach test breakouts and entries against them before the game; a special-teams lab for power-play shapes against a specific kill; and a development tool that shows a young player the difference between his reads and a veteran's in identical spots. Shot-location data, which is public, would tighten the expected-goal model and give each shooter his real map, and line data would let the engine score its combinations against the real results of those same combinations. None of that requires a different engine; it requires feeding this one real frames.