---
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!']) }}
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...
});
}
}
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
* Average Time to First Byte (TTFB) on a standard VPS.