Folder Structure

The first step to creating an awesome application is knowing where things are. If you created your project using the Toolbox or from a template, you will already have the folder structure created.

If you are making a Vapor application from scratch, this will show you exactly how to set it up.

Minimum Folder Structure

We recommend putting all of your Swift code inside of the App/ folder. This will allow you to create subfolders in App/ to organize your models and resources.

This works best with the Swift package manager's restrictions on how packages should be structured.

├── App
│   └── main.swift
├── Public
└── Package.swift

The Public folder is where all publicly accessible files should go. This folder will be automatically checked every time a URL is requested that is not found in your routes.


The FileMiddleware is responsible for accessing files from the Public folder.


The Models folder is a recommendation of where you can put your database and other models.

├── App
.   └── Models
.       └── User.swift


The Controllers folder is a recommendation of where you can put your route controllers.

├── App
.   └── Controllers
.       └── UserController.swift


The Views folder in Resources is where Vapor will look when you render views.

├── App
└── Resources
    └── Views
         └── user.html

The following code would load the user.html file.



Vapor has a sophisticated configuration system that involves a hierarchy of configuration importance.

├── App
└── Config
  └── app.json         // default app.json
    └── development
         └── app.json  // overrides app.json when in development environment
    └── production
         └── app.json  // overrides app.json when in production environment
    └── secrets
         └── app.json  // overrides app.json in all environments, ignored by git

.json files are structured in the Config folder as shown above. The configuration will be applied dependant on where the .json file exists in the hierarchy. Learn more in Config.

Learn about changing environments (the --env= flag) in the Droplet section.