RW · Saskatoon Blades · WHL
2022-23 regular season 56 GP · 9 G · 14 A · 23 P · 0.41 P/GP · +6 +/-
Born 2003-11-24 · Flin Flon, MB · 6'02" · 205 lb · Shoots R
| Season | Team | GP | G | A | P |
|---|---|---|---|---|---|
| 2019-20 | Vancouver Giants | 49 | 1 | 5 | 6 |
| 2020-21 | Vancouver Giants | 21 | 3 | 5 | 8 |
| 2021-22 | Vancouver Giants | 50 | 8 | 8 | 16 |
| 2022-23 | Saskatoon Blades | 56 | 9 | 14 | 23 |
His card, with percentiles, comparable seasons, shot map, splits and game log, is built on this page.
Search a name above, or open one from Season Stats or Percentiles.
Each club files its lines with the league before the game, usually a few hours before puck drop. They show up here as soon as the league posts them; today's list checks again every few minutes. Open a game to see its lines, with each player's details and his season so far; a name takes you to his card. Times are Eastern.
Choose a player on each side above. Each side has its own league, so the two can come from different leagues.
Player cards, percentiles and stats for the three leagues of the Canadian Hockey League: the QMJHL, the OHL and the WHL.
CHL Cards turns each player's season into a card: his numbers, and where each one ranks among the players at his position in his league that year. Around the cards are the tables and tools to find and compare players.
| QMJHL | OHL | WHL | |
|---|---|---|---|
| Season totals from | 1969-70 | 1997-98 | 1996-97 |
| Cards and percentiles from | 2005-06 | 2005-06 | 2005-06 |
| Game logs and splits from | 2025-26 | 2025-26 | 2025-26 |
| Expected goals and shot maps from | 2025-26 | 2025-26 | Not recorded |
The WHL does not record where shots are taken, so it has no expected goals and no shot maps. A stat a league did not keep in a given season is left out for that season, never shown as zero.
The numbers are updated every night, and on game nights within about fifteen minutes of a final score.
Statistics come from the leagues' own public HockeyTech / LeagueStat feed, the same one behind the leagues' websites. Lines come from the lineup sheets the clubs file with their league before each game. NHL draft picks come from the NHL's own records.
What the site adds is worked out from those numbers:
Every stat on the site, and how it is worked out, is in the stat glossary.
CHL Cards is built and run by one person, as an independent project. It is not affiliated with, endorsed by, or connected to the Canadian Hockey League, the QMJHL, the OHL, the WHL, or any of their clubs. All team names, logos and player likenesses belong to their owners.
There are no accounts and no cookies. Visits are counted without identifying anyone: which page was opened, not who opened it.
Write to info@chlcards.com with a question, an idea or a correction.
The site is also on X as @CHLCards, where new cards and lines are posted.
If a number looks wrong, say which player and season and what you expected. Leagues change a scorer or an assist after a game more often than you would think, and the site follows them the night after.
Every number on the site: what it tells you, how it is worked out, and where you'll find it.
Three ideas sit under almost every number on the site.
Where a player-season ranks among comparable ones, from 0 to 100. 90 means he's ahead of 90% of them.
How: within the same league, season, competition (regular season or playoffs) and position group (forwards, defencemen or goalies), among players who cleared the games-played floor: (players below him + half of those tied) ÷ players ranked. Stats where lower is better (GAA, PIM/GP, shots per goal, on-ice goals against) are flipped. A true zero on a counting stat is the 0th. The card's bars round to 1–99, apart from that zero.
PercentilesCardChartsTrajectoryCompare
The minimum games to be ranked, so ten minutes of hockey can't top a list.
How: for the season in progress, half of his club's games so far, rounded up, and never more than 30: 4 games once his club has played 7, 10 once it has played 20, 30 from its 60th game on. Finished seasons use 10 games, and playoffs 3. The same for skaters and goalies. A player under it still has his numbers on his card, without percentiles or comparable seasons.
Early in a season the floor is only a few games, so percentiles swing from night to night, and a player who sits out while his club plays can drop under it until he catches up.
Rates are per game played, never per 60 minutes: the leagues don't publish skaters' ice time. A goalie's workload rates are per 60 minutes, because his minutes are recorded.
Regular season and playoffs are separate everywhere: separate totals, separate rankings. A playoff percentile comes from a short sample and moves a lot.
Games he dressed for. From box scores from 2025-26, the league's season line before that.
Everywhere
His age on the last day of the season, whole years. Blank when the league has no birthdate (common before 1990).
Where a season sits against his first NHL draft. DY is the season that ends in the year he's first eligible, DY-1 the one before, DY+1 the one after.
How: first eligible draft = the year he turns 18 if born on or before 15 September, otherwise the next year.
Season StatsPercentiles filterCardLines
The year, round and pick he was taken in his league's draft, "Import draft" for the CHL import draft, or "Undrafted" when the league signed or listed him without a pick.
CardSeason Stats and Percentiles filter
His NHL pick (year, round, pick, club), from the NHL's own results where they can be matched to him, the league feed otherwise. "NHL rights" names the club holding them after a trade, and shows on current players only.
CardLines (club logo)
From the league's player record. A season is ranked at the position he was listed at that season, so a defenceman who later moved up front stays a defenceman for those years.
The league's official counts. P = G + A.
Season StatsCardGame log
A1 is the last pass before the goal; A2 is the one before that. Primary assists say more about who created the goal.
How: A1 from each box score's list of goals, which names the first and second assister. A2 = assists − A1, so the two always add up to his assists. From 2025-26.
Season StatsSeason by seasonGame log
Points ÷ games played. The main production number.
PercentilesCard
Goals ÷ GP and assists ÷ GP.
Primary assists ÷ GP. The only assist split with a percentile. From 2025-26.
Goals plus primary assists: points without the second assist, which says the least about who made the goal happen. A cleaner read of a player's own production than total points.
How: P1 = G + A1. Season Stats, the season-by-season table and the game log show the total; Percentiles and cards rank it per game (P1/GP), in all situations and at 5v5, on the power play and on the penalty kill. From 2025-26, in all three leagues.
Season StatsPercentilesCardSeason by seasonGame log
(Points − power-play points − short-handed points) ÷ GP. "Even strength" here is anything but PP and SH, so it includes 4-on-4 and empty nets; the strict 5v5 version is in the Situation menu. On the charts it is written EVP/GP.
The goal that put his team one ahead of the other side's final score. A season count.
Goals scored in overtime (shootout goals don't count). A season count.
The leagues record shots on goal only, never missed or blocked shots, so every shot number here is shots on goal.
Shots that reached the goalie or went in.
Goals ÷ shots × 100. Highly streaky over one season.
Shots ÷ GP. How much he gets the puck to the net.
Shots ÷ goals; lower is better. Only for players with a goal.
How many goals his shots would produce for an average shooter. It rates the chances he gets, apart from how he finishes them.
How: each shot on goal gets a chance of scoring from a model fitted on the league's own shots: distance, angle, behind the net, a rebound (within 3 s), off a faceoff (within 4 s), the manpower on the ice, and shots recorded from his own zone. xG is the sum. Empty-net shots are left out. QMJHL and OHL from 2025-26; the WHL records no shot locations.
Season StatsPercentiles (xG/GP)Card
Finishing. Above zero, he scored more than his chances were worth.
How: goals on his located shots − xG of those shots. Leaves out empty-net goals, so it won't equal G − xG for everyone.
His shots on goal sorted into high-, medium- and low-danger chances. High-danger chances are rare and go in about one time in four; low-danger ones are about half of all shots and go in 3 to 4% of the time.
How: by each shot's expected-goal value: high is 20% or better, medium 8 to 20%, low under 8%. Season Stats shows the totals; Percentiles and cards rank them per game (HDSC/GP and so on). These are all shots on goal, so a low-danger "chance" is often a long shot that reached the goalie. QMJHL and OHL from 2025-26; empty nets left out.
Season StatsPercentilesCard
How often he scores on chances of each kind: finishing, with the quality of the chance held roughly equal.
How: goals ÷ chances at that level × 100. To be ranked he needs a minimum number of chances; below it the card leaves the row off. Over a full season that is 10 high-danger chances, or 20 medium or low. During the season in progress the minimum grows with the games his club has played, reaching the full number at 34 club games: after 8 games it is 3 high-danger chances, or 5 medium or low. Early-season rates rest on a handful of shots and move a lot. Season Stats shows the raw rate for everyone.
Season StatsPercentilesCard
Scored while his team had more skaters because of a penalty, as the league flags the goal.
Season StatsPercentiles (PPG/GP, PPP/GP)
Which power-play unit he is on, without ice time: of his club's power-play goals in the games he played, the share he was on the ice for. A first-unit regular is at 80 to 90%. A player who never sees the power play is at 0.
How: his on-ice power-play goals for ÷ his club's power-play goals in his games × 100. Ranked once the club has 10 such goals; in the season in progress that minimum climbs with the club's games played (3 goals at 8 games, the full 10 from 34). It counts goals, not minutes, so a second unit that rarely scores reads smaller than its ice time. QMJHL and OHL, from 2025-26.
Season StatsPercentilesCardPower-play card
Scored while his team was short a skater.
Season StatsPercentiles (SHG/GP, SHP/GP)
Every goal lists the skaters on the ice for both teams, so the site knows who was out there, not just who scored. Goals only: shots don't say who was on the ice. From 2025-26, QMJHL and OHL. The WHL's feed leaves power-play goals off those lists, so it has none of these.
Goals his team scored, and allowed, with him on the ice.
How: at 5v5 in the all-situations tables; with a situation picked, that situation's own. A power-play goal against him is counted on his penalty kill.
Season StatsPercentiles (OGF/GP, OGA/GP)
Plus/minus done properly: of the 5v5 goals with him on the ice, the share his team scored. 50% is even.
How: GF ÷ (GF + GA) × 100, at 5v5. Ranked from 10 on-ice goals.
Whether his team does better with him on the ice than without him. Separates a player driving results from one riding a good team.
How: his GF% − his team's GF% with him off the ice, in the games he played, at 5v5. Ranked from 10 on-ice goals. Shown on the card in place of plus/minus when he has it.
Season StatsPercentiles (RELGF%)Card
Of the goals scored with him on the ice, the share he had a point on. High: he's in on the scoring. Low: he's along for the ride.
How: his points on those goals ÷ GF × 100. At 5v5 in all situations. Ranked from 10 on-ice goals for.
The league's plus/minus: +1 when he's on the ice for an even-strength or short-handed goal for, −1 for one against. Power-play goals don't count. Empty nets do.
Season StatsCard stat linePercentiles (PM/GP)
Plus/minus ÷ GP.
Body checks credited by the scorer. QMJHL only, from 2003-04: the OHL and WHL have never recorded hits.
Minutes assessed. PIM/GP is ranked lower-is-better.
Faceoffs won ÷ faceoffs taken × 100. Ranked for centres with 100 or more faceoffs.
Decisions as the league credits them. OTL counts overtime and shootout losses. WIN% = wins ÷ GP × 100; SO/GP = shutouts ÷ GP.
Shots on goal he faced, the ones he stopped, the ones that went in.
Saves ÷ shots against, shown as .912.
Goals against × 60 ÷ minutes played. Lower is better.
How many goals he saved beyond what an average goalie would have, given the quality of the shots he faced.
How: xG of the shots he faced − goals he allowed on them. Empty nets left out. QMJHL and OHL from 2025-26.
GSAX on a per-game scale, so a starter and a backup can be compared. The total grows with how much a goalie plays; this doesn't.
How: GSAX ÷ games played. It is the version on the card's radar; the total stays in the card's bars.
PercentilesCard radar
The shots he faced, sorted into high-, medium- and low-danger by the same cut-offs as skaters' scoring chances.
How: by each shot's expected-goal value: high is 20% or better, medium 8 to 20%, low under 8%. Totals on Season Stats, per game on Percentiles and cards. QMJHL and OHL from 2025-26.
Season StatsPercentilesCard
His save percentage on each kind of shot. High-danger save % separates goalies more than the overall number, which is dominated by easy saves.
How: saves ÷ shots at that level. To be ranked over a full season he needs 30 high-danger shots, or 50 medium or low. During the season in progress that minimum grows with his club's games in the same way as for skaters: after 8 games it is 8 high-danger shots, or 12 medium or low. Season Stats shows the raw rate for everyone.
Season StatsPercentilesCard
How much he plays, and how busy he is when he does. MIN is his minutes in net; SA/60 and SV/60 are the shots he faced and stopped for every 60 of them; MIN/GP is minutes per game played.
The Situation menu splits a player's numbers by game state. From 2025-26, the seasons read game by game. Games played stays all his games, since there is no ice time by situation.
Everything, the way the league counts it.
Strictly five skaters a side with both goalies in. Not 4-on-4, not 3-on-3 overtime, not an empty net or an extra attacker.
More, or fewer, skaters than the other side because of a penalty. A goalie's situation is his team's: a power-play shot against him is his penalty kill.
Goals: exact. Power play and short-handed come from the league's flag on the goal; 5v5 from the five-a-side on-ice lists. Shots: worked out from the penalties being served, with regular-season overtime as 3-on-3. A shot taken with the goalie pulled for an extra attacker can't be spotted and counts as 5v5 (about 2% of shots).
A split is one slice of a season: where the game was played, the month, the opponent, or the period. On Season Stats it is the Split menu; on a profile it is the Splits box, between the season table and the game log. From 2025-26, in all three leagues.
His games at home, or on the road. Games played is the games in that slice, and every counting stat comes with it.
The games played in one calendar month. The quickest way to see a hot stretch or a slump.
His games against one club.
What he did in each period, with every period after the third counted as overtime. Unlike the other three it is a part of every game, so games played stays all his games on Season Stats and is a dash in the profile box.
How: goals and assists from the play-by-play, which matches the box score point for point. Shots, shooting % and xG by period come from the located shots, so the QMJHL and OHL only. Plus/minus, penalty minutes, game-winners, hits and faceoffs are not recorded by period and show a dash.
One split at a time, and not together with a situation: choosing one sets the other back to all. The on-ice stats and PP share are left out of splits. A career view adds up the seasons that have game data. Goalies have every split except by period in the WHL, which records no shot locations.
Season StatsPlayer profile
The four seasons most like this one, from the same league, position group and draft-year class, in the same season or earlier.
How: similarity = 100 − the weighted average gap between the two seasons' percentiles. Scoring rates weigh most, physical play least. xG, A1 and the on-ice stats are not part of it.
On a trajectory, the median percentile of players in the same draft-year class that season, for comparison with his own line.
Percentiles ranks each axis 0–100. Per game plots the stat itself. Totals multiplies a per-game stat by games played; rates and shares (SH%, SV%) stay as they are.
Up to three player-seasons on the same percentile spokes. Each spoke is a percentile, so the shape shows strengths at a glance.
Every shot on goal of a player's season on a half rink, under his card on Player Profiles. It is drawn from behind the shooter with the net at the top, so his left is the left of the drawing. A goalie's map shows the shots he faced.
How: one dot per shot on goal, filled for a goal, larger for a better chance (its expected-goal value). Shots taken from past centre sit on a strip under the red line. Empty-net goals are left out. Only shots on goal exist: no league records misses or blocks. The filters (situation, danger, result, opponent, goalie) redraw the map, the totals and the by-danger table; the radar beside it shows his season percentiles and does not follow the filters. Hover or tap a dot for that shot's details. QMJHL and OHL from 2025-26; the WHL records no shot locations.
Player Profiles
In Season Stats, every season a player played added together. Rates and shares are worked out from the summed counts, not averaged. Stats that start in 2025-26 cover only those seasons.
Read from the lineup sheets clubs file with the league before each game: forward lines, defence pairs, starting and backup goalie.
Shooting (or catching) hand · draft year · birth month (YYYY-MM) · height · weight, from the club's roster. The logo in the corner is the NHL club holding his rights.
His season so far, as of the last update: GP · G · A · P for skaters, GP · SV% · GAA for goalies.
A stat a league never recorded is absent, never shown as zero.
| Stat | QMJHL | OHL | WHL |
|---|---|---|---|
| Goals, assists, points, PIM, power play | 1969-70 on | 1997-98 on | 1996-97 on |
| Shots on goal | 1998-99 on | 2015-16 on | 2014-15 on |
| Hits | 2003-04 on | never | never |
| Percentiles, cards, charts | 2005-06 on | 2005-06 on | 2005-06 on |
| Game logs, A1 / A2, situations, splits | 2025-26 on | 2025-26 on | 2025-26 on |
| xG, GAX, GSAX | 2025-26 on | 2025-26 on | no shot locations |
| On-ice GF, GA, GF%, IPP, PP share | 2025-26 on | 2025-26 on | incomplete, not shown |
No stat matches that search.
What has been added to CHL Cards, newest first. Each addition is also posted on X by @CHLCards.