Skip to content

yemson/kood

Repository files navigation

오늘의 집단 무의식 (MVP)

Nuxt + Supabase 기반 일일 배치 프로젝트입니다.
매일 한 번 RSS를 수집하고, OpenAI로 daily_art를 생성합니다.

핵심 엔드포인트

  • POST /api/daily/run
    • 역할: 수집 + 정규화/중복제거 + 코퍼스 구성 + AI 생성 + DB 저장
    • 인증: 요청 헤더 x-cron-secret 필요
  • POST /api/daily/regenerate
    • 역할: 수집 없이 DB의 raw_items를 날짜별로 읽어 AI 결과(daily_art)만 재생성
    • 인증: 요청 헤더 x-cron-secret 필요
    • 기본 동작: 기존 daily_art/daily_corpus에 있는 날짜 전체 재생성
    • 선택 옵션: date, from/to, limit, style(poet_line 문체 힌트)
  • GET /api/today?date=YYYY-MM-DD (선택 쿼리)
    • 역할: 해당 날짜(또는 최신)의 poet_line/메타/mood_scores/analyst_note/evidence_keywords 조회
    • 참고: 요청한 date 데이터가 없으면 404 반환
    • 프론트: 하단 30일 가로 스크롤 달력에서 날짜 클릭으로 탐색
    • 오늘 날짜 칸은 비활성 + 수집중으로 표시 (기본 배치가 KST 전일 생성)
    • Notes 패널: 기본 닫힘, 데스크톱 우측 드로어 / 모바일 하단 시트
    • 범위(최근 30일) 밖 날짜는 안내 문구를 노출

응답 필드(핵심):

{
  "date": "2026-02-15",
  "updated_at": "2026-02-16T00:05:01.000Z",
  "sources_count": 32,
  "poet_line": "....",
  "analyst_note": "....",
  "evidence_keywords": ["키워드1", "키워드2"],
  "mood_scores": {
    "anger": 41,
    "anxiety": 57,
    "fatigue": 52,
    "cynicism": 38,
    "hope": 29
  }
}

Living Fog (WebGL)

  • Today 화면 배경은 CSS 그라데이션 위에 Raw WebGL fragment shader 안개 레이어를 합성합니다.
  • 구현은 추가 라이브러리 없이 webgl 컨텍스트를 직접 사용합니다.
  • 입력 모드는 자동호흡 only이며, 포인터/스크롤 반응은 사용하지 않습니다.
  • 날짜별 mood_scores와 dominant mood를 색조/속도/농도에만 미세 반영합니다.
  • Notes 패널이 열리면 안개 모션 속도는 약 85%로 감쇠됩니다.

성능/접근성 보호:

  • prefers-reduced-motion: reduce에서는 정적 프레임(저모션)으로 강등합니다.
  • WebGL 미지원 환경에서는 안개 레이어를 렌더하지 않고 CSS 배경만 사용합니다.
  • 해상도는 devicePixelRatio를 최대 1.5로 제한합니다.
  • 탭 비활성(visibilitychange) 상태에서는 루프를 pause합니다.
  • 리사이즈는 ResizeObserver + requestAnimationFrame으로 디바운스 처리합니다.
  • 프레임 간 시간(dt)은 최대 48ms로 클램프합니다.

요청 예시:

curl -X POST "https://<your-domain>/api/daily/run" \
  -H "content-type: application/json" \
  -H "x-cron-secret: <CRON_SECRET>" \
  -d '{}'
curl -X POST "https://<your-domain>/api/daily/regenerate" \
  -H "content-type: application/json" \
  -H "x-cron-secret: <CRON_SECRET>" \
  -d '{"from":"2026-02-14","to":"2026-02-19","style":"관측 보고형, 건조한 단문"}'

환경 변수

.env.example 기준:

SUPABASE_URL=
SUPABASE_KEY=
SUPABASE_SECRET_KEY=
OPENAI_API_KEY=
OPENAI_MODEL=gpt-4.1-mini
CRON_SECRET=

로컬 실행

pnpm install
pnpm dev

브라우저에서 날짜 테스트:

http://localhost:3000/?date=2026-02-14

배포/운영

  • Vercel 함수 리전: icn1 (서울)
    설정 파일: vercel.json
  • Supabase Cron에서 하루 1회 HTTP POST 호출 권장
    • 예시(UTC): 5 15 * * * = KST 00:05
    • URL: https://<your-domain>/api/daily/run
    • Header: x-cron-secret: <CRON_SECRET>

About

대한민국 하루 요약

Resources

Stars

Watchers

Forks

Contributors