Fields & Floors Collectors
eBay에서 번호가 매겨진 스포츠 카드들을 인쇄본·사인·신인 여부·가격으로 검색하고, 검색을 저장해 새 카드가 등록되면 이메일 알림을 받는다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기사연으로 입찰하는 경매 플랫폼.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
돈이 아니라 사연으로 입찰하는 경매 플랫폼. 가장 높은 금액을 부른 사람이 아니라, 가장 공감받은 이야기를 쓴 사람이 낙찰받는다. 전체 시안은 디자인 시안 (웹)에서 — 화면 32장과 디자인 시스템 4장을 배포된 서비스 안에서 그대로 열람할 수 있다. 경매 · 사연 · 포인트 • 사연으로 입찰하고, 공감(주최자 +50 P · 그 외 +10 P)이 낙찰을 가른다 • 포인트는 입찰에 걸고, 미낙찰·유찰·사연 삭제 시 전액 반환된다 • pg_cron 이 1분마다 마감을 집행한다 — 낙찰 산정·유찰·포인트 정산이 자동이다 • 마감 임박 알림은 경매 기간에 비례한 3단계로 온다 실시간 (Supabase Realtime) • 낙찰자↔주최자 1:1 채팅 — 읽음/안읽음 표시, 재연결 시 놓친 메시지 자동 복구, 전송 실패 시 재전송, 배송 정보는 말풍선이 아닌 카드로 • 실시간 이벤트에도 RLS 가 그대로 적용된다 — 참여자만 수신한다 • 새 알림이 오면 새로고침 없이 하단 탭 배지가 켜진다README 전문 보기 ↗
돈이 아니라 사연으로 입찰하는 경매 플랫폼.
가장 높은 금액을 부른 사람이 아니라, 가장 공감받은 이야기를 쓴 사람이 낙찰받는다.
| 구분 | 일반 경매 | Vidding |
|---|---|---|
| 입찰 수단 | 금액 | 사연(스토리) |
| 낙찰 기준 | 최고가 | 사연이 받은 공감 |
| 참여 경험 | 가격 경쟁 | 이야기 공유·공감 |
바로 보기 — 서비스 · 기능명세서 · 디자인 시안 · 스토리북 · 앱 다운로드
전체 시안은 디자인 시안 (웹)에서 — 화면 32장과 디자인 시스템 4장을 배포된 서비스 안에서 그대로 열람할 수 있다.
경매 · 사연 · 포인트
pg_cron 이 1분마다 마감을 집행한다 — 낙찰 산정·유찰·포인트 정산이 자동이다실시간 (Supabase Realtime)
푸시 알림 (웹 + 앱)
pg_net 으로 발송 API 를 호출한다 — 클라이언트를 거치지 않는다하이브리드 앱 (Expo)
앱 설치 (PWA)
관계 기반 UI
인증 · 보안
디자인 시스템
.pen 시안과 코드가 1:1 로 맞다에러 · 오프라인
src/app 과 대조한다살아 있는 목록
flowchart LR
subgraph client["클라이언트"]
web["웹 · Next.js 16 (Vercel)"]
app["앱 · Expo WebView 셸 (iOS 네이티브 탭)"]
end
subgraph supa["Supabase"]
db[("Postgres + RLS")]
rt["Realtime"]
auth["Auth (카카오 · 구글)"]
cron["pg_cron — 마감 집행"]
end
push["/api/push — Web Push · FCM"]
app -->|"배포 웹을 그대로 담는다"| web
web <--> db
web <--> rt
web <--> auth
cron --> db
db -->|"INSERT 트리거 + pg_net"| push
push -->|"VAPID"| web
push -->|"FCM"| app
Android 폰 카메라로 QR 을 찍거나, 아래 링크로 받는다.
vidding.apk 를 열면 된다/download)를 거친다 — 카카오톡 등 인앱 브라우저는 APK 설치가
막히므로 감지해서 외부 브라우저로 자동 전환한다기존 서비스의 기획과 디자인을 참고해 새로 만드는 개인 프로젝트다.
기존 서비스는 사용자를 경매진행자와 입찰참여자로 나누고 헤더 토글로 전환하게 했다. 같은 사람인데도 토글을 바꿔야 버튼이 눌렸다.
신분(내가 누구인가)이 아니라 관계(이 경매와 나는 어떤 사이인가) 로 판단한다.
| 관계 | 조건 |
|---|---|
| 주최자 | 내가 등록한 경매 |
| 참여자 | 내가 사연을 쓴 경매 |
| 방문자 | 로그인했지만 위 둘 다 아님 |
| 비회원 | 미로그인 |
관계는 계정 속성이 아니라 경매마다 따로 정해진다. 사용자가 선언하지 않는다.
낙찰
최종 점수 = 본인이 건 포인트 + 받은 공감 가중치
동점이면 → 먼저 작성한 사연
입찰 — +/− 버튼으로만 조작한다. 숫자를 직접 입력하지 않는다.
1,000 → 1,500 → 2,000 → 2,500 → 3,000
공감 — 주최자 +50 P · 그 외 +10 P
주최자가 결과에 개입하는 수단은 공감 하나뿐이다.
포인트 — 물건을 나누면 얻고, 물건을 받으면 쓴다.
| 흐름 | 내용 |
|---|---|
| 가입 | +5,000 P (1회) |
| 입찰 | 차감 |
| 미낙찰 · 유찰 · 사연 삭제 | 전액 반환 |
| 낙찰 | 낙찰자 → 주최자에게 이전 |
채팅 — 낙찰 이후 주최자와 낙찰자 사이에서만 열린다.
| 문서 | 내용 |
|---|---|
| 기능명세서 (웹) | 아래 기획 문서를 배포된 화면에서 읽는다 |
| 디자인 시안 (웹) | .pen 화면 32장 · 디자인 시스템 4장 |
| 스토리북 | UI 컴포넌트 카탈로그 |
| 기획 전체 | 인덱스 · 핵심 규칙 · 단순화 원칙 |
| PRD | 배경 · 문제 · 목표 · 사용자 · 기능 · 시나리오 · MVP 범위 |
| 데이터 모델 | 테이블 · RLS · 고정 상수 |
| 기능 스펙 | 기능별 상세 13개 |
| 코드 구조 | 폴더 구조 · 관계 판정 · 토큰 사용법 |
| Supabase | 마이그레이션 · 인증 설정 · 검증 결과 |
| 구분 | 사용 |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| Backend | Supabase (DB · 인증 · Realtime · pg_cron) |
| Push | Web Push(VAPID) · FCM(Expo) |
| App | Expo (React Native WebView 셸 · iOS 는 expo-router NativeTabs) |
| Docs | Storybook · Pencil(.pen) |
pnpm install
cp .env.example .env.local # Supabase 키를 채운다
pnpm dev
더미 데이터 — 마감·낙찰·유찰까지 실제 흐름대로 만든다.
SUPABASE_SERVICE_ROLE_KEY 가 있어야 한다.
돌리기 전에 대시보드에서 이메일 제공자를 켠다. 시드는 계정마다 이메일로 로그인해 RLS 를 그대로 통과하는데, 서비스는 소셜 둘만 제공해서 (F10 3.1) 평소엔 꺼 둔다. 끝나면 다시 끈다. 자세한 이유는
scripts/seed.mjs머리말에.
pnpm seed # 이미 있으면 건너뛴다
pnpm seed --clean # 지우고 다시 만든다