Stencil
A Git-backed CMS and visual site builder - content as files in a GitHub repo, no database.
Stencil turns a GitHub repo into a Git-versioned CMS and a visual site builder - with no database. Author Markdown, articles, wiki pages, or drag-and-drop layouts; reuse components; personalize per visitor with server-side conditional components; and publish through a two-branch Git workflow with history and diffs. Everything serves from a cached public site, a headless JSON API, or an iframe embed.
Visual Page Builder
Drag-and-drop blocks, a layers tree, live Tailwind class / inline-style editing, and a responsive canvas - a visual builder whose output is clean, self-hosted HTML at any URL.
Conditional Components
Components that render a different branch per visitor - by auth, geo, time, device, query params, A/B bucket, or page data - resolved server-side and edited in a React Flow diagram.
Reusable Components
Build a component once (a nav, a hero, a footer), drop it into any page from the blocks palette, and every instance stays in sync when you edit it.
Four Content Types
Markdown, Articles, visual Pages, and Wikipedia/Wikitext - each with its own editor, all stored as human-readable files with YAML frontmatter.
Articles
First-class blog/news: header + social images with an in-browser 1200×630 crop tool, tags, git-derived dates, an articles.json index, and grid / card / featured / tag-filter blocks.
Rich Markdown Editor
A TipTap WYSIWYG with a raw toggle, syntax-highlighted code blocks with a language picker, tasks, tables, image align/resize, and Excalidraw whiteboards.
Git Storage & Roles
Content lives as files in a GitHub repo (no database) via the API; GitHub OAuth sign-in derives Admin / Moderator / Editor roles from each user's repo permission.
Two-Branch Publishing
Edits commit to a draft branch; the public site serves the publish branch. Draft / Published / Unpublished-changes badges, full history, and side-by-side commit diffs.
Text Variables
Any text can embed {username}, {query.ref}, {geo.country}, {data.*}, and more - substituted server-side at render against the same signals conditions use.
Headless API & Embeds
A public, read-only, CORS-enabled JSON API plus template-free article embeds in an auto-resizing iframe - with edge caching via s-maxage and stale-while-revalidate.