Usability audit — familiar and streamlined for low digital literacy
Status: Accepted · Date: 2026-09-16 · Owner brief: "provide a familiar and streamlined user experience, visually and behaviorally, so that even those that don't have high digital literacy can easily use all features of the app … from onboarding to settings, all of the pages and user flows."
This audit is the input to a plan: every finding below is either shipping now (Tier 1), waiting on one owner decision (Tier 2), or part of a larger gated program (Tier 3). Each finding is also a feedback entry on the page QA board tagged usability, so it is re-checked on device with the rest of the QA items.
1. Who we design for, and what "familiar" means
Korean amateur club members and 총무 in their 40s–60s who live in KakaoTalk, Naver, 네이버 밴드 (the incumbent for club management), 당근 and Toss, but do not explore menus, do not discover gestures, read slowly, and abandon on the first confusing screen. Familiar = it works like those apps. Streamlined = fewest steps, one obvious next action, sensible defaults.
2. Method
Three parallel lanes read the real screens (packages/features/*, packages/app/src, packages/ui/src, apps/mobile/app), the Korean copy (packages/app/src/config/i18n/ko/*.ts) and the phone-width web renders of every route taken on 2026-09-15 with seeded data, then scored against twelve heuristics tuned for this audience:
| Id | Heuristic |
|---|---|
| H1 | Orientation — the page says what it is for and how to get back |
| H2 | Plain words — no unexplained jargon, abbreviations or English |
| H3 | One obvious next step — the primary action is visible and unrivalled |
| H4 | Familiar controls, no hidden gestures — nothing reachable only by long-press, swipe or a ⋯ menu |
| H5 | Visible affordances and labels — icon-only controls are universal or labelled |
| H6 | Feedback and confirmation — actions confirm; money and destructive actions confirm first |
| H7 | Error prevention and recovery — defaults, inline fixes, no dead ends |
| H8 | Progressive disclosure — advanced options hidden; one decision per step |
| H9 | Readability and touch — 44pt targets, body ≥14, critical facts never truncated |
| H10 | Consistency — one look and behaviour per concept |
| H11 | Help and undo — a way to ask, learn, undo; "what happens next" |
| H12 | Effort — taps, steps and fields a task really needs |
Lane A walked the newcomer/member path, lane B the organizer (총무/host) path, lane C the cross-cutting patterns (language, gestures, icon-only controls, menus, feedback, states, readability, formats). Every claim used below was re-verified in the code by the main thread before it was accepted. The lane reports with full inventories are kept alongside this file's commit in the session scratchpad and summarised here.
3. Effort to finish the key tasks today
| Task | Taps / screens | What gets in the way |
|---|---|---|
| Sign up and land on Home | not possible in-app (email/password login only; copy says "contact the ops team") | U-01 |
| Join the first club | 1 tap from a tapped invite link · 3 taps from a pasted code (find the key icon) · 4–6 taps browsing | U-09, U-10 |
| RSVP and pay a session fee | 2 taps to confirm · +3 taps to find the bank account on another screen · a trip to a banking app · wait for host confirmation | U-02, U-11 |
| Find my own schedule | 0–1 tap (Home is the landing tab) | fine |
| Create a club | 9 wizard screens, ~17 taps, ~7 required choices | U-32 |
| Create a session with club defaults | 7 screens, ~13 taps | U-19, U-33 |
| Generate matches and start play | ~6 taps | U-16 |
| Record one score | ~3 taps, no recap | U-34 |
| Collect a month of dues from 20 members | ~5 setup + 40 taps (2 per member, no bulk action, no confirm) | U-04, U-15 |
4. Findings
Severity: blocker = a low-literacy user gets stuck or does the wrong thing; major = they hesitate or make avoidable mistakes; minor = friction. Effort S/M/L. Owner call marks a change to information architecture, a ratified design, a canon law or product policy.
Blockers
- U-01 · No self-serve sign-up.
login-screen.tsxis email/password sign-in only;use-auth.tshas nosignUp; the copy says "계정이 없다면 운영팀에 문의해 주세요"; a shared pickup link sends a stranger to "로그인하고 신청하기". H3/H7. Tier 3 — sign-up is the gated Phase 8 program (Kakao OAuth / 본인인증). Nothing else in this audit matters to a person who cannot get in. Owner call: yes. - U-02 · Paying a fee never shows where to send the money. The
reservedpayment banner on session detail shows the amount and "입금 완료" but no account; the club's account lives only on 클럽 → 회비 (payment-gate-banner.tsx;useClubBankAccounthas no caller underfeatures/sessions). H6/H7. Tier 1: render the club's account line in the banner. Effort S. - U-03 · A crash shows a raw English exception as the headline.
packages/ui/src/error-boundary.tsxprintserror.messageand the stack and asks the user to forward it. H2/H7. Tier 1: plain title, one sentence, 재시도; technical details behind "자세히 보기". Effort S. - U-04 · Money actions with no confirmation. Marking dues paid mutates instantly (
use-club-dues-actions.tshandleMarkPaid, whilehandleWaiveconfirms) and the paid row then loses its only management affordance; the session settlement screen generates payments and marks paid/waived from a bare tap (session-payments-screen.tsx). Every other consequential action in the app confirms in plain language. H6/H7/H10. Tier 1: confirm all four. Tier 2: a "납부 취소" affordance on paid rows for the current month (needs an unmark mutation). Effort S + M. - U-05 · The club admin console is reachable only through an unlabelled ⋯. 관리 (settings, venues, attendance, challenges, analytics, bank account, guest policy) lives in
HeaderActionsMenu, whose label is screen-reader only; the visible club nav shows 홈/일정/채팅/기록/멤버/회비 (club-detail-screen.tsx). The same menu holds 클럽 나가기. H4/H1. Tier 2 (IA): give officials a visible, labelled 관리 entry — a header text action or a nav item — like KakaoTalk's 채팅방 설정. Recommendation: header text action "관리" for admins, ⋯ keeps share/leave. Effort M. Owner call: yes. - U-06 · Fee, format, rotation and RSVP deadline can never be edited. The edit screen's own banner: "참가비, 종목, 로테이션, 모집 마감 등은 생성 후 변경할 수 없어요". A typo means cancelling (notifying everyone) and recreating. H7. Tier 3 (policy): allow fee edits until the first payment exists, using the gate the settlement screen already has. Now: restate the lock on the create-session review step. Effort L / S. Owner call: yes.
Major
- U-07 · Jargon at first contact. ELO, NTRP, 티어, D-4, 구성 ("클럽 기준"), 로테이션, 모집 마감 vs 마감, 성사 대기, 신뢰 등급, 인터클럽, 측정 중 appear with no explanation the first time they are met; the one explainer (
TierInfoSheet) is wired on own-profile/records/two wizard steps but not on the public profile. Onboarding card 2 already says "ELO·매너로 믿고 치는 상대". H2. Tier 1: wireTierInfoSheeton the public profile. Tier 2 (terminology): one first-encounter pattern — a plain caption or a tap-to-learn "?" — for ELO/NTRP/D-day/구성/로테이션, decided once in the terminology guide. Tier 3: 신뢰 등급 needs its mechanics documented before it can be explained. Owner call: yes for the pattern. - U-08 · One roster, two skill vocabularies.
participation-section.tsxcalls the mode-unawaretierSubLabelfor members with a sub-tier and the mode-awareskillLabelForTierfor the rest, so "실버 II" sits next to "NTRP 3.5–4.0" (seen in the render). H10. Tier 1: useskillLabelForTierSub. Effort S. - U-09 · Icon-only header actions a first-timer cannot decode. A bare key icon is the only manual "join with a code" entry (
club-join-header-action.tsx); bookmark and sliders icons carry only accessibility labels. H5. Tier 2 (ratified header conventions): a labelled text action for 초대 코드; keep universal icons (back, search, share, gear, chat, ⋯). Effort S. Owner call: yes. - U-10 · The empty 내 클럽 tab offers two rival first actions. Empty state "클럽 탐색" and a pinned band "클럽 만들기" at equal weight (
club-list-screen.tsx); a newcomer was almost always told to join an existing club. H3. Tier 2: 탐색 leads (with the code entry next to it); 만들기 becomes secondary until the user has looked. Effort S. Owner call: yes. - U-11 · The "copy account number" button does not copy on native.
dues-bank-card.tsxtoasts "계좌번호를 길게 눌러서 복사하세요" (a hidden gesture, on a money field). H4/H6. Tier 3:expo-clipboardis a native module → next EAS build. Tier 2 interim: relabel the control as the hint it is. Owner call: yes. - U-12 · The most common secondary text is 13px.
cardMeta(dates, venue names, counts, fees on every row) is$3= 13px;microis 10px. H9. Tier 2 (type scale): raisecardMetato 14px and review on the screenshot board. Effort M. Owner call: yes. - U-13 · Names truncate to one line with no way to read them. Venue, club and session titles are
numberOfLines={1}on every card; real names ("대치유수지체육공원 테니스장") clip. H9. Tier 2 (card layout): allow two lines for the name. Effort M. Owner call: yes. - U-14 · Three words for "collect money" and two row grammars. 회비 (dues, kebab + modal, 완료/면제), 결제 현황 / 비용 정산 (one screen with two titles, inline 확인/면제), 참가비; nothing links the session fee to the settlement split. H2/H10. Tier 2 (terminology): one label per concept and one verb pair (확인/면제) on both rosters; one sentence on the settlement screen relating fee and split. Effort M. Owner call: yes.
- U-15 · No bulk "mark all paid". 40 taps for a 20-member club every month (
admin-roster-section.tsx). H12. Tier 2: "전체 완료 처리" with one confirm naming count and amount, mirroring the pickup-host bulk approve. Effort M. Owner call: yes. - U-16 · Match board: two primary buttons, one unexplained. Empty state "대진 짜기" and the pinned "경기 시작" are both filled primaries; 대진 짜기 has no explanation. H3/H2. Tier 1: subtitle "경기 상대와 코트를 자동으로 배정해요". Tier 2: hide or demote 경기 시작 until a round exists, unless free play without a draw is intended. Owner call: yes for the hierarchy.
- U-17 · Settlement suggests 34,286원.
Math.ceil(total / count)with no transfer-friendly rounding. H7. Tier 1: round up to the nearest 1,000원 (configured unit). Effort S. - U-18 · The 듀스 toggle visibly does nothing. Its own caption says "참고용이며 점수 입력에는 영향 없어요" among three toggles that matter. H2/H6. Tier 2: wire it or render it inert. Owner call: yes.
- U-19 · "경기 시간" on the players step reads as the session time. It means the length of one match (20/30/40/60분). H2. Tier 1: "한 경기 시간" + caption. Effort S.
- U-20 · Auto-cancellation below the minimum is caption text only. "최소 인원 미달 시 일정이 자동 취소돼요" under a stepper, never restated. H6/H11. Next batch: restate on the review step as a callout. Effort S.
- U-21 · Tier credentials expose federation jargon. "신인부/챌린저부 입상권 (KTA, KATO)" when a treasurer just describes a casual club (
clubs.tstierCredentials). H2. Tier 2 (tier sheet design): lead with 구력 lines, federation detail behind 자세히 보기. Owner call: yes.
Minor
- U-22 · Waitlisted users are not told what happens next. Only a badge + cancel (
rsvp-cancel-actions.tsx); promotion is automatic and pushes. H11. Tier 1: "자리가 나면 자동으로 확정되고 알려드려요". Effort S. - U-23 · A club application does not promise a notification. "신청 검토 중" and nothing else (
join-cta-band.tsx). H11. Tier 1: "총무가 승인하면 알려드릴게요". Effort S. - U-24 · Help is email-only.
/legal/contact: one email address + FAQ. H11. Tier 2: a KakaoTalk channel or a phone number. Owner call: yes. - U-25 · "A조" on every member row with no legend. H2. Tier 2: hide the 조 tag for viewers whose club has one group, or add a one-line legend. Owner call: yes (minor).
- U-26 · DM thread: blank canvas and a generic title. No
emptyStateon the message list; the header falls back to "메시지" while loading. H1/H7. Tier 1. Effort S. - U-27 · Notification cards cut mid-sentence. "…확정 0명 (최소 4…". H9. Next batch: truncate at a clause or allow a third line for alert bodies (the body itself is U-14 of the 2026-09-15 pass).
- U-28 · "LIVE" tab in English. A standing ruling (terminology guide); noted, no change.
- U-29 · Seven identical red 삭제 buttons on the participants screen; rows boxed as cards on a detail page. H9/H5. Already filed on 2026-09-15 (flat law); Tier 2: muted trailing icon per the item-remove law. Owner call: yes.
- U-30 · 성장 분석 row leads to a "준비 중" placeholder. H8. Tier 1: badge the row 준비 중. Effort S.
- U-31 · "사진 한도에 도달했어요" with 0/0 photos. H2/H7. Tier 1: "사진첩은 상위 등급에서 이용할 수 있어요" when the limit is 0. Effort S.
- U-32 · Create-club is nine screens; two steps show derived math. The recruit-size receipt (step 5) and the court-fee dues calculator (step 6) front-load arithmetic; the wizard cannot be shortened. H8/H12. Tier 2/3 (wizard): a "빠르게 시작" path that defaults 스타일/인원/게스트 (fill in later from 클럽 설정), the receipt behind "왜 이 숫자죠?", "월 회비 직접 입력" as the lead. Owner call: yes.
- U-33 · 형식 must be re-picked on every session. The other three axes seed from the club; 형식 is null-start by wizard law. H12/H10. Tier 2: seed from
club.preferredFormat, still changeable. Owner call: yes (wizard law). - U-34 · A saved score has no recap. H6. Next batch: an undo toast ("13:2 저장됨 · 취소"), not a dialog. Effort S.
- U-35 · 멤버 관리 mixes a personal discovery tool (복식 파트너 추천) into the treasurer's roster page. H1. Tier 2 (IA): move it to a personal surface. Owner call: yes.
- U-36 · Tournament setup shows 조 크기 / 진출 방식 knobs for a casual event. H8. Next batch: defaults + "설정 더보기". Effort S.
- U-37 · Web routes missing (session preview, records day/rivals, several settings screens; /settings/privacy serves the legal page). Web target only. Tier 3 backlog.
Working well and worth protecting: the invite-link join path (one tap, one CTA, clear mismatch dialog), the club starter-mission checklist (시작 미션 1/3), Home as the schedule landing tab, plain verbs on the RSVP CTA (참석 확정하기), the friendly 매너 태그 introduction, the host-tools section on session detail (visible, labelled rows — the template U-05 should copy), 44pt hit slops computed on every small control, money and dates always through the shared formatters, and no swipe-to-delete or drag gestures anywhere.
5. The plan
Tier 1 — shipping now (no owner call, effort S). U-02 account line in the payment banner; U-03 plain crash screen; U-04 confirmations on dues mark-paid and the three settlement actions; U-07a tier explainer on the public profile; U-08 one skill vocabulary per roster; U-16a 대진 짜기 subtitle; U-17 rounded settlement suggestion; U-19 "한 경기 시간"; U-22 waitlist next-step line; U-23 application notify line; U-26 DM empty state and loading title; U-30 준비 중 badge; U-31 photo quota copy.
Next batch — no owner call, small. U-06 lock notice on the review step; U-20 auto-cancel callout on the review step; U-27 alert-body truncation; U-34 score undo toast; U-36 tournament defaults behind a disclosure; U-32b receipt behind "왜 이 숫자죠?".
Shipped 2026-09-16, foundational pass (see the rebuild log entry of the same date): the whole next batch — U-06 (lock restated on the review step; the fee-edit policy itself stays Tier 3), U-20, U-27 (facts wrap as segments), U-34, U-36, U-32b — plus U-16b (a domain gate, canStartMatches, with the reason on the CTA), U-11 (honest copy control: selectable value + hint on native, a real 복사 on web), U-04b (납부 취소 with a confirm, current period, manual rail only), U-29 (participant rows flat, RemoveIconButton), and the tier-cell, initials, deadline, scope and empty-state classes the QA pass surfaced. Still open as owner questions: U-05, U-07b, U-09/U-10, U-12/U-13, U-14/U-15, U-18, U-21, U-24, U-25, U-33, U-35; gated: U-01, U-07c, U-32 quick-start, U-37.
Tier 2 — one owner decision each (recommendation first).
- U-05 club 관리 visible for officials — header text action "관리".
- U-07b first-encounter jargon pattern — plain caption on first appearance per screen, "?" opens the existing sheet; written into the terminology guide.
- U-09 labelled 초대 코드 entry on the 클럽 tab; U-10 탐색 leads the empty state, 만들기 secondary.
- U-12
cardMeta14px and U-13 two-line names — one screenshot board, both at once. - U-14 one money vocabulary and one verb pair; U-15 bulk mark-paid; U-04b 납부 취소 on paid rows.
- U-16b hide 경기 시작 until a round exists; U-18 듀스 wired or inert; U-33 seed 형식 from the club.
- U-21 plain tier credentials; U-25 조 legend; U-29 참석자 removal icon; U-35 파트너 추천 out of 멤버 관리; U-24 KakaoTalk support channel; U-11 relabel the copy control until the native module ships.
Tier 3 — gated programs. U-01 sign-up (Phase 8 Kakao / 본인인증); U-06 fee-edit policy; U-11 expo-clipboard in the next EAS build; U-07c 신뢰 등급 mechanics; U-32 create-club quick-start; U-37 web route parity.
6. How it is audited with the rest of QA
Every finding is a feedback entry on the page QA board tagged usability and filed by Claude on its page (or as General for cross-cutting ones). Tier 1 items are marked Fixed with the commit; the owner re-checks them on device with the page's own 10-item list and moves the page to Done. Tier 2 items are filed as questions with the recommendation; the owner answers in the entry (reply) or on a wireframe board, and the item flips to open work. The task table in §3 is re-measured after each batch; the goal is met when sign-up exists, joining and paying take the counts a KakaoTalk user expects (≤3 taps, no other screen to visit), and no first-contact screen shows an unexplained term.