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.
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
• 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.
① Data layers
What data we need, grouped by where it comes from and who owns it.
Raw slate data
- Games & start times
- Rosters + positions
- Injuries / lineups
- Weather (MLB/NFL)
- DFS salaries per platform
Projections
- Proj fantasy points
- Variance / confidence
- Usage, pace, matchup
- Model version + run ts
Picks + value
- Value score (proj÷$)
- Edge vs. market
- Top-3 ranker output
- AI blurb (cached)
User state
- Auth / session
- Preferences
- Push tokens
- Streak, tails, reads
Attribution
- CTA click events
- Partner → pick → user
- Conversions (if feed)
- Revenue reconciliation
external source
internal
core / product differentiator
user-facing output
② Architecture flow
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
③ Daily lifecycle
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
④ Open decisions
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?
Q2
Launch sports?
Q3
Salary source?
Q4
Live tracking?
Q5
Auth gate?
Q6
Regions / legality?
⑤ MVP scope proposal
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
⑥ Schema sketch
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.