Typography:
Clean, legible sans-serifs throughout. Headlines have weight. Body copy breathes. Nothing competes with the interface data.
Pool is a serious sport. Millions of players. Organized leagues. Real money changing hands after real games. And the software supporting all of it? Embarrassing.
No unified platform. No verified rankings. No way to find local opponents, challenge them, set a wager, play the match, and get paid - all in one place. Players were texting each other on WhatsApp, settling bets in cash, and arguing about results with no record of anything.
The client came to us with a clear vision and a hard problem: build the platform that pool actually deserves. Not a hobby app. Not a social network with a billiards skin. A real competitive infrastructure - with ELO ratings, wagered matches, tournament brackets, verified results, and a wallet that moves real money.
We said yes. Then we got to work.
A full competitive ecosystem for pool
players. One app. Everything inside.
That loop sounds simple. Building it
correctly is not.
Before a single screen was designed, we solved the brand.
Pool is a sport of geometry, precision, and tension. The logo needed to carry all three. We landed on a mark built around the cue and ball at the moment of contact - the exact instant the game is decided. Clean lines. High contrast. Works at 16px on a notification badge and at 200px on a splash screen.
The name Cue Contact Pro does real work. It signals the sport, the moment of action, and the level of player being addressed - Pro isn't aspiration, it's a filter. This platform is for people who take the game seriously.
Color palette: deep forest green anchored by clean white and dark backgrounds. Not the neon-and-chrome aesthetic of fantasy sports apps. Something calmer, more confident - like a well-maintained pool hall that knows it's the best one in the city.
We started with a full user journey audit. The user types from day one: authenticated players and guests. Every feature had to account for both states - what a guest sees, what they're offered, and exactly where the friction is designed to convert them into registered players.
The complexity surface became clear fast:
a match between two players isn't just two
people agreeing to play. It's a challenge
sent, a challenge received, a wager agreed
upon, a venue selected, a time confirmed,
a result reported by both sides, and money
moved accordingly.
Each of those steps has a counterparty.
Each counterparty has their own screen
state. Each state has edge cases - no-show,
dispute, reschedule request,
cancellation with penalty, expired
challenge.
We mapped it all before Figma was opened for design. That discipline is why the final product has no dead ends.
Wireframe modules completed:
Dark mode and light mode. Both built properly. Neither an afterthought.
The design system anchors on forest green (#1A3A2A
range), clean whites, and deep blacks - with a single high-
energy accent (bright green) reserved exclusively for
primary CTAs and active states. Color does real work here.
Green means go. Red means stop or warning. Yellow
means caution. Users learn the language in the first
session and never have to think about it again.
Clean, legible sans-serifs throughout. Headlines have weight. Body copy breathes. Nothing competes with the interface data.
Clean, legible sans-serifs throughout. Headlines have weight. Body copy breathes. Nothing competes with the interface data.
Required a full calendar component with time picker, confirmation states, acceptance/ decline states, and countdown displays. That's more UX work than most entire apps.
Eight screens minimum before a user reaches the home screen - and none of them feel like a chore.
The wallet setup and age verification are load-bearing from a regulatory standpoint. We designed them to feel like milestones, not interrogations. By the time a user hits the home screen, they've set up everything needed to participate fully - payment method, verified age, verified location. No friction later.
Guest mode runs in parallel. A guest can browse the app, see the leaderboard, view player profiles, and understand the full value proposition before committing to registration. The guest profile screen has one job: "Build your player identity." It converts.
The home screen answers three questions immediately:
Stats widget: wins, losses, ELO rating, total earnings. Leaderboard preview: top players with ratings. Upcoming Matches feed: next games with countdowns. And if the wallet needs attention - a persistent prompt to add funds before an opportunity is missed.
Dense, but never cluttered. Information hierarchy designed to reward the experienced user while remaining legible to someone opening the app for the first time.
Real money. Built accordingly.
The wallet handles two rails: card payments (full card entry flow with Visa/Mastercard/Amex) and digital wallets (Apple Pay, Google Pay). Deposits and withdrawals both fully designed - custom amount entry, preset amounts ($30, $50), withdrawal to bank account.
Transaction history shows every movement: wager wins in green, losses in red, deposits and withdrawals clearly labeled. Every transaction has a detail view.
The wallet setup flow includes age verification (date of birth entry) and location verification (native iOS/Android geolocation permission with a proper "why do we need this?" explanation screen). These aren't legal checkboxes - they're trust signals. We made them look like it. Empty wallet state has one purpose: get the first deposit. The CTA is clear. The path is short.
Two views. One purpose: find someone to play.
List View: Players ranked by ELO with location and availability. Search. Filter by range, skill level, availability. Each player tile shows their record, rating, and a direct Challenge CTA. One tap to initiate.
Map View: The same player data rendered on a real map with player pins and venue markers. Filter by distance. Tap a pin to see the player card. Tap "Challenge" directly from the map. Pool halls visible as venue markers - so you can find a player and a venue in the same view.
The keyboard and filter system is fully built out - not a placeholder. Multi-select filters, sort logic, persistent state across sessions.
The most complex form in the app. Also the most important one.
Step 1: Select opponent (from Find Players or direct search)
Step 2: Choose game type
Step 3: Set wager amount (custom keypad, no preset limits)
Step 4: Select date (full calendar)
Step 5: Select time (time picker with AM/PM)
Step 6: Choose venue (map view with venue pins, or list view)
Step 7: Review & Send
Every step has a back path. Every step has validation. The wager keypad handles edge cases - no negative numbers, no amounts exceeding wallet balance, clear error messaging when funds are insufficient with a direct path to deposit. The challenge arrives to the opponent as a notification. They see the full terms before accepting. If they decline, the challenger is notified immediately. If they don't respond, the challenge expires - and both parties see the expired state with a "Send New Challenge" option.
This is where the engineering of the UX shows. A match
between two players can exist in more states than most apps
handle in their entirety.
Countdown timer. Match details.
Venue. Option to Propose New
Time or Cancel.
Full calendar + time picker.
Request confirmation sent.
"Proposed Change" with Accept/
Decline. Reschedule Accepted/
Declined fully designed.
Cancellation policy display.
Penalty selection (who pays).
Confirm Cancel. Match Cancelled
confirmation with refund detail.
Challenge sent. Waiting for
opponent response. Timeout
state if no response.
Result reporting. Both players
submit their score. Disputed result
flow. Result confirmed - money
moves.
Report No-Show flow.
Confirmation required. Admin
escalation path. Resolution states.
Opponent view of a challenge
received. Full terms visible. Accept
or Decline. Cancellation of a
received challenge fully handled.
Every match screen has a
counterparty version. We
designed both. The UX works
correctly from either side of the
match.
Challenge expired without
response. Clean state. New
challenge CTA.
Multiple leagues. Multiple filters. ELO ratings visible at all times.
Leagues tab: Local League, Challenge League, Gold Tier League, Western League, Legend League. Each with its own ranking and prize pool display.
Rewards Info screen: what each tier earns, how ELO is calculated, what actions move your rating.
Filter by region, league, skill tier. The leaderboard isn't just a vanity screen - it's the motivation engine. Seeing your ELO number is why players open the app every day.
Built for organizers and participants equally.
Upcoming tournaments with prize
pools, entry fees, player counts.
Filter by entry fee range, game
type, date.
Name, game type, entry fee, prize
pool structure, date/time, venue.
Full form with validation.
Real-time bracket with live match
indicator.
Full bracket preview before joining.
Entry fee shown. Prize pool
breakdown. "Joined successfully"
confirmation. Insufficient funds
state with deposit option.
Bracket works across all rounds.
Players advance visually. Current
round highlighted, completed
matches dimmed. Most
technically demanding UI - it
works.
Categorized notification center: Challenges, Matches, Tournaments, Friends, System.
Every notification type designed: Challenge Accepted, Challenge Declined, Match Reminder, Result Submitted, Friend Request, Tournament Starting, Funds Received, Withdrawal Processed.
Notification detail view with direct action - accept a challenge from the notification without opening the full app.
All matches in one view.
Month calendar with match indicators. Tap a date to see that day's matches. Guest mode shows an empty calendar with a sign-up prompt. Logged-in view shows scheduled, in-progress, and completed matches with status indicators. Profile avatar visible on match dates - small detail, high polish.
The public-facing identity layer.
Stats: wins, losses, ELO, total earnings. Match history. Social links. Follow/Challenge CTAs. The profile is both a reputation signal and a conversion point - viewing someone's profile and challenging them is a two-tap flow.
Referral Program: Earnings display, referral code, share mechanics. Total earnings from referrals visible on the profile alongside winnings. Guest Profile: Dedicated state showing a placeholder identity with "Build your player identity" and "Sign Up" CTA. No dead end - always a path forward.
Every setting a competitive platform needs:
Payment method management is fully designed - add card flow, remove card confirmation, set as default. No partial implementation.
Help Center: Categorized FAQ structure. Account, Wallet & Payments, Match & Gameplay, Tournaments, Challenges, Advocacy & Fairness. Each category expandable. Direct support contact path at the bottom.
Why Flutter: Native-level performance on both iOS and Android from a single codebase. For an app with this many interaction states - match countdowns, real-time leaderboard updates, bracket animations - Flutter's rendering engine outperforms React Native in consistency. Every screen looks exactly as designed on every device.
Both platforms live. Zero major post-submission issues.
When two players agree to a $100 wager, that money needs to be locked the moment the challenge is accepted - not when the match starts, not when the result is reported. Building the escrow logic correctly, handling edge cases (cancelled match with penalty, disputed result, no-show), and ensuring the money always ends up in the right place required careful backend architecture. We got it right.
A single-elimination tournament bracket that renders correctly at every round, updates in real time as matches complete, and works on mobile screen - this is a genuinely hard UI problem. We solved it with a custom recursive rendering approach. It works. It's fast. It looks exactly right.
Every match screen exists twice - once for the challenger, once for the challenged. The same match, the same data, different context and different available actions. Designing and building both perspectives for every state without inconsistencies or dead ends required rigorous system thinking. We mapped it, we designed it, we built it.
Cue Contact Pro is in the market on iOS and Android. Pool players can find opponents, set wagers, play matches, report results, and get paid - all inside one app, all with a verified record attached to their name.
The sport deserved software at this level. Now it has it.
Designed and build with care by Improvs.com
Independent, founder-funded venture capital firm backing early-stage builders in AI, hardware, and consumer tech.
Self-custody crypto wallet for Gen Z and first-time users, with an AI guide, a social-style crypto news feed, and a crypto-backed debit card.
Real estate alternative investment platform with dual investor paths, FINRA exam integration, and gamification tiers.
Your submission has been received. We will be in touch and contact you soon!
Back to Homepage