diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9cbf510 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +.git +.next +node_modules +remotion/node_modules + +# Datos persistentes: NO van en la imagen, llegan por volúmenes montados +projects +data +*.db +*.db-wal +*.db-shm + +# Secretos y locales +.env*.local +CLAUDE.md +CONTEXT.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..08f535f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,35 @@ +# Story Studio + +App **Next.js 16** (App Router) para crear series animadas infantiles asistidas por IA: wizard de 3 pasos (Idea Motriz → Personajes → Capítulos), y luego por capítulo: guión conductor → (pre)escaleta → prompts de imagen → fondos → imágenes de plano → vídeos → render final. Los metadatos se persisten en **SQLite** (`data/story-studio.db`); las imágenes y vídeos generados van en disco bajo `projects/{slug}/`. + +> **`CONTEXT.md` tiene el detalle de arquitectura, pero está parcialmente desactualizado** (describe persistencia en markdown/JSON "sin BD" y Turbopack — ambas cosas ya no son ciertas). Para persistencia usa el modelo SQLite de `src/lib/db.ts` / `db-service.ts`; para el resto (Character Assets, convenciones, estructura) sigue siendo buena referencia. Si tocas algo estructural, corrige `CONTEXT.md` a la vez. + +## Stack (resumen) + +- Next.js 16.1.6 · React 19 · TailwindCSS 4 · Lucide React · react-markdown + remark-gfm +- LLM texto: OpenAI **GPT-4o** (`openai`) · LLM imágenes: Google **Gemini `gemini-3-pro-image-preview`** / Nano Banana Pro (`@google/genai`) +- Vídeo: **BytePlus Ark — Seedance 1.5 Pro** (`ARK_API_KEY`, `src/lib/video-service.ts`) +- Render final de vídeo: **Remotion integrado en este proyecto** (`@remotion/renderer` + `@remotion/bundler`, `src/lib/remotion-service.ts`, `POST /api/render`) +- Persistencia: **SQLite** (`better-sqlite3`, `data/story-studio.db`, WAL) — `src/lib/db.ts` (esquema) + `db-service.ts` (acceso). Imágenes/vídeos en disco bajo `projects/{slug}/`. + +## Arranque + +``` +npm run dev # servidor de desarrollo (Next.js, webpack) +``` + +Requiere `.env.local` en **UTF-8 sin BOM** con `OPENAI_API_KEY`, `GEMINI_API_KEY` y `ARK_API_KEY` (si se guarda como UTF-16 LE, Next.js no lee las variables). + +> **Nota para agentes:** si necesitas levantar el dev server (`npm run dev`), arráncalo en **segundo plano / detached**. En primer plano no termina nunca y **bloquea el turno**. + +## Proyecto hermano + +Existe también un proyecto Remotion independiente en `../vibecoding/`. El render principal de Story Studio ya vive **dentro** de este repo (ver `remotion-service.ts` / `/api/render`). + + +## Tu rol en el equipo + +> Sección gestionada por el proyecto `orquestrator` (workspace «Essia»). No editar a mano: se regenera al cambiar el organigrama. + +Eres **experto** de este proyecto dentro del workspace «Essia». + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..889f9d0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM node:22-slim + +# Toolchain para módulos nativos (better-sqlite3) y clonado de deps +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 make g++ git \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY package.json package-lock.json* ./ +RUN npm install --production=false + +COPY . . + +RUN npm run build + +ENV PORT=3000 +ENV NODE_ENV=production + +EXPOSE 3000 + +# Los datos persistentes (SQLite + imágenes/vídeos) llegan por volúmenes +# montados en /app/data y /app/projects (ver mounts de Dokploy). +CMD ["npm", "start"] diff --git a/package.json b/package.json index 39f7c2e..519a074 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "next dev --webpack", - "build": "next build", + "build": "next build --webpack", "start": "next start", "lint": "eslint" }, diff --git a/tsconfig.json b/tsconfig.json index cf9c65d..73845a5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,5 +30,5 @@ ".next/dev/types/**/*.ts", "**/*.mts" ], - "exclude": ["node_modules"] + "exclude": ["node_modules", "remotion"] }