Panel generado del esquema
Cada página, tipo de contenido y campo declarado se convierte en una pantalla de edición. El cliente solo ve lo que el sitio realmente tiene — sin menús de sobra, sin pantallas de configuración.
Recursos
Un CMS completo en la descarga: panel, campos ricos, SEO, formularios, miembros y multi-idioma. Sin plugins que buscar, sin versión de pago.
Lo esencial
El admin se genera del site.json — y ya nace con lo que todo sitio necesita por debajo.
Cada página, tipo de contenido y campo declarado se convierte en una pantalla de edición. El cliente solo ve lo que el sitio realmente tiene — sin menús de sobra, sin pantallas de configuración.
Meta title, description y og:image adjuntados automáticamente a cada página e item, con sitemap.xml generado — incluyendo hreflang cuando el sitio es multi-idioma.
Subida de jpeg, png, gif, webp, svg y pdf con texto alternativo, nombres limpios y tamaños con nombre generados bajo demanda — thumb, hero, los que declares.
Protección CSRF + honeypot, envíos guardados en la base de datos y enviados por email con asunto dinámico ({{name}}). ¿Falló el email? El envío sigue guardado.
Logins del sitio — clientes, alumnos, leads — con sus propios tipos y campos, rutas personalizables y sesiones separadas de los usuarios del admin. Un problema en un lado no alcanza el otro.
URLs con prefijo y slug por idioma, traducción por contenido en pestañas en el propio editor y fallback automático — los helpers del tema resuelven el idioma solos.
Campos
Declarados en el site.json, renderizados en el panel, leídos en el tema con field().
text
Texto de una línea — títulos, nombres, titulares.
textarea
Texto largo sin formato.
richtext
Editor visual (TipTap) que guarda HTML limpio.
image
Una imagen de la biblioteca de medios; resuelta con image_url().
gallery
Lista ordenada de imágenes.
select
Desplegable con opciones que defines.
boolean
Activar/desactivar — destacado, badge, sección opcional.
number
Valor numérico.
Input de email con validación HTML5.
url
Input de URL con validación HTML5.
date
Selector de fecha.
repeater
Grupo de subcampos que se repite — testimonios, FAQs, listas.
flexible
Bloques con layouts con nombre — el "contenido flexible" de ACF.
link
Título + URL + nueva pestaña; se imprime con link_tag().
item
Relación con otro contenido, por búsqueda — solo items publicados.
group
Caja organizativa plegable en el admin; el almacenamiento sigue plano.
tabs
Pestañas organizativas en el editor — solo visual, sin cambiar los datos.
Estructura
El site.json describe lo que el sitio puede tener. El panel y las URLs lo siguen.
Posts, casos, servicios, propiedades — tú los nombras. Cada tipo tiene slug, template, archivo (listado) y, si quieres, plantillas alternativas por item.
Categorías, etiquetas y lo que necesites — jerárquicas o no, con página propia opcional y campos personalizados en los términos.
El campo item conecta contenidos — el caso al servicio, el post al autor — con un combobox de búsqueda en el panel.
Páginas estructurales declaradas en el esquema (home, contacto) y plantillas de página para que el cliente cree nuevas en el admin — cada una con sus campos.
Teléfono, redes sociales, textos de pie: las páginas de opciones se vuelven formularios en el admin y salen en el tema con option('contacto.phone') — cacheado, una sola query.
field_groups define bundles de campos una vez — SEO local, bloque de CTA — y los reutiliza en páginas y tipos con una línea.
Vibe coding
Todo lo que hace el panel, bin/velk lo hace por JSON. Así un agente de IA crea el esquema, escribe contenido, publica y mantiene el sitio entero — de punta a punta.
$ ./bin/velk item:schema servico
name · type · required — el mapa antes de escribir
$ ./bin/velk item:create servico --json-stdin
✓ Item creado: consultoria-seo
$ ./bin/velk item:publish servico consultoria-seo
✓ Publicado
Bajo el capó
El engine es una dependencia versionada: el upgrade descarga el tarball, verifica el sha256 y cambia solo los archivos del core — tema, contenido, uploads y .env quedan intactos.
¿Subiste archivos nuevos por FTP? En la primera petición Velk aplica las migraciones pendientes solo, serializado con un lock de MySQL — un hosting sin SSH termina el upgrade sin terminal.
Escape de salida con e(), SQL 100% en prepared statements, CSRF en cada POST, honeypot en los formularios y sesiones de miembros aisladas de las del admin.
Instala la skill en Claude Code y describe tu primer sitio — la IA instala Velk y el panel aparece antes de que se enfríe el café.