Uniweb
Para desarrolladores

El contenido y el código van por separado. Se encuentran cuando una página se renderiza.

Un proyecto Uniweb tiene dos partes. El sitio es contenido. La foundation es React. Un runtime ligero las une allí donde se renderiza una página: en el build, en el host y en el navegador. Esta página muestra cómo se ve eso en un proyecto real, tanto si trabajas con un agente como por tu cuenta, en tus sitios o en los de tus clientes.

ReactViteTailwind v4Apache 2.0
01

Entra Markdown. Sale un objeto tipado.

Los autores escriben cada sección como un archivo Markdown. Antes de que ningún componente lo vea, el archivo se convierte en un objeto con campos con nombre: cadenas y arrays, nunca null. Los encabezados marcan la estructura, no el tamaño.

site/pages/home/hero.md
---
type: Hero
theme: dark
---
# Ship the site this week
## Not every change needs a developer

We help small teams publish.

[Get started](/start)
lo que recibe el componente
content = {
  title: 'Ship the site this week',
  subtitle: 'Not every change needs…',
  paragraphs: ['We help small teams…'],
  links: [{ label: 'Get started', … }],
  items: [],
  // images, icons, data, …
}

$ uniweb inspect pages/home/hero.md

src/sections/Hero/index.jsx
import { H1, H2, P } from '@uniweb/kit'

export default function Hero({ content }) {
  return (
    <>
      <H1 text={content.title} />
      <H2 text={content.subtitle} />
      <P text={content.paragraphs} />
    </>
  )
}

Ese es el componente completo. No tiene elemento contenedor, ni comprobaciones de null, ni lógica de tema, ni textos fijos en el código.

02

Tipos de sección ligeros. React normal detrás.

Un tipo de sección es la parte que los autores pueden nombrar. Lee los parámetros, elige un componente y le pasa props simples. Todo lo que hay detrás es React normal: cualquier paquete, cualquier librería, cualquier patrón.

Un solo tipo para el autor, tantas versiones como necesite el diseño.

src/sections/Hero/index.jsx
const workers = { slider: SliderHero, contact: ContactHero }

export default function Hero({ content, params, block }) {
  const Worker = workers[params.variant] || SliderHero
  return (
    <Worker
      title={content.title}
      links={content.links}
      images={content.images}
      block={block}
    />
  )
}
03

meta.js es la interfaz.

Cada tipo de sección declara lo que lee y qué parámetros acepta. Ese único archivo fija los valores por defecto, crea los controles del editor visual y le dice a un agente qué existe.

Cada parámetro que declaras es algo que un autor puede cambiar sin ti.

src/sections/Features/meta.js
export default {
  title: 'Feature Grid',
  content: {
    title: 'Heading',
    items: { label: 'Cards [3-6]' },
  },
  params: {
    columns: { type: 'number', default: 3 },
    variant: {
      type: 'select',
      options: ['default', 'centered'],
      default: 'default',
    },
  },
}
04

El runtime hace esto una vez, para todas las secciones.

Lo que te queda por escribir es la lógica de renderizado.

Contenedores y fondos de sección. Se definen en el frontmatter y los pinta el runtime.
Temas. Los tokens se adaptan al contexto claro u oscuro de cada sección. Los colores y las fuentes son del sitio.
Rutas y enlaces. Enlaza una página por su id y el enlace sigue funcionando aunque la página se mueva.
Datos. Nombra una consulta y declara su clave en meta.js: los registros llegan en content.data, prerenderizados. Sin fetch en un effect.
Idiomas. El contenido llega ya traducido. No hay claves de texto en tus componentes.
Prerenderizado. En el build para hostings estáticos, y justo a tiempo en el edge en Uniweb Cloud.
Índices de búsqueda y de IA. Un índice de búsqueda, un llms.txt y una copia en Markdown de cada página, a partir del mismo contenido.
05

Un proyecto normal, en dos paquetes.

El sitio y la foundation son paquetes separados en un mismo workspace. Instala cualquier librería en la foundation como en cualquier proyecto React. La configuración del build es cosa del CLI.

Una foundation puede servir a muchos sitios.

estructura del proyecto
site/el contenidopages/one Markdown file per sectionrecords/one file per record, by schemaqueries.ymlnamed queries over recordslocales/translationstheme.ymlcolors and fontssite.ymlpages, languages, servicessrc/la foundationsections/section types authors can usecomponents/ordinary Reactlayouts/custom layoutsmain.jsfoundation settingsstyles.cssTailwind and theme tokens
Paso 1

Crear

Un proyecto a partir de una plantilla, con su manual para agentes.

$ npx uniweb@latest create my-site --template marketing
Paso 2

Ejecutar

