Fantasy Flu

AI-Native Fantasy Football Platform: League History, AI-Written Weekly Stories, and Keeper Tracking on Top of Sleeper

Fantasy Flu

Project Overview

FLU (Fantasy League Utils) sits on top of Sleeper and gives a fantasy league its memory: every trade traced to the end of the line, keepers and salary contracts tracked automatically, and a weekly story written from the league's own numbers. It runs at fantasyflu.com as a live product: a mobile-first PWA, a FastAPI backend, push notifications, passkey sign-in, and per-league Pro pricing.

My Contributions

Solo founder. I own the product strategy, UX, design system, pricing, and every line of code, from the trade-graph engine to the marketing site. I also designed the AI layer: LLM-written weekly stories, the guardrails that keep them factual, and an LLM judge that grades every story. The whole product is built with AI agents, using Claude Code as my engineering team.

Skills used for this Role

Founder, Product & Engineering

May 2026 - Present

LLM Product Design | Prompt Engineering | LLM-as-Judge Evals | AI Guardrails & Grounding | Claude Code / Agentic Development | Product Strategy | UX & Design Systems | Full-Stack Development | Pricing & Packaging | Data Modeling

Key Takeaways

Shipped a production LLM feature end to end: a grounded generation pipeline, validation, versioned prompts, and an automated LLM judge.

Built the entire product AI-natively, with me as product lead and Claude Code agents doing engineering from written plans and design briefs.

Every product decision rests on one principle: show the data, never give a verdict.

The Product

One question per session, answered fast. FLU is a research tool, not a feed.

Trade Tracer

The core engine rebuilds a league's full history as a graph of every pick and player. A 2022 first-round pick becomes a player, the player gets flipped, and the chain rolls up to whoever holds the asset today. A league vote asks "who won the trade?" again at 1, 3, and 5 years, so the answer has its own history.

FLU trade history, a trade with its league vote, what each side turned it into, and points since the trade

AI in the Product

Every Tuesday, FLU publishes a story about each league's week. An LLM writes it, and a second LLM checks the work.

AI-Written Weekly Stories

It's Spotify Wrapped for your fantasy week: a swipeable, broadcast-style story deck built to be shared in the group chat. When a week settles, FLU builds a fact sheet from the league's own data: results, records, playoff swings, and rivalries. Claude writes the story from that sheet, and every content slide has to cite the fact-sheet lines it uses. Stories are generated through the Message Batches API, validated against a shared slide contract, and then frozen, so a later prompt change never rewrites a story someone already watched.

Frames from an AI-written weekly story: the cover, the series history, game of the week, and the playoff line

Guardrails: Grounded, Never Judgmental

FLU's one unbreakable rule is "show the data, don't editorialize," and an LLM will break it by default. So the guardrails are part of the system design, not left to the prompt alone: • Grounding: the model only sees a structured fact sheet with stable IDs, and slides that don't cite it fail validation. • Retry, then fail safe: a malformed or failed story gets one resubmit. After that it's marked failed, and the weekly digest goes out without a story. • Human override: admins can pull a published story and restore it later. The original is kept for audit. • Cost and access gates: generation only runs for leagues entitled to it, and the pipeline does nothing without an API key.

The LLM Judge

Validation catches broken formatting and engagement data catches boring stories, but neither catches a story that reads well and quietly breaks a house rule. That needed a judge. A second model grades every new story against its own fact sheet on a seven-check rubric: every number cited, no verdicts, no invented chronology, the right team credited for each figure, and house style. It returns a 0-100 score and quotes the exact text behind each failed check, so failures are traceable instead of hallucinated. The judge is versioned like an instrument. Each rubric change gets a new version so scores stay comparable, and the rubric changed based on real runs. One version learned that vivid "broadcast color" is the point, not a verdict. Another added a check after a story cited a correct number but credited it to the wrong team. When the smaller model kept flagging allowed writing, I moved the judge to a more capable model with extended thinking: the judge benefits from more reasoning, while the writer is matched to the cost of running every week.

AI as the Build Team

A full-stack product built by one product lead working with AI agents.

How I Build With Claude Code

I run FLU like a product org where the engineers are AI agents. My job is the product leader's job: decide what to build and why, write it down clearly, and review the result. • Written context: a living CLAUDE.md documents the product rules, architecture, and API quirks, so every agent session starts with the same understanding. • Plan, then build: each feature starts as a plan doc (problem, rulings, PR sequence) and a design brief, then ships as a series of small, reviewable PRs. • Parallel agents: independent work runs in parallel sessions on separate git worktrees. • Quality gates: CI runs typecheck, lint, tests, and a bundle-size budget on every PR, so agent output is held to the same bar as human code. The stack: Python and FastAPI, SQLAlchemy and Postgres, a durable background worker, React with TanStack Router and Query, Tailwind, Stripe, Web Push, and passkeys, deployed on Railway.

More of the Product

Free tools give every league its history. Pro adds the layers a commissioner would otherwise keep in a spreadsheet.

Keeper & Contract Tracking

Salaries, keepers, and contracts are tracked automatically. Cap issues and rule penalties are flagged to the whole league but never blocked, so the commissioner retires the spreadsheet. On keeper day, the Keeper Selector turns the decision into one board: every rostered player with his real cost to keep, contract year, current production, and positional rank. Costs, cap room, and open slots update live as you check players, and the plan autosaves.

FLU team page with salary cap, contract watch list, roster salaries, and cap room in the standings
FLU keeper selector on desktop: a keeper board with live costs, contracts, cap room, and positional ranks

In-Season Intelligence

Each start-sit decision is scored against the player you benched and rolled into one Manager IQ number. Playoff odds come from simulated seasons, and power rankings cover every position.

FLU power ranking, season swaps, positional power, and the weekly home screen

Teams, Records & Draft Order

Every franchise gets its own profile: trade partners, roster construction, and trophies. Every season gets rebuilt into an all-time record book. A total-points draft order gives the best pick to the worst overall team, not the unluckiest schedule.

FLU team hub with franchise players and history, positional ranks, roster, and total-points draft order

Want to work together?

If you like what you see and want to work together, get in touch!