尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
우리 가족만 쓰는 프라이빗 성장 다이어리 PWA. Next.js (App Router) + Supabase. 1. Supabase 프로젝트를 만들고 supabase/migrations/ 안의 SQL을 순서대로 실행합니다 (Supabase SQL Editor에 붙여넣거나 supabase db push 사용). 2. .env.local.example을 .env.local로 복사하고 프로젝트 URL/anon key를 채웁니다. 3. 개발 서버 실행: 4. 가족 중 한 명이 /signup에서 아이디 + 닉네임 + 비밀번호로 가입 후 "새 가족 만들기"로 가족을 만들면 6자리 초대 코드가 발급됩니다(가족 피드 화면 상단에 표시). 나머지 가족은 /signup → "초대 코드로 참여하기"로 그 코드를 입력해 합류합니다. 가입은 열려 있지만, 초대 코드를 모르면 남의 가족 기록에 접근할 수 없습니다 (RLS로 private-first가 강제됨).檢視完整 README ↗
우리 가족만 쓰는 프라이빗 성장 다이어리 PWA. Next.js (App Router) + Supabase.
supabase/migrations/ 안의 SQL을 순서대로 실행합니다
(Supabase SQL Editor에 붙여넣거나 supabase db push 사용)..env.local.example을 .env.local로 복사하고 프로젝트 URL/anon key를 채웁니다.npm run dev
/signup에서 아이디 + 닉네임 + 비밀번호로 가입 후
"새 가족 만들기"로 가족을 만들면 6자리 초대 코드가 발급됩니다(가족 피드
화면 상단에 표시). 나머지 가족은 /signup → "초대 코드로 참여하기"로 그
코드를 입력해 합류합니다. 가입은 열려 있지만, 초대 코드를 모르면 남의
가족 기록에 접근할 수 없습니다 (RLS로 private-first가 강제됨).이메일 주소는 전혀 쓰지 않습니다 — 가입 시 내부적으로 무작위 placeholder
이메일을 만들어 Supabase Auth에 등록하고, login_identities 테이블이
"아이디 → 그 placeholder 이메일"을 매핑해 로그인 화면에서 아이디+비밀번호로
로그인할 수 있게 해줍니다 (supabase/migrations/0002_name_based_auth.sql,
0004_separate_username_nickname.sql). 이메일 확인(confirm email) 절차는
DB 트리거로 즉시 처리되므로 Supabase 대시보드의 이메일 인증 설정과 무관하게
항상 동작합니다.
아이디(로그인용, login_identities.username)와 닉네임(가족 피드 등에
보이는 이름, profiles.name)은 별개입니다 — 설정 탭에서 닉네임을 바꿔도
로그인 아이디는 그대로예요.
src/app/(app)/ — 로그인 후 화면 (오늘/달력/가족/앨범/설정, 기록 작성·수정, 도전 모드, 개인 공간)src/app/login/, src/app/signup/ — 로그인/가입src/app/onboarding/ — 가입 직후 가족 생성/참여 화면src/app/(app)/trips/, src/lib/trip/ — 가족 여행 플래너 (홈의 "가족 여행" 카드로 진입, 하단 탭 아님). 여행 정의는 trips.def(JSON), 일차별 편집본은 trip_day_items, 장소별 진행 기록은 trip_progress. 가족 구성원 모두가 읽고 쓰는 공유 데이터이며(0014_family_trips.sql), 일정 엔진은 src/lib/trip/engine.ts. 동시 편집은 updated_at 기반 낙관적 잠금(충돌 시 최신 데이터에 재적용, src/lib/trip/cas.ts). 순수 로직은 npm run test:unit(Vitest)로 검증. 화면은 trip-view.tsx(지도+목록 한 페이지, 낙관적 반영 use-trip-state.ts), 지도는 Leaflet + OpenStreetMap 타일. 소감·별점은 trip_progress, 사진은 trip_photos + 비공개 버킷 trip-media(브라우저에서 줄여 직접 업로드, 0015_trip_reviews_and_photos.sql), 여행 요약은 src/lib/trip/summary.ts의 결정론적 계산(AI 호출 없음)src/app/actions.ts — 서버 액션 (기록 생성/수정, 리액션, 댓글, 가족 생성/참여, 목표, 일정, 로그아웃)src/lib/supabase/ — 브라우저/서버/미들웨어용 Supabase 클라이언트supabase/migrations/ — DB 스키마 + RLS (private-first) + 초대 코드 조회 함수public/manifest.webmanifest, public/sw.js — PWA 매니페스트 + 오프라인 셸 캐싱포함: 로그인, 오늘 기록(카테고리 5종 + 한 줄 + 사진 최대 5장 + 공개범위, 이후 수정 가능 — 사진은 나중에 추가만 가능하고 삭제는 아직 없음), 월간 캘린더(가족 구성원별 작성 표시 포함), 가족 피드 + 리액션 + 댓글, 가족 목표(부모/아이 누구나, 응원 카운트), 캘린더 일정(미용실/약속 등), 사진 앨범(본인 + 가족이 공개한 사진 모아보기).
목표는 결과 달성 압박이 아니라 "사소한 것도 응원받는" 걸 목적으로 해서, 가족간 순위나 벌점은 없고 응원(👏) 카운트만 누적됩니다.
홈 화면에는 "🎁 모은 아이템"도 있습니다 — 기록/목표 활동에 따라 정해진
규칙으로만 아이템이 해금돼요 (src/lib/items.ts). 랜덤 뽑기는 PRD의
게임화 원칙(도파민 자극용 랜덤 보상 금지)과 맞지 않아서 의도적으로 배제
했습니다.
가족 구성원마다 /room/[userId] 개인 공간(미니홈피 느낌)이 있고,
설정에서 나무/별자리/행성/색모음집 중 자기 세계관을 직접 고를 수 있습니다
(가족 전체가 하나로 통일할 필요 없음). 공간에는 모은 아이템과 목표가
표시되는데, 본인이 아닌 경우 그 사람이 가족에게 공개한 것만 보입니다 —
get_item_stats가 별도 권한 체크 없이 기존 RLS에 그대로 얹혀 동작하는
구조라, 다른 사람 공간을 봐도 그 사람의 비공개 기록은 절대 새지 않습니다.
"도전 모드"(연속 기록 일수에 따라 동물이 자라는 화면)는 하단 탭에는 없고 홈 화면 "🎁 모은 아이템" 옆 링크로 들어갑니다 — 하단 탭은 5개(오늘/달력/ 가족/앨범/설정)로 유지하는 게 원칙입니다 (아래 "설계 원칙" 참고).
보류 (PRD 참고): 원본/디스플레이/썸네일 리사이즈 파이프라인(현재는 원본만 업로드), Google Calendar 연동, 가족 공유 일정(현재 일정은 개인 캘린더에만 표시), 사진 삭제.
docs/design-principles.md 참고 — 비용/랜덤/RLS/
스토리지 RLS/비정규화 필드 동기화/E2E 타임아웃/하단 탭바 개수에 대한 원칙을
정리해뒀습니다. CLAUDE.md에서 임포트하고 있어서 새 세션에서도 항상 로드돼요.
main입니다. main에 병합되면 Vercel이 프로덕션으로 배포합니다 (다른 브랜치는 미리보기 배포).