Type-safe
We pay a closer look at type-safety, seamless intellisense, and support for auto imports when designing framework APIs.
ESM ready
AdonisJS leverages modern JavaScript primitives, including ES modules, Node.js sub-path imports, and much more.
Fast - Wherever it matters
We ship with one of the fastest validation libraries, and our HTTP server has performance on par with Fastify.
Feature rich framework core
The core of the framework is a single npm package that provides all the base-level features you need to create a web application from scratch.
No need to spend hours finding and assembling dozens of packages together before you can write the first line of code.
Use AdonisJS and be productive from day one.
World-class testing experience
Testing is not an afterthought for us. We ship with primitives to manage test databases, swap dependencies, generate fake data, interact with cookies and sessions, and much more.
With AdonisJS, you will love writing tests.
import { test } from '@japa/runner'
import { UserFactory } from '#factories/user_factory'
test('render polls created by the logged-in user', async ({ visit, browserContext }) => {
/**
* Create a user with 5 polls using Model factories
*/
const user = await UserFactory.with('polls', 5).create()
/**
* Mark the user as logged in
*/
await browserContext.loginAs(user)
/**
* Visit the endpoint that renders the list of
* polls for the logged-in user
*/
const page = await visit('/me/polls')
for (let poll in user.polls) {
await page.assertExists(
page.locator('h2', { hasText: poll.title })
)
}
})
import { test } from '@japa/runner'
import { UserFactory } from '#factories/user_factory'
test('get list of expenses for the logged-in user', async ({ client }) => {
/**
* Create a user with 10 expenses using Model factories
*/
const user = await UserFactory.with('expenses', 10).create()
/**
* Login user and visit the API endpoint to
* get the list of expenses
*/
const response = await client
.get('/me/expenses')
.loginAs(user)
/**
* Assert response matches the schema defined
* in an OpenAPI schema file
*/
response.assertAgainstApiSpec()
response.assertBodyContains(user.expenses.toJSON())
})
import { test } from '@japa/runner'
import mail from '@adonisjs/mail/services/main'
import VerifyEmailNotification from '#mails/verify_email'
test('create user account', async ({ client }) => {
/**
* Fake emails before executing the code that
* triggers emails
*/
const { mails } = mail.fake()
const response = await client.post('users').json({
email: 'virk@adonisjs.com',
password: 'secret',
})
response.assertStatus(201)
/**
* Assert an email was sent after making the request
* to the "/users" endpoint
*/
mails.assertSent(VerifyEmailNotification, ({ message }) => {
return message
.hasTo('virk@adonisjs.com')
.hasSubject('Verify email address')
})
})
import { test } from '@japa/runner'
import ace from '@adonisjs/core/services/ace'
import Greet from '#commands/greet'
test('greet the user and exit successfully', async () => {
/**
* Create an instance of the CLI command
* and execute it
*/
const command = await ace.create(Greet, ['virk'])
await command.exec()
/**
* Write assertions for the command status and
* logs
*/
command.assertSucceeded()
command.assertLog('[ blue(info) ] Hello world from "Greet"')
})
A huge collection of officially maintained packages
Always find yourself switching between the latest ORMs or migrating away from those two unmaintained libraries?
We have been there too! That is why AdonisJS ships with a collection of officially maintained and well-documented packages.
Pick and use the ones you need.
Lucid
Auth
Bouncer
FlyDrive
Limiter
Edge
Bento Cache
VineJS
Ally
I18n
Health checks
Mailer
Transmit
Lock
Vite
Inertia
IoC container
AdonisJS ships with a zero-config IoC container that uses reflection to resolve and inject class dependencies.
Supercharged CLI
Scaffold resources, run database migrations, use application-aware REPL, or create custom commands. All using a unified CLI framework.
Security primitives
Implement CORS policies to protect your APIs, or use AdonisJS shield to protect against CSRF, XSS, and man-in-the-middle attacks.
A wall full of love and support from developers across the world
![]()
Mahmoud Mousa
@MahmMousa
Adonis in MVC is a blessing tbh! I use it with HTMX or Turbo and it's just perfect!
![]()
Peter Vukovic
@pvukovic
Adonis is wonderful - just a perfect level of cognitive load a framework can have both in documentation and implementation.
Not too much, not too little, but exactly what you need as a developer.
![]()
Reagan Ekhameye
@techreagan
@adonisframework is the first ever framework I learnt from the docs, I'm in love with this framework, it's just like @Laravel but for the @nodejs world . I will be like I'm stuck how can i solve this, the docs got you covered. It's gonna be my long term buddy.
![]()
Trésor Muco
@mucotreso
The more I work with @adonisframework the more I'm convinced that it is the best framework in the Nodejs Ecosystem.
The docs are well written, well designed, you just want to stay there and learn more.
Thanks to all the people who are working on this project.
![]()
Dragos Nedelcu
@Drag0sNedelcu
Tried recently @adonisframework v6 and I am blown away. I love how the modules are separated, like orm, validation etc. Wish there were more discussions on this. Feels highly underrated...
![]()
Carl Mathisen
@carlmathisen
We’ve used it at work for a couple of years, just replacing these express cocktails. They were fine, but I was tired of maintaining and upgrading a unique set of libraries that were our company unique combination of regular features.
![]()
Jofie Bernas
@jooop4y
Having a solid experience in Laravel and wanting to explore NodeJs, I found @adonisframework a good choice for me to go through. It is been easy for me to jump in since it feels like I am just writing Laravel but in typescript and NodeJS , Awesome developer experience!.
![]()
Dylan Britz
@britzdm
I've been using @adonisframework for the last two days an I've already got more done then I did in the last 3 weeks with just using expressjs.
![]()
Sam Newby
@SamNewby_
If you’re a PHP dev who loves Laravel and want to give another language a go and use a similar style framework then make sure to check out @adonisframework. It has its own ORM, Auth support, and even a CLI tool called Ace which is very similar to Artisan.#Laravel #NodeJS
![]()
Andrew Weir
@andruu
So funny seeing everyone looking/begging for the node/ts equivalent of rails/Laravel when it’s existed for years. I started using @adonisframework in 2016 in production for one of the biggest startups in Asia. If you want full stack with everything built in take a look.
Sponsored by fantastic companies and individuals
AdonisJS is an independent open-source project released under the MIT license. We rely on our GitHub sponsors to keep the lights on.