Panel generated from the schema
Each declared page, content type and field becomes an editing screen. The client only sees what the site actually has — no extra menus, no config screens.
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.
Each declared page, content type and field becomes an editing screen. The client only sees what the site actually has — no extra menus, no config screens.
Meta title, description and og:image attached automatically to every page and item, with sitemap.xml generated — including hreflang when the site is multi-language.
Upload jpeg, png, gif, webp, svg and pdf with alt text, clean names and named sizes generated on demand — thumb, hero, whatever you declare.
CSRF + honeypot protection, submissions saved to the database and sent by email with a dynamic subject ({{name}}). Email failed? The submission is still saved.
Site logins — clients, students, leads — with their own types and fields, custom routes and sessions separate from admin users. A problem on one side does not reach the other.
URLs with a per-language prefix and slug, per-content translation in tabs in the editor itself and automatic fallback — the theme helpers resolve the language on their own.
Fields
Declared in the site.json, rendered in the panel, read in the theme with field().
text
Single-line text — titles, names, headlines.
textarea
Long text without formatting.
richtext
Visual editor (TipTap) that saves clean HTML.
image
One image from the media library; resolved with image_url().
gallery
Ordered list of images.
select
Dropdown with options you define.
boolean
On/off — highlight, badge, optional section.
number
Numeric value.
Email input with HTML5 validation.
url
URL input with HTML5 validation.
date
Date picker.
repeater
A group of subfields that repeats — testimonials, FAQs, lists.
flexible
Blocks with named layouts — the ACF "flexible content".
link
Title + URL + new tab; printed with link_tag().
item
Relationship to other content, via search — published items only.
group
Collapsible organizational box in the admin; storage stays flat.
tabs
Organizational tabs in the editor — visual only, no data change.
Structure
The site.json describes what the site can hold. The panel and the URLs follow.
Posts, cases, services, properties — you name them. Each type has a slug, template, 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 terms.
The item field connects content — 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 for the client to create new ones in the admin — each with its own fields.
Phone, social networks, footer texts: options pages become forms in the admin and come out in the theme with option('contact.phone') — cached, a single query.
field_groups defines field bundles once — local SEO, a CTA block — and reuses them across pages and types with one line.
Vibe coding
Everything the panel does, 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.
$ ./bin/velk item:schema servico
name · type · required — the map before writing
$ ./bin/velk item:create servico --json-stdin
✓ Item created: consultoria-seo
$ ./bin/velk item:publish servico consultoria-seo
✓ Published
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.
Output escaping with e(), 100% SQL in prepared statements, CSRF on every POST, honeypot on forms and member sessions isolated from 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.