Panel generated from the schema
Every page, content type and declared field becomes an editing screen. The client sees only what the site actually has: no leftover menus, no settings screens.
site.json → /admin
Features
A complete CMS in the download: panel, rich fields, SEO, forms, members and multi-language. No plugins to hunt, no paid tier.
The essentials
The admin is generated from the site.json — and it is born with what every site needs underneath.
Every page, content type and declared field becomes an editing screen. The client sees only what the site actually has: no leftover menus, no settings screens.
site.json → /admin
Meta title, description and og:image attached automatically to every page and item, with a generated sitemap.xml — including hreflang when the site is multi-language.
sitemap.xml · hreflang · og:image
Upload with alt text, clean file names and named sizes generated on demand: thumb, hero, whichever ones you declare.
jpeg · png · gif · webp · svg · pdf
CSRF and honeypot protection, submissions saved to the database and emailed with a dynamic subject. Email failed? The submission is still stored.
CSRF · honeypot · assunto {{name}}
Site logins (clients, students, leads) with their own types and fields, customizable routes and sessions kept apart from admin users. Trouble on one side never reaches the other.
sessions isolated from the admin
Prefixed URLs and a slug per language, per-record translation in tabs inside the editor itself, and automatic fallback: the theme helpers resolve the language on their own.
/pt/ · /en/ · /es/
Fields
Declared in site.json, rendered in the panel, read in the theme with field().
Structure
The site.json describes what the site can hold. The panel and the URLs follow.
Posts, cases, services, listings: you name them. Each type has a slug, a template, an archive listing and, if you want, alternate templates per item.
Categories, tags and whatever else you need: hierarchical or not, with an optional page of their own and custom fields on the terms.
O campo item links content together — the case to the service, the post to the author — with a search combobox in the panel.
Structural pages declared in the schema (home, contact) and page templates so the client can create new ones in the admin, each with its own fields.
Phone, social links, footer copy: option pages become forms in the admin and come out in the theme with option('contato.phone'), cached, a single query.
field_groups defines field bundles once (local SEO, a CTA block) and reuses them across pages and types in a single line.
Vibe coding
Everything the panel does, the bin/velk does over JSON. That is how an AI agent creates the schema, writes content, publishes and maintains the whole site, end to end.
Paste into Claude Code to install:
Install the Velk skill from skill.velkcms.com into ~/.claude/skills/velk
Under the hood
The engine is a versioned dependency: the upgrade downloads the tarball, verifies the sha256 and swaps only the core files. Theme, content, uploads and .env stay untouched.
Uploaded new files over FTP? On the first request Velk applies the pending migrations by itself, serialized with a MySQL lock: a host without SSH finishes the upgrade with no terminal at all.
Output escaping with e(), SQL 100% on prepared statements, CSRF on every POST, honeypot on forms and member sessions isolated from the admin ones.
Install the skill in Claude Code and describe your first site — the AI installs Velk and the panel appears before your coffee gets cold.