AI-native · kernel-class · mantis-shrimp-fast 💥

The CMS where AI does the work.

Squilla is an open-source, Go-based CMS designed around one idea: an AI agent should be able to build, populate, and operate an entire website with zero hand-holding. Every operation lives behind an MCP tool. Every feature lives in a sovereign gRPC extension. The kernel stays small. The shrimp stays fast.

01 / 03

AI-Native, MCP-First

Roughly 50 MCP tools across 15 domains. An agent registers custom node types, seeds content, activates themes, manages extensions, renders previews — all through structured calls. No filesystem access, no shell, no human-in-the-loop required.

core.node.create({
  type: "recipe",
  fields: {…}
})
02 / 03

Kernel + Extensions

The core is a minimal kernel: nodes, rendering, auth, CoreAPI, event bus. Anything feature-specific (media, email, forms, sitemap, blocks) is a sovereign gRPC extension that owns its full stack — its own tables, business logic, admin UI, migrations.

$ ls extensions/
forms/        media-manager/
email-manager/ sitemap-generator/
content-blocks/ resend-provider/
03 / 03

Sub-millisecond strike

Atomic, hot-swapped config maps. Pre-resolved layout trees. JSONB + GIN-indexed content. PostgreSQL connection pooling. The kernel gets out of the way so the response gets out the door — fast.

GET /docs/quickstart
→ 200 OK
  template = pre-resolved
  query    = single round-trip
§ architecture

A kernel
for kernels.

Squilla's architecture is borrowed from operating systems: the kernel does the minimum required to be a CMS, and everything else is a sovereign extension. Disable an extension and there is no dead code in core. Add an extension and it brings its own database tables, HTTP routes, admin UI pages, scripts, and migrations.

HARD RULE

If disabling an extension would leave dead code in core, that code belongs in the extension, not the kernel.

PUBLIC WEB
Fiber HTTP · pre-resolved layouts · cached
L0
MCP SERVER
Model Context Protocol · ~50 tools · stdio + http
L1
KERNEL (CoreAPI)
nodes · rendering · auth · event bus · capability gates
L2
gRPC PLUGIN BUS
HashiCorp go-plugin · bidirectional · GRPCBroker
L3
EXTENSIONS
media · forms · email · sitemap · blocks · providers
L4
POSTGRESQL 16
JSONB · GIN indexes · per-extension migrations · pooling
L5
kernel
internal/cms · internal/coreapi
extensions
extensions/*/cmd/plugin
themes
themes/*/scripts/theme.tengo
§ MCP showcase

Every operation
is a tool an
AI can call.

Squilla exposes a Model Context Protocol surface across 15 domains — nodes, node types, taxonomies, terms, settings, events, menus, media, themes, extensions, layouts, blocks, render, users, files. An agent drives the entire CMS through structured tool calls, with capability scopes enforced server-side.

~50
tools
15
domains
24
capability gates
stdio + http
transports
browse the MCP API →
mcp://squilla.local · session a4f9e2 · capabilities 24/24 0/16
§ built-in extensions

Seven extensions in the box.
Built like a third-party would build them.

Squilla ships with reference extensions that exercise every part of the extension API — gRPC plugins, Tengo-only providers, manifest-only block libraries. They are not core code in disguise; they're the same extensions you'd build yourself.

content-blocks
official

Forty production-ready content blocks plus ten page templates. Pure manifest — no plugin binary required.

kind
Manifest only
ver
1.0.0
tables
routes
email-manager
official

Email templates, base layouts, sending rules, and a delivery log — fronting any email-provider extension via the event bus.

kind
gRPC plugin
ver
1.0.0
tables
4
routes
9
OWNS
email_templatesemail_layoutsemail_rulesemail_logs
forms
official

Production-grade form builder. File uploads, CAPTCHA, conditional logic, GDPR fields, webhooks, email notifications.

kind
gRPC plugin
ver
2.0.0
tables
3
routes
5
OWNS
formsform_submissionsform_webhook_logs
hello-extension
official

Tiny demo extension. Reads its manifest, declares an asset, does nothing scary. Read the source, then build your own.

kind
Manifest only
ver
1.0.0
tables
routes
media-manager
official

Upload, organise, and serve images, documents, and any other file. Public routes for /media/* and /media/cache/*.

kind
gRPC plugin
ver
1.0.0
tables
2
routes
2
OWNS
media_filesmedia_image_sizes
resend-provider
official

Send transactional email via Resend.com. Pure Tengo — the entire transport is a settings page and a script.

kind
Tengo only
ver
1.0.0
tables
routes
§ themes

Themes are
sovereign too.

A Squilla theme is a self-contained package: layouts, partials, content blocks, assets, plus a Tengo seed script that registers node types, taxonomies, and seeds pages on activation. No restart, no manual install — activate and the CMS reorganises itself around the theme.

Layouts
Page-level templates. Receive .node · .app · .user
Partials
Reusable fragments included via {{renderLayoutBlock}}. Same context plus .partial
Blocks
Atomic content units. Self-contained, schema-defined, render with their own field data only.
Activate a theme. The CMS reorganises itself around it. No restart.
themes/hello-vietnam/scripts/theme.tengo
nodes    := import("core/nodes")
nodetypes := import("core/nodetypes")
events   := import("core/events")

// register the recipe node type
nodetypes.register({
  slug: "recipe",
  label: "Recipe",
  field_schema: [
    {name: "hero_image",   type: "image"},
    {name: "prep_minutes", type: "number"},
    {name: "servings",     type: "number"},
    {name: "ingredients",  type: "repeater"},
    {name: "instructions", type: "richtext"}
  ]
})

// seed a starter recipe
nodes.create({
  node_type: "recipe",
  title:     "Caramelised scallops",
  status:    "published",
  fields_data: { prep_minutes: 18, servings: 2 }
})

events.emit("theme.seeded", { theme: "hello-vietnam" })
§ performance

Built for the metric
that matters: TTFB.

  • Atomic configuration maps — hot-swapped without locks
  • Pre-resolved layout trees — no template lookup at request time
  • JSONB + GIN indexes for content — sub-millisecond field queries
  • PostgreSQL connection pooling via pgx — saturated under load
  • Eager-loaded relations — no N+1 queries on read paths
  • Hot theme/extension activation — no restart, no downtime
LIVE TTFB · /docs/quickstart
23ms
single-digit ms goal
p50
fast
p95
still fast
p99
yes really