Design Review

Guesslet UX Tour

Every screen, by surface. Every flow, end to end. Every UX wave from UX-5 to UX-10. Captured live from app.guesslet.com against a seeded test account.

48 screens 13 surfaces 5 brand colors Updated June 2, 2026 (UX-10)

Brand Kit

The visual identity. Palette, type, lockup, and the component primitives that show up on every surface.

Color Palette

Mint
#00FFB2 · primary CTA, logo, accents
Cream
#FFFAEC · page background, light fills
Ink
#1C1B1A · body text, headings
Stone
#94908B · secondary text, placeholders
Linen
#E8DFD0 · borders, dividers, card outlines
Mint Bright
#0A9760 · win-rule indicator (UX-7 A13)
Mint Deep
#0C7A5A · accessible pair on cream, 5.10:1
Danger Red
#E53E3E · destructive actions only

Typography

Display · Capriola 400
Group guesses for friends.
Headings, logo wordmark, screen titles, modal headers.
Body · Inter 400 / 500 / 600
Pick a side. Win the coins.
All body copy, buttons, labels, metadata.
Coin display · Capriola 400
1,000 Coins
Coin balances render in Capriola for visual weight. Per-group renameable currency keeps the unit familiar.

Logo & Components

Guesslet logo lockup
Kite mascot + wordmark, pink on cream.
Primary CTA · pill, 999px radius
Ghost · Linen border, Ink text
Destructive · red, used sparingly
Cards · 16px radius, Linen border

User Flows

Seven primary paths through the app. The first three are the core retention loop; the rest are the social and identity loops that make the group feel alive.

First-time signup
Anonymous user lands on the app, picks a sign-in method, names themselves with a pre-randomized emoji, walks through the three-slide concept carousel, and lands inside a demo group seeded with bot members, pre-loaded guesses, and chat. A tutorial checklist and a five-bubble coachmark layer guide their first real action.
🌐 Splash
Brand splash, routes to /auth
Sign in
Apple, Google, or Phone (gated)
Welcome
Display name + pre-set emoji
Carousel
Three concept slides
Demo group
Seeded bots + chat + guesses
Tutorial + coachmarks
Anchored to real UI
Make a guess
Tap the inline FAB or the desktop sticky CTA. Five steps: write the question, set the clock, make it interesting, write the rules, preview. Defaults are aggressive: anyone can pick, the proposer is the resolver, suspense mode off. The Post-now skip is one tap on Spark.
Spark
Question + answer style + harassment notice
Clock
Picks-close + result-known datetimes
Make it interesting
Reward + fate + enforcer + confidence
Rules
Win + lose + other rules
Preview
Suspense toggle + post
Make a bingo board
Seven steps. Title, mode (Race or Co-op), size (3x3 default after UX-7), squares (with AI-suggest once the title is long enough), stakes, timing, receipt. The receipt step makes empty cells tap-to-edit and offers an Auto-fill with AI shortcut. Posting with blanks asks if you want them turned into free spaces.
Spark
Board title
Mode
Race or Co-op
Size
3x3 default, 5x5 option
Squares
Edit cells, AI-suggest
Stakes
Per-cell pool + bonus prize
Timing
Closes-at + resolves-at
Receipt
Auto-fill + post
Send a chat message
Chat lives in the third tab. Type, optionally @-mention a member with autocomplete, optionally reply-quote a previous message. Send it and SSE echoes to everyone. Tap any reaction pill to toggle yours, tap the avatar stack to see who reacted. Mentions push, reactions stay silent.
Chat tab
Default landing on unread
Compose
Type, @ mention, reply-quote
Send
Optimistic + SSE echo
React
Split-tap pill, picker bottom sheet
View someone's profile
Avatars are tap-targets everywhere: chat bubbles, member rows, pick cards, mentions, who-reacted sheet. Tapping any of them opens ProfileModal. Banner full width, cropped avatar overlapping, name + tagline + streak + bio + voice line + stats grid + mutual groups + badges + Share. Same content rendered as /u/:userId for sharing by link.
Tap avatar
Anywhere in app
ProfileModal
Mount globally
Banner + stats
Full content render
Share /u/:id
Auth-gated public route
Resolve a guess
When picks close, the resolver sees a banner above the Guesses tab. Open the ResolverPanel, pick the winning option, confirm. The Resolution Takeover lands as a full-screen mint moment with the animated counter, the per-pick narrative, and a Share card. A two-minute dispute window lets two distinct members override the call before it locks.
Resolver banner
Above Guesses tab
ResolverPanel
Pick the winning option
Takeover
Animated counter + share card
Dispute window
2 min, 2 members can override
Onboard a friend into a new group
Open Create Group from the Groups tab. Pick a name, an emoji, a currency (preset chips or AI suggestions). Then the W8.F existing-people picker, sourced from /me/people, lets you bulk-invite anyone you already share a group with. They land in the new group with a Welcome system message in chat.
Groups tab
Tap Create
Name + emoji
EmojiPicker modal
Currency
7 presets + custom + AI suggest
Existing people
Bulk-add from /me/people
Welcome message
System post in chat

