Features

Everything in the box

A complete CMS in the download: panel, rich fields, SEO, forms, members and multi-language. No plugins to hunt, no paid tier.

The essentials

A panel that builds itself

The admin is generated from the site.json — and it is born with what every site needs underneath.

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.

Built-in SEO

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.

Media library

Upload jpeg, png, gif, webp, svg and pdf with alt text, clean names and named sizes generated on demand — thumb, hero, whatever you declare.

Forms out of the box

CSRF + honeypot protection, submissions saved to the database and sent by email with a dynamic subject ({{name}}). Email failed? The submission is still saved.

Members area

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.

Native multi-language

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

17 field types

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

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

Declared structure, free content

The site.json describes what the site can hold. The panel and the URLs follow.

Content types

Posts, cases, services, properties — you name them. Each type has a slug, template, archive (listing) and, if you want, alternate templates per item.

Taxonomies

Categories, tags and whatever else you need — hierarchical or not, with an optional page of their own and custom fields on terms.

Relationships

The item field connects content — the case to the service, the post to the author — with a search combobox in the panel.

Pages both ways

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.

Global options

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.

Reusable groups

field_groups defines field bundles once — local SEO, a CTA block — and reuses them across pages and types with one line.

Vibe coding

The CLI is the API

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.

  • schema:validate
  • page:sync
  • item:create
  • item:update
  • page:update
  • item:schema
  • --json-stdin
  • --dry-run
  • --format=json
bin/velk

$ ./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

Built to last in production

Fearless upgrades

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.

Auto-migrate on boot

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.

Security by default

Output escaping with e(), 100% SQL in prepared statements, CSRF on every POST, honeypot on forms and member sessions isolated from admin ones.

See all of this running

Install the skill in Claude Code and describe your first site — the AI installs Velk and the panel appears before your coffee gets cold.