GitHub - Netrun-Systems/sigil-cms: Multi-tenant headless CMS with native PostgreSQL RLS. 21 plugins, 2FA, site cloning, audit log, block clipboard, data export. TypeScript SDK, GraphQL + REST, Next.js integration. Free self-hosted, unlimited.

GitHub

11 min read Original article ↗

The multi-tenant headless CMS built for agencies, developers, and the AI era.

One deployment. Unlimited clients. Free forever.

MIT License npm version GitHub stars Discord TypeScript


Why Sigil?

Every headless CMS forces agencies to choose between cloud lock-in (Sanity), plugin hell (Strapi), or running separate deployments per client. Sigil is the first headless CMS with native multi-tenancy -- one deployment serves unlimited client tenants with Row-Level Security at the database layer. No per-seat pricing traps, no separate instances per client, no vendor lock-in.

Ship client sites with a Design Playground (1,400+ CSS variables, 70+ Google Fonts), block-level Resonance analytics, AI design generation (describe a page, get editable blocks), and 21 built-in plugins covering e-commerce, booking, docs, artist content, and more -- all from a single MIT-licensed codebase you own.

Quick Start

npx sigil-cms create my-site --template website
cd my-site
sigil dev

Open http://localhost:4000/admin to launch the admin panel.

# Other templates
npx sigil-cms create my-blog --template blog
npx sigil-cms create my-docs --template docs
npx sigil-cms create my-store --template ecommerce
npx sigil-cms create my-band --template artist

What Makes Sigil Different

Feature Sigil Strapi Sanity Payload
Multi-tenancy Native (RLS) No No (per-project billing) Plugin (buggy)
Self-hosting Free, unlimited Free, unlimited Not available Free, unlimited
Visual design editor Design Playground No No No
Block-level analytics Resonance No No No
AI design generation Stitch + Charlotte No AI Assist (text only) No
Built-in plugins 21 Marketplace No Marketplace
Content scheduling Built-in Enterprise only Yes Yes
Copy/paste blocks Built-in No No No
Site cloning One-click No No No
Image focal point Built-in No No No
Data export (JSON/CSV) Built-in Paid add-on Yes No (51 votes open)
2FA (TOTP) Built-in Enterprise only Yes No (49 votes open)
Tenant audit log Built-in No Enterprise only No
GraphQL API Yes Yes GROQ Yes
Seats at $29/mo 10 5 2 ($15/user) 3
Sites at $29/mo 5 1 1 project 1

Features

Native Multi-Tenancy

One Sigil deployment. One database. Unlimited tenants. Each agency client gets their own isolated space with separate sites, themes, users, and media -- all protected by Row-Level Security at the PostgreSQL layer.

Agency (Tenant)
 ├── Client A (Site) ── pages, blocks, themes, media
 ├── Client B (Site) ── pages, blocks, themes, media
 └── Client C (Site) ── pages, blocks, themes, media
// Every API call is tenant-scoped via JWT
const client = createClient({
  baseUrl: 'https://cms.agency.com',
  siteSlug: 'client-a',
});
const pages = await client.pages.listPublished();

Users can have different roles per site -- an editor on one client site and a viewer on another, all within the same tenant.

Tenant switcher: Super-admins managing multiple agencies can switch between tenants from a single login — no separate URLs or re-authentication.

Subdomain routing: Each tenant gets a subdomain (client-a.agency.com) that auto-routes to the correct tenant and site. Custom domains (clientsite.com) also resolve automatically.

Site cloning: Onboard a new client in one click. POST /sites/:id/clone duplicates all pages, blocks, theme, and settings into a new site — preserving page hierarchy.

Bulk provisioning: Create a complete tenant environment in one API call — tenant + admin user + site + default theme + starter pages:

curl -X POST /api/v1/tenants/provision \
  -d '{ "tenant": { "name": "Acme Agency", "subdomain": "acme" },
        "site": { "name": "Client Site", "slug": "client-site" },
        "admin": { "email": "admin@acme.com", "name": "Admin", "password": "..." } }'

Audit log: Every write operation is recorded with who, what, when, and which tenant — queryable for SOC2/GDPR compliance. GET /api/v1/audit?resource_type=page&from=2026-01-01

Design Playground

Give designers control without filing tickets. The Design Playground exposes 1,400+ CSS variables through a visual editor -- colors, typography (70+ Google Fonts), spacing, border radius, shadows, backdrop blur, and glass effects. Seven built-in presets provide starting points. Designers work in the browser; developers never need to touch a config file.

  • Real-time dark/light mode preview
  • Custom CSS injection for edge cases
  • Theme duplication and multiple themes per site
  • Font browser with Google Fonts search and custom font upload (.woff2, .ttf, .otf)

Resonance Analytics

Block-level engagement metrics that tell you which block users engage with, not just which page they visited. Resonance tracks viewport time, scroll depth, clicks, and bounce points per content block.

  • Composite resonance score (0-100) per block per time period
  • A/B experiments between block variants with traffic splitting
  • AI-generated improvement suggestions per block (via Gemini)
  • Embeddable resonance_insights block for in-page analytics

