Criclysis
Cricket analytics for every men's and women's international team, built only
from open ball-by-ball data.
Criclysis turns Cricsheet's public ball-by-ball
records into team records, player strengths and weaknesses measured against
comparable players, and replays of real matches with a validated
win-probability model. A GitHub Action rebuilds everything from Cricsheet
every day, so new internationals appear within about a day. "Live" here means
that daily refresh plus a replay engine; there is no live-score API, no API
key and no paid service.
Live site: criclysis.vercel.app
As of the 9 Nov 2026 build (refreshed daily): 10,009 matches, 5,329
player profiles, 201 teams and 382 venues, with data through
2 Nov 2026.
Screenshots
Taken from the live site on 9 Nov 2026, on the full dataset (data through
2 Nov 2026). The numbers on the site move as the daily refresh adds matches.
| |
|---|
| |
| Home | Player profile |
| |
| Replay with projection, par and matchup | Method page |
| |
| Team page, dark mode | Replay on a phone, dark mode |
What it does
1. Match and team analysis for every international side
Men's and women's Tests, ODIs and T20Is, including associate nations.
- Coverage (9 Nov 2026 build): 899 men's Tests, 2,617 men's ODIs, 3,649
men's T20Is, 24 women's Tests, 620 women's ODIs and 2,200 women's T20Is.
That is 4,810,633 deliveries in total. The full table is in
docs/DATA_SOURCES.md.
- Team pages: results overall, at home, away and at neutral venues;
batting first and chasing; the toss; scoring by phase; venues; and
head-to-head pages for any two teams.
- Every match has a scorecard page.
2. Player analysis
5,329 players have a profile: everyone who has faced 60 balls, or bowled 240
balls or taken 5 wickets, in at least one format.
- Strengths and weaknesses are judged against a cohort of comparable
players in the same format and gender: batters with at least 600 balls
faced, or bowlers with at least 900 balls bowled.
- A split becomes a claim only if it has at least 150 balls (240 for
bowling) and at least 8 comparable players, differs from the player's own
overall figure by at least 4%, and ranks at or above the 70th percentile of
the cohort (a strength) or at or below the 30th (a weakness). Small samples
are first shrunk toward the player's own overall figure.
- Matchups by bowling type (ten types, from right-arm fast to left-arm
wrist spin), by pace or spin and by phase of the innings; for bowlers, also
by the batter's hand. Bowling styles are known for 5,650 players.
- Form: the last 10 innings with the bat and with the ball, next to the
career figures.
- Compare puts two players side by side; Strategy builds a scouting
plan from a player's claims.
3. "Live" without an API
- Daily refresh. At 04:23 UTC a GitHub Action downloads Cricsheet's
archives, rebuilds the dataset, checks it and imports it. If Cricsheet's
files haven't changed, the build and import are skipped.
- Replay engine. Every one of the 10,009 matches can be replayed ball by
ball (21.8 MB of gzipped replays; 30 featured, such as World Cup finals).
At each ball the replay shows:
- win probability for ODIs and T20Is, from four models (men's and
women's ODI and T20I) validated on matches from 2023 on, which they never
saw;
- projected score with an 80% range, and par, adjusted for the
ground;
- matchup cards: the batter's record against the current bowler's type
and against that bowler.
How the models work, and how well: docs/WINPROB.md.
4. A clean, accessible, responsive UI
- One design system: teal accents on neutral surfaces.
- Dark mode follows the system setting, with a toggle that doesn't flash on
load.
- A Men/Women switch kept in the URL (
?gender=women), so a filtered view can
be shared.
- Pages work from 360 pixels wide.
- An automated axe check against WCAG 2.1 AA (the web accessibility standard)
found no violations.
- Every chart has a "View as table" fallback. Every page has loading, empty
and error states, and unknown ids return a real HTTP 404.
- A Method page (
/method) explains the data, the thresholds and each
win model's validation, read from the database rather than typed in.
How it works
flowchart LR
A["Cricsheet<br/>ball-by-ball JSON<br/>(CC BY 4.0)"] -->|"daily, 04:23 UTC"| B
subgraph B["GitHub Actions: daily refresh"]
direction TB
B1["Python pipeline (standard library only):<br/>fetch and build"] --> B2["Fit the four<br/>win-probability models"]
B2 --> B3["Export replays"]
B3 --> B4["Replay checks (Python + TypeScript)<br/>and golden parity test"]
end
B -->|"importer: lock,<br/>hash-guarded upserts, guards"| C[("Neon Postgres")]
C -->|"reads"| D["Next.js on Vercel"]
B -.->|"POST /api/revalidate"| D
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