

# 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.

Note

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

## Models

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

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

## Controllers

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

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

## Views

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.

    drop.view.make("user.html")

## Config

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.