DD · SPEC · V1

DraftDaily — Product & Data Spec

Structure, hierarchy, and content decisions for the app — plus how data moves underneath it. No visual styling; use this to lock what each screen does and where data comes from before hi-fi.
9 screens 4 primary tabs 1 core flow Mobile · 390 × 820 6 data sections

00

Legend

Solid boxcommitted UI element
Dashed boxTBD / placeholder
Hatchedimage / media slot
note
Annotationbehavior or rationale
01

Core user flow

The app is a daily habit: open → scan top 3 → tap → click out. < 10 seconds.
Push @ 9 AM"Today's 3 are ready"
Open applands on Home
Scan 3 picksvalue, proj, salary
Tap for detailoptional
CTA outboundaffiliate link
Eveningslate locks @ 7:30

02

Primary screens

Home is the workhorse. Detail is for users who want reasoning. Locked keeps the product alive after 7:30 PM.
01 · HOME / TODAY'S PICKS
DraftDaily
👤
TODAY · DATE · SLATE CONTEXT
H1 — "Top 3 edges"
● UPDATED 9:00 AM · 142 MODELS · SHARP 0.83
NBA 8
NFL
MLB
NHL
PICK #01
IMG
Player name
TEAM vs OPP · POS
VALUE
94
PROJ
48.2
$
7.8k
AI blurb — 2 line max…
PLAY ON [PARTNER]
PICK #02
(same card structure)
PICK #03
(same card structure)
Today
History
Alerts
Profile
Hero view. All 3 picks visible w/o scrolling. Tapping card → Detail.
Cards are the primitive. Everything above is chrome. Everything below Pick #3 is bonus.
02 · PICK DETAIL
PICK #01 · DETAIL
IMG
Player name
TEAM vs OPP · 7:30 PM
EDGE
94
PROJ
48.2
$
7.8k
WHY THIS IS A VALUE PLAY
Hero visual — big number + 2–3 bars (proj vs market, pace, salary eff.)
AI BLURB
Full paragraph — 3–5 sentences on matchup, role, injury context.
MATCHUP STATS
PACE
DEF
USG
LAST 10 GAMES
BAR CHART
MODEL REASONING
• Bullet 1
• Bullet 2
• Bullet 3
PLAY ON
[Partner]
TAIL →
Opened from Home. Sticky CTA persists at bottom. Back returns to Home.
"Why value" gets its own module — this is the trust-builder, must be visually loud.
03 · LOCKED STATE
DraftDaily
👤
TONIGHT · APRIL 17
Slate LOCKED
🔒
Picks locked at 7:30 PM ET
Tomorrow's 3 edges drop at 9:00 AM ET
13
HRS
42
MIN
08
SEC
NOTIFY ME AT 9 AM
LIVE · YOUR 3 PICKS
Q2 4:18
P
Player 1
34.6
P
Player 2
17.8
P
Player 3
28.6
Today
History
Alerts
Profile
Post-7:30 PM ET. App stays useful via live tracking of today's picks. Countdown drives return.
Not a dead state — turns into a "sweating it out" live-scoreboard for players who tailed.

03

Secondary screens

