PermissiveMITTested by Geekflare

AdonisJS review

TypeScript MVC framework for Node.js with its own ORM, validator, auth, testing and CLI, for APIs and server-rendered apps

Data refreshedMethodologyHow we tested
Director of Geekflare

Rity Anand is a director of Geekflare. She has extensive experience managing business technology and a special interest in emerging technologies.

Verdict

AdonisJS gives Node.js teams a Laravel-style framework where the ORM, validator, auth, authorisation, testing and CLI come from one team and work together out of the box. The catch is a smaller community than NestJS or Express, a Node.js 24 minimum, no official OpenAPI or WebSocket package, and four multipart body parser advisories this year.

Best for

Teams that want a batteries-included MVC framework like Laravel or Rails, in TypeScript

Not for

Teams that need OpenAPI generation or WebSockets from official packages, or older Node.js

Pros

  • Official SQL ORM with migrations, seeders and factories
  • VineJS validation for bodies, queries, params and headers
  • Session, token and social login plus policies from first-party packages
  • Typed API client generated from routes and validators

Cons

  • Needs Node.js 24 or later
  • No official OpenAPI or WebSocket package
  • Several multipart body parser advisories this year
What people say
Ask Sparkian

Is AdonisJS right for your project?

Describe what you need and AI will check the fit against this review.

Or try:

AdonisJS features and capabilities

Lucid ORM

Models, relationships, migrations, seeders and factories ship with every starter kit, and the Knex query builder is there for complex SQL.

VineJS validation

Validators check bodies, query strings, params, headers and cookies, return errors in the right format for HTML or JSON, and can check rows in the database.

Authentication and authorisation

Session, opaque access token and basic auth guards, social login through Ally and Bouncer policies cover sign-in and permissions without third-party packages.

End-to-end types

Tuyau generates a typed HTTP client from routes, controllers and validators, so a React or Vue front end catches API changes at compile time.

Container, CLI and test runner

An IoC container injects dependencies into controllers, the Ace CLI adds and configures packages, and the test setup includes database assertions and state resets between tests.

TypeScript firstWritten in TypeScript or ships its own types, with typed routes or handlers
Yes
Request validationValidates bodies, params or queries against a schema, in the core or an official package
YesVineJS, from the AdonisJS team
OpenAPI docsGenerates an OpenAPI spec or Swagger UI from routes
PartlyCommunity packages only
Beyond Node.jsOfficially runs on Bun, Deno or edge runtimes such as Cloudflare Workers
NoNode.js only
WebSocketsBuilt in or through an official plugin
NoTransmit offers server-sent events, not WebSockets
Project structureModules, dependency injection or a fixed layout, not only routing
YesIoC container and a fixed project layout
Database layerAn official ORM, query builder or data layer
YesLucid SQL ORM
AuthenticationAn official auth module, plugin or strategy system
Yes@adonisjs/auth guards, Ally social login and Bouncer

At a glance

Type
Full-stack MVC framework
Stack
TypeScript / Node.js 24+
Databases
PostgreSQL, MySQL, SQLite, SQL Server, Turso

Free vs paid editions

What you get when you self-host, and what needs a paid plan.

The framework and its official packages, including Lucid, VineJS, auth, Bouncer and Transmit, are MIT. AdonisJS Plus is a paid add-on from the creator with ready-made user management and role packages, copy-in Feature Packs and AI skills, at $149 a year for early adopters and $249 a year after that.

Running AdonisJS

AdonisJS 7 needs Node.js 24 or later and npm 11 or later, and apps are compiled to a standalone JavaScript build for production.

New cloud server to ready

2 min

Memory in use at idle

133 MB of 4 GB

Reads per second

4,201

Writes per second

3,111

Startup

1.35 s

Version tested

7.6.0 · Oct 31, 2026

  • npm init adonisjs with the api starter kit installed 515 packages, 198 MB, in 1 minute 47 seconds. The production build needs 371 packages and 139 MB.
  • npm ci for the production build failed in the slim Node.js image because the SQLite driver had to compile and found no Python. It worked in the full node:24 image.
  • The starter applies session, shield, CORS and auth middleware to every route, and I kept it as shipped. A stripped-down app would be faster.
  • Validation errors come back as 422 with every invalid field. VineJS treats an empty string as missing, so the name error says it must be defined.
start/routes.ts and app/validators/item.ts, added to npm init adonisjs@latest -- --kit=api
import vine from '@vinejs/vine'

export const createItemValidator = vine.create({
  name: vine.string().minLength(1).maxLength(100),
  price: vine.number().min(0),
  tags: vine.array(vine.string()).maxLength(10).optional(),
})

// start/routes.ts, after the starter's own routes
import { createItemValidator } from '#validators/item'
// Benchmark routes: 100 items kept in memory, so the test measures the framework, not a database.
const items = new Map<number, object>()
for (let i = 1; i <= 100; i++) items.set(i, { id: i, name: `Item ${i}`, price: i * 1.5, tags: ['sample'] })
let nextId = 101

router.get('/health', () => ({ status: 'ok' }))

router.get('/items/:id', ({ params, response }) => {
  const item = items.get(Number(params.id))
  if (!item) return response.notFound({ error: 'Not found' })
  return item
})

router.post('/items', async ({ request, response }) => {
  const data = await request.validateUsing(createItemValidator)
  const item = { id: nextId++, ...data }
  items.set(item.id, item)
  return response.created(item)
})
OutputPassed7.6.0 · 422, VineJS's default error
Request: POST /items with {"name": "", "price": -1}
{
  "errors": [
    {
      "message": "The name field must be defined",
      "rule": "required",
      "field": "name"
    },
    {
      "message": "The price field must be at least 0",
      "rule": "min",
      "field": "price",
      "meta": {
        "min": 0
      }
    }
  ]
}

What you can do with AdonisJS

SaaS app with a React or Vue front end

Use the React or Vue starter kit with Inertia, Lucid and the session guard to build a full product in one codebase.

JSON API for a mobile app

Start from the API kit with access token auth, VineJS validation and Lucid models, and share types with clients through Tuyau.

Moving a team from Laravel or Rails

Give developers used to Laravel or Rails a familiar MVC layout, ORM and CLI in TypeScript.