Built for the
modern developer.
Every feature designed around simplicity, Git workflows, and developer experience.
Content as JSON Files
Every piece of content is a plain JSON file on disk. No opaque databases, no migrations, no ORM overhead. Read your data with cat, edit with any text editor, version with Git.
- Human-readable data format
- File-system is the single source of truth
- Works with any frontend — Next.js, Astro, Hugo
- Zero vendor lock-in
{
"id": "nano-id-abc123",
"title": "My First Post",
"content": "Hello, world!",
"createdAt": "2026-04-04"
}
Git-Native Versioning
Content changes are automatically committed to a dedicated cms-data branch using Git worktrees. Stage content on branches, merge to publish. Full history, full attribution.
- Automatic Git commits for every save
- Branch-based content staging
- Author attribution on every commit
- Orphan branch isolation (no code pollution)
Relationships
Link content types together with four relationship types. Deep population resolves nested data at query time automatically.
- one-to-one — Profile → User
- one-to-many — Author → Articles
- many-to-one — Articles → Category
- many-to-many — Articles ↔ Tags
Dynamic Zones
Flexible, component-based content areas. Define reusable components (Hero, FAQ, Gallery) and let editors compose pages freely.
- Compose pages from reusable blocks
- No developer needed for content layout changes
- Type-safe component schemas
- Supports nesting and ordering
RBAC & Field-Level Security
Role-based access control at both API and field level. Ownership-based rules, conditional templates, and four built-in roles.
- Admin, Editor, Authenticated, Public roles
- Field-level read/write restrictions
- Ownership conditions:
createdBy: '${user.id}' - JSON-configurable permissions (rbac.json)
In-Memory Query Engine
Lightning-fast queries powered by an in-memory index. Real-time sync via Chokidar watches the file system for external changes.
- <50ms avg read latency
- Chokidar file-system watcher for live reindex
- Filter, sort, paginate, populate in one query
- No restart needed after git pull