~/progetti/magosox/README.md

COOKIES_ADVICE PRIVACY_POLICY.

~/progetti/magosox/README.md

magosox

{ fecha: “2026-08-01”, estado: “live”, módulos_stack: 12 }

Automatiza el contenido social de una marca — elige el tema, escribe el texto, crea las imágenes y publica

magosox produce el contenido social de una marca y lo publica por su cuenta. A las horas que se le han fijado decide de qué hablar, escribe el texto, saca de ahí las imágenes y lo sube: nadie tiene que abrir nada. La parte difícil no es publicar, sino hacerlo manteniendo una voz reconocible. Una publicación automática que suena a publicación automática no vale nada, y es justo ahí donde este proyecto pone el esfuerzo.

## El contexto de la marca es un dato, no código

Lo que hace reconocible a una publicación — la voz, la manera de dirigirse a quien lee, lo que la marca sabe y lo que deliberadamente calla, junto con el almacén de temas — en magosox vive dentro del producto y no en el código fuente. Se escribe y se corrige desde la interfaz, y el cambio rige a partir de la siguiente publicación, sin despliegues. De ahí se deriva todo lo demás: incorporar una marca nueva es configuración y no desarrollo, y cada marca lleva su propio contexto sin tocar el de las demás.

## Estructurar la prosa, no trocearla

La calidad de una publicación no viene de una arquitectura: viene de unas mil palabras bien escritas. Es una distinción que parece obvia y que casi todos los sistemas de este tipo pasan por alto: trocean esas palabras en columnas — tono, formalidad, usarEmoji: false — y luego las recomponen, obteniendo instrucciones peores que las de partida. En magosox las reglas de voz son filas que contienen texto literal, saltos de línea y sangrías incluidos. El sistema solo sabe cuándo inyectarlas, en qué orden y bajo qué encabezado: estructura el alcance, el peso y la colocación de la prosa, nunca la prosa. Y para que tocar el motor no cambie la voz a escondidas, un test de regresión recompila el prompt a partir de esas filas y lo compara, carácter a carácter, con una referencia congelada.

## Un registro en lugar de una consulta

Para que el feed no se repita, el sistema tiene que saber de qué se ha hablado hace poco. Lo evidente sería deducirlo de las publicaciones ya salidas, y no funciona. La ventana cuenta publicaciones, no días, y en un mismo día puede salir más de una: ningún orden cronológico sabe ponerlas en fila. Están además las publicaciones puntuales escritas a petición, que no remiten a ningún tema del catálogo y por tanto nunca podrían ser claves foráneas. Por eso la anti-repetición es un registro que solo crece, con una numeración propia. Una publicación programada consume su tema de inmediato y lo devuelve si la publicación falla: un ciclo de vida que el estado de una publicación no sabría representar sin mentir.

## Límites anunciados y límites aplicados

Para cada superficie de texto hay dos números distintos: el que se le anuncia al modelo y el que la comprobación aplica de verdad. Un título puede anunciarse con 55 caracteres y rechazarse solo a los 65, mientras el mensaje de corrección sigue diciendo 55. Ese margen de en torno al 18% es lo que mantiene la tasa de reintentos cerca de cero, y pesa más de lo que parece: el segundo intento produce, de media, un texto peor que el primero. Juntar los dos números en una sola columna significa o inundar el ciclo de corrección, o dejar que cada título engorde un 18%.

## De la idea a la publicación

La cadena funciona sin vigilancia, a las horas que marca el calendario, y cada paso deja un rastro que se puede releer:

·Elección del tema: cadencia de los pilares de contenido, enfriamiento, rotación de categorías por uso menos reciente, estacionalidad — con un generador aleatorio con semilla, para poder repetir una elección
·Generación: prompt compilado desde el contexto de la marca, salida estructurada, saneamiento, validación y ciclo de corrección conversacional
·Renderizado: mustache y Chrome headless producen los JPEG; tema, plantilla y versión de Chrome quedan fijados en cada render
·Publicación: Instagram Graph API en tres fases, retomando los contenedores ya creados y con renovación automática del token
·Programación: franjas que fijan días y hora — y, si se quiere, el pilar o el formato de ese día —, ocurrencias materializadas a partir de ellas, y un worker que genera por adelantado y publica a la hora exacta

## La interfaz

La administración es el sitio donde el contexto de la marca se edita de verdad, sin que nadie tenga que acercarse a un repositorio. El acceso es sin contraseña, con un código por correo; no existe registro, las cuentas se crean desde el terminal.

·Contexto: secciones de prompt, reglas de voz y documentos, todo editable
·Prompt: el texto exacto que saldría hacia el modelo, sin llamarlo
·Temas: el almacén, con elegibilidad y distancia desde el último uso en una columna
·Taxonomía: pilares con su cadencia, categorías, etiquetas con su color, formatos con sus límites anunciados y aplicados
·Publicaciones y calendario: qué sale y cuándo, y en qué estado
·Ajustes: los proveedores de modelo, almacenamiento, correo y renderizado, cada uno con el resultado de una comprobación real

## Stack tecnológico

El enfoque de la configuración merece una nota: las variables de entorno son la única forma de configurar el servicio antes de que exista la base de datos, así que se quedan. Pero desde el primer arranque gana el valor guardado, y la interfaz muestra cuál de los dos está ganando. Cambiar la clave del modelo a las tres de la madrugada no debería exigir acceso al servidor.

·API: NestJS sobre Fastify, Prisma y PostgreSQL
·Administración: React, Vite, HeroUI, TanStack Query y Router
·Generación: Claude con salida estructurada
·Renderizado: Chrome headless, con las fuentes incrustadas como data URI porque Chrome aplica CORS a los @font-face incluso entre documentos file://
·Almacenamiento: Cloudflare R2 — Instagram descarga las imágenes desde una URL pública
·Acceso: better-auth con código de un solo uso por correo, sesión en una cookie httpOnly
·Explotación: Docker Compose detrás de un Caddy compartido, con TLS automático

magosox está en producción desde el 1 de agosto de 2026 y publica sin vigilancia, con la cadencia que se le haya fijado. Antes de arrancar se cargó también el historial de los contenidos ya publicados, para que la anti-repetición tuviera memoria desde el primer día en lugar de tener que construirla a lo largo de semanas.

// stack
[nestjs”, fastify”, prisma”, postgres”, react”, vite”, typescript”, claude-api”, instagram-api”, docker”, caddy”, content-automation”, ]