← All work

Project 02 · Product design · 0→1

Runtiva

Building a multi-format fantasy sports platform from 0 to 1. The goal was one app where classic, private-group and survival contests feel like modes of the same product, not separate products bolted together.

Role
Product Designer
Stage
0→1
Market
US fantasy sports
Platform
iOS & Android
Runtiva Groups screen: a 'Have a code?' join card, a list of six groups with LIVE and ORGANIZER badges, a Create Group button and the bottom navigation.

The question

How might we create a unified fantasy sports experience that supports different contest formats, without making the product complicated?

  • UX architecture
  • User flows
  • Wireframes
  • Interaction design
  • UI
  • Design system
  • Prototyping
  • Dev handoff

01

There was a product idea, but not yet a product experience

When I joined, Runtiva was at an early stage. There was no established product experience, design system or mature UX architecture to build on.

What we had

  • A defined business and product direction
  • A target market: US fantasy sports
  • Product requirements
  • An understanding of the category
  • Established competitors to learn from

What we didn't have

  • An information architecture
  • Mature user flows
  • A design system
  • Established interaction patterns
  • Any product behaviour data
  • A proven navigation model

My responsibility

  1. Product requirements
  2. UX architecture
  3. User flows
  4. Wireframes
  5. Interaction design
  6. UI
  7. Design system
  8. Prototyping
  9. Developer handoff
  10. Iteration

02

We weren't designing in a vacuum

Fantasy sports already has strong players in the US. I studied them to understand how users discover contests, read formats and rules, build teams and track results. The aim wasn't to copy their interfaces.

114features audited
14feature categories, from discovery to withdrawals
6US apps compared side by side
1competitor (Splash) runs paid DFS, private and survivor together

Competitor matrix

AppDaily fantasy formatsPrivate contestsSurvivor poolsIn-app chat
DraftKingsSalary cap, snake, best ball; Pick6 in a separate appYes friends contestsPartly Sportsbook app only (21+)Not found
FanDuelSalary cap, single game, daily snakeYes Friends ModeNot foundNot found
PrizePicksPick'em (Player Picks)Not foundNot foundNot found
UnderdogPick'em, daily drafts, best ballPartly private best ballPartly elimination best ballNot found
SleeperPlayer Picks (more/less)Yes free leaguesPartly free onlyYes almost every screen
Splash SportsQuick Picks, Tiers, One & Done, salary capYes commissioner-ledYes paid, private & publicYes in private contests

"Not found" means no evidence in store listings or press coverage, not confirmed absence. Researched October 2026.

Where the gaps are

Paid pools with built-in social

Chat only exists at Sleeper (free pools) and inside Splash private contests. Everyone else leaves the social layer out.

Private contests as groups

DraftKings and FanDuel treat private contests as an invite-only lobby filter, not a group with members, history and an organiser.

One app for every format

DraftKings splits DFS, Pick6, Predictions and survivor across separate apps. One account and one entry flow is an open space.

Survivor in the fantasy app

DraftKings' paid survivor lives in its Sportsbook app, limited to 21+ and betting states.

Trusted pot handling

Only Splash and Sleeper hold private-pool money. Commissioners need in-app collection and payouts.

Fantasy-first positioning

Every competitor now bolts prediction markets into or beside fantasy. A calm, skill-and-friends product stands apart.

Why social matters

Fantasy players are already social offline: 84% hold a draft party (FSGA). Sleeper reports that over 90% of its growth came from friends inviting friends, and that users spend about 50 minutes a day in season with chat a swipe away. These figures are company-reported and show direction, not audited results.

03

Multiple formats. One product.

Each format brings its own rules, team structures, scoring, durations and entry requirements. Users still shouldn't feel like they're entering a different product every time they switch formats.

Different contest experiences should feel like different modes of the same product, not completely different products.
RuntivaNFL · NBA · MLB · NHL · Cricket
ClassicSingle game & multi-game · salary cap · public lobby
Private groupsInvite code · organiser · group leaderboard · chat
SurvivalSeason-long entry · weekly elimination · players remaining
Shared journey
  1. Discover
  2. Understand
  3. Select
  4. Build
  5. Review
  6. Enter

04

Before designing screens, I needed to understand the system

Users could have several contests, several teams, different formats, upcoming games and a history. The structure had to scale as more formats and features arrived.

Home
  • Sport tabs: All, NFL, NBA, Cricket
  • Promo banners
  • Community: groups & survivor pools
  • Upcoming games by sport
  • → Single game detail
Groups
  • Join with a code
  • Your groups
  • Organiser tools
  • Group contests
  • Create group
My Games
  • Upcoming
  • Live: scores & standings
  • History: results & winnings
  • Joined contests per game
Chat
  • Group conversations
  • Reactions
  • Contest moments
Profile
  • Wallet: deposit & withdraw
  • Transactions
  • Identity verification
  • Referrals

Inside a game: Single game detail → Contests / My Contests / My Teams → Contest detail (Prizes, Leaderboard, Scoring rules) → Create team → Success.

05

From discovering a contest to entering it

At each stage the user has a different decision to make: what the contest is, which format it uses, what's required, how to build a team, and what happens after they submit.

  1. DiscoverBrowse upcoming games by sport on HomeFormat badge and entry fee + prize shown together on every card
  2. UnderstandOpen a game, compare its contests"How to play" per format; filters by fee, type and prize
  3. SelectContest detail: prizes, leaderboard, rulesDual CTA: Reserve entries (outlined) vs Join | $49 (filled)
  4. BuildPick players into position slotsSalary cap tracker pinned to the bottom
  5. ReviewCheck the final lineup and costLock countdown always visible; edit until submit
  6. Enter"You're in the game!" confirmationLocked team, entry ID and more contests for the same team

