Skip to content

Lane B — the category: sports, club, community and booking apps (Korean and global), measured ​

Status: Reference · Date: 2026-10-08 · Evidence appendix for visual-benchmark-2026-10-08.md. Frame and crop paths refer to the session scratch directory (not committed); App Store frames are re-fetchable from the store URLs in the tables.

Date of capture: 2026-10-08. English only. Nothing under /home/sungkyu08/Dev/twomore-v2 was modified (read-only look at packages/app/src/config/themes/classic-grass.theme.ts, packages/ui/src/tokens.ts, docs/design/visual-tone-audit-2026-10-06.md for our own numbers).

0. Method, conventions, and what the numbers mean ​

  • Source: App Store screenshots via https://itunes.apple.com/lookup?id=<id>&country=<kr|us> (store pages in the table). 35 apps measured, plus Padel Mates (marketing mock-ups only, excluded from numerics). All apps are listed with the store version / currentVersionReleaseDate returned by the lookup on 2026-10-08.
  • Frames are vendor-curated marketing images (392x696 or 222x480 px, JPEG). I looked at every frame of every app (overview sheets bench/b_overview/<app>.png), picked the 1-3 most raw frames, and cropped the phone-screen rectangle out of the marketing mock-up (box fractions per frame in bench/b_crops/metrics.json, field crop; an extra 3% side inset removes bezels). Crop file b_crops/<app>_<n>.png is cut from frames/<app>/<store-id>_<n>.png. Full-frame raw UIs (OneFootball, TennisFriends) use the whole frame minus the status bar.
  • Metrics use the shared definitions in bench/sample.py (canvas = modal quantised colour in left+right 4% strips; near-white = L* > 92; ink = L* < 35; saturated = chroma Cab > 30), applied by my own box-crop wrapper scratchpad/crop_b.py (same functions imported from sample.py, only the crop differs: a rectangle instead of top/bottom fractions). I added three of my own measures: (a) dominant pale hex (L 93-99, C* < 8) and its area share (b_crops/surfaces.json); (b) quantised C* > 45 colour shares for solid brand area; (c) store-frame canvas class over all 265 store frames.
  • Comparison numbers for TwoMore come from the repo: canvas #F8FBF9 (L* 98.3, C* 1.5), card #FFFFFF, gray100 #F0F5F1 (L* 96.1), the rejected #EEF2EF (L* 95.1), brand600 #006D37 (L* 39.9, C* 46.3), mint #E5FAEA (L* 96.4), optic #C6E84B (L* 87.1, C* 76.2); native Home-tab near-white 90.8%, ink 1.5% (visual-tone-audit-2026-10-06.md, same metric definitions).
  • Sizes in pt are estimates: 392x696 full-bleed frames are iPhone 8 Plus screenshots (0.947 px/pt), 222x480 full-bleed frames are 390 pt wide (0.57 px/pt), mock-up crops are about 0.65-0.80 px/pt. Treat "est." values as +/- 2 pt. Two direct pixel measurements: OneFootball squad rows are 53 px pitch = about 56 pt, jersey numerals 13-14 px cap height = about 20 pt font (frames/onefootball/382002079_7.png); TennisFriends match cards are 43-46 px tall = about 76-80 pt (frames/tennisfriends/6758872979_3.png).
  • Colour values are +/- 2-3 sRGB levels (JPEG); L* +/- 0.5.

1. Per-app table ​

Columns: ground (page background) and card; where SOLID brand colour sits; how the core objects are drawn; chips, radii, type, icons (est.); near-white / ink / saturated % of the raw-UI crops (mean over frames used; photos inflate ink and saturated); frames used. "Store canvas" = the modal full-frame backdrop colour of the store art, which is what the owner may be seeing in "pronounced backgrounds".

1A. Korean (country=kr) ​