Every Screen, by Surface

48 of 48 captures present. Missing screens render as "capture pending" placeholders, replaced by the live screenshot once the capture script runs. Mobile viewport is 390 by 844 (iPhone 13/14 mini width). Desktop is 1280 by 900 (two-pane layout active).

Sign in

The unauthenticated entry. The kite mascot, the sign-in chooser, the legal footer. Everything before account.

Splash
/
Splash
Brand splash with the Guesslet kite mascot. Routes anonymous users to /auth and authenticated users to /groups. Shows for one tick on cold start.
Public
Sign-in chooser
/auth
Sign-in chooser
Anonymous landing page. Apple + Google + Phone (currently gated until Twilio Trust Hub clears) sign-in buttons, lockup-vertical brand mark, terms/privacy footer.
Public

Onboarding

Brand-new users only. Display-name + emoji wizard, three-slide concept carousel, and the demo group seeded on first run with bot members and pre-loaded chat so the user lands somewhere alive. Tutorial checklist and coachmarks layer on top.

Welcome, name + emoji
/welcome
Welcome, name + emoji
First-run wizard step 1. The user picks a display name and an emoji avatar. Emoji is pre-randomized from a 16-emoji pool on signup (UX-7) so brand-new users don't all start as 🎲.
Public
Tutorial checklist on demo group
/groups/:demoGroupId
Tutorial checklist on demo group
Tutorial checklist mounted at the top of the demo group (UX-8 W8.G). Compact list of CTAs: Welcome / Create group / Add people / Make a guess / Make a board / Chat / Finish. Each item auto-completes when the user performs the action; state persists server-side via POST /me/tutorial/step-seen.
Demo only
Coachmark layer
/groups/:demoGroupId
Coachmark layer
Five-bubble coachmark layer (UX-7 W7.C) anchored via data-onboarding selectors: chat-tab, guesses-tab, post-pick, member-avatar, new-group-cta. Each Got-it advances onboardingStep server-side.
Demo only

Groups list

The home screen post-auth. Every group the user belongs to with member-preview avatars, per-group balance, and the create or join entry points.

