Tavotto
AI drew your research figure. Tavotto makes it publication-ready: edit matplotlib figures on a canvas, lay out in mm, check journal rules. Free, open source.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
색 하나만 골라. 나머지는 Color of Apple이 맞춰줄게. Color of Apple은 기준색 하나를 역할이 부여된 UI 컬러 시스템으로 바꿉니다. 작업대는 끝까지 무채색이고, 색은 Generate를 누른 뒤에 미리보기와 핵심 CTA에만 퍼집니다. Google 로그인과 Cloud Firestore를 사용해 프로젝트와 무료 사용량을 관리합니다. 클라우드 에이전트는 당신 PC의 C:\에 파일을 쓸 수 없습니다. 로컬에 같은 구조를 받으려면 WSL에서 Origin으로 클론합니다. • Browse: https://cursor.com/codebase/daesung-digital/matchu (Private — 설정에서 변경 가능) • Origin CLI: https://cursor.com/docs/origin/cli 개발 서버는 http://127.0.0.1:43123에서 뜹니다. Firebase 프로젝트는 matchu-a1fbb를 사용합니다.查看完整 README ↗
색 하나만 골라. 나머지는 Color of Apple이 맞춰줄게.
Color of Apple은 기준색 하나를 역할이 부여된 UI 컬러 시스템으로 바꿉니다. 작업대는 끝까지 무채색이고, 색은 Generate를 누른 뒤에 미리보기와 핵심 CTA에만 퍼집니다. Google 로그인과 Cloud Firestore를 사용해 프로젝트와 무료 사용량을 관리합니다.
이 절이 아래 과거 진행 기록보다 우선합니다. Paddle 계정 검증은 Complete이며 정산 정보도 저장됐습니다. 사용자 진행 승인 후 Vercel Production의 일반 Paddle 변수 네 개를 Live 키·토큰·가격·서명 키로 교체하고 PADDLE_ENVIRONMENT=production, PADDLE_LIVE_ENABLED=true로 재배포했습니다. 배포 5TnyuGHybZZwa2sR1USS9KHCt9qA는 Ready이며 공개 /api/billing/config가 HTTP 200, enabled=true, production, KRW 990 및 Live 토큰 형식을 반환합니다. 공개 가격 페이지도 세금 포함·매월 자동 결제·해지 안내와 활성 결제 CTA를 표시합니다.
ntfset_01m4aah3ct49rknm2endnjnqxn은 Active, 기존 Sandbox 목적지는 Inactive입니다. 공용 URL의 Live 서명 키로 서명한 비권한 customer.created 요청은 HTTP 200 received=true, body 변조 및 무서명 요청은 HTTP 400 invalid_signature였습니다. 이는 서버 서명 검증이며 Paddle 발신 결제 이벤트·권한 부여 검증과 구별합니다.ntfsim_01m4ad9r2zxn01qdmnmzd0bv64를 생성·실행·Replay했습니다. 화면의 Response는 {}이며 전달 성공 상태를 확인하지 못했으므로 Paddle 발신 전달 검증 완료로 간주하지 않습니다. 실제 결제 이벤트에서 Delivered와 서버 반영을 확인해야 합니다.PADDLE_LIVE_* 네 별도 변수는 백업 보관용이며 앱은 일반 이름의 변수를 읽습니다. 로컬 .env.local은 Sandbox를 유지하고 .env.paddle-live.local은 별도 보관합니다. 로컬의 false 스위치는 운영 Vercel의 true와 별개입니다.txn_01m4adqfbxvtwx69pnbwq56p9c는 completed, KRW 990이며 구독 sub_01m4advd6fdwe42wk84gtresdt는 active입니다. 이용 기간은 2026-10-07T05:37:16.057702Z부터 2026-11-07T05:37:16.057702Z까지이며 다음 자동 청구는 2026-11-07 14:37:16 KST, 해지 예약은 없습니다. Live 고객과 사용자 연결, billing/production 구독 상태·완료 거래·미회수 권한, 실제 사용자 plan=pro, proExpiresAt=2026-11-07T05:37:16.057Z를 조회 확인했습니다. 공개 구매 완료 화면과 구독 관리 화면도 Pro/이용 중/동일 종료일을 표시합니다. Production 처리 이벤트는 3개입니다.transaction.completed 알림은 최초 시도 Delivered입니다. subscription.activated는 최초 HTTP 503 후 자동 재시도 HTTP 200을 확인했습니다. 목록을 새로고침해 구독 생성·활성화·거래 완료 세 알림 모두 Delivered(구독 알림 각 2회, 거래 완료 1회)를 확인했습니다. 실제 갱신·해지·환불은 Sandbox에서 검증했고 Live에서는 사용자 승인 없는 추가 청구·해지·환불을 하지 않았습니다.현재 작업 브랜치는 main이며 저장소는 https://github.com/junefiv/color-of-apple입니다(기존 junefiv/matchu에서 이동). Paddle 연동 코드와 Sandbox 상품 설정을 진행한 상태이며, 실제 결제 운영과 요율 협의는 아직 완료하지 않았습니다. 아래 순서로 이어서 작업합니다.
.env.local로 Firebase Admin 인증과 Paddle Sandbox 가격 검사가 성공했습니다. 월 KRW 990·세금 포함·무료 체험 없음·수량 1 설정을 확인했습니다. 실제 키는 출력하거나 저장소에 추가하지 않았습니다.BILLING_OPERATOR_NAME=GIT_IN을 설정했습니다. Sandbox 초안 표기이며, Live 심사 정보와 공개 운영자 표기의 적합성은 운영 전 확인해야 합니다.PADDLE_WEBHOOK_SECRET도 비어 있습니다. 웹훅은 아직 생성하지 않았습니다./pricing 페이지는 열리지만 결제 UI는 출시 준비 중입니다. 공개 /api/billing/webhook에 서명 없는 빈 요청을 보낸 결과 HTTP 500, JSON이 아닌 응답을 받았습니다. 로컬 구현의 예상 응답은 HTTP 400의 invalid_signature이므로, Vercel 배포·서버 로그·환경 변수부터 확인하고 정상 endpoint를 확보한 뒤 목적지를 등록해야 합니다.npm ci가 실패해 npm install --ignore-scripts --no-audit --no-fund --package-lock=false로 의존성을 복구했습니다. package.json과 lockfile은 변경하지 않았지만 설치 결과는 lockfile의 완전 재현 검증이 아닙니다. 깨끗한 환경에서 Node 22 이상으로 npm ci 및 배포 빌드를 확인해야 합니다.21cb27c의 기존 배포가 Ready인 상태였지만 결제 API는 Firebase Admin → jwks-rsa → jose의 ERR_REQUIRE_ESM 로딩 오류로 HTTP 500을 반환했습니다.NODE_OPTIONS=--experimental-require-module을 등록했습니다. Paddle/Firebase/Billing 설정 12개도 Production 배포 환경에 Secret 유형으로 저장했습니다. BILLING_APP_URL=https://color-of-apple.vercel.app, PADDLE_ENVIRONMENT=sandbox, PADDLE_LIVE_ENABLED=false로 설정했습니다. Preview에는 아직 설정하지 않았습니다.hqEiEe2PYQBKexmVr4kntrAghnDL은 Ready입니다. 공개 /api/billing/config는 HTTP 200, enabled=true, sandbox, KRW 990을 반환합니다. 서명 없는 웹훅 요청은 HTTP 400 invalid_signature로 정상 거부합니다.ntfset_01m48xen1z65jd7qytd213e907을 생성했습니다. URL은 https://color-of-apple.vercel.app/api/billing/webhook, Active, Usage Both, transaction.completed·모든 subscription.*·adjustment.created·adjustment.updated 총 12개입니다. secret은 .env.local과 Vercel Secret에만 저장했습니다. 기존 API 키의 웹훅 생성/개별 조회 권한이 부족해 관리자 화면으로 생성·저장했으며 키 권한은 확대하지 않았습니다.https://color-of-apple.vercel.app/billing/checkout 저장을 확인했습니다.customer.created 테스트 payload를 로컬에서 서명해 공개 서버에 보낸 결과 HTTP 200 received=true입니다. body 변조 요청은 HTTP 400으로 거부했습니다. 이 검사는 배포된 secret·Firebase 읽기·서명 검증을 확인한 것이며, Paddle 서버가 직접 보낸 알림이나 결제 성공을 검증한 것은 아닙니다.txn_01m48xvcxegej0ay8p80wc1yve는 KRW 990·completed, 구독 sub_01m48xx4ghpmz0ynews3nzgeb3는 active입니다. Paddle의 subscription.created, subscription.activated, transaction.completed 알림이 Delivered이고 Firestore에도 처리 기록이 있습니다. 실제 users/{uid}.plan은 free로 유지됐습니다.subscription.updated 웹훅이 Delivered이고 앱·서버의 해지 예약일과 결제한 이용 기간 종료는 모두 2026-11-07 00:39:20 KST입니다. 종료 전 테스트 Pro는 유지됩니다. transaction.completed 알림의 Replay도 Delivered이며 처리 이벤트는 4개로 유지돼 중복 기록이 생기지 않았습니다.이 절이 위 과거 진행 기록보다 우선합니다.
GIT_IN이며 Live 심사 적합성 검토는 남아 있습니다.[email protected]에서 [email protected]으로 발송하고 Gmail 보낸편지함에서 확인했습니다. 협상 요율은 아직 승인되지 않았습니다.paymentRevoked=true로 테스트 권한이 회수됐습니다. 실제 사용자 plan은 계속 Free입니다.txn_01m4a3dqhaxj7ha1a0ep86kdqj가 990원으로 완료됐습니다. 웹훅이 이용 기간을 2026-11-07T02:35:00Z로 연장하고 이전 전액 환불 후 테스트 권한을 복구했습니다. 정상 구독은 해당 기간 종료 해지 예약을 복원했습니다.txn_01m4a3px94nwcv80pger3sr0sh는 카드 인증 실패(authentication_failed)로 거래·구독 모두 past_due가 됐습니다. 실제 웹훅과 인증된 status/confirm API에서 기존 이용 기간을 연장하지 않는 것을 확인했습니다. 이어서 테스트 구독을 즉시 해지해 canceled, 테스트 플랜 Free, 다음 청구 없음까지 확인했습니다. 테스트를 위해 청구일을 앞당겼으므로 기존 결제 영수증의 유료 기간이 실패 시각 이후까지 남아 있는 조건입니다.PADDLE_LIVE_ENABLED=false를 유지합니다.We're reviewing your details, 현재 추가 작업 없음, 필요 시 이메일 연락으로 표시됩니다. 판매자 계정의 최종 승인 완료는 아직 확인되지 않았습니다. 한국 화면에는 개인사업자 / Single ownership business가 표시됐으며, 상품 설명에 사업자등록 없는 한국 개인 개발자라는 맥락을 명시했습니다.pro_01m4a4h941cfsmnvz8mhv9hmfj, 가격 pri_01m4a4k5y9kgr2ecwn2j34w9hz를 생성했습니다. 월 KRW 990, 세금 포함, 무료 체험 없음, 수량 1입니다. 아직 앱은 Sandbox 가격을 사용합니다.ed29540을 main에 푸시했고 공개 배포에서 링크 반영을 확인했습니다.color-of-apple.vercel.app(ID chedom_01m4a4px7dt55z36ej4b56pmg0)은 Checkout approved, Apple Pay approved입니다. 판매자 계정 심사와는 별개입니다..env.paddle-live.local에 따로 저장했습니다. Git에서 제외되며 Next.js가 자동 로드하는 .env.local의 Sandbox 값은 유지했습니다. 다른 PC로 옮길 때 이 별도 파일도 안전하게 가져와야 합니다. 실제 값은 채팅이나 Git에 넣지 않습니다.ntfset_01m4aah3ct49rknm2endnjnqxn, URL https://color-of-apple.vercel.app/api/billing/webhook, 12개 이벤트, Usage Both를 생성했습니다. 현재 Inactive로 준비했으며, 실제 Live 전환 시 서버 secret 교체와 함께 활성화해야 합니다. Sandbox 목적지와 같은 URL이므로 기존 Sandbox 목적지는 전환 시 비활성화해야 합니다. 공식 SDK를 이용한 로컬 서명 검증과 변조 거부는 성공했으나 Live 서버 알림 전달은 아직 검증하지 않았습니다.https://color-of-apple.vercel.app/billing/checkout을 저장했습니다. Vercel 로그인 후 Production Secret에 PADDLE_LIVE_API_KEY, PADDLE_LIVE_CLIENT_TOKEN, PADDLE_LIVE_WEBHOOK_SECRET, PADDLE_LIVE_PRO_MONTHLY_PRICE_ID를 별도 저장하고 성공 메시지와 네 변수의 등록을 확인했습니다. 이 네 변수는 전환 대기용으로 현재 앱에서 읽지 않습니다. 최종 전환 시 기존 PADDLE_API_KEY, PADDLE_CLIENT_TOKEN, PADDLE_WEBHOOK_SECRET, PADDLE_PRO_MONTHLY_PRICE_ID에 대응 값을 연결하고 환경·활성화 스위치를 함께 변경해 배포해야 합니다. 앱과 배포는 아직 Sandbox이며 이번 저장만으로 Live가 활성화되지는 않습니다.Payout settings have been successfully updated 메시지를 확인했습니다. 계정 유형은 Individual / Sole Proprietorship, 정산 방식은 Payoneer입니다. 정산 설정 저장은 판매자 심사 승인과 별개입니다.Set up your live account와 Test and go live는 In progress입니다. 운영 설정 연결·Live 서버 알림 검증·실결제 확인은 남아 있으며 앱의 Live는 비활성 상태입니다. 요율 문의 답변도 아직 확인되지 않았습니다.Node.js 22 이상을 사용합니다. 저장소가 없으면 다음과 같이 받습니다.
git clone https://github.com/junefiv/color-of-apple.git matchu
cd matchu
이미 받은 저장소가 있으면 해당 폴더에서 git switch main과 git pull --ff-only로 최신 코드를 받습니다. 로컬 변경이 있으면 먼저 보존합니다.
npm ci
# .env.local이 없고 가져온 설정을 아직 붙여넣지 않은 경우에만 템플릿 생성
if (!(Test-Path .env.local)) { Copy-Item .env.example .env.local }
회사 PC의 .env.local 전체 내용을 집 PC의 프로젝트 루트에 있는 .env.local에 붙여넣습니다. Git에는 이 파일이 포함되지 않습니다. .env.example은 이름만 적힌 템플릿이며 실제 키는 들어 있지 않습니다. 특히 Firebase JSON의 private_key_id가 아니라 private_key 전체 PEM 값을 사용해야 합니다. 키의 줄바꿈은 \n을 포함한 따옴표 문자열 형태로 유지합니다. 키 값을 채팅, README, 커밋에 넣지 않습니다.
node scripts/check-billing.mjs
npm run dev
검사 스크립트는 키 값을 출력하지 않고 Firebase Admin 인증과 Paddle 가격을 확인합니다. 회사 PC에서는 두 검사 모두 성공했습니다. 앱은 http://localhost:43123, 플랜은 http://localhost:43123/pricing, 구독 관리는 http://localhost:43123/billing에서 확인합니다.
proExpiresAt를 Firestore 규칙과 클라이언트에서 확인합니다. 기존 컬러북은 자동 삭제하지 않습니다.billing/sandbox에 분리되며 테스트 결제는 실제 users/{uid}.plan을 바꾸지 않습니다. 실제 운영 활성화는 별도 설정으로 잠겨 있습니다./pricing, /billing, /billing/checkout, /terms, /privacy, /refund-policy를 추가했습니다. 약관·개인정보·환불 페이지는 Sandbox 초안이며 운영자 표기는 GIT_IN입니다. Live 운영 정보의 적합성 확인은 남아 있습니다. 공개 문의 이메일은 [email protected]입니다..env.local에 저장했습니다.| Sandbox 항목 | 값 |
|---|---|
| 상품 | Color of Apple Pro / SaaS |
| Product ID | pro_01m483wmpr2hbjdmrf2vv51grx |
| Price ID | pri_01m483zd2z7qgjwjcjq7e6qacj |
| 가격 | KRW 990 / 매월 / 세금 포함 |
| 무료 체험·수량 | 없음 / 최소·최대 모두 1 |
| API 키 만료 | 2026-11-05 — 이후 교체 필요 |
아래 1–4, 6–7과 5의 최초 결제·자동 갱신 성공/실패·해지 예약/즉시 해지·실패 후 재시도·환불·실제 계정 Free 유지 검사는 2026-10-07에 완료했습니다. 위 회사 PC 재개 검증부터 확인하고, 실제 기간 종료 관찰과 8을 이어갑니다. 아래 미완료 표현은 2026-10-06 인수인계 당시 상태입니다.
.env.local로 검사 스크립트를 실행하고, 공개 운영자 이름을 BILLING_OPERATOR_NAME에 확정합니다. [email protected]을 유지합니다./api/billing/webhook을 등록합니다. 이벤트는 transaction.completed, 모든 subscription.*, adjustment.created, adjustment.updated, Usage는 Both를 선택합니다. 생성 후 서명 secret을 .env.local의 PADDLE_WEBHOOK_SECRET에 저장합니다. 회사 PC에는 이 값이 아직 없습니다.http://localhost:43123/billing/checkout을, 배포된 테스트에는 실제 HTTPS URL의 /billing/checkout을 사용합니다. 이 설정도 아직 완료하지 않았습니다. localhost로는 Paddle 서버가 웹훅을 전달할 수 없으므로 외부에서 접근 가능한 테스트 배포가 필요합니다.PADDLE_ENVIRONMENT=sandbox, 해당 서버 origin의 BILLING_APP_URL, 서버 전용 Paddle/Firebase 값이 필요합니다. 실제 키에 NEXT_PUBLIC_를 붙이지 않습니다. 새 테스트 도메인을 쓰면 Firebase Google 로그인 허용 도메인도 확인합니다./billing에서 보고 실제 계정이 Free로 남는지도 확인합니다.firestore.rules 변경은 로컬 파일만 수정했습니다. 실제 규칙 배포는 아직 하지 않았습니다. 유료 기능 운영 전에 배포하고 만료된 Pro 계정의 신규 저장을 서버 규칙으로 차단하는지 확인합니다.[email protected]으로 보냅니다. 아직 발송하지 않았습니다. Gmail·Vercel 연결을 제안했지만 연결 완료는 확인되지 않았습니다. 예상 결제량은 미정으로 밝히고 월 100·500·1,000건은 견적 비교 시나리오로만 사용합니다. 월 990원을 유지하며 연간 요금으로 임의 변경하지 않습니다. 공식 표준은 5% + USD 0.50이고, USD 10 미만 상품의 별도 요율은 서면 승인 전까지 적용된 것으로 간주하지 않습니다.PADDLE_LIVE_ENABLED=false를 유지합니다.선물 후원(BIC 볼펜 1,000원·라떼 4,700원·빅맥 5,700원)은 여전히 준비 안내만 제공합니다. 순수 후원을 Paddle 상품으로 등록하지 않으며 별도 수납 제공자를 정해야 합니다.
관련 구현·운영 세부 사항은 billing.md, 요율 문의 내용은 paddle-fee-inquiry.md, 환경 변수 이름은 .env.example을 참고합니다.
npm test: 27개 파일, 157개 테스트 통과.npm run build 및 TypeScript: 통과.npm run lint에는 기존 tests/refresh-transition.test.ts:11의 react-hooks/globals 오류 1개와 기존 경고 8개가 남아 있습니다. 결제 파일 오류는 아닙니다.npm audit fix --force를 실행하지 않았습니다.집에서 새 Codex 대화를 열면 다음처럼 요청하면 됩니다.
README의 2026-10-06 Paddle 인수인계를 읽고 현재 상태부터 이어서 작업해 줘. .env.local은 가져왔어. 월 990원 구독을 유지하고 Sandbox 웹훅·기본 결제 링크·Vercel 테스트 배포와 실제 Sandbox 결제부터 검증해 줘. Paddle 요율 문의는 초안을 사용하되 미정 판매량을 약속하지 말고, 실제 결제 운영은 테스트와 심사 완료 후 검토해 줘.
클라우드 에이전트는 당신 PC의 C:\에 파일을 쓸 수 없습니다. 로컬에 같은 구조를 받으려면 WSL에서 Origin으로 클론합니다.
한 번에 설치 (WSL):
bash scripts/setup-windows-documents.sh
기본 경로: C:\Users\Administrator\Documents\matchu
PowerShell (WSL 호출):
.\scripts\setup-windows-documents.ps1
수동 (WSL):
curl -fsSL https://downloads.cursor.com/origin/install.sh | sh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
origin auth login
cd /mnt/c/Users/Administrator/Documents
origin repo clone daesung-digital/matchu
cd matchu && npm install && npm run dev
npm install
npm run dev
개발 서버는 http://127.0.0.1:43123에서 뜹니다.
npm test
npm run build
Firebase 프로젝트는 matchu-a1fbb를 사용합니다.
npx firebase-tools login
npx firebase-tools deploy --only firestore --project matchu-a1fbb
팔레트 생성은 로그인과 횟수 제한 없이 사용할 수 있습니다. 파일 내보내기는 로그인 사용자에게 횟수 제한 없이 제공하며 브라우저에서 직접 생성합니다. 저장 프로젝트는 무료 계정 기준 slot-1부터 slot-5까지 최대 5개입니다. Firestore 콘솔 또는 신뢰할 수 있는 서버에서 사용자 문서의 plan을 pro로 설정하면 프로젝트 제한이 해제됩니다. 클라이언트에서는 plan을 변경할 수 없습니다.
커뮤니티는 개인 컬러북의 색 스냅샷을 공개하고, 다른 사람이 프리뷰에 적용한 뒤 자기 컬러북으로 복사하는 기능입니다. 커뮤니티 자체는 Free와 Pro 모두 무료입니다. 복사본은 기존 저장 한도(무료 5개, Pro 무제한)를 그대로 사용합니다.
공개 경로는 /community이고 공유 주소는 /community?post={postId}입니다. 메인 헤더에만 커뮤니티 진입이 있고, 프리뷰 화면은 오른쪽 패널의 컬러토큰 / 커뮤니티 전환을 사용합니다. 푸터에는 커뮤니티 링크를 넣지 않습니다.
클라이언트는 아래 컬렉션을 직접 읽거나 쓰지 않습니다. firestore.rules에서 모두 거부하고, 서버 Admin API만 소유권과 형식을 검사합니다.
communityPosts/{postId}: 공개 스냅샷. 이메일, 개인 프로젝트 ID, 색 수정 이력은 저장하지 않습니다.users/{uid}/communityPublications/{projectId}: 개인 프로젝트와 공개 글의 연결. 프로젝트당 하나라서 재시도해도 글이 중복되지 않습니다.users/{uid}/communityLikes/{postId}: 그 사용자의 좋아요.users/{uid}/communityCopyIntents/{intentId}: 같은 저장 의도의 중복 복사를 막습니다.communityReports/{postId}_{uid}: 사용자당 글 하나. 신고만으로 글을 지우지 않습니다.communityRateLimits/{uid}_{action}: 게시, 좋아요, 신고, 복사 요청 제한. Firestore에 두므로 서버 인스턴스마다 따로 세지 않습니다. 목록 읽기에는 적용하지 않습니다.개인 프로젝트에는 선택 필드 source가 있을 수 있습니다. 없는 기존 문서도 그대로 열립니다. 공개 글을 지워도 이미 복사한 개인 프로젝트는 남습니다.
firestore.indexes.json에 최신순, 좋아요 많은순, 내 게시물 복합 인덱스가 있습니다. 규칙과 인덱스를 함께 배포합니다.
npx firebase-tools login
npx firebase-tools deploy --only firestore --project matchu-a1fbb
이 저장소에는 Firestore Emulator 설정이 없습니다. 권한과 트랜잭션은 인메모리 저장소로 검증했고, 에뮬레이터나 실사용자 데이터로는 검증하지 않았습니다.
운영자 숨김은 글을 자동으로 지우지 않습니다. COMMUNITY_OPERATOR_UIDS에 운영자 Firebase uid를 쉼표로 넣은 뒤, 해당 계정으로 PATCH /api/community/posts/{postId}에 { "status": "hidden" }을 보냅니다. 같은 계정이 DELETE로 글을 지울 수도 있습니다. 삭제는 공개 글과 작성자의 연결 문서만 지우고, 모든 사용자의 좋아요 문서를 훑지 않습니다. 삭제된 글의 좋아요 문서는 공개 글로 취급하지 않으며, 그 사용자가 해제를 요청하면 자기 문서만 지웁니다. 계정 삭제 정리는 아직 없습니다.
수치는 문서 읽기/쓰기입니다. 복합 인덱스가 추가로 인덱스 엔트리를 읽고, 문서가 0건인 쿼리도 최소 비용이 있습니다. 트랜잭션이 재시도되면 읽기가 늘어납니다.
| 행동 | 문서 읽기 | 문서 쓰기 |
|---|---|---|
| 공개 첫 페이지 | 최대 12. Next.js data cache가 30초 안에 맞으면 Firestore 조회를 건너뛸 수 있음 | 0 |
| 카드 선택, 펼침, 접기, 앱/웹 전환 | 0 | 0 |
| 다음 12개 | 최대 12 | 0 |
| 정확히 12개로 끝난 뒤의 다음 조회 | 빈 결과 1회. 비용이 0은 아님 | 0 |
| 로그인 좋아요 상태 | 그 페이지에서 아직 캐시하지 않은 글마다 개인 like 문서, 최대 12 | 0 |
| 좋아요 상태가 바뀔 때 | 제한 문서, 공개 글, 개인 like 문서. 약 3 | 제한 문서, like 문서 생성 또는 삭제, 공개 글. 약 3 |
| 같은 좋아요 상태를 다시 보낼 때 | 약 3 | 제한 문서 1. likeCount는 변하지 않음 |
| 게시 생성 | 제한, 연결 문서, 개인 프로젝트. 약 3 | 제한, 공개 글, 연결 문서. 약 3 |
| 같은 프로젝트 재게시 | 제한, 연결 문서, 기존 글. 약 3 | 제한 문서 1. 새 글을 만들지 않음 |
| 내 컬러북 복사 | 제한, 의도 문서, 공개 글, 프로필, 무료면 슬롯 최대 5 | 제한, 개인 프로젝트 1, 의도 문서 1 |
| 목록에 없는 공유 주소 | 공개 글 1 | 0 |
| 컬러북 모달을 연 로그인 사용자 | 기존 개인 프로젝트 구독에 더해 연결 문서 수만큼 | 0 |
공개 첫 페이지만 Next.js data cache에 정렬별로 약 30초 보관합니다. 이것은 배포의 Next.js 데이터 캐시이며 CDN이라고 부르지 않습니다. 게시, 내용 수정, 비공개, 삭제 때만 그 캐시를 비웁니다. 좋아요마다 목록 캐시를 비우지 않으므로 다른 방문자의 좋아요 수와 인기 순서는 최대 약 30초 늦을 수 있습니다. 좋아요 상태와 내 게시물은 private, no-store입니다. 카드 선택만으로 추가 문서를 읽지 않습니다. 긴 목록의 DOM 가상화는 넣지 않았습니다. 그건 화면 비용이고, 이미 받아 둔 글을 다시 읽는 비용을 줄이지는 않습니다.
새 환경 변수는 COMMUNITY_OPERATOR_UIDS뿐입니다. 기존 Firebase Admin 키는 그대로입니다.
Color is the result, not the decoration.
culori)ENGINE_VERSION이 JSON에 포함됩니다.