Saltar al contenido
Caso · 18 / 19← Todos los trabajos

Sitios editables

Un editor de contenido sin CMS: un esquema JSON dibuja el formulario, y publicar rearma la página estática y la commitea en git. Tres sitios de clientes corren con esto.

Rol
Arquitectura y desarrollo completo
Stack
HTML, Vanilla JS, Node.js, Vercel Functions, GitHub Git Data API
El editor
El editorGit es la base de datos
(01) El problema

Dos coaches y una ingeniera en alimentos necesitaban landings que pudieran cambiar solas: textos, fotos, botones, colores, qué secciones se ven. Un CMS hosteado era una cuenta mensual, un login más y una página que pide su contenido en cada visita. Darles el HTML era romper el maquetado la primera vez que alguien pegara una cita.

Mi rolSeparé cada sitio en contenido, esquema y plantilla, escribí el editor y la función que publica, y llevé el motor de un sitio al siguiente.
(02) ResultadosContados en el código
3sitios de clientes en producción con el mismo motor
413campos editables entre los tres esquemas, ninguno en HTML
89 KBpesa la página de Lole, que salió de un export de diseño de 710 KB
(03) Arquitectura

Tres decisiones que lo definieron.

  1. 01

    Git es la base de datos

    Por qué. contenido.json en el repo es la fuente de verdad. Publicar lo manda a una sola función de Vercel que sube el JSON, el index.html rearmado y las fotos nuevas como blobs, arma un árbol y un commit con la Git Data API de GitHub y mueve la rama. Un commit es un solo redeploy. Deshacer es un commit nuevo con el árbol del anterior, y sólo corre si el último commit vino del editor, así nunca revierte un cambio de código.

    El costo. Cada publicación espera un deploy, más o menos un minuto. El editor manda el archivo de contenido entero, así que dos pestañas abiertas se pisan. Las fotos quedan en el historial de git, por eso el editor las achica a 1600 px en el navegador antes de subirlas.

  2. 02

    Armar al publicar, servir HTML estático

    Por qué. render(plantilla, contenido) es texto entra, texto sale, así la misma función corre con node construir.mjs en local y dentro de la función que publica. Quien entra baja un HTML del CDN y nunca llama a la función. Las clientas escriben texto plano con tres marcas (*cursiva dorada*, **negrita**, Enter); todo lo demás se escapa, y un campo vacío se lleva el bloque que lo envuelve, así borrar el texto de un botón saca el botón.

    El costo. Nada de la página es dinámico. Los formularios abren WhatsApp o el mail con un mensaje armado en vez de mandar a un servidor, y la vista previa necesita ir y volver de la función.

  3. 03

    Copiar el motor en cada sitio, no empaquetarlo

    Por qué. Cada sitio tiene su repo, su proyecto en Vercel, su contraseña y un token de GitHub con permiso sólo sobre ese repo. Alimentación Integral Hoy tuvo el editor primero, después Natalia y después Lole. Copiar los archivos dejó que cada sitio sumara lo suyo: Alimentación tiene listas de videos y de fotos, Lole un tipo de lista genérico, orden de secciones y una paleta que deriva once colores de seis.

    El costo. Las tres copias se separaron. El editor de Natalia no tiene buscador ni orden de secciones, y el detector de campos vacíos sólo está en dos repos. Un arreglo viaja a mano.

(04) GaleríaSeguí scrolleando →
El editor
El editor · El editor de Lole corriendo en local. Cada sección, etiqueta y pista sale de esquema.json. La paleta revisa el contraste WCAG en vivo antes de publicar nada.
Mujer Despierta
Mujer Despierta · La landing de Lole empezó como un export de diseño con React, un runtime propio y los assets en base64. Quedó una plantilla con marcadores y unos KB de JS vanilla.
Alimentación Integral Hoy
Alimentación Integral Hoy · El primer sitio con el motor, y el esquema más grande: programas, videos, recursos gratis y un banner que Julia cambia sola.
Natalia Raffatella
Natalia Raffatella · El más chico de los tres. Una app en Next.js se reemplazó por la página estática y el editor.
(05) Qué haría después
01Sacar el motor (editor, render y función de publicar) a un repo común del que se actualicen los tres sitios, para que el tipo de lista y el orden de secciones de Lole lleguen a Natalia.
02Mandar con cada publicación el commit que el editor cargó y rechazarla si el contenido cambió desde entonces, así dos pestañas no se pisan.
03Guardar los intentos fallidos de login fuera de la memoria de la función. Hoy una instancia nueva arranca el contador en cero y sólo sostiene la demora creciente.
Próximo proyecto · 19 / 19
Trading analytics dashboard →Heatmaps, gráficos y tablas en vivo para traders
Caso · 18 / 19

