Build content systems
that don't fight you.
A modular PHP ecosystem — a framework, a CMS, and an orchestration platform. Use one layer, two, or all three. Nothing is coupled. Nothing is hidden.
The Stack
Three layers. Use any combination. Each one stands on its own.
Just need a framework? Use Core.
Need a CMS? Add VelvetCMS.
Managing dozens of sites? Fleet handles the rest.
A PHP framework that
boots in under a millisecond.
Four runtime dependencies. No facade layer. No service locator. No 180-provider boot sequence. Core cold-starts in 0.43ms because there's almost nothing to start.
You can trace every call.
No facades. No hidden boot sequences. Every dependency is injected through the constructor. When something breaks, your stack trace points to real code — not a chain of proxies resolving through a service container.
// Where does Cache come from? What resolved it?
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
Route::get('/posts', function () {
return Cache::remember('posts', 60, fn() =>
DB::table('posts')->get()
);
});
// Every dependency is injected and traceable
$router->get('/posts', function (
Cache $cache,
QueryBuilder $db
) {
return $cache->remember('posts', 60, fn() =>
$db->table('posts')->get()
);
});
Everything you need. Nothing you don't.
Core isn't a micro-framework pretending to be minimal. It has routing, DI, a query builder, a view engine, caching, scheduling, multi-tenancy, and a module system. It just doesn't have the 200MB of abstraction layers you don't need.
$router->get('/', fn() => view('welcome'));
$router->group(['prefix' => '/api', 'middleware' => [Auth::class]], function($r) {
$r->get('/posts', [PostController::class, 'index']);
$r->get('/posts/{slug}', [PostController::class, 'show']);
$r->post('/posts', [PostController::class, 'store']);
});
Services first.
Interface second.
Every feature in VelvetCMS is a standalone, injectable service. ContentService. MediaService. UserService. The admin panel, CLI, and REST API are thin wrappers that call these services — not the other way around.
Disable the web admin entirely and run headless. Disable the API and use only the CLI. Or run all three. One config toggle each. Your business logic never changes.
// 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',
]);
// Hook into the content lifecycle
$hooks->filter('content.before_save', function (Content $content) {
$content->slug = Str::slug($content->title);
return $content;
});
Everything built in. Zero plugins required.
Block editor with drag-and-drop and custom types. Media library with WebP conversion and focal-point cropping. Workflows with role gates, draft links, and atomic staging. SEO, analytics, search, taxonomies, users, roles — all built in, all services, all overridable.
Extend with hooks — filters mutate data, actions trigger side effects. WordPress-style patterns, but typed, testable, and without the global state. Or build custom modules with PSR-4 autoloading, their own routes, views, and migrations.
- Block editor with visual, Markdown, and code editing modes
- Revision diffs with field-level change highlighting
- Per-content staging — edit, preview, deploy atomically
- WordPress WXR import with dry-run mode
$changeset = $staging->createChangeset('Homepage redesign');
$staging->stage($homepage, $changeset);
$staging->stage($aboutPage, $changeset);
$staging->preview($changeset); // staging URL
$staging->deploy($changeset); // goes 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 go through legal review, editor approval, and scheduled publication. Shareable draft links let external reviewers see unpublished content without a CMS account.
Every save creates an automatic revision. Diff any two versions side-by-side. Restore with one click. Stage multiple pages into a changeset, preview the result, deploy everything at once.
One dashboard.
Every site.
You're SSH-ing into 47 servers to update a plugin. You're maintaining spreadsheets of client credentials. One site's down and you find out from an angry email. Fleet replaces all of that with a single control plane — VelvetScore tells you what needs attention, agents handle the rest.
Agent ID: agent-fra-01
Fleet: fleet.velvetcms.com (connected)
Uptime: 14d 6h 32m
───────────────────────────────────────
Managed Instances:
• Group: /var/www/velvet-multi (32 tenants)
• Instance: /var/www/acme-corp (VelvetScore: 78)
• Instance: /var/www/bigstore (VelvetScore: 82)
System: CPU 34% │ RAM 2.1/8GB │ Disk 45/100GB
Agents on your servers. Intelligence in the cloud.
Install a lightweight PHP agent on each server. Fleet's control panel — hosted or self-hosted — sends commands. Agents execute. Updates roll out across your fleet with automatic backups and zero-downtime deploys.
One VelvetCMS instance serves N tenants. Shared resources, centralized updates. Efficient for homogeneous sites.
Separate VelvetCMS per site. Complete isolation, dedicated resources. For high-value clients or compliance needs.
Every operation. One command.
Rolling updates across 100 sites. Staging environments with one click. Auto-scaling driven by VelvetScore — not CPU guesses. White-label the entire platform under your brand. Self-host or use Fleet Cloud.
Auto-scaling configuration for site-acme:
┌─────────────────────┬────────────────┐
│ Setting │ Value │
├─────────────────────┼────────────────┤
│ Enabled │ ✓ Yes │
│ Target VelvetScore │ 65 │
│ Min Compute Units │ 2 │
│ Max Compute Units │ 8 │
│ Max Monthly Cost │ €150 │
│ Allow Scale-Down │ ✓ Yes │
│ Notify on Scale │ Slack + Email │
└─────────────────────┴────────────────┘
Current: 3 CU │ Score: 68 │ Status: Healthy
Start with what you need.
Core is open source. Apache 2.0. No vendor lock-in, no phone-home, no license key.
VelvetCMS and Fleet are how we fund development.
Questions? velvetcms@anvyr.dev