When you create and execute a new Nessa project, multiple files are created and it's good to know the meaning and
structure of each one. Let's take a look at them.

## Project files

In a Nessa project there can be multiple files created automatically:

1. **main.nessa**: entrypoint of the interpeter. This is the file that `nessa run` will execute.
2. **nessa_config.yml**: contains everything the interpreter needs to execute a project. This includes the module's name,
  version and paths to look for modules. This file should not be shared publicly.
2. **nessa_deps.yml**: contains the name, dependencies and versions of the project. This file can be shared publicly and
  a full **nessa_config.yml** file can be reconstructed from it if the required libraries are available.
3. **nessa_cache/main.nessac**: contains a cached file that allows the execution of a module without recompiling.
4. **nessa_cache/prof.json**: contains profiling information about the program.

Let's take a look at each of them.

## General configuration

The **nessa_config.yml** file contains the following values:

* **module_name**: the module's name.
* **version**: the current module's version.
* **hash**: an **automatically calculated** value that summarizes the contents of a module in order to check if recompilation is necessary.
* **module_paths**: a list of strings that contains every path where the interpreter should look for modules when executing this project. They can contain
  environment variables by using the format `${variable_name}`.
* **modules**: a map where the keys are the names of the modules that can be used inside the module and the values are objects with the following keys and values:
    * **version**: SemVer string that represents the version of the imported module.
    * **path**: path pointing to the folder where the imported **nessa_config.yml** is located. 

You can edit this however you want, but it is not recommended to modify the **hash** property. Also, the **modules** property *should* be handled using the `nessa add`
command.

## Nessa cache

There is not much to say about **main.nessac** other than when it is present, the program will not be recompiled as long as the hash is the same. Also, you can force
recompilation by using the `--recompile` flag.

## Profiling information

> ***Note:*** this file is still at a very experimental stage, so things may change and you might see some things that are not documented. Only the parts meant for
> non-developers will be explained here.

The **prof.json** file is a JSON that contains many values, but the only ones that you should care about are the following:

* **total_time**: total execution time in nanoseconds.
* **loc_time**: map where the keys are the modules and the values are the times in nanoseconds spent executing that line in the module.