AI Design Generation

Describe a page in plain English. Get structured, editable content blocks.

Stitch integration generates full-page HTML from a text prompt, then the Stitch-to-blocks converter parses it into Sigil blocks (hero, feature grid, CTA, text). Import the result directly to any page.

Charlotte AI provides context-aware design advice grounded in your actual theme tokens and block structure -- not generic tips. She knows your colors, your fonts, and your block types.

POST /api/v1/sites/:siteId/design/generate
{ "prompt": "A dark-themed landing page for a jazz musician with hero and upcoming shows" }
→ Full HTML mockup

POST /api/v1/sites/:siteId/design/import
{ "screenId": "...", "pageId": "..." }
→ Structured Sigil blocks added to page

21 Built-In Plugins

Every plugin is environment-gated -- missing env vars cause a graceful skip, never a crash. The core CMS always works.

Category Plugin What It Does
Creative Artist Releases, events, profiles, 6 block types for musicians
Creative Photos Multi-provider storage (GCS/Azure/S3), AI tagging via Gemini
Commerce Store Stripe products, checkout, orders, webhooks
Commerce Printful Print-on-demand merchandise via Printful
Commerce PayPal PayPal/Venmo checkout integration
Commerce Booking Appointment scheduling, Google Calendar sync
Communication Mailing List GDPR-compliant subscribe/unsubscribe, broadcast
Communication Contact Form submissions with inquiry types and status workflow
Communication Support Embeddable support panel widget
Developer SEO Sitemap.xml, RSS feeds, zero-config
Developer Docs Knowledge base with categories, versioning, feedback
Developer Webhooks Event bus with delivery tracking and retry
Developer Migrate Import from WordPress, Shopify, Square Online
Developer Resonance Block-level analytics, A/B testing, AI suggestions
AI Advisor Charlotte AI chat with pgvector RAG and TTS
AI Charlotte Embeddable voice assistant widget
Integration KAMERA B2B sales intelligence — OSINT reports, company research, risk scoring
Integration KOG CRM bridge — sync contacts, organizations, and pipeline data
Integration Intirkast Social media syndication — auto-publish content to 10+ platforms

Developer Experience

TypeScript SDK -- zero dependencies, works in Node.js, browsers, and edge runtimes:

npm install @sigil-cms/client
import { createClient } from '@sigil-cms/client';

const cms = createClient({ baseUrl: 'https://cms.example.com', siteSlug: 'my-site' });
const page = await cms.pages.getBySlug('about');
const tree = await cms.pages.getTree(); // hierarchical nav
const theme = await cms.sites.getPublicTheme();

Next.js integration -- App Router, server components, static generation, ISR:

npm install @sigil-cms/next @sigil-cms/client
// app/[[...slug]]/page.tsx
import { SigilPage, generateSigilMetadata, generateSigilStaticParams } from '@sigil-cms/next';

export const generateMetadata = ({ params }) => generateSigilMetadata(params.slug?.join('/') ?? 'home');
export const generateStaticParams = () => generateSigilStaticParams();

export default async function Page({ params }) {
  const { slug } = await params;
  return <SigilPage slug={slug?.join('/') ?? 'home'} />;
}

GraphQL API at /graphql with queries for pages, blocks, themes, media, sites, navigation, and search.

CLI for scaffolding, dev server, builds, migrations, and seeding:

npx sigil-cms create my-site    # scaffold project
sigil dev                        # dev server with hot reload
sigil build                      # production build
sigil migrate                    # run database migrations
sigil seed                       # seed demo content
sigil info                       # environment diagnostics

REST API versioned at /api/v1/ with public and authenticated endpoints. Bearer JWT auth. Full CRUD on sites, pages, blocks, media, themes, users, and all plugin resources.

23 Built-In Block Types

Category Block Types
Layout Hero, Call to Action, Bento Grid
Content Text, Rich Text, Feature Grid, Pricing Table, Testimonials, FAQ, Stats Bar, Timeline, Code Block, Custom HTML
Media Image, Video, Gallery
Interactive Contact Form, Newsletter
Artist Embed Player, Release List, Event List, Social Links, Link Tree, Artist Bio

Plugins add more: product_grid, buy_button, booking_calendar, service_list, resonance_insights, doc_callout, doc_code. Build your own with the CmsPlugin interface.

Content Management

  • Hierarchical pages with computed URL paths, full-text search, and SEO fields (meta title, description, OG image) with database-enforced character limits
  • Content versioning -- unlimited revision history with full snapshots, revert to any version
  • Content scheduling -- publish and unpublish at specific times via built-in daemon
  • 15-language i18n via page-clone model with per-language slug uniqueness
  • Media library -- bulk upload (20 files, 50MB each), folder organization, dimension metadata, multi-provider storage, image focal point for responsive cropping
  • Block templates -- save and reuse block presets across sites in a tenant. Three scopes: site-only, tenant-wide (all sites), or global (platform presets)
  • Block clipboard -- copy blocks from one page and paste them into any other page, even across different sites within the same tenant
  • Data export -- export a full site as JSON (pages + blocks + theme) or CSV (pages for spreadsheet reporting). Import bundles into any site.
  • Live preview -- split-view editor with desktop/tablet/mobile viewports

