Use Cases / Blog Platform

A blog that developers own completely.

Define your post schema in code, or build it visually. Either way, your editors get a Lexical-powered rich text editor, categories and authors as proper relational collections, and a media library for images. No plugin marketplace required.

Lexical Rich Text

Slash commands, drag-and-drop blocks, tables, code blocks, and custom React embeds. Your writers get a proper editor.

Relational Taxonomy

Categories and authors are real collections with relationships. Query all posts in a category or by an author in a single call.

Media Library

Upload and organize images with automatic Sharp processing. Responsive sizes generated at upload time.

Code-first or Visual

Define the schema in TypeScript for full version control, or use the visual builder. Both produce the same admin experience.

The problem

Every blog setup is the same compromise.

Managed blog platforms lock you into their editor and their data model. Headless CMS tools give you flexibility but add another subscription and deployment. Building it yourself means reinventing slug generation, rich text storage, and image uploads every time.

Nextly gives you a production-ready blog schema in minutes, with full TypeScript control over every field, hook, and access rule.

Example

Blog schema in under 30 lines

Posts collection

collections/posts.ts
import {
 defineCollection, text, richText,
 relationship, select, upload, date,
} from"@revnixhq/nextly/config";

export default defineCollection({
 slug:"posts",
 fields: [
  text({ name:"title", required: true }),
  text({ name:"slug", unique: true }),
  richText({ name:"content" }),
  upload({ name:"featuredImage", relationTo:"media" }),
  relationship({ name:"author", relationTo:"users" }),
  relationship({
   name:"categories",
   relationTo:"categories",
   hasMany: true,
  }),
  select({
   name:"status",
   options: [
    { label:"Draft", value:"draft" },
    { label:"Published", value:"published" },
   ],
  }),
  date({ name:"publishedAt" }),
 ],
 hooks: {
  beforeChange: [
   async ({ data }) => ({
    ...data,
    slug: data.title?.toLowerCase().replace(/\s+/g,"-"),
   }),
  ],
 },
});

Categories collection

collections/categories.ts
import { defineCollection, text } from"@revnixhq/nextly/config";

export default defineCollection({
 slug:"categories",
 fields: [
  text({ name:"name", required: true }),
  text({ name:"slug", unique: true }),
 ],
});

Start building with Nextly

Free, open source, and yours to own. No sign-up required.

>_npx create-nextly-app@latest