AdonisJS v6 is here. Learn more in our release blog post.

Static assets

AdonisJS ships with a static file server to serve the files from a given directory. It is as simple as dropping a file inside the ./public directory and then accessing it by its filename. For example:

Create a file named public/style.css with the following contents.

body {
background: #f7f7f7;

And then access it by visiting the http://localhost:3333/style.css . You don't have to type the directory name (/public), and the files are accessible directly by their filename.


The config for the static server is stored inside the config/static.ts file.

import { AssetsConfig } from '@ioc:Adonis/Core/Static'
const staticConfig: AssetsConfig = {
enabled: true,
dotFiles: 'ignore',
etag: true,
lastModified: true,
export default staticConfig


A toggle switch to enable/disable the static file server.


The treatment for the dotfiles. The value can be one of the following:

  • 'allow': No special treatment for dotfiles. Just serve them like any other file.
  • 'deny': Deny the request with a 403 status code.
  • 'ignore': Pretend like the dotfile does not exist.


Whether or not to generate the ETag for the files.


Enable or disable the Last-Modified HTTP header. The value for the header relies on the file's last modified value.

The default directory

Conventionally, we serve the files from the ./public directory. However, you can choose a different directory by configuring it inside the .adonisrc.json file.

"directories": {
"public": "assets"

After the above change, The static server will serve the files from the ./assets directory.

Notifying assembler about the change

The @adonisjs/assembler package compiles your production application and writes the output to the ./build directory.

During this process, it also copies the files from the public directory, and hence, you must notify it about the change within the .adonisrc.json file.

"metaFiles": [
"pattern": "public/**",
"reloadServer": false
"pattern": "assets/**",
"reloadServer": false

URL conflicts

In case your static file names conflict with a registered route, AdonisJS will give preference to the static file and the route handler will never be called.

In this scenario, we recommend you to rename the static file or move it inside a sub-folder to avoid the conflict at the first place.

Additional reading