Nextly is an open-source CMS and visual page builder that runs inside your Next.js application. You model content in TypeScript or in the Visual Schema Builder, edit it in an admin panel that ships as a package, and read it from your own server components. Your content lives in your database, your schema lives in your repository, and there is no service in between.
It is MIT licensed and in alpha.
What "inside your app" means
Most content tools are a second system. You run a CMS somewhere, it exposes an API, and your Next.js app fetches from it over the network. That is a deployment to operate, a network hop on every read, and a second place for your types to drift from your data.
Nextly is a dependency instead. You install it, name your database in two environment variables, and your app gains a /admin panel and a typed data API in the same process:
import { defineCollection, richText, text, upload } from "nextly/config";
export const Posts = defineCollection({
slug: "posts",
admin: { useAsTitle: "title" },
fields: [
text({ name: "title", required: true }),
text({ name: "slug", required: true, unique: true }),
richText({ name: "content" }),
upload({ name: "featuredImage", relationTo: "media" }),
],
// Built-in draft and published lifecycle.
status: true,
});Reading it back is a function call, not a fetch:
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",
});
return (
<ul>
{posts.map((post) => (
<li key={String(post.id)}>{String(post.title)}</li>
))}
</ul>
);
}No HTTP round trip, no API key, no second deployment. A REST API is there when you want one, for a mobile client or a separate frontend, but your own pages do not have to go through it.
Two ways to model content, one result
A code-first CMS gives developers precision and gives everyone else a ticket queue. A visual one gives your team autonomy and gives developers a schema they cannot review in a pull request.
Nextly does both, against the same schema. Define a collection in TypeScript and it appears in the admin. Build one in the Visual Schema Builder and it becomes the same collection, addressable by the same API, exportable to the same code. Neither path is a lesser version of the other.
What is in the box
The alpha ships collections and singles, an admin panel, a Lexical rich text editor, a media library, role-based access control with field-level permissions, a hooks system, a form builder, an email system, Postgres, MySQL and SQLite support, a CLI, create-nextly-app, a visual page builder, a visual schema builder, localization, content versioning and drafts, webhooks, a plugin system, background jobs, an audit log, releases, admin widgets, project templates, an SEO plugin, and preview links with an editor preview pane.
Everything above is in the published packages today. What is not there yet is on the roadmap, which is honest about which lane each item sits in.
Where your data lives
In your database. Nextly picks its adapter from your environment:
DB_DIALECT=postgresql
DATABASE_URL=postgresql://user:password@localhost:5432/mydbPostgres, MySQL and SQLite are all supported. There is no hosted Nextly service holding your content, and nothing in the runtime calls home.
Trying it
npx create-nextly-app@0.0.2-alpha.62The current release is 0.0.2-alpha.62. Alpha means the APIs can still change between releases, so pin exact versions if you build something you care about. It also means the fastest way to change the product is to tell us what is missing: GitHub Discussions for ideas, Discord for questions.
Start building with Nextly
Free, open source, and yours to own. No sign-up required.