
AdonisJS review
TypeScript MVC framework for Node.js with its own ORM, validator, auth, testing and CLI, for APIs and server-rendered apps
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
“I find Adonis way better (and ages more modern) than Django.”
Hacker News, Aug 2026“pretty much the JS sibling of Laravel and RoR”
Hacker News, Mar 2026“Adonis is nice, but still young and lacking features.”
Hacker News, Mar 2026
Is AdonisJS right for your project?
Describe what you need and AI will check the fit against this review.
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.
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)
}){
"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.