尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Aplicación web para un creador de contenido de República Dominicana que produce microdramas con IA: frutinovelas (telenovelas animadas en 3D con personajes con cabeza de fruta), cine romántico estilo años 90, frutinovelas cristianas, y más adelante dropshipping orgánico con videos de productos.
localStorage y los datos de ejemplo./api/generate, /api/analyze-metrics, /api/analyze-viral y /api/dropshipping exigen sesión: sin login devuelven 401 sin llamar al modelo.La capa de datos vive en src/lib/DataContext.tsx (contexto + useData()), con los mapeos cliente↔tabla en src/lib/db.ts. Ningún módulo toca localStorage directamente: todos usan insert / update / remove de useData().
@supabase/ssr. Todo se lee con .eq("user_id", auth.uid()) y todo insert lleva user_id; update/delete filtran por id y user_id. La RLS de supabase/schema.sql impone lo mismo en la base de datos (política own rows: auth.uid() = user_id), así un usuario jamás ve datos de otro aunque manipule el cliente. Colecciones conectadas: accounts, series, characters, formulas, episodes (el Generador guarda el episodio con platform_adaptations y versions), production_cards, clip_checks, costs, calendar_entries, metrics (las métricas específicas de cada plataforma 4B van en la columna extra jsonb), viral_analyses, products y product_tests. Las mutaciones refrescan el estado al instante y hay suscripción Realtime (si está activa en tu proyecto) que recarga ante cambios externos.localStorage con los datos de ejemplo. Ideal para probar sin configurar nada.🟢 Conectado: tu@correo (Supabase) con botón Salir, o 🟡 Modo sin login (datos locales). La página principal es usable en ambos modos.src/middleware.ts (con @supabase/ssr) refresca la sesión en cookies en cada petición, para que el servidor la vea. Cada ruta de IA empieza llamando requireUser() (src/lib/auth-guard.ts), que crea el cliente de servidor desde las cookies y ejecuta auth.getUser():
401 {"error":"No autorizado: inicia sesión"} y la ruta no llama al LLM (se responde antes de parsear el cuerpo y de cualquier generación).503 con el mensaje de que Supabase no está configurado: las rutas quedan cerradas, nunca abiertas por falta de configuración.LLM_API_KEY usa el modelo; sin ella, responde la plantilla local del servidor).En el frontend, Generador, Métricas (Analizar), Analizador y Dropshipping detectan el 401/503 y muestran «Inicia sesión para usar la IA» con enlace a /login, sin romperse. En modo sin login ofrecen la plantilla local en el cliente (misma salida, generada en el navegador) dejando claro que la API protegida requiere login.
Verificado: con un
.env.localde placeholders bien formados,curl -X POSTsin sesión a las 4 rutas devuelve 401 en las 4; sin variables de Supabase devuelve 503 en las 4; la página principal responde 200.
s01, s02…, motivo para rehacer y montaje al aprobar todas las escenas. El Kanban y costos siguen disponibles.Regla: toda historia se construye primero con la FÓRMULA BASE (Instagram) y después se generan 4 versiones, una por plataforma. Nunca el mismo archivo ni el mismo texto en todas.
FÓRMULA BASE (Instagram) — el origen de todo:
El generador (src/lib/llm.ts + src/lib/platforms.ts, API POST /api/generate, componente Generador) entrega 4 fichas separadas, cada una con duración recomendada, cambios de montaje, texto de portada, título/descripción, hashtags, mejor horario, frecuencia, CTA, métricas a vigilar, checklist y nombre de archivo propio, con su botón Copiar:
| Plataforma | Duración | Claves de la ficha |
|---|---|---|
| Instagram Reels | 30-60 s | Cortes cada 2-4 s. Portada: cara en primer plano + 1 frase de intriga. Descripción corta con pregunta + «Comenta PARTE 2». 3-5 hashtags de nicho. Recordatorio: activar la etiqueta «Información de IA». Métricas: compartidos, guardados, seguidores. |
| 60-90 s | Diálogo sin pausas. Subida nativa, nunca desde Instagram. Gancho visible 5-8 s. Descripción emotiva / de debate: «¿Quién tiene la culpa?». Sugerencia de 3 grupos de Facebook dominicanos con una frase para compartir en cada uno (verifícalos antes de publicar). Publicar 1/día, 7-10 pm (hora RD). Métricas: tiempo promedio, vistas de 1 minuto, ingresos estimados. | |
| TikTok | 1-3 min (>1 min monetiza) | «Anteriormente...» de 5-8 s si es continuación. Tarjetas de tiempo + narrador solo en la última frase. Portada «PARTE X» grande + título de la serie. Descripción con keywords buscables (frutinovela, telenovela de frutas, drama dominicano) + 3-5 hashtags. Playlist por serie. 1-2/día. Respuestas en video a comentarios. Métricas: % visto completo, nuevos seguidores, búsquedas. |
| YouTube Shorts | Hasta 3 min, ideal 45-90 s | Final que empalma con el inicio para hacer bucle. Título con keywords + #shorts, máximo 60 caracteres. Sin marcas de agua, archivo limpio. Vincular la siguiente parte con «video relacionado». Métricas: visto vs deslizado, retención. |
Dónde se guarda: cada episodio guarda sus 4 fichas en el campo platform_adaptations (jsonb) de la tabla episodes en Supabase (en modo local: episodes[].platform_adaptations en localStorage). En el generador también puedes descargarlas como adaptaciones-plataformas.json.
Comparación en Métricas: el módulo 7 incluye un tablero de comparación del mismo episodio lado a lado en las 4 plataformas, y cada una se juzga con sus propias métricas 4B (no solo por vistas).
YouTube Shorts también es plataforma seleccionable al registrar una Cuenta.
supabase/schema.sql para un proyecto nuevo. Para un proyecto ya desplegado, ejecuta supabase/migrations/20261022_character_bible_scene_review.sql antes de publicar esta versión; añade las columnas nuevas sin borrar filas existentes./login.Copia .env.example a .env.local y rellena:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
LLM_API_KEY=
LLM_PROVIDER=anthropic # anthropic | openai
LLM_MODEL=claude-3-5-sonnet-latest # o gpt-4o-mini si usas OpenAI
Nota honesta: las rutas de IA exigen login (ver «Protección de las rutas de IA»). Sin
LLM_API_KEY(pero con sesión) el generador, el analizador y dropshipping responden con la plantilla local del servidor (sin IA). En modo sin login, la plantilla se genera en el cliente y los datos van alocalStorage.
npm install
npm run dev
# http://localhost:3000
src/lib/platforms.ts # 4B: FÓRMULA BASE + buildPlatformAdaptations() (4 fichas)
src/lib/llm.ts # callLLM (Claude/OpenAI) + generateEpisode() + plantillas locales (servidor y cliente)
src/lib/seed.ts # Serie y personajes de ejemplo + fórmulas precargadas
src/lib/db.ts # Mapeos colección <-> tabla Supabase / clave localStorage
src/lib/DataContext.tsx # Sesión + capa de datos (Supabase por usuario | modo local) + SessionBar + Salir
src/lib/auth-guard.ts # requireUser(): 401 sin sesión / 503 sin Supabase configurado
src/lib/api-client.ts # postApi() del frontend (detecta 401/503)
src/middleware.ts # Refresco de sesión en cookies (@supabase/ssr)
src/lib/supabase/ # Cliente navegador y servidor (@supabase/ssr)
src/app/api/generate/ # Generador (incluye platformAdaptations) — protegida
src/app/api/analyze-metrics/ src/app/api/analyze-viral/ src/app/api/dropshipping/ # protegidas
src/components/ # Los 9 módulos + PlatformAdaptations.tsx (fichas 4B)
supabase/schema.sql # Esquema + RLS + migración 4B + metrics.extra