Skip to content
Pre-Release: Fe is under active development. This documentation covers the upcoming release. Follow progress on GitHub

Project Structure

Every Fe project follows a standard structure with a manifest file and source directory.

A minimal Fe project looks like this:

my-project/
├── fe.toml
└── src/
└── lib.fe

As your project grows:

my-project/
├── fe.toml
└── src/
├── lib.fe # Entrypoint
├── token.fe # Additional modules
├── utils.fe
└── messages/
├── mod.fe # Submodule entrypoint
└── transfer.fe

The fe.toml file defines your ingot’s metadata and dependencies:

[ingot]
name = "my_project"
version = "1.0.0"
[dependencies]
# Dependencies go here

Every fe.toml requires an [ingot] section with:

FieldRequiredDescription
nameYesThe ingot name (used for imports)
versionYesSemantic version string
[ingot]
name = "token_library"
version = "0.1.0"

The name must be a valid identifier. Use underscores instead of hyphens:

# Good
name = "my_token"
# Bad - hyphens not allowed
name = "my-token"

All Fe source files live in the src/ directory. The compiler discovers files matching the pattern src/**/*.fe.

Every ingot must have a src/lib.fe file. This is the entrypoint that defines what the ingot exports:

src/lib.fe
// Re-export items from other modules
pub use token::Token
pub use messages::Transfer
// Define items directly
pub struct Config {
pub max_supply: u256
}

Split code across multiple files for better organization:

src/lib.fe
pub use token::Token
pub use utils::calculate_fee
// src/token.fe
pub contract Token {
// ...
}
// src/utils.fe
pub fn calculate_fee(amount: u256) -> u256 {
amount / 100
}

Create subdirectories with mod.fe files for deeper organization:

src/
├── lib.fe
└── messages/
├── mod.fe # Required for submodule
├── transfer.fe
└── approval.fe
src/messages/mod.fe
pub use transfer::Transfer
pub use approval::Approval

To create a new Fe project:

  1. Create the project directory:

    Terminal window
    mkdir my_project
    cd my_project
  2. Create fe.toml:

    [ingot]
    name = "my_project"
    version = "0.1.0"
  3. Create the source directory and entrypoint:

    Terminal window
    mkdir src
    touch src/lib.fe
  4. Add your code to src/lib.fe:

    pub contract MyContract {
    // ...
    }
ComponentPurpose
fe.tomlManifest with name, version, dependencies
[ingot]Required section with name and version
src/Contains all source files
src/lib.feRequired entrypoint
src/**/*.feAdditional source files