> This page is for version Release 2.3.
> For other versions, use one of these documentation indexes:
> - Release 3.0 (default): https://docs.nvidia.com/isaaclab/3.0/llms.txt
> - Release 2.3: https://docs.nvidia.com/isaaclab/2.3/llms.txt
> - Release 2.2: https://docs.nvidia.com/isaaclab/2.2/llms.txt
> - Release 2.1: https://docs.nvidia.com/isaaclab/2.1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/isaaclab/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/isaaclab/_mcp/server.

# Project Structure

There are four nested structures you need to be aware of when working in the direct workflow with an Isaac Lab template
project: the **Project**, the **Extension**, the **Modules**, and the **Task**.

![The structure of the isaac lab template project.](/isaaclab/_fern-files/isaaclab.docs.buildwithfern.com/904bdc13b651623007165f0c0cd6248c08ee8c3b939585f0178b5c558bce1572/assets/releases/2.3/static/setup/walkthrough_project_setup.svg)

The **Project** is the root directory of the generated template.  It contains the source and scripts directories, as well as
a `README.md` file. When we created the template, we named the project *IsaacLabTutorial* and this defined the root directory
of a git repository.   If you examine the project root with hidden files visible you will see a number of files defining
the behavior of the project with respect to git. The `scripts` directory contains the `train.py` and `play.py` scripts for the
various RL libraries you chose when generating the template, while the source directory contains the python packages for the project.

The **Extension** is the name of the python package we installed via pip. By default, the template generates a project
with a single extension of the same name. A project can have multiple extensions, and so they are kept in a common `source`
directory. Traditional python packages are defined by the presence of a `pyproject.toml` file that describes the package
metadata, but packages using Isaac Lab must also be Isaac Sim extensions and so require a `config` directory and an accompanying
`extension.toml` file that describes the metadata needed by the Isaac Sim extension manager. Finally, because the template
is intended to be installed via pip, it needs a `setup.py` file to complete the setup procedure using the `extension.toml`
config. A project can have multiple extensions, as evidenced by the Isaac Lab repository itself!

The **Modules** are what actually gets loaded by Isaac Lab to run training (the meat of the code). By default, the template
generates an extension with a single module that is named the same as the project. The structure of the various sub-modules
in the extension is what determines the `entry_point` for an environment in Isaac Lab. This is why our template project needed
to be installed before we could call `train.py`: the path to the necessary components to run the task needed to be exposed
to python for Isaac Lab to find them.

Finally, the **Task** is the heart of the direct workflow. By default, the template generates a single task with the same name
as the project. The environment and configuration files are stored here, as well as placeholder, RL library dependent `agents`.
Critically, note the contents of the `__init__.py`! Specifically, the `gym.register` function needs to be called at least once
before an environment and task can be used with the Isaac Lab `train.py` and `play.py` scripts.
This function should be included in one of the module `__init__.py` files so it is called at installation. The path to
this init file is what defines the entry point for the task!

For the template, `gym.register` is called within `isaac_lab_tutorial/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/__init__.py`.
The repeated name is a consequence of needing default names for the template, but now we can see the structure of the project.
**Project**/source/**Extension**/**Module**/tasks/direct/**Task**/**init**.py