Groups list
/groups
Groups list
All groups the caller is a member of. Each card shows the group emoji + name + per-group balance + a member-preview strip (UX-8 W8.D) of overlapping circular avatars with a +N overflow. Mobile FAB opens the create-or-join modal.
Groups list, empty state
/groups
Groups list, empty state
Shown when the user has zero groups AND has already completed onboarding (so the redirect to /onboarding/welcome doesn't fire). Two CTAs: Create a group, Try a demo group (UX-8 Wave 1).
Create group modal
/groups?new=create
Create group modal
Tabbed modal (Create / Join). Group name + emoji + currency picker (CurrencyPicker with preset chips and AI suggestions). Plus the W8.F 'Add people you already know' picker (search-able list of existing people sourced from /me/people; selected users are bulk-added on group create).
Modal
Join group modal
/groups?new=join
Join group modal
Invite-code input. Backend errors (not_found / expired / exhausted / group_full) map to human sentences (UX-5 W1.4) plus a 'Copy ask' clipboard button on expired/exhausted.
Modal

Group canvas (header + tabs)

Inside a group: header, gear icon, MemberPreviewStrip, and the four tabs (Guesses, Boards, Chat, Members). Default landing favors active guesses, falls through to Members for cold groups.

Group detail, Guesses tab
/groups/:groupId?tab=guesses
Group detail, Guesses tab
Default landing tab when there are active guesses (UX-6 W1). Group header with member-preview strip linking to Members tab + gear icon for settings (UX-8 W8.D + W8.E). Sub-tabs Open / Closing / Resolved. Resolver banner above the list when the caller has a guess to call. List items are GuessCards with live countdown when picksCloseAt < 2h.
Group detail, empty Guesses
/groups/:groupId?tab=guesses
Group detail, empty Guesses
Empty Guesses tab (UX-8 W8.B Wave 1). Headline 'Make a guess', a 36s rotating ticker of 12 funny example prompts (respects prefers-reduced-motion), primary 'Make a guess' CTA + ghost 'Invite someone' secondary.
Group detail, empty Boards
/groups/:groupId?tab=boards
Group detail, empty Boards
Empty Boards tab (UX-8 Wave 1). Sample 3x3 'Group trip bingo' grid with soft column-pulse animation. Idea pills (Group trip / Family dinner / Watch party / Weekend plans) plus a primary 'Make a bingo board' CTA.
Group detail, Members tab
/groups/:groupId?tab=members
Group detail, Members tab
Members ranked by balance. Per-row avatar + name + balance + 3-dot overflow (UX-8 W8.B / Wave 1) hiding kick + block. Awards moved BELOW the members list (UX-8 W8.D).
Group settings modal
/groups/:groupId?tab=members&settings=open
Group settings modal
Owner-only modal opened from the gear icon in the group header (UX-8 W8.D). Rename / emoji / currency / live-event delay / banner image / delete group.
Modal

Make-a-guess composer

The 30-second guess creation flow. Five steps after UX-7 dropped Room: Spark, Clock, Stakes, Rules, Preview. Each step is one focused decision; backward navigation is a tap on the dot indicator.

Composer, Spark (step 1/5)
/groups/:groupId?tab=guesses&compose=open
Composer, Spark (step 1/5)
Step 1 of the 5-step composer (UX-7 reduced from 6). Question input, AnswerStyleField, harassment notice directly under the input ('Play nice! Don't use guesslet to harass or bully people.'), 'Post now (skip)' fast-path that auto-assigns the proposer as resolver.
Modal
Composer, Clock (step 2/5)
/groups/:groupId?tab=guesses&compose=open&step=2
Composer, Clock (step 2/5)
Picks-close + result-known datetime fields with QuickTimeChips. UX-7 A3: bold day/time on the right of each pill row.
Modal
Composer, Stakes (step 3/5)
/groups/:groupId?tab=guesses&compose=open&step=3
Composer, Stakes (step 3/5)
Winner reward (coins-from-pool checkbox + custom text), Loser fate (optional), Enforcer (optional, placeholder 'Group members'). ConfidenceField with 'How likely is this guess?' label and the layered ChancesSlider (gray track z-0, mint fill z-1, pink thumb z-10).
Modal
Composer, Rules (step 4/5)
/groups/:groupId?tab=guesses&compose=open&step=4
Composer, Rules (step 4/5)
Win rule + lose rule + other rules text fields. Win-rule indicator uses the brighter mint-bright token (UX-7 A13).
Modal
Composer, Preview (step 5/5)
/groups/:groupId?tab=guesses&compose=open&step=5
Composer, Preview (step 5/5)
Final preview. 'Everyone stays anonymous until the result drops' suspense toggle. Header reads 'Preview' (UX-7 A14, dropped 'The'). Submit button posts the guess.
Modal

Bingo board composer

Bingo board creation. Seven steps from title through stakes to receipt. Defaults to 3x3, AI suggests squares once the title is long enough, the receipt step lets the user tap empty cells inline or auto-fill them with AI.

Board composer, What's this about (step 1/7)
/groups/:groupId?tab=boards&compose=open
Board composer, What's this about (step 1/7)
Step 1: title input. Header reads 'What's this board about?' (UX-7 B1). Defaults to 3x3 (UX-7 B2).
Modal
Board composer, Squares (step 4/7)
/groups/:groupId?tab=boards&compose=open&step=4
Board composer, Squares (step 4/7)
3x3 grid editor with FREE space at center. 'Suggest squares with AI' button enabled once the title hits MIN_TITLE_LEN_FOR_AI (re-evaluates from live form state per UX-7 B4 fix).
Modal
Board composer, Receipt (step 7/7)
/groups/:groupId?tab=boards&compose=open&step=7
Board composer, Receipt (step 7/7)
Final preview with mini grid. UX-7 B8: empty cells are tap-to-edit (open CellEditSheet inline) AND there's an 'Auto-fill empty squares with AI' button at the top. UX-7 B9: posting with empty cells triggers a 'Continue and turn the blank squares into free spaces?' confirm modal.
Modal
Board purpose selector
/groups/:groupId?tab=boards&compose=open&step=2
Board purpose selector
PurposeStep in the board composer (Wave C). Two large tap-targets: 'Predictions' (link guesses to cells) and 'Goals' (personal + shared goal tracking). Purpose drives cell-kind defaults and mark-authority rules for the whole board.
Modal

Bingo boards

The bingo surface inside a group. List of boards plus inline detail (UX-9 ?board= search param) so opening a board never unmounts the group chrome.

Boards tab, list
/groups/:groupId?tab=boards
Boards tab, list
Boards tab populated. Each row shows board image (or 🎲 fallback) + title + size + race/co-op + closes-at. Tapping a row opens the board IN-LINE (UX9-2) via ?board=ID, group chrome stays.
Board detail, inline in Boards tab
/groups/:groupId?tab=boards&board=:boardId
Board detail, inline in Boards tab
Board open inside the Boards tab via UX9-2 ?board= search param. ReachBanner above the grid. BoardGrid renders the 3x3 cells with tap-to-claim and live SSE updates. '← All boards' link clears the param.
Goal board with marks
/groups/:groupId?tab=boards&board=:goalBoardId
Goal board with marks
Board detail showing a goal-purpose board (Wave D). Goal cells display the personal-mark ring (dotted mint border + corner badge) and the official-mark pink fill independently. The board-level reaction chip strip sits above the tab strip.
Cell with personal mark
/groups/:groupId?tab=boards&board=:goalBoardId
Cell with personal mark
A board cell showing both an official group mark (pink fill) and the current user's personal mark (corner badge). CellSheet reveals mark history for both layers, or 'No marks yet' when neither is set.
Board chat thread
/groups/:groupId?tab=boards&board=:goalBoardId
Board chat thread
Chat tab inside a board detail (Wave D). Board-scoped messages separate from the group chat, with a '+ Message' composer and 'Be the first to comment on this board' empty state. SSE-wired in Wave E for live board.message.posted delivery.

Group chat

Group chat. UX-5 W2 made messages a first-class lane: per-message reactions with attribution, @-mention autocomplete with push, reply-quote tap-to-scroll, and a viewport-fit composer that survives the iOS keyboard.

Chat tab, populated
/groups/:groupId?tab=chat
Chat tab, populated
Group chat with realistic history. Messages from multiple users with reactions (split-tap pill: emoji+count toggles, avatar stack opens WhoReactedSheet). Mention chips highlight pink. Composer pinned at bottom inside a viewport-fit container (UX-8 W8.A): 100dvh - chrome - safe-area-inset-bottom.
Chat composer, mention autocomplete
/groups/:groupId?tab=chat&compose=mention
Chat composer, mention autocomplete
Composer with @-mention autocomplete dropdown showing matching group members. Server parses mentions and pushes 'mentioned_in_chat' to each (excluding the author per UX-9 W9.4 self-exclusion).
Message with reactions
/groups/:groupId?tab=chat#m-:messageId
Message with reactions
Single message bubble with a reaction pill row: 🔥3 👀2. Tap the count area to toggle your reaction (idempotent per UX-8 W8.C). Tap the '+' to open MessageReactionPicker bottom sheet.
Moment

Activity feed

The cross-group action feed at the Activity tab. UX-10 W2.2 added priority-sorted lanes so the user lands on actionable items first: needs-your-pick, closing-soon, needs-your-resolution, mention, then result-dropped and general social. Empty groups land on a gentle prompt to make a guess or join a group.

Activity tab, quiet state
/activity
Activity tab, quiet state
Activity tab with no events. Empty-state copy: 'Quiet around here. Make a guess or join a group to see activity.' (UX-10 W2.2). 'See my groups' primary CTA returns the user to the Groups tab.
Activity tab, populated
/activity
Activity tab, populated
Activity feed with mixed lanes (UX-10 W2.2). Lane order: Action needed (top), Result, Drama, Just so you know. Each card shows the group emoji + lane icon, headline, lane reason, and time-ago. Cards tap through to the related guess, board, or group.
Activity, Needs your pick at top
/activity
Activity, Needs your pick at top
Top-priority Activity card: open guess in your group with picks closing in under 30 min and you haven't picked. Reason reads 'Pick now -- closes in N min'. Tapping the card opens the guess detail. UX-10 W2.2 promoted this above all other lanes.
Activity, Closing soon (you picked)
/activity
Activity, Closing soon (you picked)
Activity card for an open guess you've already picked, closing within 2 hours. Reason reads 'Closing in N min'. Sits below 'Needs your pick' but above resolutions and drama, so you can rally a friend or grab the screenshot before lock.
Activity, Needs your resolution
/activity
Activity, Needs your resolution
Activity card when the viewer is the designated resolver and picks have closed. Reason reads 'Resolve now'. Tapping the card opens the guess detail with the resolver call surface. UX-10 W2.2 sits this immediately under 'Needs your pick' and 'Closing soon'.

User profiles

Identity surfaces. Tap any avatar anywhere and ProfileModal mounts. Banner + cropped avatar + bio + tagline + voice line + stats grid + mutual groups + badges. Same content powers /u/:userId for share-by-link.

Profile modal (someone else)
/groups/:groupId?tab=members&profile=:secondMemberUserId
Profile modal (someone else)
Tap any avatar anywhere → ProfileModal mounts (UX-6 W3). Banner full-width (UX9-3) with avatar overlap. Display name + tagline + streak + member-since + bio + voice line + stats grid (guesses created / picks placed / win rate / biggest win) + mutual groups + badges + Share button.
Modal
Profile edit modal, cropping
/you?edit=open
Profile edit modal, cropping
Own-profile editor (UX-6 W3). Banner crop (3:1 ratio) and avatar crop (1:1) via react-image-crop. Bio (≤280 chars) + tagline (≤60 chars) + display name + emoji. Save uploads to R2 via the kind-routed /uploads/image-url endpoint.
Modal
You, single-profile layout
/you
You, single-profile layout
UX-8 W8.E overhaul. ProfileView at the top (banner, cropped avatar, name with compact share + edit icon buttons in line, tagline, streak, bio, voice line, stats, mutual groups, badges). PlayerCard demoted to a secondary 'Cross-group player stats' panel below, hidden for cold-start users.
Shareable profile (/u/:userId)
/u/:userId
Shareable profile (/u/:userId)
Full-page profile route at /u/:userId. Same content as the modal but rendered as a standalone page (auth-gated; redirects with ?redirect= round-trip). Document title hoisted via React 19 for SEO.

Members + moderation

Members tab and moderation. Per-row overflow menu hides kick + block; the kick action fires a destructive-confirm with the member name and group name spelled out.

Member row, overflow menu
/groups/:groupId?tab=members&overflow=:secondMemberUserId
Member row, overflow menu
3-dot overflow menu (UX-8 Wave 1) on a member row, owner-visible. Options: Kick, Block. Kick triggers UX-8 W8.B confirm modal next.
Moment
Kick confirm modal
/groups/:groupId?tab=members&kickConfirm=:secondMemberUserId
Kick confirm modal
UX-8 W8.B destructive-confirm modal. 'Remove {Name} from {Group}?' + safety body copy + Remove person (destructive) / Cancel (secondary).
Modal

Settings

The fourth root tab as of UX-5 W2. Account, Notifications, Privacy, the collapsible Groups list, the People-in-your-groups graph from UX-8, About, sign out, and delete account.

Settings, overview
/settings
Settings, overview
Settings tab (UX-5 W2 W2.4 made it a 4th root tab). Account section + Notifications + Privacy + Groups (collapsed by default, UX-8 Wave 1) + People in your groups (UX-8 W8.F) + About + Sign out + Delete account.
Settings, People in your groups expanded
/settings?expand=people
Settings, People in your groups expanded
UX-8 W8.F section expanded. Deduplicated list of users sharing at least one group with the caller. Each row links to /u/:userId. Source: GET /me/people (excludes blocked + demo bots, both directions).

Moments (resolution + bingo)

The screenshot-worthy beats. Resolution takeover with mint + dark typography, animated counter, per-pick narrative, and the share card export. Bingo moment when a board is won.

Resolution takeover
/groups/:groupId/guesses/:resolvedGuessId
Resolution takeover
Full-screen takeover when a guess resolves. Hot pink + cream typography, animated counter, per-pick narrative ('You won 233 from Bob'). 'Share with the group' opens the native share sheet on Capacitor (UX-5 W3.1) or downloads the 1080x1350 PNG on web.
Moment
Bingo moment takeover
/groups/:groupId?tab=boards&board=:wonBoardId&devBingoMoment=1
Bingo moment takeover
BingoMomentTakeover after board.won fires. Headline, winner name, winnings amount, three actions: Share board result · View board · Done. 8-second auto-close cancels on any interaction.
Moment

What shipped, by wave

Rolling list of UX waves since the last tour refresh. Pulled from CHANGELOG.md and rewritten for tour readers.

UX-10 W4 May 4, 2026

New features: bingo AI, weekly recap, public-lite profile

  • Bingo one-tap AI fast-path. After a 6-char board title, the user sees [ Generate board ] + [ Build manually ]. Generate stamps a full cell array (with center FREE) and jumps directly to Receipt. Anthropic Haiku, content-addressed cache, graceful fallback to manual build on failure.
  • Weekly recap MVP. New GET /groups/:id/recap?period=week returns biggest winner, worst miss, most accurate, most chaotic guess + totals. RecapCard renders 4 emoji rows on the Guesses tab between personality highlights and resolver banner. Empty-state copy for quiet weeks. No push notification yet, intentionally MVP.
  • Public-lite profile (opt-in only, default private). New /p/:userId route OUTSIDE auth. Migration 039 added users.profile_visibility. Safe-field set: display name + emoji + avatar + banner + tagline. Private fields strictly excluded with a 28-banned-key body assertion plus end-to-end leak test.
UX-10 W3 May 4, 2026

Polish + accessibility hardening

  • Bingo Receipt shows blank-cell count INLINE (yellow alert with Auto-fill or Turn into free spaces) instead of a post-tap confirm modal.
  • Board detail focus mode. When a board opens inline (?tab=boards&board=ID), the group hero collapses to a compact emoji + name + gear row so the grid gets the vertical space.
  • Resolution share polish: Share = primary full-width button above [Run it back] + [Make revenge guess] outline pair, then [Done] ghost. Share card 1080x1350 export gained a Play coins only no cash value footer.
  • prefers-reduced-motion wired from zero usage to system-wide. Animation gates on RevealAnimation, ResolutionTakeover, BingoMomentTakeover, BoardShuffleAnimation, plus a global CSS safety net.
  • Button primitive aria-label dev warn, axe-core in Playwright. Brand contrast audited in code: fg-muted nudged from #94908B (3.04:1, fail) to #6F6A66 (5.12:1) and mint-bright nudged from #0A9760 (3.59:1, fail) to #097552 (5.48:1) per board sign-off.
UX-10 W2 May 4, 2026

Trust + retention + onboarding

  • Reports on guess cards, chat messages, and profile views. Migration 038 generalized guess_reports with a target_type enum. Backend dedupes per (reporter, target_type, target_id). Brevo email body includes target type.
  • Activity feed becomes priority-sorted: needs-pick > closing-soon > needs-resolution > mention > result-dropped > general social. Five new tour screens for the Activity surface.
  • Rules step is now opt-in. Default state shows Most guesses don't need extra rules + smart suggestion chips matched against the question text (leave / arrive / win-sport / first / on time). Reveal buttons add full input fields when needed.
  • Tutorial checklist auto-collapses to Try these next 1 of 5 done [Expand] after the first completed step. Coachmarks pruned from 5 to 1 (kept the non-obvious profile-tap). Hide tips action + Settings re-enable toggle.
  • Disabled-state explanations across FirstRunWizard, board AI suggest, ChatComposer send. Centralized share templates at lib/share-templates.ts.
UX-10 W1 May 4, 2026

Launch-blocking polish

  • Centralized FAB visibility policy. Floating composer buttons hide on chat, members, board-detail-open, modal-open, and empty-state-visible surfaces. Replaces a single tab !== chat gate that overlapped empty-state CTAs.
  • Cross-day time pair formatter. Composer Clock + Preview now render Tonight, 11:37 PM / Tomorrow, 10:37 PM instead of ambiguous time-only when picks-close and result-known span midnight.
  • Post now is now a real button pair. After Spark validity: Ready to post above [ Post now ] + [ Customize first ]. Same postGuess handler, no validation bypass, sensible defaults.
  • Confidence slider gambling-tone scrub. Heading is now Creator's gut check, the 2.0x multiplier suffix is gone, disclaimer reads Used for prediction skill, not winnings. Backend confidence_yes plumbing untouched.
  • Stakes step user-facing label changed to Make it interesting (internal IDs unchanged). Copy-audit ban list expanded with six new gambling-coded tokens, plus a TRUST_COPY_PATTERNS allow-list so the legally-required play-money disclaimers still pass. Member moderation labels: Kick to Remove from group, Block to Block for me.
UX-9 May 3, 2026

Profile polish + inline boards

  • Self-mention exclusion: posting a message that @-mentions yourself no longer pushes a notification to your own device.
  • Boards open inline inside the Boards tab via a ?board= search param, so the group chrome and chat history stay mounted.
  • ProfileModal banner now spans the full modal width with the avatar overlap, matching the /u/:userId share page.
UX-8 May 3, 2026

People graph + tutorial + empty-state polish

  • P0 fixes: cell-upgrade column bug, currency-suggestions schema bounds for compound emoji, chat dedupe on optimistic + SSE echo, chat viewport-fit using 100dvh and safe-area-inset, kick action wrapped in a destructive-confirm modal.
  • Tutorial checklist mounted on demo groups (schema 037 tutorial_steps_seen). Auto-completes as the user creates a group, opens the invite, posts a guess, builds a board, sends a message.
  • /me/people graph endpoint and Create-Group existing-people picker. Settings gets a People-in-your-groups section. ProfileView gets compact share + edit icons in the name row.
  • MemberPreviewStrip on group cards and the group detail header. Gear icon for group settings, awards moved below members, balance dedup, kick + block in a three-dot overflow menu.
  • Empty Guesses tab gets a 36s rotating prompt ticker (12 examples, prefers-reduced-motion safe). Empty Boards tab gets a sample 3x3 Group trip bingo grid with a soft column pulse.
UX-7 May 1, 2026

Composer polish + new user onboarding

  • Guess composer goes 6 steps to 5. Room step archived; defaults applied at submit (audience everyone, resolver = current user). ConfidenceField label, ChancesSlider z-order, mint-bright token for win-rule, harassment notice moved under the question input.
  • Bingo composer defaults to 3x3 instead of 5x5. AI-suggest re-evaluates against live form state, so editing a too-short title to long-enough re-enables the button without a step round-trip. Receipt step gains Auto-fill with AI and tap-to-edit empty cells.
  • Hybrid onboarding: three-slide concept carousel + auto-seeded demo group with three fake bots (Alex 🦊, Sam 🐰, Jordan 🐯) + five-bubble coachmark layer anchored to real UI selectors.
UX-6 April 30, 2026

Tabs restored + user profiles

  • W3.6 reverted: filter pills go back to actual tabs. Order is Guesses, Boards, Chat, Members. Default landing prefers active guesses, falls back to Members for cold groups. Net minus 376 lines.
  • Profile backend (schema 035): avatar_url, banner_url, bio, tagline, voice_line cache. GET /users/:userId/profile with mutual-groups join and 24h voice-line cache. PATCH /me extended.
  • ProfileModal mounts globally and reads from a profile-viewer Zustand store. Avatars across MessageBubble, MembersList, PickCard, GuessCard, mention chips, and WhoReactedSheet are all tap-to-open. /u/:userId mirrors the modal as a standalone page.
UX-5 April 30, 2026

Trust floor + chat MVP + structural chat

  • W1 trust + retention floor: invite-code cold-start handoff, resolver close_at push + GroupTab banner, composer resolver guard, join-error humanization, reports route mailing the admin via Brevo, resolver self-deal guard.
  • W2 chat MVP: schema 32, messages router (POST/GET/PATCH/DELETE/read/unreads), mention parser, mentioned_in_chat push, ChatStream + MessageBubble + InlineGuessCard + ChatComposer with @-autocomplete and reply-quote. Plus Waiting-on row + nudge, live countdown on closing guesses, pool-pulse animation, unread badges, welcome system message, demo-group secondary CTA.
  • W3 chat unification: Capacitor share-sheet, daily streaks + weekly recap push, chat reactions (block-aware), Resolution rich card in chat, two-minute dispute window with vote-based override, reply-quote tap-to-scroll. The W3.6 chat-as-primary view was reverted in UX-6 W1.