Open Source · .NET 10 · PostgreSQL

Content,
made happy.

A writer-first CMS that strips away every piece of friction. Beautiful admin UI, headless API, plugin ecosystem, dark mode — all in one package.

terminal

$ git clone https://github.com/plsft/contento.git

$ cd contento

$ dotnet run --project src/Contento.Web

info: Contento CMS started successfully

info: Listening on: https://localhost:5001

$ curl https://localhost:5001/api/v1/content/posts

{"data": [...], "meta": {"totalCount": 1}}

135

API Endpoints

8

Built-in Themes

582

Test Coverage

100%

Open Source

Everything you need to publish

A complete content platform with the DX you wish every CMS had.

Distraction-Free Editor

Full-page Markdown editor with autosave, word count, cover images, and keyboard shortcuts.

Headless API

Full REST API with content delivery endpoints, bearer token auth, search with highlights, and structured JSON.

Plugin System

JavaScript plugins run in a Jint sandbox. SEO analyzer, contact forms, reading progress — install from admin.

8 Themes + Dark Mode

From Playfair Display editorial to Lora night-reading. CSS variable system with full dark mode support.

Full-Text Search

PostgreSQL-powered search with highlighted results, autocomplete suggestions, and relevance ranking.

Media Library

Folder organization, drag-and-drop upload, responsive image variants (640w, 1024w, 1536w WebP), focal point picker, and grid/list views.

Threaded Comments

Threaded comments with nested replies, AI-powered spam scoring, auto-approve threshold, moderation queue, and batch actions.

Import / Export

Import from WordPress (WXR) or Markdown files. Export as JSON, Markdown, or HTML.

Security First

CSRF protection, CSP headers, BCrypt passwords, role-based access, audit logging, and anti-XSS sanitization.

Membership & Subscriptions

Stripe-powered paid memberships with plan management, content gating, billing portal, and subscriber dashboard.

Newsletter & Email

Built-in newsletter with subscriber management, campaign editor, and email delivery. Grow your audience.

Navigation Menus

Admin-configurable header and footer menus with nested dropdowns, link types (custom, post, category, tag), and reordering.

Multi-Site

Run multiple sites from one installation. Domain-based routing with per-site themes, content, and settings.

oEmbed & Rich Media

Paste a YouTube, Vimeo, Spotify, or Twitter URL and it auto-embeds. Cached provider lookups with fallback.

Shortcodes

Use [youtube], [button], [callout], [gallery], [code], and [toc] shortcodes in your content. Register custom ones at runtime.

URL Redirects

Manage 301/302 redirects from the admin panel. Hit tracking, auto-redirect on slug changes, and middleware processing.

User Registration

Public signup with email verification, password reset flow, and Gravatar avatars. Secure token-based verification.

Post Editing Locks

Prevents simultaneous editing conflicts. 2-minute TTL locks with automatic expiry and real-time lock status.

AI & MCP Ready

Full REST API with OpenAPI spec lets AI agents create, manage, and publish content via MCP. Stateless bearer tokens, streaming AI endpoints, and SEO analysis built in.

Headless Mode

Use it your way

Contento works as a traditional CMS with server-rendered pages, or as a headless API powering any frontend. Next.js, Astro, 11ty, mobile apps — anything that speaks HTTP.

  • Content Delivery API — no auth needed for public content
  • Bearer token authentication for management endpoints
  • Posts returned with rendered HTML + Markdown + table of contents
  • Search, comments, media, themes — all accessible via API
  • MCP-compatible — AI agents can create and publish content autonomously
Read the headless guide
fetch.js
const res = await fetch('/api/v1/content/posts');
const { data, meta } = await res.json();

// Each post includes:
// id, title, slug, excerpt, coverImageUrl,
// publishedAt, readingTimeMinutes, tags

data.forEach(post => {
  console.log(post.title, post.slug);
});

// Get full post with HTML + table of contents
const post = await fetch(
  `/api/v1/content/posts/${slug}`
).then(r => r.json());

// post.data.bodyHtml — rendered HTML
// post.data.tableOfContents — [{id, text, level}]

8 beautiful themes, ready to go

Each with its own personality, font pairing, and color palette. Switch instantly from the admin panel.

Shizen

Warm organic serif

Ink

Modern editorial

Grove

Classic literary

Neon

Playful creative

Folio

Minimal reading

Dusk

Dark elegance

Koyo

Autumn earth tones

Yuki

Stark minimal

Built on proven foundations

Modern stack, battle-tested components, zero lock-in.

.NET 10

Runtime & framework

PostgreSQL

Primary database

Redis

Caching layer

Alpine.js

Reactive UI

Tailwind CSS v4

Design system

Jint

Plugin sandbox

BCrypt

Password hashing

Serilog

Structured logging

Stripe

Payments & subscriptions

ImageSharp

Image processing

Start writing in minutes

Clone the repo, run one command, and you're live. No complex setup, no configuration files to hunt down.