SMStefan MihovSystems & AutomationDesign portfolio ↗

Decision engine · Fantasy basketball

A custom decision system built on top of real league state.

Draft9 does more than rank players. It normalizes multiple projection and market sources, builds a custom 9-category value model, connects a real ESPN league and simulates how draft picks, trades and waiver moves change a specific roster relative to its competition.

Player poolUp to 1,000 from ESPNRefreshScheduled every 6 hoursLeague contextRosters · draft · schedule · matchupsProductPrivate beta

01 · Problem

Player value is not a fixed number once a league starts.

A ranking tells you who is generally good. It does not tell you what your roster needs, where your team sits against eleven competitors, whether a trade improves both sides enough to be plausible, or whether a waiver pickup has enough games left this week to matter.

DATA

Sources disagree

Projections, ADP and rankings come from different places, formats and assumptions.

CONTEXT

Fit depends on the roster

A player's categories can be valuable to one team and redundant—or actively harmful—to another.

STATE

The league keeps changing

Draft picks, injuries, schedules, rosters, free agents and current matchups continuously alter the decision.

02 · Data & model

Normalize the inputs first. Then model the decision.

Draft9 combines ESPN fantasy data with public projection and ADP sources, maps them into one player model and computes its own category-aware score rather than treating a single provider ranking as truth.

Selected layer

ESPN player pool0
Scoring categories0
Scheduled refresh6h
Market contextESPN · Yahoo · Fantrax

03 · Simulation

The important output is the change caused by the move.

During a draft, Draft9 can add a candidate to the user's current roster without recording the pick, recalculate category shape and estimate how the team's projected league position changes. The demonstration below is synthetic, but mirrors that interaction.

Synthetic pick-impact demo

Preview the next roster move

Candidate profile
Projected league position

Illustrative category movement only. The production model uses actual league rosters and player projections.

DRAFT

Pick impact

Preview a player on the roster, compare before/after category ranks and see projected overall movement before committing the pick.

TRADE

Realistic trade scanning

Scan 1-for-1 and 2-for-2 ideas against actual rosters, category fit and original draft capital, rejecting deals that are too one-sided.

WAIVERS

Schedule-aware add/drop

Use the actual ESPN free-agent pool, upcoming NBA games and current matchup state to estimate what a transaction changes.

04 · Live league context

The model becomes useful when it knows the league it is operating inside.

A user can connect a public ESPN league by ID or URL. Draft9 pulls rosters, original draft positions, free agents and waivers, NBA schedules and the current matchup into a read-only snapshot. Saved snapshots are used as fallback if ESPN is temporarily unavailable.

ROSTERS

Actual team construction

Every roster is available to the simulation layer rather than approximated from a generic league.

DRAFT CAPITAL

Original pick context

Trade scanning uses where players were originally drafted as one realism constraint instead of suggesting fantasy trades in a vacuum.

SCHEDULE

Upcoming games

Free-agent analysis knows how many games a player has in the next 7/14 days and can focus on the current scoring window.

MATCHUPS

Before / after outcomes

For a current opponent, add/drop previews compare category outcomes before and after the proposed transaction.

05 · Product system

A toolkit around one analytical core.

The visible product has several surfaces, but they share the same player model and persistent league state.

RANKINGS

Personal draft board

Reorder players, add tiers/tags/notes and preserve a user's own judgment alongside the model and market ADP.

DRAFT ROOM

Live draft workspace

Track picks, remaining players, team construction, league-wide category shape and hypothetical next selections.

PUNT STRATEGY

Change the objective

Selected punt categories are removed from the active strategy so suggestions respond to how the user intends to compete.

TRADE LAB

Evaluate both sides

Model roster changes and category-rank movement instead of reducing a deal to two player names.

FREE AGENT LAB

Transaction simulation

Search actual availability, choose the exact pickup/drop and compare team and matchup effects.

RESILIENCE

Refresh + cache behavior

Scheduled source refreshes, league snapshot caching and saved-state fallback keep the product useful when external feeds fluctuate.

06 · My role

I designed the decision logic as well as the product around it.

This is a self-directed build. I defined the decision problem, sourced and normalized the data, designed the scoring and simulation logic, structured the persistent league state, implemented the ESPN integration and built the product surfaces around real fantasy decisions I wanted to make faster.

WHAT IT SHOWS

Analytical product design

Turning a vague objective—“help me make better fantasy decisions”—into explicit models, simulations and workflows.

WHAT IT SHOWS

External data → usable decisions

Normalizing unreliable, changing external data and combining it with user-specific state without hiding uncertainty behind a single magic number.