louisecms
v0.11.0
Published
Louise CMS — a V8-native, inline edit-on-the-live-page CMS for Cloudflare Workers. Framework-agnostic core primitives (cms, db, commerce, email, queues), a SolidJS + ProseKit inline-edit client, and the daisyUI editor theme.
Maintainers
Readme
louisecms
A V8-native, inline "edit-on-the-live-page" CMS for Cloudflare Workers.
Louise makes the live site editable in place: no separate admin app, no JSON forms
for prose. It ships as framework-agnostic core primitives (cms, db, media,
forms, commerce, email, queues, worker, plus opt-in auth/security), a
SolidJS + ProseKit inline-edit client, a registry-driven editor drawer, the generic
api/louise/* handlers, and the daisyUI editor theme — as granular, tree-shakeable
subpath exports.
Full guide and API reference: louisecms.com/docs
Install
npm install louisecmsLouise's heavier dependencies are optional peers — install only what the exports you use require:
| If you use… | Install |
| ------------------------------------------------------------------- | --------------------------------------------------- |
| louisecms/db, /cms, /media, /editor, /forms | drizzle-orm |
| louisecms/client | solid-js prosekit @prosekit/pm |
| louisecms/client/drawer | @tanstack/solid-query (+ the client peers) |
| louisecms/auth | better-auth (@better-auth/passkey for passkeys) |
| louisecms/browser | @cloudflare/puppeteer |
| louisecms/stega | @vercel/stega |
| /security, /worker, /email, /queues, /errors, /commerce | (no peers) |
The core primitives are dependency-injected — you pass in your Cloudflare bindings
(D1, R2, Queues, Email); Louise never reaches for cloudflare:workers itself.
Exports
| Subpath | What it is |
| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| louisecms/client | The inline edit-on-the-page client + ProseKit rich-text editor, icons, blocks |
| louisecms/client/drawer | The registry-driven editor drawer: shell (mountDrawer), framework panels, data layer |
| louisecms/editor | Framework-generic api/louise/* handlers (save/settings/pages/media/forms/submissions/seed) |
| louisecms/forms | defineForm → derived table + capture route + validation + review columns; optional TanStack adapter |
| louisecms/cms | Collections, codegen, patch/validation, structure, webhooks |
| louisecms/db | Thin Drizzle-over-D1 helper + framework-owned pages/inquiries/media/submissions/site_settings columns |
| louisecms/media | R2 media: magic-byte-sniffed uploads, asset registry (alt/caption/dims), cfImage transforms, delete-safety scan |
| louisecms/auth | Better Auth factory + guard/handler + generateAuthSchemaSql (and the louise CLI) |
| louisecms/security | sanitize, rate-limit, secrets, security headers |
| louisecms/worker | composeWorker — compose editor + site routes over an SSR fallthrough |
| louisecms/browser | Cache-first OG-image render + link checker (Cloudflare Browser Rendering) |
| louisecms/commerce | Shared commerce primitives: money helpers + webhook-signature crypto |
| louisecms/commerce/stripe | Stripe glue: Payment Element / PaymentIntents, invoices, webhooks (raw fetch, no SDK) |
| louisecms/commerce/square | Square /v2 catalog, orders, payments, customers, loyalty, subscriptions + webhook verification |
| louisecms/commerce/fourthwall | Fourthwall storefront/catalog + webhook verification |
| louisecms/email | Cloudflare Email Sending (env.EMAIL.send) |
| louisecms/queues | Cloudflare Queues producer + batch consumer |
| louisecms/stega | @vercel/stega visual-editing tagging + a dependency-free stripper |
| louisecms/errors | LouiseError and typed subclasses |
| louisecms/theme/louise.css, /theme/fonts.css | the daisyUI "louise" editor theme |
Quick start
// A Cloudflare Worker endpoint — bindings are passed in, never imported.
import { db } from "louisecms/db";
import { sendEmail } from "louisecms/email";
export default {
async fetch(req: Request, env: Env) {
const orm = db(env.DB); // Drizzle over your D1 binding
await sendEmail(env.EMAIL, {
from: "[email protected]",
to: "[email protected]",
subject: "Hello from the edge",
html: "<p>Sent V8-natively.</p>",
});
return new Response("ok");
},
};Making a field inline-editable is a marker plus the client:
<h1 data-louise-field="settings:1:heroHeadline">Your Studio</h1>import { mountLouise } from "louisecms/client";
mountLouise(); // no-op unless the page rendered edit-mode markersSee the Getting Started guide for the full wiring (edit mode, the save endpoint, rich text, the drawer, media, theme).
Contributing / building
This package is developed in the louisecms
workspace with Vite+. It's packaged with vp pack (tsdown /
Rolldown: multi-entry, .d.ts, tree-shaking).
vp install
vp pack # build → dist/
vp test # Vitest
vp check # Oxlint + Oxfmt + type-checkCredits
Bundled (redistributed with this package, so its notice ships here): icons
from Phosphor Icons (MIT © Phosphor Icons), inlined
at build time — see THIRD_PARTY_NOTICES.md.
Built on (peer dependencies you install yourself — not redistributed here): ProseKit + ProseMirror for rich text, SolidJS for the client, and Drizzle ORM over Cloudflare D1.
License
MIT © BowenLabs
