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.

Available Now Layer 1 — The Foundation

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.

0.43ms Cold boot
4 Dependencies
15× Faster than Laravel
Core 0.43ms
Symfony 1.13ms
Laravel 6.53ms

Hello World · Framework Laptop 16 · PHP 8.4 · OPcache · SQLite

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.

Typical framework
PHP
// 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()
    );
});
VelvetCMS Core
PHP
// 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.

routes/web.php
$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']);
});
Coming March 24th, 2026 Layer 2 — Content Management
⌨️ CLI Cron, CI/CD, scripts
🔌 REST API SPAs, mobile, headless
🖥️ Web Admin Content editing, settings
Services Layer
ContentService MediaService UserService AuthService SearchService TaxonomyService WorkflowService +more

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.

Headless? API only. Feed React, Vue, Next.js.
Traditional? Web admin + server-rendered templates.
Hybrid? All three at once. CLI deploys, API for the app, admin for editors.
PHP
// 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
Draft
submit
Review
approve
Approved
publish
Published
reject → back to Draft
PHP
$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.

Coming Q2 2026 Layer 3 — Orchestration

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.

VelvetScore 78
Basic
Standard
Enhanced
Premium
⚡ Response Time 40% 📈 Throughput 30% 🎯 Efficiency 20% 💾 Cache Hit 10%
fleet agent:status
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.

🏢 Group Mode

One VelvetCMS instance serves N tenants. Shared resources, centralized updates. Efficient for homogeneous sites.

🔒 Instance Mode

Separate VelvetCMS per site. Complete isolation, dedicated resources. For high-value clients or compliance needs.

🎛️ Fleet Control Panel Monitoring · Deployments · Analytics · Billing
Agent NYC 47 tenants · 3 instances
Agent Frankfurt 32 tenants · 2 instances
Agent Singapore 15 tenants · 1 instance
97+ managed sites

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.

🔄 Rolling updates
📊 VelvetScore monitoring
⚖️ Auto-scaling
🏷️ White-label
🧪 Staging environments
💾 Backup & recovery
👥 Client management
💳 Billing integration
fleet autoscale:config
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
Fleet Cloud We run it. You use it.
Self-Hosted Your servers. Your data.

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