Project structure
How files and folders are organized in an anfra project
An anfra project is a folder of plain files that you keep in Git. Running anfra init creates this layout:
my-project/
├── models/ # AML data models
├── datasets/ # AML datasets and their metrics
├── apps/ # Data apps, one HTML file each
├── .anfra/
│ ├── data_sources.yml # Warehouse connections, with credentials (git-ignored)
│ ├── data_sources.yml.example # The same without credentials, to commit
│ └── context_sources.yml # What anfra ingest reads for anfra search
└── .gitignore # Ignores .anfra/data_sources.ymlanfra init never changes an existing file, so it is safe to run in a repo that already has some of these.
models/
Each .aml file describes one data model: the mapping between a table (or SQL query) and how anfra should interpret its columns and relationships.
datasets/
Each .aml file describes one dataset: one or more data models joined together, with metrics and dimensions defined on top. Apps query datasets by name.
apps/
Each .html file is one data app. anfra serve lists them by their <title>, and apps/sales/overview.html opens at /apps/sales/overview. Subfolders group apps, and images or scripts next to an app load by relative path.
.anfra/
The project's config folder, committed with it.
data_sources.ymlholds your warehouse connections. It contains credentials, soanfra initadds it to.gitignore. See Data sources.data_sources.yml.exampleis the same file without credentials. Commit it so collaborators know what to fill in.context_sources.ymllists the dbt and LookML projects thatanfra ingestreads into the local search catalog, alongside the project's own AML. See Ingest.
anfra keeps its per-machine state for a project, such as logs, caches and the search catalog, outside the project, under ~/.anfra/repos/.
Organize as you like
Larger projects often nest models and datasets by business domain (for example marketing/models/). anfra finds AML files by their extension, not by folder, so models/ and datasets/ are just the starting point. Apps must stay under apps/.