Sitios editables

Un editor de contenido sin CMS: un esquema JSON dibuja el formulario, y publicar rearma la página estática y la commitea en git. Tres sitios de clientes corren con esto.

Rol
Arquitectura y desarrollo completo
Stack
HTML, Vanilla JS, Node.js, Vercel Functions, GitHub Git Data API
Sitios editables
(01) El problema

Dos coaches y una ingeniera en alimentos necesitaban landings que pudieran cambiar solas: textos, fotos, botones, colores, qué secciones se ven. Un CMS hosteado era una cuenta mensual, un login más y una página que pide su contenido en cada visita. Darles el HTML era romper el maquetado la primera vez que alguien pegara una cita.

Mi rolSeparé cada sitio en contenido, esquema y plantilla, escribí el editor y la función que publica, y llevé el motor de un sitio al siguiente.
(02) Resultados
3sitios de clientes en producción con el mismo motor
413campos editables entre los tres esquemas, ninguno en HTML
89 KBpesa la página de Lole, que salió de un export de diseño de 710 KB
(03) Arquitectura

Tres decisiones que lo definieron.

01

Git es la base de datos

Por qué. contenido.json en el repo es la fuente de verdad. Publicar lo manda a una sola función de Vercel que sube el JSON, el index.html rearmado y las fotos nuevas como blobs, arma un árbol y un commit con la Git Data API de GitHub y mueve la rama. Un commit es un solo redeploy. Deshacer es un commit nuevo con el árbol del anterior, y sólo corre si el último commit vino del editor, así nunca revierte un cambio de código.

El costo. Cada publicación espera un deploy, más o menos un minuto. El editor manda el archivo de contenido entero, así que dos pestañas abiertas se pisan. Las fotos quedan en el historial de git, por eso el editor las achica a 1600 px en el navegador antes de subirlas.

02

Armar al publicar, servir HTML estático

Por qué. render(plantilla, contenido) es texto entra, texto sale, así la misma función corre con node construir.mjs en local y dentro de la función que publica. Quien entra baja un HTML del CDN y nunca llama a la función. Las clientas escriben texto plano con tres marcas (*cursiva dorada*, **negrita**, Enter); todo lo demás se escapa, y un campo vacío se lleva el bloque que lo envuelve, así borrar el texto de un botón saca el botón.

El costo. Nada de la página es dinámico. Los formularios abren WhatsApp o el mail con un mensaje armado en vez de mandar a un servidor, y la vista previa necesita ir y volver de la función.

03

Copiar el motor en cada sitio, no empaquetarlo

Por qué. Cada sitio tiene su repo, su proyecto en Vercel, su contraseña y un token de GitHub con permiso sólo sobre ese repo. Alimentación Integral Hoy tuvo el editor primero, después Natalia y después Lole. Copiar los archivos dejó que cada sitio sumara lo suyo: Alimentación tiene listas de videos y de fotos, Lole un tipo de lista genérico, orden de secciones y una paleta que deriva once colores de seis.

El costo. Las tres copias se separaron. El editor de Natalia no tiene buscador ni orden de secciones, y el detector de campos vacíos sólo está en dos repos. Un arreglo viaja a mano.

(04) Galería
El editor
El editor · El editor de Lole corriendo en local. Cada sección, etiqueta y pista sale de esquema.json. La paleta revisa el contraste WCAG en vivo antes de publicar nada.
Mujer Despierta
Mujer Despierta · La landing de Lole empezó como un export de diseño con React, un runtime propio y los assets en base64. Quedó una plantilla con marcadores y unos KB de JS vanilla.
Alimentación Integral Hoy
Alimentación Integral Hoy · El primer sitio con el motor, y el esquema más grande: programas, videos, recursos gratis y un banner que Julia cambia sola.
Natalia Raffatella
Natalia Raffatella · El más chico de los tres. Una app en Next.js se reemplazó por la página estática y el editor.
(05) Qué haría después
01Sacar el motor (editor, render y función de publicar) a un repo común del que se actualicen los tres sitios, para que el tipo de lista y el orden de secciones de Lole lleguen a Natalia.
02Mandar con cada publicación el commit que el editor cargó y rechazarla si el contenido cambió desde entonces, así dos pestañas no se pisan.
03Guardar los intentos fallidos de login fuera de la memoria de la función. Hoy una instancia nueva arranca el contador en cero y sólo sostiene la demora creciente.
Próximo proyectoTrading analytics dashboard →
Nahuel SantillánES