Open Source · MIT License

Drupal's power, headless on Node.js

A headless Node.js port of Drupal's entity/field architecture. Define content types in JSON, get a full REST API and GraphQL endpoint instantly. 220+ endpoints, 60 admin pages, and 500+ passing tests.

$ npx create-drop-app my-site
18 Field Types
220+ API Endpoints
60 Admin Pages
500+ Passing Tests
42 API Handlers

Everything you need to build content-driven apps

Drupal's proven content architecture, rebuilt for Node.js. From entity/field system to GraphQL, admin UI and beyond — everything included.

Content Management

  • Entity/Field System — 18 field types with configurable content types in JSON
  • Taxonomy — Vocabularies with hierarchical terms, tree API, weight-based reordering
  • Revision History — Full versioning with list, load, revert, and diff
  • Comments — Threaded commenting with Drupal-style thread ordering
  • Content Workflow — Moderation states: draft, review, published, archived
  • Paragraphs — Structured content components with parent-child relationships
  • URL Aliases — Human-readable paths with automatic pattern-based generation

API & Integration

  • Auto-Generated REST API — Full CRUD for every entity type, 220+ endpoints
  • GraphQL — Dynamic schema from entity types with queries, mutations, and playground
  • Webhooks — HTTP callbacks with HMAC signing for entity lifecycle events
  • JSON:API — Optional JSON:API 1.0 output format via Accept header
  • OpenAPI/Swagger — Auto-generated API docs at /api/docs
  • Batch API — Execute multiple operations in a single request

Admin & UI

  • Admin UI — 60 pages built with Next.js 15 + Tailwind for content, structure, config
  • Layout Builder — Configurable page layouts with sections and 5 layout types
  • Views System — Drupal Views-inspired list builder with filters, sorts, pagination
  • Media Library — File uploads with image styles (thumbnail, medium, large)
  • Menu System — Hierarchical navigation menus with weight-based ordering
  • Block System — 8 default regions with visibility conditions and placement management
  • Content Preview — Draft preview with token-based access and TTL expiry

Developer Experience

  • Database Agnostic — SQLite for dev, MySQL/PostgreSQL for production
  • Full TypeScript — End-to-end type safety across entities, queries, fields, and API handlers
  • 18 Field Types — string, text, integer, float, boolean, email, date, link, file, image, color, and more
  • Drupal Migration — Analyze, generate schemas, and migrate content via CLI
  • Event System — Async event bus with priority-ordered hooks
  • Validation — Server-side field constraints: required, max_length, pattern, and custom validators

Enterprise

  • Auth & Permissions — RBAC with 19 permissions, sessions, password reset, CSRF
  • Multilingual — 16 default languages with translation CRUD and language negotiation
  • Search — FTS5 full-text search with porter stemming and auto-indexing
  • Scheduled Publishing — Time-based content state transitions with cron
  • Content Locking — Pessimistic edit locking with TTL, renewal, admin break
  • Config Sync — Import/export all configuration as JSON with diff
  • Rate Limiting — Per-route rate limits for auth, mutations, and read endpoints
  • Queue System — Persistent task queue with claim, release, and background processing

100% Drupal-Compatible Database

drop.js generates a byte-identical database schema to Drupal 11. Export your SQLite database and import it directly into a Drupal installation — all content, fields, taxonomy, and configuration transfer seamlessly. Migrate from Drupal or back to it at any time.

Manage in the admin UI, consume over APIs

Create and manage content through the admin interface — the same entity/field/bundle model as Drupal. Consume it headlessly via REST, GraphQL, or JSON:API.

GET /api/node/article/1
{
  "data": {
    "nid": 1,
    "type": "article",
    "title": "Hello World",
    "body": { "value": "My first post." },
    "field_tags": [3, 7],
    "field_image": "/files/hero.jpg",
    "status": 1,
    "uid": 1,
    "created": 1709856000,
    "changed": 1709856000
  }
}
API Endpoints
REST
GET    /api/node/article
GET    /api/node/article/:id
POST   /api/node/article
PATCH  /api/node/article/:id
DELETE /api/node/article/:id

Query
GET /api/node/article?sort=-created
GET /api/node/article?status=1&limit=10

GraphQL
POST /api/graphql

JSON:API
Accept: application/vnd.api+json

Swagger
GET /api/docs

One package, clean domains

A single dropjs package with domain-based modules — everything included, nothing to wire up.

Your Application
|
dropjs
|
core
api
auth
field
db
migrate
admin
cli
|
SQLite
MySQL / PostgreSQL

Up and running in seconds

Three commands. That's all it takes.

Terminal
$ npx create-drop-app my-site
Creating drop.js project in ./my-site...
 
$ cd my-site
 
$ npx drop dev
Server running at http://localhost:3000
Admin UI at http://localhost:3000/admin
API at http://localhost:3000/api
Swagger docs at http://localhost:3000/api/docs