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 문체 힌트)
- 역할: 수집 없이 DB의
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
}
}- 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>
- 예시(UTC):