PITCHPRINT

Method

This is the trust page. Everything you see on a card — its rarity class, its “1 in X” combo odds, its entropy score — is arithmetic you can reproduce by hand. Nothing here is a vibe.

A card is a composite

Every card draws one value from each of 8 independent layers. The three optional layers can also come up empty — and “empty” is itself a weighted outcome, which is exactly what makes a missing layer a rarity signal.

Basecore
Fair
18%
Fair
18%
Tan
18%
Tan
18%
Deep
14%
Deep
14%
Haircore
Buzz
18%
Crop
16%
Fade
14%
Afro
12%
Long
12%
Topknot
10%
Curls
10%
Blond
8%
Facialcore
Clean
35%
Stubble
20%
Beard
15%
Mustache
12%
Goatee
10%
Face Paint
8%
Kitcore
Home
24%
Away
22%
Third
18%
Retro
12%
Goalkeeper
8%
Cup Special
6%
Sable
5%
Tribute
5%
Backdropcore
Night Match
22%
Floodlights
20%
Tunnel
14%
Fog
13%
Pyro
11%
Dawn
9%
City Skyline
7%
Aurora
4%
Extrasoptional
Captain's Armband
6%
Goalkeeper Gloves
5%
Headband
4%
Shirt Lift
3%
Rainbow Laces
2%
missing
80%
Club Markoptional
Standard Crest
15%
Legacy Crest
7%
Gilt Crest
3%
missing
75%
Foiloptional
Holo Foil
6%
Gold Foil
3%
Prism Foil
0.8%
Void Foil
0.4%
missing
90%

Rarity class

Class looks only at the optional layers. It is permanent — it never changes as more cards get revealed. Core layers (skin, hair, facial, kit, backdrop) do not move the class.

FoilPointsClub markPoints
void6gilt3
prism5legacy2
gold4standard1
holo2missing0
missing0
score = foil + (extras present ? 2 : 0) + clubMark
TOP1 — score ≥ 7
TOP3 — score ≥ 5
TOP10 — score ≥ 2
COMMON — otherwise

Combo odds

Each layer is independent and uniform, so the probability of an exact combination is a plain product — not a sample, no black box:

P(combo) = ∏ p(layer value) across all 8 layers
comboOdds = 1 / P(combo)

“1 in X” is the theoretical number of cards you'd have to pull to expect this exact layer set again. Because it multiplies every layer, even a “common” card is a genuinely specific object — the class badge and the combo odds are measuring two different things.

Entropy score

The open-rarity number is the information content of the combo, normalized to 0–1 across the print run:

surprisal = −log₁₀ P(combo)
openRarity = (surprisal − min) / (max − min)

What is real, what is not

  • Synthetic data. The set is 500 fictional cards in a fictional league (1990–2026), generated from a seeded PRNG (seed 20260914) so the whole run is deterministic and reproducible. No real players, no real career stats.
  • The rarity math is real. The probabilities, class thresholds and combo-odds formula above are exactly what the app computes — you can verify any card by hand from its layer breakdown.
  • Appearances and goals are a judgement, not a measurement: they are sampled to feel plausible for each position (forwards score, keepers don't), and the “overall” rating is a derived flavour number, not a claim about ability.
  • On-chain later. v1 is local mock data. The reveal state lives in your browser; nothing is minted yet. When cards move on-chain, the trait table and rarity formula are the contract — they don't change.