El servidor de desarrollo muestra su dirección, y la página se actualiza al guardar.

$ cd my-site && pnpm install && pnpm dev
Paso 3

Comprobar

Mira en qué se convierte un archivo de sección antes de que se renderice nada.

$ npx uniweb inspect site/pages/home/hero.md
Paso 4

Publicar

En línea en el hosting de Uniweb, y en el editor visual para cualquiera con quien trabajes.

$ npx uniweb publish
06

Con un agente, o por tu cuenta.

Hoy la mayoría de los desarrolladores trabaja con un agente, y Uniweb está hecho para eso, pero nada en él lo exige. El proyecto son archivos normales, y el manual que trae cada proyecto se lee igual de bien para una persona que para un agente.

AGENTS.mdEl manual del proyecto: cómo funciona el framework, dónde te engañan los hábitos de otros frameworks y cómo comprobar tu trabajo.
uniweb guideEl resto del manual, un tema a la vez, para la versión que usas.
uniweb.io/docsGuías y referencia, con un índice para agentes en llms.txt.
07

Comandos que te dicen la verdad.

Tú y tu agente usan los mismos. No hay que adivinar nada: el listado de carpetas es el catálogo, e inspect muestra en qué se convirtió un archivo.

uniweb createCrea un proyecto a partir de una plantilla.
uniweb devSirve el sitio en local con recarga en vivo.
uniweb inspectMuestra la estructura analizada de un archivo o una página.
uniweb doctorComprueba la configuración del proyecto.
uniweb validateComprueba los registros contra sus esquemas.
uniweb guideLee el manual de la versión que usas.
uniweb push / pullSincroniza con el editor visual. Los cambios de los autores vuelven como un commit.
uniweb publishPublica en Uniweb Cloud.
uniweb deployDespliega en un hosting estático, como Cloudflare Pages o Netlify.
08

De un sitio a una aplicación.

El mismo proyecto crece más allá de las páginas. Los registros se sirven en vivo, los servicios se activan con una línea en site.yml, y un sitio puede tener su propio backend, con cuentas y pagos. Nada de esto exige reescribir: la misma foundation funciona en un sitio con estos servicios y en uno sin ellos.

Registros. Un archivo por registro en records/<schema>/, pedidos por nombre en queries.yml. Se sirven en vivo en el hosting de Uniweb, se compilan en el build en un hosting estático y se editan en el editor visual como formularios.
Servicios. Búsqueda, formularios, estadísticas y un asistente, cada uno con una línea bajo services: en site.yml.
Su propio backend. Inicio de sesión, roles y lo que crea cada miembro, a través de @uniweb/api y el servicio backend del sitio, con un backend simulado para uniweb dev.
Pagos. A través de la propia cuenta de Stripe del dueño del sitio, integrados en el backend.
09

Tus sitios, o los de tus clientes.

Uniweb se adapta a las dos formas de trabajar.

Tus propios sitios

Archivos, la app, o ambos

Mantén el contenido en tus archivos y en Git, lleva el sitio al editor visual, o trabaja en ambos, y publica cuando esté listo.

$ uniweb publish
Los sitios de tus clientes

Tu foundation, sus sitios

Registra la foundation, y tus clientes componen sus sitios en el editor visual con tus tipos de sección y las opciones que les diste. Tú la sigues mejorando y publicas nuevas versiones.

$ uniweb register
10

Dos formas de publicar.

Recomendamos Uniweb Cloud desde las primeras páginas de un sitio. Un sitio sencillo cuesta menos ahí, porque cada servicio tiene su propio precio; cada publicación mantiene el sitio en el editor visual, listo para editar; y el sitio crece hasta todo lo que puede hacer un sitio Uniweb sin cambios. Un hosting estático es gratuito, y sirve lo que produce un build.

Recomendado · de pago

Uniweb Cloud

Páginas prerenderizadas justo a tiempo en el edge, con datos en vivo. El sitio en el editor visual en cada publicación. Registros en vivo, formularios, analíticas, cuentas y pagos cuando los necesites.

$ uniweb publishVer precios
Gratis · sin cuenta

Cualquier hosting estático

Despliega con un solo comando en Cloudflare Pages, GitHub Pages, Netlify, Vercel o S3 con CloudFront, o exporta una carpeta para cualquier otro hosting. Los cambios de la app le llegan con un nuevo build, y el contenido en vivo, los formularios, las analíticas y las cuentas necesitan servicios propios.

$ uniweb deploy --host=cloudflare-pages

Empieza un proyecto.

$ npm create uniweb

O déjaselo a tu agente. Cada proyecto incluye un AGENTS.md que le explica cómo funciona el framework y cómo comprobar su propio trabajo.