App (store URL, version, updated)Ground / card (hex, L*)Solid brand colour sitesCore-object grammarChips, radii, type, icons (est.)nw / ink / sat %Frames used
BAND (https://apps.apple.com/kr/app/id542613198, 30.2.2, 2026-10-08)Page #FFFFFF L100; section gaps #F5F5F5-#F7F7F7 (L96.5-97.2)Green only as FAB, selected-day disc, active tab tint (#04AC4C, L61 C70), 1.5% areaClub = 3-col grid of squircle photos (~72 pt, corner ~28% of side) + 2-line caption, no card chrome. Event = month grid with coloured dots, then date-headed event (bold date ~20 pt, green vertical rule, green time line, avatar stack + "28 attending")Pill chips with green tint; filled-glyph tab bar with red count badges; photo density high74.2 / 7.4 / 3.8band_2, band_3, band_6
Somoim (https://apps.apple.com/kr/app/id582910479, 4.4.1, 2026-10-06)Page #FFFFFF; gap #F5F5F5 (L96.5)Blue FAB, full-width "Join" CTA below the meeting card, tab underline (#4C9CF4, L64 C51); store canvas #2881FF (L55.4, C72.5) on 6/8 framesMeeting card: "10/2 (Wed) D-2" bold with red D-day, small photo + 4 label:value lines (date, place, fee, attendance 12/50), avatar stack, then CTA. List rows: photo thumb + title + avatar stack + count; date strip with black selected disc; 12-icon pastel illustrated category gridFlat rows, no radius on list; pastel illustrated icons77.7 / 2.8 / 5.1somoim_2, somoim_3, somoim_5
Munto (https://apps.apple.com/kr/app/id1535886772, 7.6.3, 2026-09-18)List ground #F4F4F4 L96.2 behind cards #FEFEFE L99.7 (dL* 3.5); detail pages #FEFEFERed only on pills and the follow button (#F43434), 0.1% area; store canvas #E6E1E1 (L89.9) on 8/8 frames, the only mid-grey store backdrop in the setSession card: grey category pill (+ red "closing soon" pill), 1-line bold title with emoji (~16 pt), meta line (type, pin, region, day/time, ~12 pt grey), host avatar + "4 joined, confirmed". Square photo ~80 pt with heart overlayCard radius ~16 pt, thumb ~10 pt, pill chips; outline 2 px icons; logotype header70.7 / 8.9 / 3.4munto_3, munto_4, munto_6
Frip (https://apps.apple.com/kr/app/id1066782203, 7.0.30, 2026-10-02)Page #FFFFFF; chip fills #EFF0F1 (L94.7)Purple tab underline; blue hero banner #4973D1 3.5%Listing row: 3-photo strip (3 squares ~72 pt), region label, title, star rating (count), price bold at right, heart. Rows separated by whitespace, no cardPhoto-heavy; price 14-15 pt/700; outline icons64.6 / 15.0 / 5.2frip_3, frip_4, frip_6
Flap Football (https://apps.apple.com/kr/app/id6608972481, 2.0.1, 2026-09-21)Match list #FFFFFF; stats page ground #F1F5F8 L96.3 with white cardsLime #A5F56E (L89.1, C73): hero banner, whole "FULL TIME" card (13.6%), result score chipsMatch row = bold time lead ("18:00", ~16 pt) + 40 pt stadium thumb + title + meta (6v6, 3/4 filled) + heart; date strip with black selected rounded square; floating dark "MATCH DAY" pill. Result card: big rating numeral "8.6" (~44 pt/800) + 2-col stat grid; season list with lime rating chipsBlue "confirming soon" chip, red discount; illustrated player cards in store art74.6 / 7.4 / 10.1flapfootball_1, _5, _6
Runday (https://apps.apple.com/kr/app/id1042937618, 4.10.1, 2026-10-07)#FFFFFF, cards #F7F8FC (L97.6)Purple (store canvas #6F61D4, L47.9, 3/8 frames) as italic numerals and progress barStat cards stacked: "3.12 km" (~40 pt italic/800), pace (~32 pt italic), bar chart; challenge page hero photo + purple progress bar + "5,390 joined"Small radius ~8 pt69.0 / 5.9 / 1.8runday_2, runday_4
SmartScore (https://apps.apple.com/kr/app/id969887573, 5.4.5, 2026-09-21)#FFFFFF, fills #F6F6F6 (L96.9)Blue #268DFF (L58.7, C65.7) full-width CTA block, 8.7% of cropRecruitment detail: "11/27 same-day" + chips (slot, 4 recruited, red "1 left") then the CTA; product cards photo + bold priceSuper-app, tab strips, red sale badges53.6 / 16.3 / 17.0smartscore_3, _7, _8
Kimcaddie (https://apps.apple.com/kr/app/id1484183053, 6.3.8, 2026-10-06)#FFFFFF, #F7F7F7 (L97.2); pink promo band #FCF1FCMint brand mostly as text/label; coloured price pinsMap-first: price pins ("indoor 1.5") coloured by category; venue card = 16:9 photo, name, star 9.8 (33), coupon band; bottom card photo 56 pt + price with red 11% discountPins are chips (radius full)65.8 / 9.8 / 7.1kimcaddie_2, _3, _4
Golfzon (https://apps.apple.com/kr/app/id386722987, 7.27.0, 2026-09-30)#FFFFFF + bands #FAFAFA/#FBFBFB (L98.3-98.6, 19-22% area) = the same step as ours (dL* 1.4-1.7); pale-blue tiles #E1EBF6 (L92.6)Blue #2977EE (L51.7, C69) 100%-fill tile for primary entry; selected date = blue squareTee-time counts as a plain numeral grid (847, 1,817...), score tiles "-15.9" (~32 pt/700) on near-black card; 5x2 glossy colour icon tilesRadius ~16-20 pt on sheet; 3D glossy icons84.9 / 4.6 / 4.4golfzon_1, _3, _4
Smash (https://apps.apple.com/kr/app/id1605089284, 4.1.0, 2026-09-21)#FFFFFF; card = white with ~1 px light border, radius ~12-14 pt; store canvas violet #5D0AF7 (L36.5, C124) on 6/6 framesNone on lists; orange tier badge #FC841C (L67.5) on profileSocial-match row: ~95 pt court-photo thumb flush left, region 11 pt grey, title ~15 pt/700, date/time 12 pt, tags "mixed, 1M 1F, 1-2 yr / NTRP 2-2.5", capacity "1/4" top-right. Profile = tier badge + NTRP "2.3" (~28 pt/700) + "top 12%" two-up cardTabs as type (22 pt bold black vs grey)79.6 / 7.5 / 2.5smash_1, smash_5
TennisFriends (https://apps.apple.com/kr/app/id6758872979, 1.0.63, 2026-09-30)Ground #F9F9FB L98.0 + white cards (dL* 2.0; ours 1.7); full raw framesGreen FAB (#2C7C34); LIME #CCFD01 (L93.1, C98.7) profile card = 12.1% of frame with "36.5 / 100" manner score + progress barMatch card ~76-80 pt tall with full-height thumb, club name, date/time, chips (format, courts, ball-dot "Lv 2.0-4.5"), dark "closed" chip, "1/3" with person icon; 3-up stat card (NTRP Lv 3.0 / 18 yr / 0 matches)Radius ~12-14 pt; outline tab icons, active green90.0 / 4.6 / 6.6tennisfriends_0, _3, _5 (the nearest peer to our own tone: ours 90.8 / 1.5)
RallyUp (https://apps.apple.com/kr/app/id6795003190, 1.0.12, 2026-08-18)Dark #04070C L1.8; cards #14191F L8.5Yellow #FFFF01 (L97.1, C96.8): full-width CTA, FAB, active tab, chips; store gradient lime #8AED25-#AAF60FVote card with option rows + 0% bars; ranking rows avatar + name + points right with gold/silver/bronze outlines; record rows with "+5P" yellow chip; club search rows thumbnail + name + members + tagsRadius ~12; dark-first club-management app2.1 / 92.9 / 4.4rallyup_2, _4, _5
CourtMate (https://apps.apple.com/kr/app/id6785714091, 1.0.10, 2026-08-30)Warm cream #F6F3EA L95.8 C4.7; card #FEFDF8 L99.3 (dL* 3.5)Dark green #1C3C31 (L22.7) full-width CTA; lime chip #D3DB7D (L85); store #CDD84B + #124236Round = court tiles with 2v2 pairs and dark "VS" disc; roster = rank medal + coloured-disc avatar + name + grey ELO right; record = 3-up header "19 matches / 13W 6L / 68%" (~20 pt/700) then rows "w/ partner vs opponent 6:3" with bold score right + green dot (win) or pale-red pill (loss)Title ~22 pt/800; radius ~12; no photos84.9 / 2.7 / 2.2courtmate_0, _2, _3
Ralli (https://apps.apple.com/kr/app/id6449350578, 1.1.9, 2026-09-28)Black #000000; tiles #1C1C1E L10.3 / #333333Volt #95FF0A (L90.7, C105.7) bars; yellow #FFD80B pause; green ringScoreboard in store art: huge split numerals (40 / 15 in orange vs green halves); summary tiles 2x2iOS dark system look0.2 / 89.0 / 8.8ralli_3, _5
Ace (https://apps.apple.com/kr/app/id6809745408, 1.0.3, 2026-09-22)#FFFFFF, #F7F9FB (L97.8)Blue pins and CTAMap/list toggle, filter chips (date-time, skill, format), cluster pins with numbers; calendar with dotsPill chips83.8 / 0.5 / 2.3ace_2, ace_3 (4 store frames only)
Baseline (https://apps.apple.com/kr/app/id6741500563, 2.6.5, 2026-10-02)#FFFFFF, #F9F9F7 (L97.9), #F3F5F7 (L96.4); chips #E7E7EA (L91.7)Blue #0454FC CTA; store canvas #0052FE on 3/8 framesPSR rating line chart + 3-up stats; match list rows with right-hand 64 pt venue photo, time, price, "PSR 2.4-4.4 / NTRP 2.5", blue "recruiting"; tournament scoreboard rows = pair vs pair, avatar rings blue vs orange, centre score "6:1"Pill chips; dense71.2 / 4.9 / 8.1baseline_1, _5, _7 (+ store frame _6 viewed)
CLASS101 (https://apps.apple.com/kr/app/id1320607634, 1.12.6, 2026-10-06)#FFFFFF flatOrange #E9651D (L58.7, C77) on progress bars, CTA only (1.9%); store #FF4E02 3/8 + black 5/8Photo-hero tiles with overlay text, thin progress bars, mascot illustrationsFlat53.0 / 22.9 / 2.8class101_3, _7
Soomgo (https://apps.apple.com/kr/app/id1250771188, 122.0.0, 2026-10-02)#FFFFFF; #F3F3F3 (L95.8) fills sparseTeal CTA bar; store art white on 8/8 framesProvider rows: ~56 pt photo, name, star 4.9 (14), hires, pay badgeSmall chips83.7 / 5.0 / 1.5soomgo_4, _5
Greenlight (https://apps.apple.com/kr/app/id1580501154, 3.6.6, 2026-10-06)Ground #F5F5F5 L96.5 + white cards with soft shadowTeal-green brand as small chips, blue "N" badgeCard: portrait photo ~72 pt (radius ~8) + name (age/sex) + grey inset block (3 meta rows) + status chipRadius ~12, shadows74.3 / 3.6 / 2.0greenlight_2, _6

1B. Global (country=us) ​

App (store URL, version, updated)Ground / card (hex, L*)Solid brand colour sitesCore-object grammarChips, radii, type, icons (est.)nw / ink / sat %Frames used
Playtomic (https://apps.apple.com/us/app/id1242321076, 6.93.2, 2026-10-07)#FFFFFF; band #F5F7F7 (L97.1, 15.9%)Selected state = dark navy fill (date disc, duration, time slot); LEVEL CHIP lime #CCFC04 (L92.8, C98) ~22 pt circle with numeral; store canvas blue #335FFF (L47.1, C93) on 6/7 framesOpen match = 4 slots in a row (avatar 44 pt, first name, level chip; empty slot = outlined circle "+ Available"). Booking: 16:9 club hero, name ~17 pt/700, tabs (Home/Book/Open matches/Competitions), 5-day strip, duration segmented, 5-col slot grid (radius ~6, struck-through when taken)UI grotesque 15-17 pt/600; heavy italic only in marketing; lime-disc line icons56.8 / 18.9 / 7.2playtomic_2, _3 (composite, not aggregated), _4
Padel Mates (https://apps.apple.com/us/app/id1531797995, 3.0.75, 2026-10-05)Marketing only: navy #000B2B (L3.7) + mint #00F193 (L84.5); mocks show white UI, navy buttons, lavender cardsn/aTilted phone collage; rating ring "3.5", win-rate and sportsmanship rings on profileExcluded from numericsn/apadelmates_0-3 viewed (store art only)
Strava (https://apps.apple.com/us/app/id426826309, 484.0.0, 2026-10-07)Dark #141414 L6.3; cards #21211F L12.7Orange (store gradient #300404 to orange) on active tab, polylines, full-width SaveFeed card: title ~17 pt/700, 3-up stats (distance, time, elevation), full-bleed photo, kudos row. Leaderboard: rank, avatar ~32 pt, name, date, time right tabular, gold crownOutline tab icons, active filled orange0.3 / 83.3 / 6.1strava_5, _9 (dark by vendor choice in store art)
Nike Run Club (https://apps.apple.com/us/app/id387771637, 7.79.3, 2026-09-02)#FFFFFF, tiles #F7F7F7 (L97.2)Neon orange #FF4400 plan hero (39% of nrc_3 crop), volt #00F87D start ring, sky #45CAFF total card and selected pillActivity: huge italic condensed numeral "20.6" (~44 pt), 3-up (runs, pace, time), bar chart in sky blueBlack display italic; segmented pill91.6 / 2.2 / 2.7 (nrc_1 only)nrc_1, nrc_3, nrc_8
Spond (https://apps.apple.com/us/app/id755596884, 4.63.3, 2026-09-24)Ground #F3F3F3 L95.8 + white tiles (dL* 4.2)"Attending" solid cyan-blue #11A2C3 + outlined red "Decline"Event page = icon rows + response counts with coloured ring icons; group tiles 2-col, round photo 48 pt + name; event list rows with date block + red left rule when response dueRadius ~1082.7 / 7.2 / 2.5spond_0, _1 (_5 viewed, bezel-polluted)
Heja (https://apps.apple.com/us/app/id1157335714, 740.0, 2026-10-07)#F3F7FB (L97.0) cards on mint store art #3BBE7C (L68.9) 4/7 framesSlate-blue buttons #5367A0 (L43.3) INSIDE the event cardEvent card: coloured left rule (orange practice / blue game), date block (small-caps month + ~20 pt day), title ~18 pt/700, avatar, two buttons GOING / NOT GOINGRadius ~1282.9 / 1.1 / 6.3heja_2 (card strip only)
TeamSnap (https://apps.apple.com/us/app/id393048976, 7.73.0, 2026-09-30)#FFFFFF, section headers #F6F7FB (L97.3)Solid blue header #1D6BAE (L44.0, C42) + segmented tabs, 7% of cropAvailability list: avatar 36 pt + name #jersey + note; right-hand status squares (green check / blue ? / red x)Dense iOS-native list71.5 / 5.1 / 12.6teamsnap_1, _3
Meetup (https://apps.apple.com/us/app/id375990038, 2026.10.02, 2026-10-05)White; chip fills #F2F2F4 L95.5Purple selected pill; coral #FA677E (L63, C60) promo tile 6.2%Event card: 16:10 photo (radius ~14), 2-line bold title ~16 pt, date line 12 pt, avatar stack + "107 going"Colour emoji-style category icon row56.4 / 16.7 / 11.2meetup_1, _3
SwingVision (https://apps.apple.com/us/app/id989461317, 11.9.67, 2026-09-27)iOS dark #000000/#1C1C1E, cards #2C2C2E L18.1Data colours: orange #FF9500, green #29A853 bars, yellow target zones; store canvas green gradient #5AC660 10/10Match header: two players, set scores "4 6 7" right-aligned tabular ~17 pt/600 with check on winner; winners-vs-errors paired barsDark data UI0.8 / 88.1 / 7.2swingvision_4, _5
TennisPAL (https://apps.apple.com/us/app/id1119279287, 5.2.37, 2026-06-04)#FFFFFF; map ground #F4F1F1Navy-teal #2B4C5A selected chips; lime-green #A6CE39 (L77.6) store canvas, sliders, Search buttonFilter form: radius slider, gender/day/match-type chip groups, dual-handle NTRP 2.5-4.0 and age sliders; map with green pins + bottom cardSmall chips75.6 / 6.5 / 2.8tennispal_2, _4
Rally Racket Sports (https://apps.apple.com/us/app/id6757131090, 1.5.0, 2026-08-28)Header #045454 (L31.8, C21.9) over white body #F9FBFB (L98.5); winner row #D1FAE5 (L95.0)Teal header blocks (40.8%), lime #B5ED6D (L87.7, C67) date pill / active tab; PTI ringResults: lime date pill + "Court 2" header, rows names left / set scores right (6 4 6), trophy + mint highlight on winner; 2x2 stat tiles (numeral ~28 pt/700 + 11 pt caps label, orange win-rate)The palette closest to ours (deep green + mint + ball lime)41.5 / 50.2 / 4.8rallyracket_2, _3
UTR Sports (https://apps.apple.com/us/app/id1519232627, 2.1.5, 2026-10-05)Black header, white tab body, cells #F1F3F9 (L95.8)Cyan gradient; rating numerals white on blackProfile head: three ratings "7.45 / 7.66 / 3.1" (~40 pt/700 condensed); ranking table with light-cyan cells #D6F7FB and green/red delta chipsHeavy condensed display51.6 / 32.4 / 1.1utr_1, _2
USTA Tennis (https://apps.apple.com/us/app/id6443585452, 25.2.1, 2025-06-17)White; SOLID blue blocks #3474EC (L51.0, C69.8) 17.8% + pale-blue cards #8EB7F5 (L73.7) 34.6%Colour-block dashboard: NTRP 5.0 / WTN 32.9 stacked as full-bleed blocks with condensed numerals (~36 pt)Schedule list on white with black pill buttonsHeavy condensed headlines; highest saturation share in set50.9 / 6.9 / 35.2usta_0, _2 (oldest app in set, 2025-06)
OneFootball (https://apps.apple.com/us/app/id382002079, 16.204, 2026-10-04)White #FFFFFF, #FBFBFD (L98.7); match header blackNone in content; black header blockMatch header: crests ~40 pt both sides, centred date/time ~20 pt/700; form-guide cards = crests + score "1-3" ~15 pt/700 + win/loss dot; squad rows 56 pt pitch, avatar 36 pt, name ~15 pt/600, jersey numeral ~20 pt/700 rightRadius ~8-10; outline tab icons76.3 / 14.9 / 3.2onefootball_0, _3, _7 (full raw frames)
ESPN (https://apps.apple.com/us/app/id317469184, 8.27.0, 2026-09-30)Dark #1D1E20 L11.2; cards #2B2C2E L18.0Red only for live/brand; store canvas #CE131C 10/10Scoreboard "6 - 34" ~28-32 pt/700 with logos; each game row has a right-hand "Watch" blue pillDense dark0.7 / 91.7 / 2.6espn_6, _7
ATP WTA Live (https://apps.apple.com/us/app/id1480255719, 3.4.18, 2026-08-03)Navy #051223 (L5.3, C13), rows #0E1B2C (L9.5)Purple header #4714A8 (L25.8, C88)Two-player rows: flag, seed, name, set scores in columns, duration right, outlined H2H / STATS buttonsUltra-dense0.7 / 89.2 / 12.3atpwta_2, _3
FotMob (https://apps.apple.com/us/app/id488575683, 1243, 2026-10-03)Light #FFFFFF, rows #F8F8F8 (L97.6), group header #EAEAEA (L92.7, 12.4%); dark #1D1D1D L10.8Green pitch for lineupsMatch result: crest, "2 - 1" light-weight ~28 pt centred, crest, "Full time" 11 pt; fixture rows time left, crests, team namesLight/dark twin49.8 / 37.8 / 2.3 (mixes dark frame _7)fotmob_0, _2, _7

2. Category grammar (counts) ​

Counts are over the apps that show the object in a raw frame; each number cites frames listed above.

Scheduled session / match / event card (n = 19 apps): Band, Somoim, Munto, Frip, Flap, SmartScore, Smash, TennisFriends, RallyUp, CourtMate, Ace, Baseline, Greenlight, Playtomic, Spond, Heja, TeamSnap, Meetup, Rally.

  • Photo or image leading the card/row: 10/19 (Somoim, Munto, Frip, Flap, Smash, TennisFriends, Baseline, Greenlight, Meetup, Playtomic hero). Thumb sizes: Smash ~95 pt flush left (smash_1), Munto ~80 pt (munto_3), TennisFriends card-height ~76 pt (tennisfriends_3). No photo: 9/19.
  • First element: time/date led 7/19 (Band "Aug 18" headline band_3, Somoim "10/2 D-2" somoim_5, Flap "18:00" flapfootball_1, Heja date block heja_2, Ace, Spond, RallyUp); title-first 6/19 (Munto, Smash, TennisFriends, Baseline, Meetup, Greenlight). Dominant pattern: whatever leads is bold 15-20 pt, everything else 11-13 pt grey.
  • Headcount shown: 10/19; as a fraction "n/m": 5/19 (Smash 1/4, TennisFriends 1/3, Somoim 12/50, Flap 3/4, CourtMate 16/16). Skill/level on the card: 7 of the 8 racket apps (TennisFriends "Lv 2.0-4.5", Smash "1-2 yr / NTRP 2-2.5", Baseline "PSR 2.4-4.4 / NTRP 2.5", Playtomic level chips, TennisPAL NTRP slider, Ace skill filter, CourtMate ELO).
  • Urgency/closed expressed by ONE small chip: Munto red pill, SmartScore red "1 left", Somoim red D-day, TennisFriends dark "closed", Flap blue "confirming soon". Dominant: single chip, red = scarcity.
  • Buttons inside the card: 2/19 full buttons (Heja GOING / NOT GOING inside the card heja_2; Somoim's Join CTA in the same sheet somoim_5) plus 2 inline join affordances (Meetup "sign up" pill on the photo corner meetup_1, Playtomic "+ Available" empty slot playtomic_3). None of Munto, Smash, TennisFriends, Flap put a button in a list card: CTA lives in a footer band or FAB (TennisFriends green FAB tennisfriends_3, Somoim blue FAB somoim_2, Band green FAB band_3).

Club / group card (n = 6: Band, Spond, Meetup, Heja store art, RallyUp, CourtMate): image-first (squircle photo, round photo, logo) + name + member count in 5/6, and no CTA inside it (RallyUp only a small "manage" pill). Band: 3-col grid without card chrome (band_2). Spond: 2-col white tiles (spond_1). CourtMate: club header = square logo + name + three tabs (ranking / board / members) (store frame courtmate_1, _5).

Score / result row (n = 12): bold tabular numerals in a fixed right column plus a tiny result marker. CourtMate "6:3" + green dot / pale-red pill (courtmate_3); Baseline centre score between pairs (baseline_7); Rally Racket set scores in columns + mint winner row (rallyracket_3); SwingVision "4 6 7" with check (swingvision_4); ATP/WTA columns (atpwta_2); OneFootball/FotMob crest-score-crest and form dots (onefootball_3, fotmob_2); ESPN big numerals (espn_6); Flap rating chip lime (flapfootball_6). Fill colour on the whole row appears only in Rally (winner mint) and Baseline (chips). Dominant: number carries the result, colour is a 6-8 pt dot or chip.

Rating / profile head (n = 9): one hero numeral 28-44 pt/700-800 with a small caption: Flap 8.6, UTR 7.45 x3, Smash NTRP 2.3 + "top 12%", TennisFriends 36.5/100 on a lime card, NRC 20.6, Golfzon -15.9, Runday 3.12 km, CourtMate 3-up "19 / 13W 6L / 68%", Rally 2x2 tiles.

Member / avatar row (n = 8): overlapping stack (3-9 circles) + "N going/attending" in Band (band_3), Somoim (somoim_3, _5), Meetup (meetup_1) = 4; labelled slot row with name and level chip, empty slot as outlined "+ Available" circle in Playtomic (playtomic_3) = 1 (the only doubles-shaped member row in the set); list with status squares TeamSnap/Spond = 2; ranked list with disc avatar + ELO CourtMate = 1.

Venue / map object (n = 7): map-first with price or count pins: Kimcaddie price pins (kimcaddie_3), Ace numbered clusters (ace_2), Flap lime count bubbles (store frame flapfootball_2), TennisPAL green pins + bottom card (tennispal_4) = 4; photo-first venue: Baseline (baseline_5), Playtomic 16:9 hero (playtomic_4), Kimcaddie hero (kimcaddie_2) = 3.

Ground / surface (n = 28 light apps, 24 with a measurable second surface): see section 3 for the ladder. Dark default UI: 6 apps, all scoreboard/stat/record-led (RallyUp, Ralli, Strava, SwingVision, ESPN, ATP WTA).

Photo density: high 11 (Band, Somoim, Munto, Frip, Smash, Meetup, Kimcaddie, Greenlight, Class101, OneFootball, Strava); medium 6 (Baseline, TennisFriends, Playtomic, Flap, NRC, FotMob); low/none 18 (CourtMate, RallyUp, Ralli, Ace, TennisPAL, Rally, UTR, USTA, Spond, TeamSnap, ESPN, ATP, Golfzon, SmartScore, Runday, Soomgo, Heja, SwingVision). Every racket-sport CLUB/record app (CourtMate, RallyUp, Ralli, Rally, UTR) is photo-free and numeral-led; every discovery app (Munto, Smash, Frip, Meetup) is photo-led.

3. Surface ladder measured across the category ​

Second light surface (the tint that sits behind or beside white cards), L* with source frame; n = 24 light apps (22 listed below plus OneFootball #FBFBFD 98.7 and Rally Racket #F9FBFB 98.5, which sit nearly on white):

98.3 Golfzon (golfzon_3) | 98.0 TennisFriends (tennisfriends_3) | 97.9 Baseline (baseline_7) | 97.8 Ace (ace_3) | 97.6 FotMob (fotmob_0), Runday (runday_2) | 97.3 TeamSnap (teamsnap_3) | 97.2 Band, Kimcaddie (kimcaddie_3), NRC (nrc_1) | 97.1 Playtomic (playtomic_4) | 97.0 Heja (heja_2) | 96.9 SmartScore (smartscore_3) | 96.5 Somoim (somoim_3), Greenlight (greenlight_6) | 96.3 Flap stats (flapfootball_6) | 96.2 Munto (munto_3) | 95.8 CourtMate (courtmate_2), Spond (spond_1), UTR (utr_2), Soomgo (soomgo_4) | 95.5 Meetup chip (meetup_3).

  • Median 97.15 (quartiles 96.2 / 97.75), so the typical card-on-ground step is dL* 2.85 (range 1.3-4.5). TwoMore today is dL* 1.7: inside the shallowest quartile (Golfzon equal at 1.7, OneFootball 1.3 and Rally Racket 1.5 shallower), i.e. shallow but not an outlier.
  • Darkest real PAGE GROUND in the set: L* 95.8 (CourtMate cream #F6F3EA, Spond #F3F3F3). The rejected #EEF2EF (L* 95.1) would be darker than every measured light ground and chip fill. Toss #F2F4F6 is L* 96.1; our own gray100 #F0F5F1 is L* 96.1.
  • Second rung down (chip / section-header / tile fill) sits at L* 90.8-93.0: FotMob group header #EAEAEA 92.7 (12.4% area, fotmob_0), Golfzon pale-blue tiles #E1EBF6 92.6 (golfzon_1), Munto chip #E9E8E8 92.1 (munto_4), Baseline chip #E7E7EA 91.7 (baseline_7), Greenlight border #E4E7EC 91.6, Kimcaddie #E7E4E4 90.8 (kimcaddie_3). So the ladder in the field is ground 96-98 -> fills 91-93 -> ink, the same three tiers as the visual-tone board's proposal (canvas 95 / strong 93 / mint 92), with the ground about 1 L* lighter than proposed.
  • Chroma: grounds are neutral (C* 0-1.1: #F4F4F4, #F5F5F5, #F3F3F3, #F9F9FB), cool (#F1F5F9, #F3F7FB, C* 2-3) or warm (#F6F3EA, C* 4.7). No measured ground is green-tinted; ours is C* 1.5 hue ~150.

Store-art backdrops (not in-app), all 265 store frames: saturated flat canvas (C* >= 40) 84 frames (32%), pale/white 80 (30%), dark 67 (25%), mid 34 (13%). Per app modal: pale/white 13, saturated flat 10, dark 9, mid 3. Korean apps (19): pale 9, dark 5 (Frip, Flap, Ralli, Class101, Greenlight), saturated 4 (Somoim #2881FF, Smash #5D0AF7, RallyUp lime, CourtMate lime), mid 1 (Munto #E6E1E1).

Aggregate of raw-UI crops (light apps only, n = 28): near-white median 74.3% (p25 58.7, p75 82.9), ink median 7.1%, saturated median 4.1%. Korean light apps (17): 74.3 / 5.9 / 3.8. TwoMore native Home tab: 90.8 / 1.5 / small. Band and Toss sit at 72-86% and 94% in the 2026-10-06 audit with the same definitions; my Band crops give 74.2%, consistent.

4. Falsifiable observations ​

  1. No peer page ground is darker than L 95.8; the category median step is dL 2.85.** Evidence: section 3 list (24 apps), b_crops/surfaces.json. TwoMore's 1.7 is in the shallowest quartile (Golfzon equal, OneFootball and Rally Racket shallower); the rejected #EEF2EF (95.1, dL* 4.9) is past the deepest measured ground (dL* 4.2). Falsify by finding a light-mode page ground below L* 95.5 in any of these apps' real screens.
  2. A tinted ground behind white cards is a minority pattern: 7 of 17 Korean light apps (41%) and 3 of 11 global. Dominant pale hex >= 12% of the crop: TennisFriends #F9F9FB 22-30%, Munto #F5F5F5 23%, Golfzon #FBFBFB 19-22%, CourtMate #F7F3EB 16-21%, Greenlight #F5F5F5 14%, Flap stats #F1F5F9 12%, SmartScore #F9F9FD 12%; global Playtomic 16%, Spond 15%, Heja 14%. The other 10 Korean apps (Band, Somoim, Frip, Runday, Kimcaddie, Smash, Ace, Baseline, Class101, Soomgo) run a white page with 1-3% grey gap bands, hairline or bordered cards. So "flat and pronounced" in-app means flat white with heavy ink and photos at least as often as it means a grey canvas.
  3. The "pronounced background" impression is mostly store art and onboarding, not in-app canvas. 32% of store frames have a saturated flat backdrop (Smash #5D0AF7 L36.5 C124 on 6/6 frames; Playtomic #335FFF 6/7; Somoim #2881FF 6/8; ESPN #CE131C 10/10) while the same apps' raw UI is #FFFFFF (smash_1, playtomic_4, somoim_2). Falsify by finding any app here whose browse/booking screen ground has C* > 40.
  4. Brand colour on list/browse screens is as thin as ours; solid blocks appear on identity/stat surfaces. Solid hue share (C* > 45) is 0.1% in munto_3, 0.1% smash_1, 0.2% kimcaddie_3, 0.6% greenlight_2, 1.5% band_3. Blocks of 9-18% occur only on profile/dashboard/detail: usta_0 17.8% blue, flapfootball_5 13.6% lime, tennisfriends_5 12.1% lime, smartscore_8 9.0% blue CTA, rallyracket_3 teal header 40.8%.
  5. Ball-yellow-green solid is the racket category's own accent: 8 of 13 racket/ball apps use it. TennisFriends profile card #CCFD01 (L93.1, C98.7), Playtomic level chip #CCFC04 (L92.8, C98.1), RallyUp CTA #FFFF01, Ralli bars #95FF0A, Rally Racket pill #B5ED6D, CourtMate chip #D3DB7D, TennisPAL #A6CE39, SwingVision target-zone yellow. The five that do not (Smash, Ace, Baseline, USTA, UTR) use blue/violet instead. TwoMore already has optic #C6E84B (tokens.ts) but, by the token comment, only for motifs and gradient overlays.
  6. Peers carry about 5x our ink on the median. Light-app ink median 7.1% (n = 28) vs our 1.5%; only 2 of 28 light apps are at or below ours (Ace 0.5% map/calendar frames, Heja 1.1% card strip). The most typographic, least photographic screens are still 2.7% (CourtMate), 4.6% (Golfzon, TennisFriends). Near-white 74% median vs our 90.8%. Falsify by sampling our Home tab with the same crop rules and finding ink > 3%.
  7. Dark-first is for live/score/record surfaces, not browsing or booking. Six dark-default UIs (RallyUp, Ralli, Strava, SwingVision, ESPN, ATP WTA Live), all scoreboard/stat/record-led; RallyUp is the single dark club-management exception. All 12 discovery/booking/club apps (Band, Somoim, Munto, Frip, Smash, TennisFriends, Ace, Baseline, Playtomic, Spond, Meetup, CourtMate) keep a light UI in their store frames. Caveat: vendor chose what to show.
  8. CTAs stay out of list cards: only 2 of 19 session/match cards carry a full button, 2 more a small inline join affordance, 15 none. Full buttons: Heja (GOING / NOT GOING, heja_2) and Somoim (Join in the same sheet, somoim_5). Inline affordance: Meetup "sign up" pill in the photo corner (meetup_1), Playtomic "+ Available" empty slot (playtomic_3). The other 15 put the action in a footer band, FAB or detail page. This supports TwoMore's "no CTAs in cards" canon.

5. What TwoMore could adopt, and what to avoid ​

Adopt

  1. A measurable card step at the category's centre, not past its floor. Put the page ground at L* 96.1-97.0 with white cards (dL* 3.0-3.9): Munto #F4F4F4/#FEFEFE (munto_3, dL* 3.5), CourtMate cream (courtmate_2, 3.5-4.2), Spond #F3F3F3 (spond_1, 4.2), Toss (dL* 3.9 per the 2026-10-06 audit; #F2F4F6, L* 96.1). Our own gray100 #F0F5F1 is already L* 96.1 (C* 2.7), one L* lighter than the rejected #EEF2EF (95.1) and inside the observed range (it already backs disabled.bg in classic-grass.theme.ts, so a canvas use would need a separate disabled fill). Put chip, header and tile fills one rung down at L* 91-93 (FotMob #EAEAEA, Golfzon #E1EBF6, Munto #E9E8E8). That is the green-tinted version of what the measured category does.
  2. Ball-yellow-green as small numeric chips and one solid identity block, never as ground. Reference: Playtomic level chip #CCFC04 ~22 pt circle with a bold dark numeral under each avatar (playtomic_3), TennisFriends profile card #CCFD01 with black text and a progress bar (tennisfriends_5), Rally date pill #B5ED6D on deep green #045454 (rallyracket_3). Our optic #C6E84B (L* 87.1) plus ink #0D100E fits: NTRP/level chip, rating chip, "your turn" pill, one stat card on the Records and Profile tabs. This brings the sport's own colour into content while keeping the green as thin ink.
  3. Numeral-led records and a leading fact on session rows. Records: three-up stat strip (CourtMate courtmate_3: 19 / 13W 6L / 68%, ~20 pt/700), score rows with a bold right-aligned tabular figure and a 6-8 pt win/loss dot, hero numeral 28-44 pt/700-800 for a rating (Flap 8.6, UTR 7.45, Smash NTRP 2.3 + "top 12%"). Session rows: lead with one 16-20 pt bold fact (time as in Flap "18:00" flapfootball_1 or Band date band_3), a 76-95 pt photo or court thumb flush left (Smash smash_1, TennisFriends tennisfriends_3), and capacity as a right-aligned "n/m" (Smash "1/4"). Ours currently spreads emphasis evenly (tone audit item 2).

Avoid

  1. Saturated full-bleed backdrops as app ground (Smash #5D0AF7, Playtomic #335FFF, Somoim #2881FF): none of these apps uses them in-app (smash_1, playtomic_4, somoim_2 are white); they are store-art devices. Also avoid a wholesale dark/neon-on-black skin for browsing (RallyUp #FFFF01 on #04070C): the category reserves that for live scoring.
  2. Multicolour glossy/emoji icon tiles and shadow-lifted cards (Golfzon 5x2 glossy tiles golfzon_1, Somoim pastel icon grid somoim_2, Greenlight soft-shadow cards greenlight_6): they add saturation without information, repeat the emoji/stroke clash flagged in our tone audit item 6, and shadows conflict with our Android no-elevation rule on primitives.

6. Caveats ​

  • Store frames are curated, idealised demo states from the vendor, not production data; some mock-ups use stale UI (USTA 25.2.1 dates from 2025-06; TennisPAL 2026-06; ATP WTA 2026-08). Versions in the table are the current store version, not necessarily the UI shown.
  • Thumbnails are 392x696 or 222x480 JPEG: hex +/- 2-3 levels, L* +/- 0.5, no sub-pixel type measurement. Type sizes, radii and shadows are visual estimates (+/- 2 pt) except the two direct measurements in section 0. Type families cannot be identified from raster thumbnails (I only classify: heavy condensed display for USTA, UTR, NRC, ESPN; geometric grotesque for Playtomic; Hangul grotesque 15-22 pt bold for all Korean apps).
  • Crops include phone bezel/status bar/home indicator for some mock-ups; canvas hex was polluted by bezels in teamsnap_3, utr_1, utr_2, atpwta_2, rallyracket_2, spond_5, playtomic_3 and corrected by hand from the dominant colours (see metrics.json). Heja is a card-strip crop and Playtomic_3 is a composite, so neither contributes to ground statistics.
  • Near-white, ink and saturated shares are inflated or deflated by photos (Frip, Meetup, Class101 ink 15-23% is mostly photography). Compare screens without photos (CourtMate, Ace, Golfzon, TennisFriends) for the ground question.
  • Category selection bias: indie Korean tennis apps (Ace, CourtMate, RallyUp, TennisFriends, Baseline) have few reviews and may not represent "modern Korean apps"; Toss, Danggeun and Band-in-app were measured by another lane/the 2026-10-06 audit, not re-sampled here. Store frames show iOS only, light and dark of the same app are not both shown (Strava, FotMob, SwingVision are dark by vendor choice).
  • "Dominant pale hex >= 12%" is a threshold I chose; moving it to 8% gives 9 of 17 Korean apps, to 15% gives 4 of 17 (TennisFriends, Munto, Golfzon, CourtMate), so the claim is "a minority to half", not a precise share; the white page stays the modal pattern at every threshold.
  • No sub-agents, no git commands, nothing written under the TwoMore repository; all outputs are in bench/.

7. Files ​

Contact sheets (raw-UI crops, label = <app>_<frame>):

  • /tmp/claude-1000/-home-sungkyu08-Dev-twomore-v2/9e052da6-463b-47d5-958b-a7a7f703ba4b/scratchpad/bench/b_sheet1_kr_community.png (Band, Somoim, Munto, Frip, Greenlight)
  • /tmp/claude-1000/-home-sungkyu08-Dev-twomore-v2/9e052da6-463b-47d5-958b-a7a7f703ba4b/scratchpad/bench/b_sheet2_kr_tennis.png (TennisFriends, Smash, Ace, Baseline, CourtMate, RallyUp, Ralli)
  • /tmp/claude-1000/-home-sungkyu08-Dev-twomore-v2/9e052da6-463b-47d5-958b-a7a7f703ba4b/scratchpad/bench/b_sheet3_kr_sport_booking.png (Flap, Runday, SmartScore, Kimcaddie, Golfzon, Class101, Soomgo)
  • /tmp/claude-1000/-home-sungkyu08-Dev-twomore-v2/9e052da6-463b-47d5-958b-a7a7f703ba4b/scratchpad/bench/b_sheet4_global_club_booking.png (Playtomic, Spond, Heja, TeamSnap, Meetup)
  • /tmp/claude-1000/-home-sungkyu08-Dev-twomore-v2/9e052da6-463b-47d5-958b-a7a7f703ba4b/scratchpad/bench/b_sheet5_global_racket_perf.png (SwingVision, TennisPAL, Rally Racket, UTR, USTA, Strava, NRC)
  • /tmp/claude-1000/-home-sungkyu08-Dev-twomore-v2/9e052da6-463b-47d5-958b-a7a7f703ba4b/scratchpad/bench/b_sheet6_global_scores.png (OneFootball, ESPN, ATP WTA, FotMob)
  • Enlarged core-object crops: bench/b_zoom1.png (TennisFriends, Smash, CourtMate), b_zoom2.png (Flap, Munto, Somoim), b_zoom3.png (Band, Greenlight, Playtomic).
  • Full store-frame overview per app: bench/b_overview/<app>.png (36 files). Individual crops: bench/b_crops/<app>_<n>.png; metrics: bench/b_crops/metrics.json, surfaces.json, app_agg.json. Scripts (re-runnable): scratchpad/crop_b.py, sheet_b.py, surf_b.py, ov_b.py.

Markdown remains the source of truth. Run yarn docs:check before handoff.