Skip to content
This guide targets Fe 26.4. Fe is not production-ready. Install Fe 26.4

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

An ingot manifest uses [ingot]; a workspace root uses [workspace] instead. Standalone ingots specify:

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

The quickest way is fe new my_project. The equivalent manual steps are:

  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