BE THE HOUSE
CASE STUDY
iOS + WEB
SWIFT + SUPABASE
DESIGNED & BUILT BY TYLER
Booki

Booki: Be The House

A case study in designing, building, and shipping a full-stack sports betting platform as a solo product designer.

visit bookisports.com →
jump to interactive prototype ↓
Organizer Dashboard
Member Games View
01 // problem

The House Always...

Prediction markets are booming and sports betting is mainstream, and every friend group already has a little action on the game. The natural next question: why not run the book yourself?

But the tools that exist today weren't built for you. Pay-per-head platforms are archaic, clunky, and designed for offshore operations, not someone organizing picks for ten friends. They charge $5-10 per player per week, which means even a small 20-person group is burning $400-800/month. There was nothing modern, nothing affordable at small scale, nothing that looked like it belonged on your phone in 2026.

I saw a gap: a trust-first platform for private sports betting groups: simple to set up, beautiful to use, and priced as flat-fee SaaS instead of per-head extraction.

02 // role

My Role

Everything. Product strategy, UX research, interaction design, visual design, design system, frontend engineering (SwiftUI + web), backend architecture (Supabase Edge Functions, PostgreSQL), marketing site, SEO, content, and go-to-market.

~2 mo Timeline
789 Commits
43K+ Lines of Code

Stack: iOS (Swift 6 / SwiftUI / SwiftData), Web (Alpine.js SPA), Backend (Supabase / PostgreSQL / Deno Edge Functions), Payments (Stripe + Apple IAP), Email (Resend).

03 // strategy

Strategic Framing

Two-Sided Product, One Interface

Booki serves two users with fundamentally different mental models:

  • Organizers think in risk, exposure, and settlement cycles. Their job is managing a group.
  • Members think in odds, picks, and balances. Their job is placing bets and knowing where they stand.

Rather than building two separate apps, I designed a single product with role-gated experiences: shared data model, divergent UIs. This kept the codebase manageable while letting each side feel purpose-built.

Organizer View
Organizer: Members & Balances
Member View
Member: Games & Odds

Trust as Core Product Value

In betting, disputes are inevitable. The #1 feature isn't odds or grading; it's proof. Every design decision laddered up to a trust thesis:

  • Tamper-evident ledger — financial entries are hash-chained, making retroactive edits cryptographically detectable. This isn't just backend architecture; it's a product differentiator I surface in marketing copy.
  • Server-authoritative operations — all critical actions (submitting, grading, settling) execute on the server with idempotency protection. The client can't fabricate results.
  • Full audit trail — every bet, grade, settlement, and balance adjustment is logged with timestamps and actor IDs. Both sides can verify history.

This wasn't over-engineering. It was the insight that in a trust-deficit domain, the product is the audit trail.

Mobile-First as Strategy

The thesis: meet the user where they already are: their phone, mid-game, on the couch with friends.

The younger demographic I was targeting doesn't sit at a desktop to manage bets. They're texting odds in group chats, checking scores between plays, settling up over Venmo. An iOS app wasn't just a platform choice; it was a UX bet that the entire experience needed to feel as fast and casual as sending a text.

That conviction shaped everything downstream:

  • Offline-first architecture — SwiftData stores everything locally so the app feels instant. No loading spinners between screens. This matters when someone is placing a pick 30 seconds before tip-off.
  • Auto-pilot as the default — a younger casual group doesn't want to manually approve every bet. The system should just work. This was a product decision that only makes sense when you're designing for the low-attention, high-frequency use case of a phone.
  • The eventual pivot — after building the full native experience, I discovered the download was the biggest friction point. The web-first repositioning didn't invalidate the iOS strategy; it validated that the UX patterns I prototyped natively (bet slip persistence, sport tab browsing, quick-pick odds buttons) were the right interactions. I just needed to remove the App Store gate before people could experience them.

The iOS app was the proving ground. The web dashboard was the distribution play. The design language traveled between both because it was built from a system, not a platform.

04 // design system

Design System

I built a comprehensive design system from scratch, documented in a dedicated spec and implemented in a centralized Theme.swift file with reusable SwiftUI view modifiers. The governing philosophy: remove elements until the design breaks, then add back one thing.

Color