Trust (History), retention (Alerts), account (Profile). All reachable via bottom nav.
04 · HISTORY / ARCHIVE
DraftDaily
30-DAY WINDOW
Track record
HIT %
71
PICKS
18/24
ROI
+18
ALL
NBA
MLB
NHL
YST
Apr 16
NBA · SLATE COMPLETE
Tate · Reeves · Ndiaye
3/3
TUE
Apr 15
NBA
Kroll · Beaumont · Huxley
2/3
TUE
Apr 15
MLB
Abrego · Vance · Okonkwo
3/3
MON
Apr 14
NBA
Whitaker · Salazar · Chen
1/3
(more…)
Today
History
Alerts
Profile
Stats block at top = trust signal. List = scroll-to-verify receipts.
Q: tap a row to see that day's picks in detail? Probably yes — low effort, high reinforcement.
05 · ALERTS / NOTIFICATIONS
DraftDaily
DAILY HABIT
Alerts
● RECOMMENDED
Never miss the 9 AM drop
One push. Every morning. Your 3 edges before coffee.
TURN ON
Not now
🌅
Daily picks drop
9:00 AM ET
Lock warning
15 MIN BEFORE LOCK
Injury & line alerts
IF A PICK IS AFFECTED
📊
Live score tracking
WHEN PICKS HIT PROJ
Alerts are intentionally rare. We only ping for real edges.
Today
History
Alerts
Profile
Recommended card dismisses once daily is on. 4 toggles, not 20.
Also shows as a modal on first launch (see Modal section).
06 · PROFILE / SETTINGS
DraftDaily
MEMBER SINCE MAR 2026
Jordan Kato
14
Day streak
Since Apr 4.
PREFERENCES
Favorite sport
NBA ›
Default platform
[PARTNER] ›
Time zone
ET ›
Units
POINTS ›
ACCOUNT
Connected platforms
Subscription
PRO ›
Privacy
Sign out
Today
History
Alerts
Profile
Streak is the habit signal. Preferences drive personalization downstream.
Q: keep subscription model? Pro unlocks what — more picks, more sports, historical DB?

04

Onboarding & edge states

First-run experience, empty states, and the notification prompt modal.
07 · ONBOARDING — SPORT
SKIP ›
Which sports do you play?
We'll prioritize slates for the sports you care about.
☐ NBA
☑ NFL
☐ MLB
☐ NHL
CONTINUE
3-step onboarding. Step 1: sports preference (multi-select).
08 · ONBOARDING — PLATFORMS
SKIP ›
Where do you play?
We'll show CTAs for platforms you use.
☑ Platform A
☐ Platform B
☐ Platform C
☐ Platform D
CONTINUE
Step 2: partner preference. Drives affiliate attribution downstream.
09 · NOTIFICATION MODAL
TODAY
🔔
Turn on morning picks?
One push at 9:00 AM ET. That's it.
TURN ON
Later
YOU CAN CHANGE THIS ANYTIME
Triggered after first slate is viewed — NOT on launch. Earn the permission.
10 · EMPTY STATE (NO SLATE)
DraftDaily
TODAY
Top 3 edges
NBA
NFL
MLB
NHL
No NFL slate today
Next games Thursday — we'll ping you.
SWITCH TO NBA
Today
History
Alerts
Profile
Offseason / off-day. Push to another sport, don't leave user stranded.

05

Open questions & notes

Do we show how each previous-day pick was scored (hit/miss breakdown), or just the 3/3 tally? Leaning breakdown — more trust signal.
How does the "LIVE · your 3 picks" section know the user tailed? Is every visitor auto-tracked, or only if they tapped a CTA?
Onboarding: 3 steps or compress to 1? Tempted to make sport/platform optional and lead with "here's today's top 3" to maximize activation.
Pro tier: what's paid vs free? More picks, more sports, historical model data? Decide before Profile goes to hi-fi.
Multi-sport day: user has NBA+MLB+NHL today. Do we show 3 per sport (9 total) or still 3 total, cross-sport? MVP = 3 per sport tab.
Detail screen: is "Model reasoning" bullets editorial or generated? If generated, same source as AI blurb? If editorial, who writes them daily?

DD · DATA INTEGRATION · V1

Data integration

Where the data above comes from, how it moves through the system every day, and the open decisions that block hi-fi.
5 data layers 3 pipelines 7-stage daily lifecycle 6 open decisions Work in progress
What data we need, grouped by where it comes from and who owns it.
LAYER 1 · SLATE
Raw slate data
  • Games & start times
  • Rosters + positions
  • Injuries / lineups
  • Weather (MLB/NFL)
  • DFS salaries per platform
LAYER 2 · MODEL
Projections
  • Proj fantasy points
  • Variance / confidence
  • Usage, pace, matchup
  • Model version + run ts
LAYER 3 · DERIVED
Picks + value
  • Value score (proj÷$)
  • Edge vs. market
  • Top-3 ranker output
  • AI blurb (cached)
LAYER 4 · USER
User state
  • Auth / session
  • Preferences
  • Push tokens
  • Streak, tails, reads
