CMS for Next.jsA CMS that lives inside your Next.js app.
Nextly is an open-source content platform for Next.js.
MIT licensed, self-hosted.
After a developer sets up and deploys Nextly, editors manage content and pages in the admin.
npx create-nextly-app@alpha my-appWhat it does
Model content in TypeScript or in the Visual Schema Builder. Both feed the same Nextly runtime, admin and APIs.
Model content visually on your development instance with the Visual Schema Builder.


A Lexical rich text editor with tables, code blocks with syntax highlighting, images from the media library and YouTube or Vimeo embeds.
See who else is editing a document, and take over deliberately.


Read content straight from your database in your page code (the Direct API), or over REST.
Pages that read through Nextly’s cached queries update when their content changes.
app/blog/page.tsx
import { getNextly } from "nextly";
import config from "@/nextly.config";
export default async function BlogPage() {
const nextly = await getNextly({ config });
const { items: posts } = await nextly.find({
collection: "posts",
where: { status: { equals: "published" } },
sort: "-createdAt",
limit: 10,
});
return <ul>{posts.map((p) => <li key={p.id}>{p.title}</li>)}</ul>;
}

For your team
In the admin
For developers
In your code
- Typed, code-defined schemas and APIs:
nextly generate:typeswrites types for the collections, singles and field groups in your config. Docs - Role-based permissions for each collection and action, plus field-level read and write rules in code, on a collection’s or single’s fields, fields inside field groups included. Docs
- Hooks in code run before and after a change, a read or a delete. Docs
- Signed webhooks for content, media, user and form events, with retries, a delivery log, redelivery and secret rotation. Docs
import { defineCollection, defineConfig, richText, text } from "nextly/config";
const Posts = defineCollection({
slug: "posts",
admin: { useAsTitle: "title" },
fields: [
text({ name: "title", required: true }),
text({ name: "slug", required: true, unique: true }),
richText({ name: "content" }),
],
status: true,
});
export default defineConfig({ collections: [Posts] });import { getNextly } from "nextly";
import config from "@/nextly.config";
export default async function BlogPage() {
const nextly = await getNextly({ config });
const { items: posts } = await nextly.find({
collection: "posts",
where: { status: { equals: "published" } },
sort: "-createdAt",
limit: 10,
});
return <ul>{posts.map((p) => <li key={p.id}>{p.title}</li>)}</ul>;
}Try Nextly here, before you install it.
Pick a tour. Each one is a short, hands-on illustration of the product, and nothing here is saved.
A short tour, in your browser, and nothing is saved. Every control it draws is one Nextly 0.0.2-alpha.70 has; a dashed button is a tour shortcut.
An illustration of the Nextly admin and APIs nothing is saved
Step 1 of 3
1 · Define the field
In your code
export const Posts = defineCollection({
slug: 'posts',
fields: [
{ name: 'title', type: 'text' },
{ name: 'excerpt', type: 'textarea' },
],
})2 · The admin · Entry editor
Release notes: November
Excerpt
Content releases and version history.
3 · Your API
const { items } = await nextly.find({
collection: 'posts',
})
// response
{ "items": [{
"title": "Release notes: November",
"excerpt": "Content releases and…",
}], "meta": { … } }The Direct API reads straight from your database in your page code.
Code and the Visual Schema Builder both feed the same Nextly runtime, admin and APIs. The Visual Schema Builder runs on your development instance.
Add a field once, in TypeScript or in the Visual Schema Builder, and it reaches the editor and the API.
npx create-nextly-app@alpha my-appIn 0.0.2-alpha.70
What ships today
- Package
nextly- Release
0.0.2-alpha.70· 25 Oct 2026- Licence
- MIT
- Runs in
- Your own Next.js app, self-hosted
- Databases
- PostgreSQL 15+, MySQL 8+, SQLite 3.38+ for local work
- Requires
- Node.js 22.12+ or 24+; Next.js 16 with the App Router; React 19
- APIs
- The Direct API and REST
Not today
Where it stops
- The Visual Schema Builder
- Model content visually on your development instance with the Visual Schema Builder. Docs
- Access rules and the Direct API
- The Direct API runs as trusted server code and skips access rules unless you pass
overrideAccess: false. Called that way with nouser, it is judged as a signed-out visitor: it can read where no rule names the read, and a create, update or delete needs a rule that allows it. Docs - Sign-in
- Sign-in for your team: email and password, sessions and API keys, stored in your own database. Docs
- Database versions
- PostgreSQL 15 or later, MySQL 8 or later, SQLite 3.38 or later for local work. Docs
Nextly is in alpha. APIs may change before 1.0. Pin exact versions in production.
Questions
Does Nextly run inside my Next.js app?
MIT licensed, self-hosted. Runs inside your own Next.js app, on your own PostgreSQL or MySQL database, or SQLite for local work.
Do I model content in code or in the admin?
Model content in TypeScript or in the Visual Schema Builder. Both feed the same Nextly runtime, admin and APIs.
Model content visually on your development instance with the Visual Schema Builder.
Does Nextly have a GraphQL API?
No. Nextly offers REST and the Direct API.
Is Nextly free?
Nextly is MIT licensed and self-hosted.
MIT today, and no decision yet about paid offerings.
Can a coding agent set it up?
Every new Nextly project ships with an AGENTS.md and CLAUDE.md written for coding agents.