Classic model
2026 · through week 10 · the resume-points model this site used before the two-layer model. Kept for comparison; nothing else on the site reads it. “Main #” is the team’s rank on the main ranking.
| # | Team | Rating | Record | Main # | Main vs classic |
|---|---|---|---|---|---|
| 01 | 273.6 | 8-1 | 6 | ▼5 | |
| 02 | 272.1 | 7-2 | 15 | ▼13 | |
| 03 | 259.9 | 7-2 | 1 | ▲2 | |
| 04 | 252.9 | 9-0 | 3 | ▲1 | |
| 05 | 250.0 | 7-2 | 8 | ▼3 | |
| 06 | 237.2 | 8-1 | 4 | ▲2 | |
| 07 | 234.3 | 9-0 | 2 | ▲5 | |
| 08 | 216.5 | 8-1 | 5 | ▲3 | |
| 09 | 199.7 | 7-2 | 7 | ▲2 | |
| 10 | 193.9 | 7-2 | 11 | ▼1 | |
| 11 | 180.7 | 8-1 | 10 | ▲1 | |
| 12 | 179.9 | 8-1 | 21 | ▼9 | |
| 13 | 178.5 | 6-3 | 17 | ▼4 | |
| 14 | 181.2 | 6-3 | 24 | ▼10 | |
| 15 | 173.6 | 8-1 | 12 | ▲3 | |
| 16 | 173.2 | 6-3 | 13 | ▲3 | |
| 17 | 188.9 | 8-1 | 14 | ▲3 | |
| 18 | 169.8 | 6-3 | 26 | ▼8 | |
| 19 | 169.6 | 7-2 | 18 | ▲1 | |
| 20 | 181.7 | 6-3 | 22 | ▼2 | |
| 21 | 187.2 | 8-1 | 9 | ▲12 | |
| 22 | 162.8 | 8-1 | 20 | ▲2 | |
| 23 | 157.7 | 7-2 | 16 | ▲7 | |
| 24 | 153.5 | 7-2 | 23 | ▲1 | |
| 25 | 152.3 | 7-2 | 36 | ▼11 |
Ranks 26+
| # | Team | Rating | Record | Main # | Main vs classic |
|---|---|---|---|---|---|
| 26 | 152.2 | 7-2 | 19 | ▲7 | |
| 27 | 144.9 | 5-4 | 32 | ▼5 | |
| 28 | 142.5 | 5-4 | 34 | ▼6 | |
| 29 | 138.6 | 5-4 | 35 | ▼6 | |
| 30 | 131.5 | 6-3 | 25 | ▲5 | |
| 31 | 127.3 | 7-2 | 28 | ▲3 | |
| 32 | 126.1 | 8-2 | 39 | ▼7 | |
| 33 | 119.2 | 6-3 | 42 | ▼9 | |
| 34 | 117.3 | 7-2 | 47 | ▼13 | |
| 35 | 117.0 | 7-2 | 37 | ▼2 | |
| 36 | 116.9 | 7-2 | 29 | ▲7 | |
| 37 | 115.5 | 6-3 | 45 | ▼8 | |
| 38 | 117.5 | 7-2 | 31 | ▲7 | |
| 39 | 114.4 | 6-3 | 33 | ▲6 | |
| 40 | 113.3 | 7-2 | 41 | ▼1 | |
| 41 | 108.5 | 7-2 | 43 | ▼2 | |
| 42 | 104.7 | 7-2 | 27 | ▲15 | |
| 43 | 100.5 | 6-3 | 30 | ▲13 | |
| 44 | 96.6 | 7-2 | 49 | ▼5 | |
| 45 | 93.6 | 6-3 | 62 | ▼17 | |
| 46 | 90.8 | 7-2 | 46 | = | |
| 47 | 86.9 | 6-3 | 38 | ▲9 | |
| 48 | 83.8 | 6-3 | 50 | ▼2 | |
| 49 | 79.0 | 5-4 | 58 | ▼9 | |
| 50 | 78.4 | 5-4 | 44 | ▲6 | |
| 51 | 79.8 | 6-3 | 48 | ▲3 | |
| 52 | 67.6 | 6-3 | 65 | ▼13 | |
| 53 | 67.6 | 4-5 | 70 | ▼17 | |
| 54 | 67.6 | 5-4 | 77 | ▼23 | |
| 55 | 67.6 | 3-6 | 90 | ▼35 | |
| 56 | 67.6 | 5-4 | 71 | ▼15 | |
| 57 | 67.6 | 4-5 | 64 | ▼7 | |
| 58 | 67.6 | 4-5 | 72 | ▼14 | |
| 59 | 67.6 | 4-5 | 63 | ▼4 | |
| 60 | 67.6 | 5-4 | 78 | ▼18 | |
| 61 | 67.6 | 5-4 | 69 | ▼8 | |
| 62 | 67.6 | 3-6 | 85 | ▼23 | |
| 63 | 67.6 | 4-5 | 80 | ▼17 | |
| 64 | 67.6 | 5-4 | 73 | ▼9 | |
| 65 | 67.6 | 4-5 | 52 | ▲13 | |
| 66 | 67.6 | 5-4 | 53 | ▲13 | |
| 67 | 67.6 | 5-4 | 66 | ▲1 | |
| 68 | 82.7 | 6-3 | 59 | ▲9 | |
| 69 | 67.6 | 5-4 | 67 | ▲2 | |
| 70 | 67.6 | 5-4 | 68 | ▲2 | |
| 71 | 67.6 | 5-4 | 79 | ▼8 | |
| 72 | 67.6 | 4-5 | 84 | ▼12 | |
| 73 | 67.6 | 5-4 | 75 | ▼2 | |
| 74 | 67.6 | 5-4 | 76 | ▼2 | |
| 75 | 67.6 | 3-6 | 117 | ▼42 | |
| 76 | 67.6 | 4-5 | 91 | ▼15 | |
| 77 | 67.6 | 5-4 | 74 | ▲3 | |
| 78 | 67.6 | 6-3 | 55 | ▲23 | |
| 79 | 67.6 | 3-6 | 112 | ▼33 | |
| 80 | 67.6 | 5-4 | 81 | ▼1 | |
| 81 | 83.0 | 6-3 | 40 | ▲41 | |
| 82 | 67.6 | 5-4 | 51 | ▲31 | |
| 83 | 67.6 | 3-6 | 97 | ▼14 | |
| 84 | 67.6 | 1-8 | 130 | ▼46 | |
| 85 | 67.6 | 5-4 | 56 | ▲29 | |
| 86 | 70.4 | 5-4 | 57 | ▲29 | |
| 87 | 67.6 | 4-5 | 88 | ▼1 | |
| 88 | 67.6 | 4-5 | 99 | ▼11 | |
| 89 | 67.6 | 4-5 | 103 | ▼14 | |
| 90 | 67.6 | 1-8 | 132 | ▼42 | |
| 91 | 67.6 | 4-5 | 82 | ▲9 | |
| 92 | 67.6 | 3-6 | 109 | ▼17 | |
| 93 | 67.6 | 4-5 | 104 | ▼11 | |
| 94 | 67.6 | 4-5 | 106 | ▼12 | |
| 95 | 67.6 | 2-7 | 131 | ▼36 | |
| 96 | 67.6 | 4-5 | 107 | ▼11 | |
| 97 | 67.6 | 3-6 | 118 | ▼21 | |
| 98 | 67.6 | 5-4 | 94 | ▲4 | |
| 99 | 67.6 | 4-5 | 111 | ▼12 | |
| 100 | 67.6 | 4-5 | 102 | ▼2 | |
| 101 | 67.6 | 6-3 | 60 | ▲41 | |
| 102 | 67.6 | 5-4 | 100 | ▲2 | |
| 103 | 67.6 | 3-6 | 115 | ▼12 | |
| 104 | 67.6 | 2-7 | 129 | ▼25 | |
| 105 | 67.6 | 5-4 | 92 | ▲13 | |
| 106 | 67.6 | 4-5 | 96 | ▲10 | |
| 107 | 67.6 | 6-3 | 61 | ▲46 | |
| 108 | 67.6 | 5-4 | 83 | ▲25 | |
| 109 | 67.6 | 3-6 | 108 | ▲1 | |
| 110 | 74.9 | 6-3 | 54 | ▲56 | |
| 111 | 67.6 | 4-5 | 95 | ▲16 | |
| 112 | 67.6 | 2-7 | 125 | ▼13 | |
| 113 | 67.6 | 2-7 | 123 | ▼10 | |
| 114 | 67.6 | 3-6 | 101 | ▲13 | |
| 115 | 67.6 | 4-5 | 89 | ▲26 | |
| 116 | 67.6 | 4-5 | 110 | ▲6 | |
| 117 | 67.6 | 3-7 | 127 | ▼10 | |
| 118 | 67.6 | 5-4 | 87 | ▲31 | |
| 119 | 67.6 | 3-6 | 120 | ▼1 | |
| 120 | 67.6 | 5-4 | 86 | ▲34 | |
| 121 | 67.6 | 1-8 | 134 | ▼13 | |
| 122 | 67.6 | 2-7 | 128 | ▼6 | |
| 123 | 67.6 | 3-6 | 113 | ▲10 | |
| 124 | 67.6 | 5-5 | 105 | ▲19 | |
| 125 | 67.6 | 3-6 | 126 | ▼1 | |
| 126 | 67.6 | 3-6 | 119 | ▲7 | |
| 127 | 67.6 | 3-6 | 116 | ▲11 | |
| 128 | 67.6 | 4-6 | 121 | ▲7 | |
| 129 | 67.6 | 2-8 | 137 | ▼8 | |
| 130 | 67.6 | 3-6 | 114 | ▲16 | |
| 131 | 67.6 | 1-8 | 136 | ▼5 | |
| 132 | 67.6 | 0-9 | 138 | ▼6 | |
| 133 | 67.6 | 3-6 | 93 | ▲40 | |
| 134 | 67.6 | 3-6 | 122 | ▲12 | |
| 135 | 67.6 | 1-8 | 133 | ▲2 | |
| 136 | 67.6 | 4-5 | 98 | ▲38 | |
| 137 | 67.6 | 1-8 | 135 | ▲2 | |
| 138 | 67.6 | 3-6 | 124 | ▲14 |
How the classic model works
How a rating is actually computed, end to end — every number below is read live from the code, not typed in twice.
Every FBS team starts a season at a base rating of 100.0
(FBS_BASE_RATING) with zero preseason opinion attached: no
name recognition, no prior-year carryover. Each completed game then adds a
resume value for a win or subtracts a penalty for a loss, depending on
exactly one thing — the opponent's actual current rank — read off a
piecewise-linear curve rather than hard tiers. A win over the team ranked
#10 and a win over #11 are worth nearly the same amount, not drastically
different ones; that continuity is also what lets the system iterate to a
stable answer without a special-case “tier lock” step (see
Iteration below).
Win value / loss penalty anchors
Win value and loss penalty are each defined by a short table of
(opponent rank, value) anchor pairs. Between two anchors the
value is linear in rank; above or below the anchor range, it clamps to the
nearest anchor's value.
| Opponent rank | Win value |
|---|---|
| 1 | 50.0 |
| 5 | 50.0 |
| 10 | 35.0 |
| 15 | 20.0 |
| 25 | 20.0 |
| 50 | 10.0 |
| 100 | 5.0 |
| Opponent rank | Loss penalty |
|---|---|
| 1 | 12.0 |
| 10 | 12.0 |
| 15 | 15.0 |
| 25 | 19.0 |
| 50 | 30.0 |
| 100 | 45.0 |
Interpolated between those anchors with the same
interpolate_anchors function the ranking engine calls, here is
what beating or losing to a team at a given rank is worth right now:
| Opponent rank | Win value | Loss penalty |
|---|---|---|
| 1 | 50.0 | 12.0 |
| 5 | 50.0 | 12.0 |
| 8 | 41.0 | 12.0 |
| 10 | 35.0 | 12.0 |
| 15 | 20.0 | 15.0 |
| 25 | 20.0 | 19.0 |
| 40 | 14.0 | 25.6 |
| 50 | 10.0 | 30.0 |
| 75 | 7.5 | 37.5 |
| 100 | 5.0 | 45.0 |
| 120 | 5.0 | 45.0 |
FCS opponents
FCS opponents skip interpolation entirely: beating one is worth a flat 2.5 points — below the value of even the weakest FBS win — and losing to one costs a flat 50.0 points, the single worst outcome the algorithm scores, worse than any FBS loss. FCS teams themselves are seeded at a fixed base rating of 50.0 and are never ranked or iterated; they exist only as fixed-value opponents on someone else's resume.
Margin of victory
Raw win value or loss penalty is then scaled by a margin-of-victory
modifier with diminishing returns: modifier = 1 + (sqrt(adjusted_margin)
- 1) × 0.15. The adjusted margin feeding that
formula is capped at 28 points, and built like this: overtime
games are fixed at an adjusted margin of 1 regardless of the final score,
and a 3-point home-field adjustment applies to
regulation games — a home win's margin shrinks by
3, a road win's grows by the same amount, and
neutral-site games are untouched. Applied to the live rank-10 win value:
| Adjusted margin | Modifier | Beat #10 example |
|---|---|---|
| 1 | 1.00× | 35.0 |
| 7 | 1.25× | 43.6 |
| 14 | 1.41× | 49.4 |
| 21 | 1.54× | 53.8 |
| 28 | 1.64× | 57.5 |
Strength of schedule
Every team also earns or loses points from the average current rating of
everyone it has played:
sos_bonus = (average_opponent_rating - 100.0) ×
0.3. A team whose schedule averages 110.0
— 10.0 points above the base
rating — earns +3.0; a team whose schedule averages
90.0 loses -3.0.
Shrinkage
A team's first few games are a noisy sample of its true strength, so raw
resume points (game values, undefeated bonus, multiple-loss penalty, and
SOS, all summed) are scaled down by
games_played / (games_played + 6) before they
count toward the rating. Shrinkage never fully vanishes by design —
even a full 14-game regular season is trusted for
well under 100% of its raw point value:
| Games played | Shrinkage factor |
|---|---|
| 1 | 0.143 |
| 2 | 0.250 |
| 4 | 0.400 |
| 6 | 0.500 |
| 8 | 0.571 |
| 12 | 0.667 |
| 14 | 0.700 |
Multiple-loss penalty
Losses beyond a threshold cost an extra 10.0
points apiece. That threshold is itself prorated by games played
(min(2, max(1, games_played // 4)))
so a two-loss team isn't punished for it in September, before it has even
played enough games to justify the full threshold:
| Games played | Threshold |
|---|---|
| 1 | 1 |
| 4 | 1 |
| 8 | 2 |
| 9 | 2 |
| 12 | 2 |
| 13 | 2 |
| 14 | 2 |
Undefeated bonus
A team that has played at least 7 games and lost none of them earns a flat 15.0-point bonus on top of everything above. An undefeated team only a few games into the season gets nothing yet — that's intentional, since a short unbeaten streak isn't yet strong evidence of anything.
Iteration
A team's resume value depends on its opponents' ranks, which depend on
those opponents' opponents, and so on — so ratings aren't produced in a
single pass. Every FBS team starts at 100.0; FCS teams
stay fixed at 50.0. Each iteration re-ranks every FBS
team from the previous pass's ratings, recomputes every team's resume
points against that same snapshot, blends toward the newly computed target
with new_rating = old_rating × 0.75 + target ×
0.25, then rescales every FBS rating so the
league mean lands back on exactly 100.0. That repeats
until the largest single-team change falls under
0.01, or until 100 passes have run,
whichever comes first. Because the win/loss curve has no hard tiers, there
is no cliff for the iteration to oscillate across, so nothing needs
freezing along the way — ranks are recomputed fresh from live ratings on
every pass, all the way to convergence.
Head-to-head tiebreaker
Once ratings settle, the order gets one last pass: if one team beat another (won more of their meetings — an even split counts for neither), the loser ranks below the winner, as long as the loser is rated no more than 20 points higher. Beyond that gap the two resumes are too far apart for one game to overturn. Results are applied closest-gap first, and one that would close a loop (A beat B, B beat C, C beat A) is skipped, since no order can honor all three. This moves the order only — every rating, and every probability built on one, is unchanged — so a team can sit just below a winner it out-rates.
Publication policy
Rankings are computed from week 1 onward, but only published starting week 6. Before that, the shrinkage mechanism above hasn't had enough games to trust each team's resume, and too few cross-conference games have been played for opponent ranks to mean much yet — earlier weeks are still computed and shown, but marked provisional rather than treated as a real signal.