Twenty-four teams. Two conferences.
One hero that knows which is yours.
The AFL homepage hero is not a banner on a rotation. A calendar decides which phase the league is in, a casting rule decides which playerβs face belongs on it, and β because this league rosters the same NFL player in both conferences β a third rule decides whose colours the card is painted in. That last one is the hard part, and it is the reason this page exists.
LeagueCompositeHero Β· keeper window Midwestside Connection 2026 Keeper Deadline
Lock in your core.
Trophy gold is the keeper windowβs colour, and the face is your keeper cornerstone. Keepers are a team story, so the crest behind him is your clubβs and the glow is theirs β not Detroitβs.
Set your keepersLeagueCompositeHero Β· keeper deadline day The Boondock Saints Keepers due today
Last call on your keepers.
On the deadline itself β and only then β the card takes the red tone over the same gold accent, still wearing its clubβs crest. One day a year renders this.
Submit your keepersLeagueCompositeHero Β· AL draft AL Β· Draft scheduled
Build your empire.
The conferences draft on different days off different pages, so each names itself in the wordmark. A draft is a league event β navy, and the crest is the playerβs NFL club.
Open the draft roomLeagueCompositeHero Β· AL draft live AL Β· On the clock
The AL is on the clock.
A draft actually running takes the red tone. The AL drafts live and the NL by email, which MFLβs league-wide draft kind cannot express β so this state is resolved per conference.
Watch the boardLeagueCompositeHero Β· NL draft NL Β· Draft scheduled
The NL board opens Thursday.
Same treatment, its own wordmark and its own clock. An NL owner never sees the ALβs countdown and vice versa β the whole state is scoped to the conference the viewer plays in.
Open the draft roomLeagueCompositeHero Β· NL draft live NL Β· Drafting now
The NL is drafting.
The sixth and last composite state the AFL ships. Both conferences can be mid-draft on the same weekend, in which case two owners on the same homepage see two different heroes.
Watch the boardLeagueCompositeHero Β· NFL kickoff Season opener
Football is back.
Your likely starter in the first game you play in β so the face is personal even though the card is not. Everyoneβs season starts at the same whistle, so kickoff keeps the leagueβs navy.
Set your lineupLeagueCompositeHero Β· game day Smokane FC Game day
Lineups lock at kickoff.
Last call to set starters. Your lineup and your deadline, so the card wears your clubβs colours and crest rather than the leagueβs.
Set lineupLeagueCompositeHero Β· Sunday Ticket A Bruin Pegs Me Sunday Ticket
Build your multiview.
Once your lineup is in, the same slot flips to the multiview board β four boxes a window, ranked by how many of your starters are on the field. Still your team, still your colours.
Build your SundayLeagueCompositeHero Β· Tuesday recap Muck Juggling Micks Tuesday recap
The week in review.
The weekβs top scorer is cast deterministically β he IS the headline β so the card belongs to the club that rosters him, not to his NFL team.
Read the recapLeagueCompositeHero Β· feature New this week
A feature just shipped.
The only state that renders with no player at all: the entryβs own screenshot is the art, framed like a browser. A player joins it only when the entry names one.
Read the full storyLeagueCompositeHero Β· trade deadline Da Dangsters Trade Deadline
Last call to deal.
The face is a player actually on YOUR block, pulled from your trade bait β so the card wears your club. Red because the window shuts tonight.
Open Trade BuilderLeagueCompositeHero Β· Monday standings Monday standings
The race tightens.
Cast from the leaderβs headliner β but league-coloured, because the leader may be in the other conference and the franchise accent resolves within yours. Two different clubs.
See the raceLeagueCompositeHero Β· waiver day Waiver day
Claims run tonight.
The face is a free agent β nobody rosters him, so there is no club whose colours this could honestly wear. League navy, and his NFL crest behind him.
Set your claimsLeagueCompositeHero Β· latest article Week 2
Week 2 is a league-wide buzz saw β get ready for the reckoning.
Every contender draws a top-ten schedule this week, and the two records built on soft opponents are about to be audited in public.
Read The GauntletLeagueCompositeHero Β· season finale Season finale
Seeds are locking.
The last week before the bracket. Every clubβs seed moves on the same Sunday, so this one belongs to the league rather than to any of them.
View standingsLeagueCompositeHero Β· playoffs incoming Playoffs incoming
Bracket time is here.
The countdown into the bracket. Once the games actually start, the bespoke bracket hero takes over β a spotlight cannot hold sixteen seeds.
View bracketLeagueCompositeHero Β· world championship World Championship
One game for the crown.
Trophy gold for the one game the whole league watches. Both finalists are somebodyβs club, which is exactly why the card is not painted in either.
View bracketLeagueCompositeHero Β· champion crowned Champion crowned
A new champion.
League scope on purpose: the face here is a league-wide headliner, not the winnerβs own player, so club colours would dress it in whoever happened to be cast.
View recapLeagueCompositeHero Β· new league year New league year
The season resets.
A rookie models the reset β the newest class is the one nobody has rostered yet, which is the whole point of the phase.
Review rostersLeagueCompositeHero Β· calendar event Happening now
A dated league event.
The catch-all for anything on the calendar without a phase of its own. It still gets a face and a crest rather than the branded card it used to fall back to.
Learn moreLeagueCompositeHero Β· default AFL
Two conferences. One champion.
The leagueβs own card, shown on a day no phase claims. Twenty-four teams, two conferences, one champion.
View standingsLeagueCompositeHero Β· schedule release Just dropped
The schedule is out.
The one hero cast from the leagueβs BEST players rather than a franchise headliner β a marquee face for a marquee drop, rotating daily through the top five so one player does not own it.
See the schedulehero-franchise-accent Β· declines Rostered twice
When the rule refuses to guess.
The hard case, and the reason this page exists. Two clubs in your own conference roster him, so there is no βyour coloursβ to use β the card falls back to the leagueβs, and to his NFL crest.
How casting worksAll six composite states the AFL ships, plus the case where the colour rule declines to pick β real players, and real AFL franchise colours on the cards that are about a fantasy team rather than an NFL one. The badge on each card says which half of the colour rule it is on. Toggle your theme: the gradient, glow and tokens re-resolve for dark mode.
The Premise
Why a real player is on the hero at all β and the rule that governs which one
Identifiable NFL action photography is rights-managed β Getty, AP, Imagn. A fantasy site canβt ship it, and the usual fallback is a gradient with a headline on top.
Every NFL player, though, has a free, transparent headshot on ESPNβs CDN. Layer that cutout over a team-colour gradient with some typography and a glow and you get a branded, on-topic hero for any player, automatically, with zero licensing. The constraint became the design language β and the same one TheLeague uses, on the same components.
What it unlocks is the rule the whole system exists to serve:
Casting Rule β bindingβEvery hero casts a semantically relevant player β your keeper cornerstone in the keeper window, the best available on draft day, your starter in the first game you play. Never a random star for decoration.β
The Duplicate-Player Problem
The AFL rosters the same NFL player twice, which makes βwhose colours?β a real question
// Ownership is a LIST here, never one franchise.
const owners = ownersByPlayer.get(playerId);
// Scope to the viewer's own conference BEFORE picking.
// Inside one conference a player has at most one owner,
// so the ambiguity disappears instead of being broken
// by a tiebreak nobody can predict.
const mine = owners.filter(
(id) => conferenceOf(id) === viewerConferenceId);
// Anything but exactly one β his NFL team's colour,
// which is what every hero did before this existed.
if (mine.length !== 1) return fallback; The AFL runs 24 franchises as duplicate-player conferences: the same NFL player can be rostered by a team in the American League and a team in the National League at the same time. Sixty of the ALβs eighty-four keepers are kept in the NL too. So βthe franchise that rosters this playerβ is a list, and a hero that picks one of them paints a strangerβs colours on your homepage.
The rule that resolves it is to scope ownership to the viewerβs own conference. Inside a single conference a player has at most one owner, so the ambiguity is removed rather than guessed at. An AL owner sees the AL clubβs colours; the NL owner of the same player is not their story.
Everything that is not that falls back to the playerβs NFL team colour β a signed-out visitor, a free agent, a franchise with no usable brand colour. That fallback is the behaviour every hero had before the accent existed, so the feature can only ever add.
The Image Pipeline
How a name becomes a composite β and the gate that keeps it from breaking
KEEPERS, AL DRAFT, NL DRAFT β bled off the top edge.hexToRgba(tint, 0.42) in dark, 0.22 in light.loading="eager" above the fold, decorative alt="". A 404 hides it and reveals the AFL crest silhouette instead of an empty flank.Two failure modes are gated before anything renders. Transparency is load-bearing: the ESPN headshot has an alpha channel, MFLβs fallback JPG has a baked-in background that ruins the composite, so the gate requires an ESPN CDN URL β matched on the parsed host, never a substring, so a lookalike domain canβt slip a foreign image into an <img src>. And a team defense isnβt a person: position === βDEFβ is excluded, because a "DEF player" is a logo, not a face.
Two Conferences, Two Drafts
The split TheLeagueβs single draft hero cannot express
The AL meets and picks in MFLβs live-draft applet, Saturday at 12:30pm PT. On draft day the CTA becomes the room itself and the draft order is demoted to a secondary link β before that, the order is the useful destination, because the board is empty slots until picks land.
The NL runs a slow email draft off MFLβs email-draft page, Sunday at 9am PT β a page that never opens the live applet. Sending either conference to the otherβs URL is the bug this split exists to prevent.
Because the hero leads with the viewerβs own conference, an NL owner would otherwise have no route to the AL board while the AL is actually drafting. So a live sibling conference attaches its board as a secondary link β resolved after the lead event is picked, because a view builder only sees its own event and cannot know the siblingβs live state.
The Calendar Decides
Phases resolve by date; the regular season subdivides into six daily slots
Which hero shows is not a toggle β it is resolved from the calendar by resolveLeagueHeroState, on a priority ladder from P0 (an active event: draft day, the trade deadline, championship week) down to P5 (the default). Three phases have an identity of their own and render as composites; the rest render through the AFLβs branded promo card, which is also the fallback whenever no player can be cast. A missing feed degrades to the card that always worked, never to an empty flank.
Phases with a shipped composite hero today
Casting, by Phase
Each phase has a purpose-built picker β all deterministic, all shared with TheLeague
| Function | Phase | Who it picks |
|---|---|---|
castRosterModel | Keeper window | A headliner from YOUR franchise β your keeper cornerstone. Guests get a league-wide daily pick. |
castTopFreeAgentModel | AL / NL draft | The best available by dynasty ADP, from the players nobody in the league rosters yet. |
castRandomStarterModel | Season start | Rotates among your likely starters in the first game you play β not merely the weekβs earliest. |
castBestScoredModel | Recap slot | The weekβs highest actual score, with the rostering franchise named in the copy. |
castRookieModel | New season | The newest draft class β rookies represent βnewβ. |
castFeaturedModel | Fresh Whatβs New entry | Exactly the player the entry names, and nobody when it names none. |
Every picker is deterministic per Pacific-Time calendar day: the page is server-rendered, so Math.random() at request time would make two loads disagree and the cache useless. A hash of the PT day-key plus a per-hero seed indexes into the sorted candidate pool β stable all day, rotating at midnight PT so one face doesnβt own the window. ?testDate=YYYY-MM-DD drives both the phase and the rotation, so any dayβs hero can be previewed on demand.
One Shell, Two Leagues
The AFLβs composites are the same components TheLeague ships
The treatment is not reimplemented here. Seven forked hero components β five spotlights and two panel boards, about three thousand lines under seven CSS prefixes β were unified into one spotlight shell and one panel board. Every dimension that genuinely differed between them became a custom property; every palette became a named accent. The AFLβs keeper and draft heroes are configurations of that shell, which is why they arrived with light mode, dark mode, mobile behaviour and a 404 fallback already correct.
The accents are named per hero rather than per colour, and that is deliberate: three of TheLeagueβs five were shades of blue that differ in accent, pill and dark surface, and folding them together on the way in restyled live heroes. The AFL adds two more β navy and gold β plus the shared red urgency tone that the cut watch, the keeper deadline and a live draft all reach for.
Trophy gold, KEEPERS wordmark, your keeper cornerstone. Flips to urgency red on the deadline itself.
Navy, AL DRAFT wordmark, best available on the board. Red while the room is live; the CTA becomes the room itself for an AL owner.
The same card, one page different β the NL drafts by email, so its CTA opens MFLβs email-draft page rather than the live applet.
The branded promo card still renders the calendar events, the daily slot rotation and fresh Whatβs New entries β and is the fallback whenever a composite canβt cast anyone.
The playoff and championship heroes are a bracket and a matchup card; the trade-deadline hero is a live countdown. Those do jobs a player composite cannot, so they keep their bespoke components.
The Bottom Line
A licensing constraint turned into a rule β every hero means something β and the rule turned into a handful of small deterministic pickers plugged into a calendar that already knew what day it was. The AFLβs twist is that identity here is genuinely ambiguous: two conferences, twenty-four teams, and the same player on two rosters at once. Answering βwhose colours?β honestly is one filter and one fallback, and it is the difference between a hero that is about your team and one that is about somebody elseβs.
It renders on the server, stays stable for a Pacific-Time day, degrades to a card that always worked when a feed is missing, and looks right in light and dark. No stock photos. No licensed action shots.




















Message