The CMS Developers
Actually Enjoy

Modular architecture. File-based content. Zero magic.
VelvetCMS brings sanity back to PHP development.

๐Ÿ“ฆ Modular Core

Everything is a module. Disable what you don't need. Extend what you do. Keep your application lean and mean.

๐Ÿ“„ File-First Content

Write in Markdown. Commit to Git. Deploy anywhere. No database required for content, unless you want one.

๐Ÿš€ Blazing Fast

Built on PHP 8.3+ with a lightweight service container. Caches routes, config, and templates for sub-millisecond boot times.

๐Ÿ› ๏ธ Developer Tooling

Robust CLI for scaffolding, migrations, and diagnostics. A testing harness that actually makes testing fun.

๐ŸŽจ Theme Engine

Blade-inspired template engine with automatic escaping. Component-based layouts and partials.

๐Ÿ”’ Secure by Default

CSRF protection, XSS prevention, and secure headers out of the box. We take security seriously.

Code that feels right

Clean, expressive, and typed.

use VelvetCMS\Core\Router;
use App\Controllers\BlogController;

// Simple closure route
$router->get('/hello', function() {
    return 'Hello World';
});

// Controller route with parameters
$router->get('/blog/{slug}', [BlogController::class, 'show']);

// Grouped routes with middleware
$router->group(['prefix' => '/admin', 'middleware' => ['auth']], function($router) {
    $router->get('/dashboard', [AdminController::class, 'index']);
});
namespace App\Modules\Shop;

use VelvetCMS\Core\BaseModule;
use VelvetCMS\Core\Application;

class ShopModule extends BaseModule
{
    public function boot(Application $app): void
    {
        // Register services
        $app->singleton(CartService::class, fn() => new CartService());

        // Listen for events
        $app->make('events')->listen('order.created', function($order) {
            // Send email, update inventory...
        });
    }
}
---
title: "Getting Started"
layout: "docs"
status: "published"
---

# Welcome to VelvetCMS

This is a standard Markdown file. You can use **bold**, *italics*, and all standard formatting.

## Frontmatter
The block above is YAML frontmatter. It defines metadata for the page.

## Components
You can also include partials:
{{ $partial('alert', ['type' => 'info', 'message' => 'Pro tip!']) }}

Why VelvetCMS?

Modern PHP development has become overly complex. Layers upon layers of abstraction, heavy dependencies, and "magic" that's hard to debug.

VelvetCMS goes back to basics without sacrificing power. We believe in:

  • โœ… Explicit over implicit: You should know what your code does.
  • โœ… Files over Database: Version control your content.
  • โœ… Performance as a feature: Sub-millisecond boot times.

Performance Benchmark

VelvetCMS 12ms
WordPress 140ms
Laravel (Standard) 85ms

* Average Time to First Byte (TTFB) on a standard VPS.