FSPN

FSPN user guide

FSPN (https://fspn.ragealley.com) is an analyst desk for your fantasy football league. It syncs your Sleeper or public ESPN league, prices every player with your league's own scoring, and gives you projections with floors and ceilings, win probability for every matchup, a weekly digest, and a graded record of how the models did. This guide is for league members. Operators should read the admin guide (docs/admin-guide.md in the project repository).

1. Getting an account

  1. Open https://fspn.ragealley.com and choose Create account (or Sign in if you have one).
  2. Sign up with email and password, or Continue with Google.
    • Passwords need at least 12 characters with an upper-case letter, a lower-case letter and a number.
    • You must tick the box accepting the Terms of Use and Privacy Policy.
  3. Email sign-ups get a 6-digit verification code from no-reply@fspn.ragealley.com. Enter it on the Check your inbox page, then sign in. Send a new code is on the same page if nothing arrives.
  4. Google sign-ups skip the code: Google has already verified the address.

One account per email address. If you signed up with a password and later use Google with the same address, you land in the same account. Sessions last 30 days of inactivity; you can end them from the Account page.

Forgot your password? Forgot password on the sign-in page emails a reset code; enter it with a new password on the reset page.

2. A tour of the app

FSPN is organised around the week, not around tools. On desktop the destinations sit in a left rail; on phones there is a bottom bar with Today, Matchup, League, Players, More. A command bar (⌘K or /) jumps to any player, view or glossary term, and a Casual / Analyst / Nerd density dial (in Settings) hides or reveals ranges, tables and the second-opinion numbers.

ViewWhat it answers
TodayHow am I doing this week? A day-aware hero: your win probability against this week's opponent, projected totals for both sides, your lineup's floor-to-ceiling band with our number next to Sleeper's and ESPN's, the top of both lineups, injury flags, and a Lineup lock card listing starters with a designation or no projection and the best bench swap for each. On Sundays it offers Kickoff mode (bigger type).
MatchupWho should I start, and what decides the week? The Stage puts your lineup against theirs slot by slot; tap a starter to see every eligible bench swap with the change in win probability. Swing & sim runs the matchup thousands of times (histogram, 10th–90th bands, the swing players). What to watch filters the NFL slate to the games your matchup rides on. Roster and Rest of season (a 17-week schedule-strength strip per player, byes and fantasy-playoff weeks marked).
LeagueWhere does everyone stand? Standings with simulated playoff odds and the all-play / luck table; This week's matchups with both models' numbers and finals once played; Waivers (top free agents by position, plus the waiver advisor's FAAB bids or claim/wait/skip calls); Edges vs Sleeper (where our projections disagree with the platform's — buys, traps, role checks); Trades (mutually beneficial trade ideas and a trade builder); Ours vs Sleeper (which model was closer, week by week); Digest (this week's card or story infographic, past editions, PNG / SVG / Markdown); Setup (rosters, sync, league import).
PlayersTell me about this player. Find any player (recent, your roster, search); the trading card in his team colours with this week's number, range, 20-game spark, trend, percentiles, splits and game log; the Weekly board by position with owners and a free-agents filter; the Draft board (VOR order, with Mine/Gone marks); Compare.
NFL (More)What does the model say about the games themselves? Predict a game (Elo, weather, neutral site), series odds for a best-of, the week ahead for NBA/MLB, a research packet for any matchup, league-wide storylines, and the Elo team ratings. Covers NFL, NBA, MLB and soccer.
Play (More)Something for the group chat. Redacted — a real stat line with the name blacked out, six guesses, one new clue per miss, a shareable emoji grid; Stat Trivia — ten generated questions a day, solo, pass-and-play on one phone, or a challenge link so friends get the same ten. NFL, NBA and MLB editions.
Lab (More)How good are the models? Performance field (a position group plotted against itself), trends, backtests, accuracy of saved projections, environment edges, and Data & jobs, the console that runs the data commands (most of it is staff-only on the hosted app).
AccountYour profile (and a Hall of Fame invite field), look, plan, API tokens and the MCP connector, leagues, team claim, sessions. See sections 3–8.
OpsStaff only (Officials and the Owner): accounts and roles, Hall of Fame seats and invites, sync log, audit trail.

Every route is a real link you can share with the league, e.g. #/players/Puka%20Nacua, #/league/edges, #/play/trivia/<seed>.

3. Linking a league

Open Account → Fantasy accounts & leagues. Pick the provider.

Sleeper

  1. Enter your Sleeper username and press Find my leagues. FSPN looks the name up on Sleeper's public API and lists your leagues for the current season.
  2. Press Join next to a league. If nobody has joined it yet, the first join syncs the whole league (rosters, schedule, results, scoring settings, draft, transactions), which can take a minute. Joining a league someone else synced recently (within the last six hours) is instant — your team is read from the league FSPN already has, with no call to Sleeper. Your team is preset from the roster your Sleeper account owns, and if Sleeper marks you as the league's owner you arrive as its commissioner; everyone else is a member.
  3. You land on League with your team set.

ESPN

  1. Paste your ESPN league id, or the whole league URL (the number after leagueId=), and press Preview league.
  2. Check the name and season, pick your team from the list, and press Join. The first joiner becomes commissioner (ESPN gives us no owner signal to check). As with Sleeper, joining a league synced within the last six hours is instant.
  3. Private leagues. ESPN shows a private league only to its members, so the preview says "This league is private on ESPN" and opens a This league is private panel. Link the two cookies ESPN set in your browser when you signed in — espn_s2 and SWID (the panel's Where do I find these? walks through the browser's developer tools: Application/Storage → Cookies → https://fantasy.espn.com; the braces around SWID are part of the value) — and press Link cookies. The preview retries on its own, and joining and syncing work like any other league. FSPN reads the league as you, nothing more.
    • What is stored: the two cookie values, encrypted with a key only the hosted service holds (AWS KMS). They are used for one thing — reading your private league from ESPN — and never shown again. Remove under the ESPN pane forgets them at any time; deleting your account removes them too. They are not available on a local install of FSPN, which reads public leagues only.
    • Whose cookies sync the league: the member who linked cookies and joined (or synced) the private league becomes its credential user; the scheduled syncs and every member's Sync now read ESPN with those cookies. If that member removes them, the scheduled sync keeps the stored league and notes why in the sync log, until any member with linked cookies syncs it again — then theirs take over.
    • ESPN's cookies expire on their own every few months. When a preview or sync says ESPN refused the linked cookies, copy fresh values and link them again.

Joining and syncing use each platform's read-only data — public for Sleeper and public ESPN leagues, your own ESPN session for a private one. FSPN never asks for your Sleeper or ESPN password. An account can join up to five leagues; switch between them with the league switcher in the header.

4. Claiming and verifying your team

Your team drives Today, Matchup and everything that says "you". It is set automatically on a Sleeper join and chosen by you on an ESPN join; change it any time under Account → My team → Claim & verification.

Neither Sleeper nor ESPN has a sign-in handshake, so a claim starts on the honour system. To prove a team is yours:

  1. Press Verify it's you. FSPN issues a 6-character code.
  2. Put the code in your team name on Sleeper (team name or display name) or on ESPN (team name). A few minutes is enough.
  3. Press Check now. FSPN reads the league fresh; when it sees the code, your claim is marked verified and the code is retired. Change the name back afterwards.

Give the platform a minute after renaming before you check. A verified team cannot be claimed by someone else; an unverified one can be re-claimed until it is verified.

5. Keeping data fresh

FSPN refreshes on a schedule (all times US Eastern):

WhenWhat happens
Tuesday 06:00NFL results, rosters and injuries are ingested; Elo retrains; last week's saved projections are graded; every league is re-synced from its platform; the new week is projected; the Tuesday recap digest is written.
Thursday 09:00Every league re-syncs; the preview digest (banked points + projections, the injury report).
Sunday 08:00Every league re-syncs; the gameday digest (the league wire and NFL storylines).

Sleeper and public ESPN leagues are both on the schedule (an ESPN league re-syncs for the season it was joined in). Between those runs, Sync now (Account → Fantasy accounts & leagues → your league) pulls the latest rosters, waivers, trades, injury designations and platform projections from Sleeper or ESPN. It needs the Sync plan or better (section 6) and runs at most once every five minutes per league. The Today page shows when the league was last synced; Refresh there re-reads the numbers without a sync.

Player pages, the weekly board and the NFL views come from the shared NFL data the Tuesday job publishes; they update once a week, not on Sync now.

6. Plans and billing

PlanWhat it unlocks
Free (every account)Browse everything already synced: player cards, boards, trends, the NFL views, the games, and your league's views once someone has joined it.
Sync ($3/month)Sync now for your leagues, so your board reflects a waiver claim or a trade before the next scheduled run.
Sync + API ($6/month)Everything in Sync, plus personal API tokens for the JSON API and the hosted MCP connector for Claude and other agents (section 7).

Hall of Fame seats, Officials and the Owner have every feature included; their Account page says so instead of showing the buttons.

Hall of Fame. Fifty seats, free for life, invite-only. An Official or the Owner mints an invite (HOF-XXXX-XXXX) and shares it as a link — https://fspn.ragealley.com/join/HOF-XXXX-XXXX, usually pasted straight into the league chat; invites expire (14 days by default) and can be single- or multi-use. Two ways in:

From the link (the usual way):

  1. Open the link. The page says You're invited to FSPN's Hall of Fame and offers Create account and Sign in.
  2. Pick one. New here: create the account, enter the code from your inbox, sign in. Already a member: just sign in (email and password, or Google — either works).
  3. You land in the app with a Welcome to the Hall of Fame toast and the hall of fame badge on your Account page; nothing to renew. The invite is remembered for an hour after you open the link, so the verify-email step in between is fine.

If the invite stopped working between opening the link and signing in (it expired, its uses ran out, or the last seat went), you are still signed in — the app says why the seat wasn't claimed, and you can ask for a fresh link. Officials and the Owner who follow a link keep their role and the invite is not spent.

From the Account page (when you were handed the bare code):

  1. Sign in (or create an account — a sign-up without a link is always a Team Manager until a code is redeemed).
  2. Open Account → Profile → Invite code, paste the code (a pasted /join/<code> link, lower case or stray spaces are fine) and press Redeem.
  3. Your standing badge flips to hall of fame at once.

A link or code that is invalid, expired or already used says so in plain words and never reveals who created it. Redeeming never downgrades anyone.

Upgrade. Account → Plan & billing → Get Sync or Get Sync + API. You are sent to Stripe Checkout; the app never sees your card. Back on the Account page your plan badge updates within a few seconds (Stripe notifies FSPN after payment).

Manage or cancel. Account → Plan & billing → Manage billing opens the Stripe customer portal: change card, see invoices, switch plan, cancel. Cancelling keeps access to the end of the paid period; there are no refunds for partial periods except where the law requires them. Prices may change with 30 days' notice (see the Terms).

7. API tokens and connecting Claude (MCP)

With Sync + API (or a Hall of Fame seat or better) the Account page grows an API & MCP card. The full reference is the API reference; the short version:

  1. Account → API & MCP → Create token. Give it a name and a scope — read (projections, boards, your league) or read + write (also roster moves and console commands). The secret (sa_…) is shown once; copy it then. Up to five tokens per account.
  2. Scripts: send it as Authorization: Bearer sa_… to any read endpoint, e.g. curl -H "Authorization: Bearer sa_…" "https://fspn.ragealley.com/api/team/summary?season=2026". GET /api/index lists everything. 120 requests a minute per token.
  3. Claude Code: claude mcp add --transport http fspn https://fspn.ragealley.com/mcp --header "Authorization: Bearer sa_…". Claude Desktop signs custom connectors in with OAuth, which FSPN does not offer yet, so on Desktop the connector goes through the small mcp-remote bridge — the config is on the Connect Claude page. Claude then has the same 36 tools as the app — your week, the matchup simulator, the trade finder, playoff odds, player cards, the digest — scoped to your league.
  4. Revoke from the same card; anything using the token (scripts, the connector) stops at once. Signing out does not revoke tokens; deleting the account does. If the plan lapses, tokens pause with a The API needs the Sync + API plan message and resume when it is renewed.

Connect Claude. The step-by-step for Claude Code and Claude Desktop, the full list of the 36 tools, what a read_write token adds, and what each error means: Connect Claude (MCP).

Tokens never reach the Account, billing or Ops pages — those stay a signed-in affair.

8. Account settings

9. Privacy and terms

10. FAQ and troubleshooting

I never got the verification code. Check spam and the address you typed (the Check your inbox page shows it). Use Send a new code. Codes expire; a fresh one replaces the old. If nothing ever arrives, contact support@fspn.ragealley.com with the address you used.

"Sign-ups aren't open right now." The identity service is refusing self-service sign-up. That is an operator setting, not something on your side; tell the Owner (see the admin guide, Launch-day gotchas).

"Your email isn't verified yet" after Continue with Google. Google sign-in should never ask for a code. If it does, the operator needs to fix the Google identity provider mapping and delete the half-created identity; report it.

"An account with that email already exists." You already have a password account for that address (sign in, or use Forgot password), or you previously signed in with Google using it; try Continue with Google.

My ESPN league says it is private. Link your ESPN cookies (espn_s2 and SWID) in the panel the preview opens — section 3 explains where to find them and what is stored. If ESPN refused the linked cookies, they have expired: copy fresh ones and link again. A local install of FSPN cannot hold cookies and reads public leagues only.

Every player page is empty / the weekly board has no rows. The shared NFL data has not been loaded on this install (the weekly job has not run, or a fresh install has no history yet). League views still work from your synced league. The operator runs the backfill; see the admin guide.

"Synced 40s ago — fresh syncs are once every 5 minutes per league." Wait out the cooldown; the platforms themselves cache for about that long.

"Syncing needs the Sync plan (or better)." Sync now is a paid feature; the scheduled Tuesday / Thursday / Sunday syncs still run for every league.

"That invite code isn't valid" / "That invite expired" / "That invite has already been used." Codes are minted by staff with an expiry and a number of uses; ask whoever gave it to you for a fresh one. "The Hall of Fame is full" means all fifty seats are taken. The same reasons show as a toast after signing in through a /join/<code> link that stopped working while you were creating the account — you are signed in either way. "Too many invite lookups" on the link page: the address opened a lot of links in a minute; wait and try again.

My token answers 401 or 403. 401 That API token isn't valid — it was revoked or mistyped; make a new one. 403 The API needs the Sync + API plan — the subscription lapsed; renew it and the token works again. 403 This token is read-only — the call writes (roster move, import, console command) and needs a read + write token. 403 Account, billing and ops endpoints are for the signed-in app — those pages are never reachable with a token.

Check now says "Not seen yet". Sleeper and ESPN take a minute to publish a renamed team. Confirm the code is in the team name (not the league name) and check again.

I joined the wrong league or want to leave one. There is no leave button yet. Join the right one (up to five) and switch with the header switcher, or delete and re-create the account.

The digest shows the wrong week or an old lineup. Digests are rendered at the scheduled times from the league as synced then. Sync now, then reopen League → Digest; the next scheduled edition picks up the change.