Features

Start with the core. Add what you need.

No third-party services required. Just features that work. Code-first or visual, your choice.

01

Rich Text Editor

Lexical-powered editor with formatting, lists, tables, code blocks, and inline toolbars. Define richText fields in your collections and get a polished editing experience.

LexicalInline ToolbarTablesCode BlocksFormatting
Explore rich text editor
Lexical
Getting Started with Nextly
•Configure your first collection with TypeScript
•Add richText fields with the Lexical adapter
{ name: "content", type: "richText" }
Inline formatting, tables, code blocks, and custom nodes all supported out of the box...

02

Media Library

Media library with folder organization, drag-and-drop upload, and pluggable storage adapters: S3, Cloudflare R2, Vercel Blob, Uploadthing, or local filesystem.

FoldersS3 / R2Vercel BlobUploadthingDrag & Drop
Explore media library
media/
Upload
IMAGE
hero.jpg
2.4 MB
SVG
logo.svg
12 KB
PDF
report.pdf
840 KB
IMAGE
banner.png
1.1 MB
CSV
data.csv
44 KB
VIDEO
video.mp4
18 MB

03

Database Adapters

PostgreSQL, MySQL, and SQLite, all powered by Drizzle ORM. Pick the database that fits your project and switch adapters without changing application code.

PostgreSQLMySQLSQLiteDrizzle ORMConnection Pooling
Explore database adapters
Powered by Drizzle ORM
PGPostgreSQL
MYMySQL
SQSQLite
columntypenullable
idserialNO
titletextNO
slugtextYES
createdAttimestampYES
statustextYES

04

Lifecycle Hooks

8 collection hooks: beforeOperation, beforeValidate, beforeChange, afterChange, beforeRead, afterRead, beforeDelete, afterDelete. Transform data, enforce rules, trigger side effects.

beforeChangeafterChangebeforeDeleteafterReadWildcard *
Explore lifecycle hooks
collections/posts.ts
hooks: {
  beforeChange: [
   async ({ data, operation }) => {
    if (data?.title) {
     return {
      ...data,
      slug: data.title.toLowerCase().replace(/\s+/g, "-"),
     };
    }
    return data;
   },
  ],
 }

05

Reusable Components

Define reusable field groups with defineFieldGroup() or build them visually in the admin panel. Embed single or multiple instances across any collection or single.

defineFieldGroup()Nested SupportDynamic ZonesShared Fields
Explore reusable components
Component tree
defineFieldGroup("SEOBlock") {
fields: [
metaTitle : text
description : textarea
ogImage : media
]
}
Posts ✓
Pages ✓
+ 4 more

06

Form Builder

First official Nextly plugin. Drag-and-drop form creation with multiple field types, submission tracking, spam protection, and email notifications.

Drag & DropSubmissionsSpam ProtectionNotifications
Explore form builder
Contact Form · 3 fields
Full Name *
John Doe
Email *
john@example.com
Message
Tell us about your project...
Submit
spam ✓

07

Email System

Send transactional and notification emails via Resend, SMTP, or SendLayer. Built-in templates with variable interpolation and database-managed providers.

ResendSMTPSendLayerTemplates
Explore email system
transactional / welcome-email.ts
from:hello@yourapp.com
to:{{user.email}}
sub:Welcome to {{app.name}}!
Resend
SMTP
SendLayer

08

Access Control

RBAC with default roles (admin, editor, viewer), field-level read/write permissions, and code-defined or database-defined access functions. Sync or async.

RBACField PermissionsOwner-OnlyPer-Collection
Explore access control
RBAC · posts collection
actionadmineditorviewer
create
✓
✓
✕
read
✓
✓
✓
update
✓
✓
✕
delete
✓
✕
✕
publish
✓
✕
✕