← Cockpit Wireframes Pages by level Navigation map
Product questions — open▾
Shipped app (old grammar)Components · 공유 키트상세 페이지 — 플랫 언어Session Card · 밴드 없는 카드
홈 · Home
Home · 홈
시작 · Entry
Onboarding · 시작
ArchiveStrip Map · 세션 스트립 전체 시나리오Headers · 헤더 아이콘Card Continuity · 카드 = 상세의 예고편Session Hero · 더 조용한 공유 카드 (제안)Session Share Card · 히어로 = 공유 카드Session List Frame · 날짜 섹션 · 패널 필터 · 2+2 카드Compaction — 일정 · 코트 · 스코어카드Compaction — 클럽 상세 · 홈Compaction — 기록 · 프로필Live anchor — 진행 중 밴드Density · 카드 밀도토스트 — 리디자인 제안Club List · 클럽Clubs · 클럽클럽 상세 — 여섯 탭 플랫운영 섹션 — 플랫 목표위저드 내비게이션 — 결정 보드드래프트 복원 — 무음 복원클럽 조 편성 — 모델 결정 보드게스트 → 회원 — 심사 흐름Page polish — titled postsWeb app — desktop layoutProduct questions — openWeb app — desktop adaptation, round 2Visual tone — pure white, flat rows, one Tag, a colour budgetLibrary — chrome, surfaces, rows, labelsLibrary — controls, overlays, states, formsLibrary — page patterns, scaling, motionLibrary — additions from the pagesEmpty-once — 프로필 빈 섹션Notification groups — 할 일 밴드 그룹화Profile Cockpit · 프로필 압축Session Detail — Redesign · 일정Venue Detail — Redesign · 테니스장Profile Detail — Redesign · 프로필Tournament Detail — Redesign · 대항전Applicant Detail — Redesign · 가입 심사Canvas Migration — 회비 · 멤버 · 규칙Record Detail — Redesign · 기록Venue Finder · 코트 찾기Venue Filters · 코트 필터 재구성Notifications · 알림Panel Placement · 하단 고정
Decided 2026-10-11 — shipped; kept as the decision record
Interactive kit · grounded in code

Product questions — open

Recommended pathP1 — 홈’s desktop summary pane shows only what the week pane already loads
1Board W2 drew 참석 / 예정 / 입금 대기, but 예정 and 예비 have no projection: each would need a new RPC or a second RSVP read, so they are cut.
2The pane keeps three counts the week pane already holds: 참석 (RSVP’d sessions this week), 입금 대기 (payment gate state is reserved) and 치른 경기 (the recap’s match entries).
3다음 일정 is the first RSVP’d session, drawn with the same list row and capacity ring as W2. No new RPC; the sources are in the spec below.
Owner's word needed → Build the pane from existing loads, no new RPC — yes?
twomore.app/home
DABUSI
일정 만들기
홈
클럽
경기
기록
프로필
알림
메시지
김
김민준계정 · 설정
홈
9월 19일 (토)내일
대치유수지체육공원 테니스장
⏰19:00~21:00
🎾복식 번개
🎯
3.0–4.0
참석
6/8
올림픽공원 테니스장
⏰09:00~11:00
🎾복식
🎯
3.0–4.0
참석
4/8
9월 20일 (일)
경기고등학교 테니스장
⏰08:00~10:00
🎾복식
🎯
3.0–4.0
참석
5/8
이번 주
3참석
1입금 대기
2치른 경기
다음 일정
9/19
토
대치유수지체육공원 테니스장19:00~21:00
6/8
홈 at 1440: the summary pane is a projection of the week pane’s own queries
Recommended pathP2 — 번개 찾기 shows 친구 참석 through a count-only RPC
1A non-member cannot read a pickup’s rsvps (rsvps_select is club-members only), so the card’s friends count is 0 there and the chip never shows.
2friends_attending_count(session_ids uuid[]) is viewer-scoped and returns counts only, no identities, for open pickups; the card model gap-fills friendsGoing and the existing strip chip renders unchanged.
3Privacy call: a friend’s attendance becomes visible to their friends on pickups outside their club. The alternative is no chip on pickups, which keeps the roster wall fully intact.
Owner's word needed → Count-only RPC, chip on pickups — yes?
번개 찾기
9월 19일 (토)내일
대치유수지체육공원 테니스장
⏰19:00~21:00
🎾복식 번개
🎯
3.0–4.0
친구 참석 2명8,000원원
4/8
올림픽공원 테니스장
⏰09:00~11:00
🎾복식 번개
🎯
3.0–4.0
무료원
모집 중
3/8
With the RPC: the strip’s friends chip, count only (친구 참석 2명)
번개 찾기
9월 19일 (토)내일
대치유수지체육공원 테니스장
⏰19:00~21:00
🎾복식 번개
🎯
3.0–4.0
8,000원원
모집 중
4/8
올림픽공원 테니스장
⏰09:00~11:00
🎾복식 번개
🎯
3.0–4.0
무료원
모집 중
3/8
Without it: no chip on pickups, members’ session cards keep theirs
Recommended pathP3 — A single feed photo keeps the 4:3 row-wide frame; 16:9 would trade photo for density
1The 72×56 thumbnail from the FEED-TWO-LINES entry is already replaced (owner 2026-09-27, too small to read): FeedPhotoStrip shows one photo at 4:3 across the row and squares for two or three.
2A 16:9 band is 67px shorter per photo post (201 against 268 at 358 wide), about one more post per screen, at the cost of cropping a third of a camera photo.
3Reference: Band and Facebook lead with a full-width photo; 당근’s small side thumbnail is the density already rejected. Photo prominence wins here, since the feed is already two lines of text.
Owner's word needed → Keep 4:3 for a single photo, no change — yes?
강남 테니스 클럽
박
박지훈어제 | 자유
토요일 대치에서 한 게임 했어요. 코트 상태가 정말 좋았습니다.
🎾
12
3
이
이서준2일 전 | 자유
다음 주 정기 모임 후에 식사 같이 하실 분 계신가요?
4:3 across the row (shipped): the photo is the post
강남 테니스 클럽
박
박지훈어제 | 자유
토요일 대치에서 한 게임 했어요. 코트 상태가 정말 좋았습니다.
🎾
12
3
이
이서준2일 전 | 자유
다음 주 정기 모임 후에 식사 같이 하실 분 계신가요?
16:9 media band: denser scan, a third of the photo cropped
Spec — P1 number sources, P2 RPC, P3 geometry