LAYER 5 · $$
Attribution
  • CTA click events
  • Partner → pick → user
  • Conversions (if feed)
  • Revenue reconciliation
external source internal core / product differentiator user-facing output
How data moves from provider → app, once per day.
Sports feed
Sportradar / SDIO
Ingest
cron · 6 AM
Warehouse
Postgres
Projection
model · 8:30 AM
Top-3 picker
rank by edge
Blurb gen
LLM · cached
Slate JSON
immutable · 1/day
Mobile API
CDN cached
App
iOS / Android
CTA click
tracked link
Partner
DK / FD / PP / UD
The rhythm the whole product runs on. All times ET.
6:00 AMmorning pull
Pull fresh slate data. Games, confirmed lineups, latest injury reports, weather. Retry logic for late-posting rosters.
cronsportradar
8:30 AMmodel run
Run projection model. Score every eligible player, compute value = proj÷salary per platform. Rank, select top 3 per sport with liquidity floor.
model
8:45 AMblurbs + QA
Generate AI blurbs, cache to slate JSON. Human QA pass on top-3 reads sanity-check. Slate becomes immutable.
llm
9:00 AMpublish
Publish slate. Fire push notifications. Warm CDN cache. App fetches today's slate on cold start.
fcm / apnsslate/today
Throughoutmonitor
Watch for late scratches. If a published pick is ruled OUT, push "pick affected" alert. Only case where a slate mutates mid-day.
alert
7:30 PMlock
Lock slate. Client switches to live-tracking mode. Low-latency score feed drives the lock-screen ticker.
live/scores
11:59 PMsettle
Settle results. Compute hit rate per pick, update user streaks, archive day to history.
settle
Things I need your call on before I can commit to a design.
Answer these first — everything downstream depends on them.
Q1

Projections: build or buy?

Build. Differentiator. 3–6 mo lead time. Needs a DS.
License. Ship in weeks. Same numbers as competitors.
Hybrid. License day 1; build over time.
Q2

Launch sports?

NBA only. 1 model, 1 schedule.
NBA + MLB. 2x data, daily year-round.
All 4. Full promise — slow.
Q3

Salary source?

Partner feed. Clean — depends on deal.
Scrape. Cheap. ToS risk.
Manual. MVP only. Doesn't scale.
Q4

Live tracking?

Real-time. Websocket. Sticky. $.
Polling (30s). Good enough.
Manual refresh. Skip it v1.
Q5

Auth gate?

Required. Know every user.
Optional. Gate only alerts+history.
None v1. Anonymous device IDs.
Q6

Regions / legality?

US only. Geofence allowed states.
US + CA. Similar rules.
Global content-only. No picks where gated.
A narrow slice that ships in weeks, not months. Everything else queued for v2+.

In scope — v1

  • NBA only
  • Licensed projection source (1 provider)
  • One publish/day · 9:00 AM ET
  • 3 picks, one platform per pick
  • AI blurbs generated at publish
  • Anonymous browse · optional sign-in for alerts
  • Affiliate CTA as tracked outbound link
  • History computed from stored slates
  • Daily push notifications
  • Lock at 7:30 PM · static "locked" UI

Out of scope — v2+

  • Proprietary projection model
  • Live in-game score tracking
  • MLB / NFL / NHL
  • Multi-platform cross-comparison
  • Parlays, lineup builder
  • User-submitted picks / social
  • Partner conversion attribution
  • Subscription tier / pro features
  • Web version
A starting point — 4 entities cover most of v1.
slate
iduuid
sportenum
datedate
published_atts
locks_atts
model_versionstr
pick
iduuid
slate_idfk
rank1..3
player_idfk
proj / salary / valuenum
blurbtext
platformenum
result (nullable)enum
player
iduuid
ext_idstr
name / team / posstr
injury_statusenum
updated_atts
user
iduuid
device_idstr
push_tokenstr?
prefsjsonb
streakint
Next → answer Q1–Q6 · then wire into UI as real states, empty/loading/error handling.
Early access

Be first in line.

Daily DFS edge. Data-driven picks. One app. See you at 9 AM ET.