06

How the contest flow evolved

The contest flow went through four major versions in six weeks. Each round I walked the prototype end to end, checked it against the pain points in the journey map and the audit, and fixed what got in people's way.

The contest card, four ways

$10K$5
⚡ BoosterG
V1 · Sep 4Prize first, fee as a button. Badges are icons and letters.
$35M$49
CM 3Classic
V2 · Sep 25Bigger fee button, plus a cryptic "C · M 3" shorthand for format and entry limit.
ClassicMax 3 entriesJoined 1 of 3
$25,000
$49
V3 · Oct 5Plain-language badges, the user's own entry status, and a quieter fee.
Prize$25,000Entries1 of 3Fee$49
✎ Edit team+ Add entries
V4 · Oct 14Stat columns you can compare at a glance, with actions right on the card.

Version by version

New or changed in this version

07

Three journeys, one emotional arc

I mapped how users move through each contest type, 19 stages in total, to find where trust, anxiety and excitement peak. Choose a journey, then a stage.

08

The challenge wasn't adding information. It was making it understandable.

Player selection is the densest screen in the app: positions, stats, salary, ownership, injuries and rules, all under a deadline. I decided what users need at each moment, and pushed everything else back.

IND vs AUS⏱ 2h 14m
WK 1BAT 3AR 2BOWL 3
Player nameWK · IND · Own 42%
$9.2k+
Player name INJBAT · AUS · Own 18%
$7.8k+
Player nameAR · IND · Own 31%
$8.4k+
Player nameBOWL · AUS · Own 9%
$6.1k+
Salary left$50,000
Slots0 / 11
Fill 9 more slots
  1. Lock time, always visible. The deadline sits in the header, so users never lose track of time while they're deep in the list.
  2. Position slots as tabs. Labels explain unfamiliar roles such as Cricket's WK, BAT, AR and BOWL in context.
  3. Decision data inline. Salary, FFPG and ownership % sit on each row, and injury flags appear right where the pick happens.
  4. Cap tracker pinned to the bottom. Remaining salary and filled slots update live, so users don't have to do salary-cap maths in their head.
  5. The CTA explains itself. "Fill 9 more slots" stays disabled until the roster is valid, and says what's missing.

—

A key decision: what stays the same, what adapts

For every format I decided which patterns stay shared across the product and which behaviours adapt to that format.

Shared across every format

  • Navigation and bottom tabs
  • Contest discovery and contest cards
  • Contest information layout
  • Team management
  • Player-selection patterns
  • Confirmation and feedback states

Adapts to the format

  • PrivateGroup leaderboard tab, member avatars on the card, custom rules shown as a diff from standard
  • SurvivalEntry covers the full season, survival bar against the elimination line, "players remaining" counter
  • Survival"Safe pick vs upside pick" labels based on FFPG consistency
  • ClassicSingle-game vs multi-game badges, salary cap and multi-entry limits

09

Designing for scale, not just the first release

Because Runtiva started from scratch, I could build reusable foundations instead of designing every screen on its own. The system had to absorb new formats without breaking consistency.

Foundations

Background#121217 Surface#1D2128 Accent#00C9A7 Alert#EF4444 Warning#F59E0B
  • Colour tokens
  • Typography
  • Spacing
  • Buttons & inputs
  • Cards
  • Navigation
  • Bottom sheets & modals
  • Player components
  • Contest components
  • Status & feedback

Contest card component

ClassicGM · Max 3
Ultimate Battle Arena
Prize pool$25,000
1.5k joined3,500 spots
Reserve entriesJoin | $49
Classic Format badge G Guaranteed M Multi-entry Fill progress

10

A product doesn't only live on the happy path

I designed for what users see off the ideal path: empty, loading, error, validation, no results, unavailable contests, incomplete teams, deadlines, unavailable players and network states. Here are some of the empty states I illustrated.

Empty My Games state: faded contest ticket
My Games: no contests yet
Empty live match state: faded scoreboard
Live: no match in progress
Empty teams state: faded jerseys
My Teams: no team created
Empty chat state: 'Chat is empty — be the one to break the ice'
Chat: break the ice
Empty referrals state: gift box, 'No referrals yet'
Referrals: none yet

—

Good UX has to survive implementation

The design kept evolving as I worked with engineering. Where an interaction had technical implications, I worked with the engineers to validate feasibility, clarify behaviour, define states, resolve edge cases and simplify where needed.

11

What I contributed

Because this was a 0→1 product, the outcome was more than a redesigned interface.

Product

  • Translated requirements into a structured UX
  • Established the core user journeys
  • Designed for multiple contest formats

UX

  • Defined the information architecture
  • Designed the core workflows
  • Established interaction patterns
  • Covered edge cases and system states

Design system

  • Created reusable components
  • Established design foundations
  • Built patterns that scale across the product

Delivery

  • Collaborated with product and engineering
  • Supported implementation
  • Iterated on feasibility and feedback

What I learned

  1. Architecture comes before polish. A beautiful screen can't make up for a confusing product structure.
  2. Consistency doesn't mean identical. A scalable product needs shared patterns that still allow context-specific behaviour.
  3. Design continues after handoff. Some of the most important decisions happen while working out with engineering what's feasible to build.