4.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
INFINITH — AI 마케팅 분석 플랫폼. 성형외과를 대상으로 YouTube/Instagram/Facebook/네이버블로그/네이버플레이스/강남언니를 분석하고, 변환 전략/로드맵/KPI를 제안하는 마케팅 리포트를 생성한다.
프론트엔드(React) + 백엔드(Supabase Edge Functions) 모두 실제 구현 완료. src/data/ mock 데이터는 개발 fallback 용도로만 남아 있으며, 실제 파이프라인은 Supabase Edge Functions에서 실행된다.
Commands
npm run dev— 개발 서버 (port 3000)npm run build— 프로덕션 빌드npm run lint— TypeScript 타입 체크 (tsc --noEmit)- 테스트 프레임워크 없음
Architecture
Stack: React 19 + TypeScript + Vite 6 + Tailwind CSS 4 + React Router 7
Routes (src/main.tsx):
/— 랜딩 페이지/report/loading— 분석 로딩 (Navbar/Footer 숨김)/report/:id— 마케팅 분석 리포트/plan/:id— 마케팅 플랜/studio/:id— 콘텐츠 스튜디오 (AI 이미지 생성)/channels— 채널 연결/distribute— 콘텐츠 배포/performance— 성과 분석
Frontend Data flow:
- Pages → custom hooks (
useReport,useMarketingPlan) → Supabase DB (marketing_reports테이블) - Hooks return
{ data, isLoading, error }패턴 ScreenshotContext로 리포트 스크린샷 데이터 공유useExportPDF훅으로 리포트 → PDF 변환
Backend Pipeline (Supabase Edge Functions):
| Phase | Function | 역할 |
|---|---|---|
| 1 | discover-channels |
병원 URL → SNS 채널 발견 (registry fast-path → clinics 캐시 → Firecrawl 스크래핑) |
| 2 | collect-channel-data |
채널별 실제 데이터 수집 (YouTube API, Apify, Naver API, Firecrawl) |
| 3 | generate-report |
Perplexity AI로 리포트 생성 + groundTruth 주입으로 수치 보정 |
| 4 | generate-content-plan |
마케팅 플랜 생성 |
실제 연동된 API:
- YouTube Data API v3 — 구독자/조회수/영상 수
- Apify — Instagram/Facebook 스크래퍼
- Naver Search API — 네이버플레이스 검색
- Naver Blog RSS — 공식 블로그 포스트
- Firecrawl — 홈페이지 footer SNS 링크 추출, 강남언니 스크래핑
- Perplexity AI — 리포트 JSON 생성
- Gemini 2.5 Flash — 콘텐츠 이미지 생성 (
src/services/geminiImageGen.ts)
주요 DB 테이블 (Supabase):
marketing_reports— 리포트 결과 (channel_data,report,analysis_dataJSONB)clinic_registry— 병원 SNS 채널 등록 (fast-path 캐시)clinics— 병원 기본 정보 + 14일 TTL 캐시channel_snapshots— 채널별 수집 이력analysis_runs— 파이프라인 실행 로그
Shared utilities (supabase/functions/_shared/):
extractSocialLinks.ts— URL → SNS handle 결정론적 추출 (regex 기반)verifyHandles.ts— 핸들 실제 존재 여부 검증dataQuality.ts—isMissingValue(),validateReportQuality()retry.ts— 자동 재시도/타임아웃/rate limit 내장 fetch wrapper
Type definitions in src/types/:
report.ts—MarketingReport및 하위 타입 (YouTubeAudit, InstagramAudit, etc.)plan.ts— 마케팅 플랜 타입studio.ts— 콘텐츠 스튜디오 타입
AI Integration: src/services/geminiImageGen.ts — Gemini 2.5 Flash로 이미지 생성. GEMINI_API_KEY 환경변수 필요.
Environment Variables
Supabase Edge Functions (Supabase Dashboard → Settings → Secrets):
YOUTUBE_API_KEY— YouTube Data API v3APIFY_API_KEY— Instagram/Facebook 스크래퍼NAVER_CLIENT_ID/NAVER_CLIENT_SECRET— Naver Search APIFIRECRAWL_API_KEY— Firecrawl 스크래핑PERPLEXITY_API_KEY— 리포트 AI 생성
Frontend (.env.local):
GEMINI_API_KEY— Gemini 이미지 생성
Styling
- Tailwind CSS 4 (
@themedirective insrc/index.css) - 폰트: Pretendard (sans), Playfair Display (serif/headings)
- 색상:
primary-900(#0A1128),accent(#6C5CE7) - 상태 색상:
status-critical,status-warning,status-good,status-info(각각 bg/text/border/dot 변형) glass-card클래스: 반투명 글래스모피즘 카드- 애니메이션: Motion (framer-motion 후속) 사용
Path Alias
@/ → 프로젝트 루트 (tsconfig.json + vite.config.ts 모두 설정됨)
Deployment
- Frontend: Vercel (SPA 모드 — 모든 경로
/index.html로 리라이트).git push후vercel --prod수동 실행 필요 (Gitea 자동 트리거 없음) - Backend: Supabase Edge Functions —
supabase functions deploy <function-name>으로 개별 배포