Security

  • Two-factor authentication -- TOTP (RFC 6238) compatible with Google Authenticator, Authy, and 1Password. Setup via QR code, 8 backup codes, ±30s clock skew tolerance. Pure Node.js crypto — no external dependencies.
  • Row-Level Security -- tenant isolation enforced at the PostgreSQL engine level, not the application layer. No shared slug tables, no cross-tenant data leakage.
  • Per-tenant media isolation -- uploaded files stored under media/{tenantId}/{siteId}/ paths. Serving validates the tenant prefix matches the requesting user's JWT.
  • Audit log -- every write operation recorded with user, action, resource, tenant, IP, and duration. Queryable by date range, user, resource type, and site. Compliant with SOC2 and GDPR audit requirements.
  • JWT authentication with 4 roles (admin, editor, author, viewer) and per-site permission overrides

Self-Hosting

Sigil runs on Node.js + PostgreSQL. No proprietary dependencies. Self-host for free -- forever, with no feature limits.

Platform Monthly Cost Setup Time Command
Docker Compose (any VPS) ~$5-10/mo 10 min sigil create --template docker
Google Cloud Run ~$0-5/mo 10 min sigil create --template gcp
AWS Fargate ~$3-8/mo 15 min sigil create --template aws
Fly.io ~$3-5/mo 5 min sigil create --template fly
Railway ~$5/mo 5 min sigil create --template railway
DigitalOcean ~$5-12/mo 10 min sigil create --template digitalocean
Azure Container Apps ~$5-10/mo 15 min sigil create --template azure
Coolify / Dokku $0 + VPS 15 min sigil create --template coolify
Local / Raspberry Pi $0 15 min sigil create --template local

Scale-to-zero on Cloud Run and Fargate means you pay almost nothing when the admin panel is idle. A $5/mo VPS handles thousands of page views.

Cloud Pricing

For teams that want managed hosting, automatic updates, and priority support.

Solo Team Business Enterprise
Price $12/mo $29/mo $79/mo $249/mo
Seats 3 10 25 Unlimited
Sites 1 5 25 Unlimited
Content items 5,000 10,000 100,000 Unlimited
Media storage 5 GB 10 GB 100 GB 1 TB
API calls 100K/mo 500K/mo 5M/mo Unlimited
Plugins Core (8) All (19) All (19) All + custom
Design Playground Full Full Full Full + white-label
Multi-tenancy -- -- Yes Yes
Resonance analytics -- -- Yes Yes
SSO (SAML/OIDC) -- -- -- Yes
Support Community Email (48h) Email (24h) Dedicated (4h SLA)
SLA -- 99.5% 99.9% 99.95%

Annual billing: 2 months free (save 17%). Self-hosted is always free and unlimited.

Architecture

sigil-cms/
├── packages/@netrun-cms/
│   ├── core         — TypeScript types, enums (28), Zod schemas, utilities
│   ├── db           — Drizzle ORM schema, migrations, PostgreSQL client
│   ├── ui           — 64 Shadcn/Radix components + 1,400+ CSS variable design system
│   ├── theme        — ThemeProvider + 7 presets
│   ├── blocks       — Composable content block components
│   ├── embeds       — Platform embed components (Spotify, YouTube, etc.)
│   └── plugin-runtime — Plugin loader, registry, manifest system
├── packages/
│   ├── client       — @sigil-cms/client TypeScript SDK
│   ├── cli          — sigil-cms CLI (create, dev, build, migrate, seed)
│   └── next         — @sigil-cms/next App Router integration
├── apps/
│   ├── api          — Express.js backend (REST + GraphQL)
│   └── admin        — Vite + React 18 SPA
└── plugins/         — 21 feature plugins (env-gated, graceful skip)

Stack: TypeScript 5.7, Node.js 20+, Express.js, React 18, PostgreSQL, Drizzle ORM, Vite, Turborepo, pnpm workspaces.

Documentation

Community

Built With

Sigil was built by a solo founder with 25 years of cloud infrastructure experience and 20 AI development agents under SDLC v2.3 governance. The entire platform -- API, admin panel, 21 plugins, SDK, CLI, Next.js integration, Design Playground, Resonance analytics, AI design generation -- was architected and shipped by one person coordinating a fleet of specialized AI agents.

We use our own products to bring Sigil to market: KOG CRM for lead tracking, Intirkast for social media scheduling, KAMERA for prospect research, Charlotte for AI assistance. Built, not subscribed.

Netrun Systems -- California, USA.

License

MIT -- use it, modify it, ship it. No feature gating, no watermarking, no betrayal.