AI-powered short-form video automation. Marketing site at serefkeser.com and the working AI Studio at serefkeser.com/app.
frontend/— Vite + React 18 SPA. Marketing pages (/,/privacy,/terms,/contact) plus the AI Studio at/app. Deploys to Vercel.backend/— Express server. Owns OpenAI / Stability / ElevenLabs / Whisper / FFmpeg / YouTube upload. Deploys to Render viabackend/render.yaml.docs/— API contract, deployment guide, design spec, implementation plan.
serefkeser.com (Vercel) api.serefkeser.com (Render)
├─ / ├─ /api/health
├─ /privacy ├─ /api/script /improve /ideas
├─ /terms ├─ /api/images /regenerate
├─ /contact ├─ /api/audio
└─ /app ───── HTTPS calls ────► ├─ /api/render
└─ /api/upload-youtube
YouTube OAuth happens client-side via Firebase (Google provider, youtube.upload scope). The frontend sends the access token as Authorization: Bearer <token> on the upload request; the backend never stores it.
# terminal 1
cd backend
npm install
cp .env.example .env # fill OPENAI_API_KEY, STABILITY_API_KEY, ELEVENLABS_API_KEY
npm run dev # → http://localhost:8787
# terminal 2
cd frontend
npm install
cp .env.example .env # fill VITE_FIREBASE_* if you want YouTube upload
npm run dev # → http://localhost:5173When VITE_API_BASE_URL is empty, Vite proxies /api/* and /static/* to http://localhost:8787.
Push to main triggers Vercel (frontend) and Render (backend) rebuilds. One-time setup is in docs/deployment.md.