Dark-first with a sports-broadcast aesthetic. Electric cyan (#00F5D4) is the signature accent for actions and wins. Semantic colors are strict: cyan for wins, coral red for losses, warm orange for pending, never decorative. Gradients (cyan-to-purple) are reserved for primary CTA buttons only.

TokenValuePurpose
Accent#00F5D4Actions, wins, focus states
Secondary#9D4EDDGradients, secondary emphasis
Danger#FF6B6BLosses, errors, destructive
Warning#FFA94DPending, attention needed
Background#0A0A12App base
Card#14141FElevated surfaces

Typography & Numbers

SF Pro system font, three weights max per screen. Monospaced digits (.monospacedDigit()) everywhere; currency, odds, and scores align cleanly. Type scale runs from 34pt display (hero numbers) down to 11pt micro (chip labels).

Spacing, Radius & Motion

4pt base grid with values from 4pt to 48pt. Generous corner radii (12-16pt) for a softer feel than traditional betting UIs. Elevation through color, not shadow: featured cards get a subtle accent glow at 15% opacity instead of drop shadows. Motion uses critically damped springs (0.7-0.8 damping), all honoring prefers-reduced-motion.

Components

Standardized as reusable view modifiers: .cardStyle(), .elevatedCardStyle(), .glowingBorder(), .gradientText(). Every card, button, input, badge, and list row pulls from the same token set, consistent across 67 views without any one-off styling.

05 // decisions

Key Design Decisions

1. Auto-Pilot as Default

Most betting platforms start with manual controls and let users automate later. I inverted this.

New organizers get a fully automated system: bets auto-accept, games auto-grade when final scores come in, settlements auto-calculate. Manual approval and manual grading are opt-in toggles buried in settings.

Why: The target user isn't a professional bookie; they're someone organizing bets for friends. They don't want to manually approve every bet. The first experience should feel effortless, with power controls available when needed.

This single decision shaped the entire backend architecture. Auto-grading required sport-aware logic (moneyline, spread, totals each grade differently). Auto-settlement required atomic database transactions. Live score polling required smart API call budgeting.

2. Standalone-First Onboarding

Early versions required users to choose "Organizer" or "Member" at signup. Conversion data showed this fork paralyzed new users who just wanted to explore.

I redesigned onboarding to drop everyone into a standalone player experience with a synthetic $10K credit line and 25 open bet limit. No group needed. Just browse games, place picks, and see how it works.

The "Become an Organizer" upsell lives in the Account menu: one tap creates a bookie record, and the UI transforms. The upgrade path follows exploration, not precedes it.

3. Attention Tags for Organizer Intelligence

Organizer dashboards in competing products show raw numbers. I designed an attention tag system that translates data into actionable signals:

  • Picks Pending — bets awaiting manual approval
  • Overdue — balance outstanding past threshold
  • On Heater / Cold Streak — recent win/loss patterns
  • Whale — disproportionately large stakes
  • Parlay Demon — heavy multi-pick activity

Tags are tappable with explainer modals so organizers understand why a member is flagged. The Members list is filterable by tag, turning a flat list into a prioritized action queue.

4. Bidirectional Stake Entry

Placing a bet involves two mental models: "I want to risk $50" and "I want to win $100." Most platforms pick one. I designed a bidirectional input where both fields are live-editable: entering a stake calculates the potential return, and entering a desired return back-calculates the required stake.

The challenge was preventing feedback loops. Both fields update each other in real-time, so without careful state management, editing one triggers a write to the other, which triggers a write back. I built a focus tracking system that knows which field the user is actively typing in and only calculates in one direction at a time. A custom numeric keypad keeps the bet slip compact; the system keyboard would eat half the screen and push the slip out of view.

5. Two-Sided Data Perspective

The same bet, the same balance, the same settlement looks different depending on who's looking at it. An organizer sees "+$50 won from Tyler" in green. Tyler sees "-$50 lost to the house" in red. Same transaction, opposite emotional context.

This isn't just flipping a sign; it's two mental models of the same data. Color, direction, and language all shift based on role. The organizer's dashboard frames everything as risk and exposure. The member's view frames everything as picks and potential return. Designing this required thinking about every data point from both perspectives simultaneously, ensuring the shared backend produces role-appropriate presentations without duplicating the underlying model.

06 // architecture

Information Architecture

Organizer: 5-Tab Structure

TabPurposeKey Pattern
DashboardPnL trends, risk watchlist, exposure metricsTime-selector filters headline number
PicksAll bets with status/type/member filtersCard-based detail view
MembersRoster with attention tags and capacityInline search + 6 smart filter chips
EventsSport categories as cards, league sub-tabsShared events architecture
SettingsProfile, subscription, pick managementMenu page with detail views

Member: 4-Tab Structure

TabPurposeKey Pattern
GamesBrowse events with sport tabsHorizontal sport scroller, compact cards
SearchFull-text team search by sport/leagueDedicated tab for discoverability
TrackBet history with ticket groupingOpen/graded toggle, scores inline
AccountBalance, activity, profile, preferencesCard-based layout with stats

The asymmetry is intentional. Organizers need more surface area (5 tabs) because their tasks are more varied. Members need speed (4 tabs) because their primary action is singular: find a game, place a pick.

Organizer Dashboard
Organizer: PnL Dashboard
Member Games
Member: Browse & Pick
07 // platform

Platform Parity: iOS + Web

The web dashboard provides feature parity for organizers who prefer desktop. Key differences are intentional, not compromises:

  • Bet slip: Fixed sidebar on desktop (340px), floating sheet on mobile, each native to its input paradigm.
  • Member detail: Inline grid editing on web, modal sheets on iOS.
  • Navigation: Hash-based routing with responsive sidebar (collapses to hamburger on mobile).

Both clients share the same backend, Edge Functions, and real-time subscriptions. Data changes on one platform appear on the other within seconds.

Booki Web Dashboard

Organizer Web Dashboard

08 // growth

Marketing & Growth

Landing Site

8-section homepage with scroll-reveal animations, dedicated features page with mixed layouts, and a comparison section that positions Booki against traditional PPH pricing.

SEO & Content

  • Structured data (JSON-LD), Open Graph tags, and sitemap on all pages.
  • 3 bottom-funnel SEO landing pages targeting search intent ("PPH alternative," "bookie software," "ledger software").
  • Blog with 8+ articles, staggered publish dates, FAQPage schema on comparison posts.

Web-First Pivot

Originally positioned as an iOS app with a web companion. I pivoted to web-first messaging, replacing App Store CTAs with "Get Started Free" links to the web dashboard. This removed the friction of requiring a download before experiencing the product.

09 // technical

Navigating Technical Complexity as a Designer

This section isn't about showing off code; it's about demonstrating that I understand the systems I'm designing for, and that my design decisions account for real engineering constraints.

  • 26 Edge Functions handling everything from bet submission to Stripe webhooks to Apple IAP verification. Each function enforces its own authorization, idempotency, and audit logging.
  • 27 database migrations evolving the schema from a simple bet tracker to a multi-tenant platform with hash-chain ledger integrity, atomic settlement transactions, and row-level security policies.
  • Smart API budgeting — the live scores system estimates game durations by sport and only polls the Odds API when games are in their finishing window. (Answer: 5 minutes during the last 30 minutes of a game.)
  • Offline-first architecture — local storage for everything, cloud sync when online. The app feels instant, and I designed loading states around sync completion rather than network latency.
10 // prototype

Interactive Prototype

Tap through the app below

11 // outcomes

Outcomes & Reflection

~2 mo Timeline
789 Commits
43K+ Lines of Code
67 iOS Views
26 Edge Functions
27 DB Migrations
16+ Landing Pages
142 Stress Test Assertions

What I'd Do Differently

  • Start with the web dashboard, not iOS. The web-first pivot was the right call, but I'd have reached it faster by shipping the web experience first and treating native as the upgrade.
  • Research App Store restrictions earlier. I was excited to build a native iOS app, and my initial research suggested it was possible. But Apple recently tightened restrictions on solo developers publishing gambling-adjacent apps, which put most of the iOS work on hold. A deeper dive into App Store policy before committing to native would have saved significant time and reframed the project scope sooner.
  • Validate before building. I was excited to build something I thought my friends and I would use, but the target user turned out to be a tight niche. I spent too much time on features and not enough getting the product into real hands early. A leaner MVP and earlier distribution thinking would have surfaced that sooner. The process was a valuable learning experience, but next time I'd prioritize user validation over feature depth.

What This Demonstrates

  • End-to-end product ownership — from market insight to information architecture to pixel-level UI to production backend to marketing site.
  • Product-minded design — every design decision tied to a business thesis (trust, pricing as positioning, compliance as UX win).
  • Systems thinking — designing across iOS, web, and server-side with consistent mental models and intentional platform divergence.
  • Technical fluency — not just "familiar with code" but shipping production systems with real architectural tradeoffs.
  • Constraint-driven creativity — App Store compliance language becoming a friendlier product voice; API rate limits becoming smart polling; pricing model becoming brand positioning.
contact

tylerbkung@gmail.com

resume LinkedIn GitHub

Design + Code by Tyler Kung