尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
태어난 날부터 첫돌까지, 우리 아기의 성장 길을 한눈에. 별마마파파의 세 번째 서비스 아기 생년월일을 등록하면 생후 일수·주수·개월 수를 자동 계산하고, 그 시기에 필요한 발달·이유식·놀이·예방접종·건강·안전 정보를 자동으로 보여주는 0세 맞춤 성장 가이드입니다. • 의료 진단 서비스가 아닙니다. "정상/비정상", 점수, 백분위 판정 기능은 의도적으로 없습니다. • 콘텐츠는 모두 Supabase DB 에서 관리하며, 관리자 페이지(/admin)에서 코드 수정 없이 편집합니다. • 초기 seed 콘텐츠는 샘플(검토 전) 로 표시됩니다. 예방접종 일정은 공개 전 반드시 공식 자료로 검증하세요.檢視完整 README ↗
태어난 날부터 첫돌까지, 우리 아기의 성장 길을 한눈에. 별마마파파의 세 번째 서비스
아기 생년월일을 등록하면 생후 일수·주수·개월 수를 자동 계산하고, 그 시기에 필요한 발달·이유식·놀이·예방접종·건강·안전 정보를 자동으로 보여주는 0세 맞춤 성장 가이드입니다.
생년월일 → getBabyAge() → 월령/주수에 맞는 콘텐츠 선택(lib/content/select) → 화면
/admin)에서 코드 수정 없이 편집합니다.별마마파파 · 별별 작명소와 같은 밤하늘 · 금빛 무드를 따릅니다.
#05060c 배경, 금빛 그라데이션 #ffe9a8 → #f5c542 → #d9a215, 본문 #f6f6f8next/font 로 자체 호스팅), 본문은 Pretendard/시스템 고딕card-night), 금빛 그라데이션 알약 버튼, ✦ 구분선(StarRule), 고정 별하늘 배경, 금빛 선 아이콘 네비게이션, 하단 별마마파파 서명src/app/globals.css 의 @theme 한 곳에서 관리합니다 (night/surface/ink/gold/...). 색을 바꿀 때는 컴포넌트가 아니라 토큰을 수정하세요.| 영역 | 사용 |
|---|---|
| 프레임워크 | Next.js 16 (App Router, Turbopack, proxy.ts), React 19, TypeScript |
| 스타일 | Tailwind CSS v4 (디자인 토큰: src/app/globals.css) |
| 백엔드 | Supabase (PostgreSQL, Auth, Storage) via @supabase/ssr |
| 테스트 | Vitest (순수 로직 단위 테스트) |
| 배포 | Vercel |
추가 런타임 의존성은 @supabase/supabase-js, @supabase/ssr, server-only 뿐입니다. 차트·폼·상태관리 라이브러리를 쓰지 않습니다.
npm install
cp .env.example .env.local # 값 채우기 (아래 "환경변수")
npm run dev # http://localhost:3000
Supabase 환경변수가 없어도 빌드와 공개 페이지 렌더링은 동작하며(콘텐츠는 빈 상태), 개인 페이지는 설정 안내를 보여줍니다.
| 명령 | 설명 |
|---|---|
npm run dev | 개발 서버 |
npm run build / npm start | 프로덕션 빌드 / 실행 |
npm run lint | ESLint |
npm run typecheck | 라우트 타입 생성 + tsc --noEmit |
npm test | Vitest 단위 테스트 |
.env.example 참고. service role key 는 사용하지 않으며 절대 클라이언트에 넣지 마세요.
| 변수 | 필수 | 설명 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | ✅ | Supabase 프로젝트 URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | ✅ | anon(public) 또는 publishable 키 (RLS 로 보호) |
NEXT_PUBLIC_SITE_URL | ✅(배포) | 서비스 URL. canonical·OG·인증 메일 링크에 사용 |
NEXT_PUBLIC_AUTH_PROVIDERS | 선택 | kakao,google 처럼 나열하면 소셜 로그인 버튼 표시 |
.env.local 에 입력.supabase/migrations/ 의 파일을 이름 순서대로 실행 (20260930000000_init.sql → 20261001000000_account_deletion.sql) → supabase/seed.sql 실행npx supabase link --project-ref <ref>
npx supabase db push # 마이그레이션
psql "<connection string>" -f supabase/seed.sql # 샘플 콘텐츠
(로컬 Supabase 사용 시 npx supabase init 후 npx supabase db reset 이 마이그레이션+seed 를 함께 실행)supabase/seed_food_more.sql 만 SQL Editor 에서 한 번 더 실행하세요 (여러 번 실행해도 안전, 샘플 데이터).supabase/tests/rls_check.sql 실행 → RLS OK, RLS owner OK, RLS admin OK, RLS anon OK, RLS account deletion OK NOTICE 확인. (트랜잭션 롤백되어 데이터가 남지 않음)https://your-domain.com)http://localhost:3000/auth/callback, https://your-domain.com/auth/callbackauth.uid() 를 가지므로 RLS 가 그대로 적용됩니다. 꺼져 있으면 시작 화면에서 "지금은 바로 시작할 수 없어요" 가 표시됩니다. 게스트 기록은 그 브라우저(세션 쿠키)에 연결되므로, 브라우저 데이터를 지우면 다시 볼 수 없습니다. 남용이 걱정되면 Auth → Attack Protection 에서 CAPTCHA 를 켜거나 익명 가입 rate limit 을 조정하세요.
/auth/callback → /onboarding 으로 이동합니다.baby-photos 와 정책을 생성합니다 (경로 {user_id}/..., 본인만 접근, 화면에는 1시간 만료 signed URL).update public.profiles set role = 'admin'
where id = (select id from auth.users where email = '[email protected]');
사용자는 스스로 role 을 바꿀 수 없습니다(컬럼 권한 + RLS).NEXT_PUBLIC_AUTH_PROVIDERS=kakao,google 설정. 코드 수정은 필요 없습니다.도메인이 없어도 Vercel 이 https://<프로젝트명>.vercel.app 주소를 줍니다.
supabase/setup_all.sql (마이그레이션 2개 + seed 묶음) 전체를 붙여넣고 Runbaby-dictionary 선택, 브랜치 claude/baby-star-map-mvpNEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY → Deploy (NEXT_PUBLIC_SITE_URL 은 비워두면 vercel.app 주소를 자동 사용)https://<프로젝트명>.vercel.app 와 https://<프로젝트명>.vercel.app/auth/callback 추가Supabase 없이 배포해도 빌드는 되지만, 로그인·기록 기능은 동작하지 않고 콘텐츠도 비어 보여요.
src/
├─ app/
│ ├─ page.tsx 랜딩 (SEO, JSON-LD)
│ ├─ (auth)/login, signup 이메일 로그인/가입 (+소셜 확장)
│ ├─ auth/callback/route.ts 이메일 인증/OAuth 콜백 (PKCE code, token_hash)
│ ├─ onboarding/ 아기 등록 (추가 등록: ?add=1)
│ ├─ (app)/ 앱 셸(상단/하단 네비)
│ │ ├─ today/ ★ 오늘: 6개 맞춤 카드 + 이번 주 + 성장 여행
│ │ ├─ map/ ★ 성장지도 타임라인 ("지금 여기", 발견한 별)
│ │ ├─ week/ 생후 N주 가이드 (주차 이동)
│ │ ├─ development/ 월별 발달 관찰 기록 (하고 있어요/아직이에요/잘 모르겠어요)
│ │ ├─ guide/[slug] 공개 월령 가이드 /guide/8-month-development
│ │ ├─ food/ 이유식 가이드, ingredients/[slug], recipes/[slug], tried, fridge
│ │ ├─ play/ 놀이 목록, play/[slug]
│ │ ├─ safety/ 시기별 안전 체크
│ │ └─ baby/ 우리아기: edit, growth, vaccines, milestones, favorites
│ ├─ admin/ 관리자 콘텐츠 CRUD (설정 기반)
│ ├─ sitemap.ts robots.ts manifest.ts icon.svg opengraph-image.png
├─ components/ ui/ (Card, Button, Form…), 기능별 컴포넌트
├─ lib/
│ ├─ date/date-only.ts 달력 날짜 유틸 (KST 기준 오늘)
│ ├─ age/age.ts ★ 월령 계산 엔진 (유일한 계산 출처)
│ ├─ content/select.ts 월령/주차 → 콘텐츠 선택, 오늘의 놀이, 성장지도 위치
│ ├─ vaccines/ 접종 예정일 계산·상태·문구
│ ├─ food/match.ts 이유식 냉장고 레시피 매칭
│ ├─ growth/chart.ts 성장 차트 스케일/눈금
│ ├─ validation/ 입력 검증 (아기, 기록)
│ ├─ admin/ 관리자 필드 설정·파서
│ ├─ queries/ Supabase 조회 (content: 공개/캐시, baby·records: 세션/RLS)
│ ├─ actions/ Server Actions (auth, baby, records, admin)
│ └─ supabase/ server / client / public / proxy 클라이언트, DB 타입
└─ proxy.ts 세션 갱신 + 개인 경로 보호 + X-Robots-Tag noindex
supabase/
├─ migrations/…_init.sql 스키마 + RLS + Storage 정책
├─ seed.sql 샘플 콘텐츠 (is_sample=true)
└─ tests/rls_check.sql RLS 격리 검증 스크립트
lib/age/age.ts 한 곳에서만 합니다. 출생일=생후 0일, 개월은 달력 기준(말일 보정), 오늘은 KST 기준.owns_baby(baby_id) 하나로 보호 → 향후 공동 양육자 공유는 이 함수만 확장. 콘텐츠는 is_admin() 만 쓰기 가능.noindex 메타 + X-Robots-Tag. 사진은 비공개 버킷, 업로드 전 브라우저에서 재인코딩해 EXIF(GPS) 제거.content_sources ↔ content_source_relations(다형 N:M). 화면 하단에 정보 출처와 최종 검토일(미검토 시 "전문가 검토 전")을 표시.growth_standards 테이블에 넣어 같은 차트 스케일에 추가할 수 있습니다.npm test — 월령/주수/개월 계산, 콘텐츠 선택, 예방접종 예정일·상태, 레시피 매칭, 입력 검증, 관리자 폼 파서, 성장 차트 스케일 (단위 테스트)supabase/tests/rls_check.sql — 다른 사용자 아기 데이터 조회/수정/삭제 차단, 역할 상승 차단, 관리자 쓰기 허용, 비로그인 차단data_reference_date/reviewed_at 입력, is_sample 해제. 발달·이유식·안전 콘텐츠 전문가 검토.baby_milestones 기반).owns_baby() 확장).