Features

Everything a production site needs, nothing it doesn't

Lumen is a single Cloudflare Worker: template engine, data layer, media pipeline, forms, email, webhooks, and an MCP server — with zero moving parts for you to operate.

Edge-native rendering

Server-side rendering in 100+ Cloudflare locations. No origin server, no cold starts, no cache invalidation.

MCP built in

Connect opencode, Claude Code, or any MCP client and manage content conversationally with signed-JWT auth.

Composable templates

Pages, layouts, and components with props, loops, and conditionals. Pure HTML output, zero hydration.

D1 + R2 storage

SQLite content at the edge, media in R2 with signed URLs and on-the-fly transforms cached for a year.

Forms & webhooks

AJAX forms with honeypot and captcha support, transactional email, and webhooks for content events.

Guarded by default

Admin JWTs gate everything. SQL is sandboxed to data statements. Secrets never leave your Worker.

Dynamic routes

URLPattern paths like /blog/:slug with param-aware templates, validation, and custom handlers.

Local-first workflow

lumenpages-cms create seeds a local dev environment with D1 snapshots you can restore in one command.

One-command deploy

lumenpages-cms deploy provisions remote D1 + R2, uploads secrets, and puts you on a custom domain with SSL.

The template engine

HTML in, HTML out

Templates are just HTML with a small expression syntax — interpolation, conditionals, loops, and components. No build step, no hydration, no client runtime. What renders is what you wrote.

  • Pages, layouts, components — nest and reuse with typed props
  • Dynamic routes — URLPattern paths like /blog/:slug
  • Data sources — SQL, external JSON, and R2 files resolved in parallel
  • Custom handlers — sandboxed JS endpoints when you need full control
page: /blog/:slug
<article class="post">
  <h1>" }}</h1>
  " }}
    <img src="" }}&w=900&f=auto"
         alt="" }}" />
  " }}
  " }}
</article>
Images & media

Edge image pipeline, built in

Every image URL — static or R2 — accepts transform parameters served by Cloudflare Images. Resize, crop, face-aware gravitate, and negotiate AVIF/WebP automatically, cached for a year at the edge.

  • On-the-fly transforms — ?w=800&h=600&fit=cover&f=auto
  • Signed media URLs — R2 objects are never publicly listable
  • Direct uploads — minted signed PUT URLs from the MCP or API
transforms
# hero, sized to the box
/images/hero.jpg?w=1600&h=600&fit=cover&f=auto&q=80

# card thumbnail
/images/post.jpg?w=400&h=300&fit=cover&gravity=face&q=75

# avatar
/images/me.png?w=96&h=96&fit=crop&gravity=face&f=auto
MCP server

Your agent is the admin panel

Lumen exposes its entire content API over the Model Context Protocol. Grant an agent a signed JWT and it can build pages, wire data sources, create forms and custom tables — while you keep the git-style audit of what changed.

  • 40+ tools — pages, layouts, components, forms, tables, files, settings
  • Custom tables — structured content with SQL access from templates
  • Guardrails — SQL sandbox rejects schema changes and stacked queries
agent session
▸ "Build a blog with posts and tags"
✓ created table __posts
✓ created page /blog
✓ created page /blog/:slug
✓ wired db data sources

▸ "Show the 3 latest posts on the home page"
✓ updated page / with " }}

Questions, answered

Is there a JavaScript framework on the frontend?
No. Lumen renders HTML server-side and ships only the small amount of JS your components declare. There's no hydration, no virtual DOM, and no client bundle tax. Interactive pieces (forms, menus) are progressive enhancement.
How fast is page rendering?
Templates render in-memory inside the Worker — typically single-digit milliseconds — and responses are served from the Cloudflare edge network in 100+ locations. Most sites see global TTFB well under 50ms.
Can Lumen send email and webhooks?
Yes. Transactional email is built in (Workers Email Sending), and webhooks fire on content and form events with automatic retries. Forms support honeypot protection plus Turnstile, reCAPTCHA, or hCaptcha.
What happens when my agent makes a mistake?
Every MCP call goes through the same validation as the HTTP API — JSON schemas for component props, validation rules for form fields, and the SQL guard for data access. Mistakes fail loudly instead of corrupting content, and local D1 snapshots give you restore points.
Does it work with static site generators or frameworks?
Lumen is a full rendering layer on its own, but it stays headless-friendly: custom handlers can return JSON for any route, so you can power a Remix or Next frontend from it if you want to.