github
// login → init → deploy

Freedom to deploy. Freedom to own. Freedom from recurring CMS costs.

A guided setup — sign in once, answer a few questions, deploy — to a live site on your own Cloudflare account. D1, R2, and Workers on the permanent free tier. Your domain, your data, no monthly bill to publish.

run this — a live site in a few minutes
$npx kalayaan init
read the quickstart guide
kalayaan
$ kalayaan login
→ opening your Cloudflare token page…
✓ signed in — account auto-detected
$ kalayaan init my-site
? content models: posts, authors
? services: ai, custom domain
? domain: blog.example.com
✓ wrote cms.config.ts
deploy now? → yes
$ kalayaan deploy
→ provisioning D1, R2, KV…
→ attaching blog.example.com…
✓ live at https://blog.example.com
$0.00/mo
// how it works

Three commands. One is enough.

Run them yourself, or let kalayaan init chain login and deploy for you.

01$ kalayaan login
Sign in, once

Opens a Cloudflare token page with the right permissions pre-filled. Kalayaan auto-detects your account — no keys to copy by hand.

02$ kalayaan init
Answer the wizard

Pick your content models, toggle services, enter a domain. It writes a real cms.config.ts — the file below — then asks: deploy now?

03$ kalayaan deploy
Ship to the edge

Provisions D1, R2, and KV, uploads the admin SPA, and attaches your domain with automatic DNS and TLS. Resolves to a live URL.

// the config the wizard writes — not lorem
cms.config.ts
import { defineConfig, collection, field } from "kalayaan";

export default defineConfig({
  name: "my-site",
  domain: "blog.example.com",
  ai: { enabled: true, features: ["alt-text", "translate", "editorial-assist"] },
  collections: [
    collection("posts", {
      fields: {
        title: field.text({ required: true }),
        slug: field.slug({ from: "title", unique: true }),
        body: field.richText(),
        cover: field.media(),
        author: field.relation("authors"),
        status: field.select(["draft", "published"], { default: "draft" }),
      },
      versioning: true,
    }),
  ],
});
// the whole platform

A real CMS, not a starter kit.

Everything below ships in the current release.

Schema-driven admin
Define content models in cms.config.ts; the admin SPA renders itself — typed fields, relations, and validation.
Databases your way
D1 is the zero-config default. Bring Postgres or MySQL over Hyperdrive when you outgrow it.
AI that helps you ship
Alt-text, translation, and editorial assist on Workers AI's free tier — plus optional semantic search.
Every way to read
A public REST API and config-generated GraphQL, plus an MCP endpoint so agents can query and edit content.
Roles & real access control
Config-defined roles and permissions, email invites, scoped API tokens with an audit log.
Media, versions, locales
Upload to R2 or S3, roll back any change, and localize content across languages from one place.
Moderated submissions
Accept public contributions behind Cloudflare Turnstile, then approve or reject from the admin queue.
Your own domain
Attach any custom domain with automatic DNS and TLS — the site is yours, not a subdomain.
// honest cost

The bill is the whole point.

Kalayaan runs entirely on your own Cloudflare free tier — every service it uses, at no monthly cost to publish.

cloudflare service
what it runs
cost / mo
Workers
runs the CMS admin and serves your API
$0.00
D1
your default SQL database
$0.00
R2
media and file storage
$0.00
KV
cache and edge config
$0.00
Workers Assets
static hosting for the admin SPA
$0.00
Turnstile
spam-free public submissions
$0.00

// free tier limits apply — see the docs for D1 / R2 / Workers quotas.

Your idea, on your own domain.

Sign in once, answer a few questions, deploy — free, on your own Cloudflare account.

$npx kalayaan init