尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Generate, edit, animate, and export fictional, simulated WhatsApp-style conversations with AI.
CREATE → AI GENERATE → EDIT → PREVIEW → PLAY → SCREENSHOT → VIDEO
ChatFrame AI is an original, independently-branded simulation product. It is not affiliated with
WhatsApp or Meta Platforms, Inc. Every conversation it produces is fictional and is labeled
"SIMULATED CONVERSATION" in exports by default.檢視完整 README ↗Generate, edit, animate, and export fictional, simulated WhatsApp-style conversations with AI.
CREATE → AI GENERATE → EDIT → PREVIEW → PLAY → SCREENSHOT → VIDEO
ChatFrame AI is an original, independently-branded simulation product. It is not affiliated with WhatsApp or Meta Platforms, Inc. Every conversation it produces is fictional and is labeled "SIMULATED CONVERSATION" in exports by default.
lib/timing/engine.ts).components/ui/*, CVA-based)stores/*)lib/validation/schemas.ts, lib/ai/schemas.ts)openai SDK — see lib/ai/@remotion/bundler + @remotion/renderer)localStorage (see "Data layer" below)The product spec calls for a Supabase-backed Postgres database with Row Level Security and
Supabase Auth in production. This environment has no provisioned Supabase project or
credentials, so per the project's documented local-fallback policy, ChatFrame persists projects
to the browser's localStorage (lib/storage/projectStore.ts) and runs without real
authentication (a local-only "demo session"). The architecture is isolated behind that one module
specifically so a real Supabase client can be dropped in later without touching the rest of the
app — see "Remaining production work" below.
Copy .env.example to .env.local and fill in what you need:
cp .env.example .env.local
| Variable | Required | Notes |
|---|---|---|
OPENAI_API_KEY | one of these two | Used if DEEPSEEK_API_KEY is not set |
OPENAI_MODEL | no | Defaults to gpt-4o-mini |
DEEPSEEK_API_KEY | one of these two | Takes priority over OpenAI if both are set |
DEEPSEEK_MODEL | no | Defaults to deepseek-chat |
NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY / SUPABASE_SERVICE_ROLE_KEY | no | Reserved for a future Supabase migration; unused today |
NEXT_PUBLIC_APP_URL | no | Only needed in production behind a proxy that doesn't set x-forwarded-host |
RENDER_BASE_URL | no | Internal URL used by screenshot rendering; defaults to http://127.0.0.1:3000 in Docker |
RENDER_CONCURRENCY | no | Remotion render concurrency; defaults to 1 for small production containers |
AI generation requires one of OPENAI_API_KEY or DEEPSEEK_API_KEY. Everything else
(editor, playback, screenshot export, video export, projects, demo content) works with no keys at
all.
npm install
npx playwright install chromium # only needed for screenshot export
cp .env.example .env.local # add an OpenAI or DeepSeek key for AI generation
npm run dev
Open http://localhost:3000. Use 127.0.0.1:3000 instead of localhost:3000 if you hit a
same-origin dev-resource warning in an unusual local DNS setup — allowedDevOrigins in
next.config.ts is already configured for both.
npm run dev — start the dev server (Turbopack)npm run lint — ESLint (Next core-web-vitals + TypeScript rules)npx tsc --noEmit — type-checknpm run build && npm run start — production build and serveThis was manually verified end-to-end in a real browser and via direct API calls, since no automated test suite is included in this build (see "Remaining production work"):
npx tsc --noEmit, npm run lint, and npm run build all pass cleancomponents/chat/ChatWindow.tsx and components/chat/MessageList.tsx are the single source of
truth for rendering a conversation. Four different contexts render through them with different
inputs, never different code:
lib/timing/engine.ts computes a canonical timeline (buildTimeline), and
stateAtTime(timeline, ms) derives which messages/typing indicators/reactions are visible at
any point; the preview player advances ms with requestAnimationFrameapp/api/export/screenshot/route.ts) — writes the conversation/theme/
export-settings payload to a temp file, has Playwright load app/render/[renderId]/page.tsx
(a plain server-rendered page with no editor chrome), and screenshots itapp/api/export/video/route.ts) — bundles remotion/index.ts with
@remotion/bundler and renders remotion/compositions/ChatVideo.tsx with @remotion/renderer;
that composition uses the exact same buildTimeline/stateAtTime functions, frame-driven
instead of real-time-drivenEverything above runs and was verified locally. These require infrastructure this environment doesn't have:
lib/storage/projectStore.ts for a Supabase client, add the
tables/RLS policies described in the product spec, and wire Supabase Auth (email, magic link,
Google). No code outside that one module needs to change.lib/usage/usage.ts) is provider-agnostic and ready for
Stripe, but no payment processing is wired up — the pricing page's plan switcher is a local
simulation.localStorage, which is fine for a local/demo build but is trivially bypassable; a production
deployment needs limits enforced server-side against an authenticated user.app/api/ai/generate/route.ts (which resets per server instance/restart) would need a durable
store (Redis/Upstash) in a multi-instance deployment.