Services First.
Interface Second.
VelvetCMS is a service-oriented CMS. All logic lives in frontend-agnostic services. Three consumers — CLI, REST API, and Web admin — expose them independently. Use all three, two, one, or none.
Three Interfaces. One Codebase.
Business logic lives in services. Consumers are thin, optional wrappers. Disable any interface with a single config toggle.
CLI
Automation, cron, CI/CD pipelines
REST API
SPAs, mobile apps, headless frontends
Web Admin
Content editing, media, settings
Content Without Compromise
Not a feature checklist — a coherent content workflow.
Compose with Blocks, Not HTML
Drag-and-drop content blocks with real-time preview. Text, images, code, embeds, custom block types. Every block is a self-contained unit with its own schema and rendering.
- Custom block types — define schema, template, CSS
- Reorder with drag-and-drop, no page reload
- Inline editing with Markdown shortcuts
- Raw HTML block for when you need full control
// Register a custom block type
$blocks->register('callout', [
'label' => 'Callout Box',
'icon' => 'megaphone',
'fields' => [
'style' => ['type' => 'select', 'options' => ['info', 'warning', 'tip']],
'title' => ['type' => 'text'],
'content' => ['type' => 'rich-text'],
],
'template' => 'blocks.callout',
]);
Edit Without Fear
Every save creates an automatic revision. Diff any two versions side-by-side. Restore with one click. For bigger changes, use the staging environment — edit multiple pages, preview the result, then deploy everything at once.
- Full history with visual diffs
- Named snapshots for milestone backups
- Staging sandbox with preview URLs
- Coordinated multi-page deploys
// Restore a previous revision
$content->restoreRevision($revisionId);
// Create a staging changeset
$changeset = $staging->createChangeset('Homepage redesign');
$staging->stage($homepage, $changeset);
$staging->stage($aboutPage, $changeset);
// Preview, then deploy
$staging->preview($changeset); // → staging URL
$staging->deploy($changeset); // → live
From Draft to Published — Your Rules
Define review pipelines with approvals, role gates, and automatic transitions. A blog might need just "draft → published." An enterprise site might need "draft → legal review → editor approval → scheduled → published."
- Custom states and transitions per content type
- Role-based gates — who can approve what
- Automatic actions on state change (notify, index, cache)
- Audit trail for compliance
// Define a workflow
$workflow->define('editorial', [
'states' => ['draft', 'review', 'approved', 'published'],
'transitions' => [
'submit' => ['from' => 'draft', 'to' => 'review'],
'approve' => ['from' => 'review', 'to' => 'approved',
'gate' => 'role:editor'],
'publish' => ['from' => 'approved', 'to' => 'published'],
'reject' => ['from' => 'review', 'to' => 'draft'],
],
]);
Extend Everything
Mutable hooks, modular architecture, and a queue system. VelvetCMS is designed to be extended, not forked.
Hooks System
Filters mutate data as it flows through the system. Actions trigger side effects. If you've used WordPress hooks, you already know the pattern — but typed, testable, and without the global soup.
// Filter: modify content before saving
$hooks->filter('content.before_save', function (Content $content) {
$content->slug = Str::slug($content->title);
return $content;
});
// Action: trigger side effects after publishing
$hooks->action('content.published', function (Content $content) {
$search->index($content);
$cache->invalidate('sitemap');
$webhook->notify('content.published', $content);
});
Module System
Self-contained packages with routes, views, migrations, and commands. Version constraints, dependency resolution, conflict detection. VelvetCMS itself is a module running on Core.
Queue System
Offload heavy work — media processing, imports, search indexing, webhook delivery. Database-backed with retry logic, failure tracking, and priority lanes.
Smart Search
Built-in search with typo tolerance, synonym support, faceted filtering, and search analytics. No Elasticsearch required — but you can swap drivers if you outgrow it.
Built on a Purpose-Built Framework
VelvetCMS runs on Core — a lightweight, explicit PHP framework with no facades, no service locators, no magic. Every dependency is injected. Every call is traceable.
// Explicit. No magic. No surprises.
class PostController
{
public function __construct(
private ContentService $content,
private CacheInterface $cache
) {}
public function show(Request $req, string $slug): Response
{
$post = $this->cache->remember(
"post:{$slug}",
600,
fn() => $this->content->findBySlug($slug)
);
return view('posts.show', ['post' => $post]);
}
}
The Stack
Three layers. Use what you need.
Fleet
Multi-site orchestration, VelvetScore auto-scaling, white-label management.
VelvetCMS
Admin panel, block editor, media library, workflows, SEO, analytics.
Core
Routing, DI, query builder, caching, events, modules, multi-tenancy.
Also Included
The things you expect from a modern CMS — all built in.
Fair Code. Fair Price.
Core is open source. VelvetCMS is free for non-commercial. Simple.
Core
- Free forever
- Commercial use included
VelvetCMS
- Free for non-commercial
- License for business use
Fleet
- For agencies & scale
- Professional support