P1. The pane is a projection, not a feed row: it renders beside the FeedList on windows of 1200 and up, reading the same queries the week pane already holds, so opening 홈 on desktop adds no request the phone does not make. It follows the browsed week (its title reads 이번 주 only for the current week).

CellDefinitionSupplied byNew RPC?
참석Count of `rsvpdSessions` in the week range`useHomePeriodRecap(userId, weekRange)` (`useRsvpdUpcomingSessions`)No
입금 대기Sessions where `sessionPaymentGateState(fee, status, submittedAt)` is `reserved``useMySessionPayments(userId, weekSessionIds)` plus the fee on `sessionCardModels`No (bulk reader exists)
치른 경기Match-history entries in the week (`derivePeriodRecap` total)`useMatchHistory` already read by the week paneNo
다음 일정First of `rsvpdSessions`, host-first sorted, from today on`useHomePeriodRecap` + `sessionCardModels` (capacity ring from the model)No
예정 (cut)Would count sessions the viewer could still join, not RSVP’dNeeds a viewer-scoped open-sessions count across clubsYes: a new RPC
예비 (cut)Waitlisted RSVPs; `useRsvpdUpcomingSessions` returns confirmed onlyWould add a second RSVP-status readYes: new read

P2. friends_attending_count(session_ids uuid[]) returns (session_id uuid, friend_count int): SECURITY DEFINER with search_path = '', REVOKE FROM PUBLIC, GRANT to authenticated. It counts confirmed rsvps whose user is an accepted friend of auth.uid(), only for open, visible pickup sessions, at most 50 ids per call, rows with a zero count omitted. It returns no identities: the viewer learns that N of their friends are going, never which. The client gap-fills who.friendsGoing with the larger of the roster count and the RPC count through one bulk sibling hook (Protocol A), so the strip rule in session-strip.ts and the card stay unchanged. Needs a pgTAP file: a stranger gets 0, a friend of an attendee gets the count, a blocked friend is excluded.

P3. At the phone column (358 usable width on a 390 screen) a 4:3 photo is 268 tall and a 16:9 band is 201: the band saves 67px per photo post, about one extra text-only post per screen. 4:3 is the phone camera’s own ratio, so 16:9 crops a third of a typical photo off the top and bottom; the tile arrangement for two and three photos is unchanged either way. Band and Facebook show the full-width photo; 당근 keeps a small thumbnail beside the text, which is the density the owner already rejected as too small.

Spec (grounding, anatomy)

Proposal (2026-10-06): three product questions, each drawn as the recommended final state. P1 the 홈 desktop summary pane from existing loads; P2 a count-only 친구 참석 RPC for the pickup finder; P3 the single-photo frame in the club feed.

route · packages/features/home/src/home-feed-screen.tsx · packages/app/src/presentation/components/sessions/session-card-v2.tsx · packages/features/clubs/src/shared/post-row.tsx grounded in 13 source file(s)
packages/features/home/src/home-feed-screen.tsxpackages/features/home/src/page/home-body.tsxpackages/features/home/src/lead/use-home-lead.tspackages/features/home/src/news/news-feed-list.tsxpackages/features/home/src/lead/lead-block.tsxpackages/app/src/domain/session-info-model.tspackages/app/src/domain/session-info-model/payment-gate.tspackages/app/src/domain/session-strip.tspackages/app/src/presentation/components/sessions/session-card-v2.tsxpackages/app/src/presentation/hooks/use-session-card-models.tssupabase/migrations/00080_db_optimization.sqlpackages/features/clubs/src/shared/post-row.tsxpackages/features/clubs/src/shared/club-photo-seam.tsx