Project Anatomy
The files and folders in an Embedr project: the manifest, firmware, PCB sources, mechanical designs, specs, local state, and what to commit.
An Embedr project is an ordinary folder. embedr.yaml at its root marks it as a project and tells Embedr which parts it has. Everything else is plain files you can open in any editor, track with Git and move between machines.
A complete project
A project created as Electronics + firmware that has grown a board, an enclosure and a plan looks like this:
plant-monitor/
├── embedr.yaml # project manifest
├── platformio.ini # firmware build environments
├── .gitignore
├── src/
│ └── main.cpp # firmware entry point
├── include/ # optional headers
├── lib/ # project-local libraries
├── pcb/
│ ├── pcb.toml # PCB workspace settings
│ ├── main.zen # schematic source
│ ├── .gitignore
│ └── layout/
│ ├── layout.kicad_pcb # board layout
│ └── layout.kicad_pro # KiCad project and design rules
├── mechanical/
│ ├── enclosure.cad.json # mechanical design manifest
│ ├── enclosure.py # generator source
│ ├── imports/ # STEP and other files designs import
│ └── assembly/
│ └── enclosure-v1.json # assembly guide
├── specs/
│ └── plant-monitor.md # Plan Mode spec
└── .embedr/ # Embedr's local project state
No project has to contain all of this. Each part appears when you or the agent create it.
What each project type starts with
| Created as | Files |
|---|---|
| Electronics + firmware | embedr.yaml, platformio.ini, src/main.cpp (or main.c), lib/, .gitignore, and the pcb/ workspace |
| Electronics only | embedr.yaml (with project.kind: electronics), .gitignore, and the pcb/ workspace |
| Import KiCad | An electronics project whose pcb/ holds Zen sources converted from your KiCad design |
| Open Folder / Clone Repository | Your existing files. If there is no embedr.yaml, click Initialise Agent in the chat and the agent writes one without replacing your source. |
New projects go to ~/EmbedrProjects/<name>/. Names keep letters, digits, - and _.
The firmware entry file depends on the target's framework:
| Framework | File | Entry point |
|---|---|---|
| Arduino | src/main.cpp |
setup() and loop() |
| ESP-IDF | src/main.c |
app_main() |
| Zephyr | src/main.c |
main() |
| Mbed | src/main.cpp |
main() |
| STM32Cube, CMSIS, libopencm3, SPL | src/main.c |
main() |
embedr.yaml
The manifest names the project and describes its firmware target, custom build commands and component list. A new Arduino Uno project starts with:
manifest_version: 1
name: plant-monitor
version: 0.1.0
board:
platform: atmelavr
board: uno
framework: arduino
build:
build_flags: []
lib_deps: []
monitor_speed: 115200
components: []
connections: []
Embedr adds to it as you work: picking a target writes a capabilities.firmware block, processing a datasheet adds a datasheets list, and sharing the project adds a project.id. See Project manifest for every field.
Firmware: platformio.ini, src/, include/, lib/
Firmware builds use PlatformIO. platformio.ini holds one [env:...] section per build environment, and default_envs names the one the toolbar selects:
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
[platformio]
default_envs = esp32
Picking a target in the toolbar adds or updates its environment here. Target Settings (upload speed, monitor speed and so on) are written into the active environment. You can also edit the file by hand; Embedr reads it as the source of truth for PlatformIO projects. See Targets and environments.
src/: your firmware sources.include/: headers, if you keep them separate.lib/: libraries that belong to this project. Libraries from the PlatformIO registry go inlib_depsinstead. See Dependencies and libraries..pio/: created by the first build. It holds downloaded libraries and build output, and is ignored by Git.
Projects that build with Make, CMake, Zephyr west or another tool instead of PlatformIO declare their commands in embedr.yaml; see custom firmware actions.
Hardware: pcb/
The pcb/ folder is the electronics workspace.
| File | Purpose |
|---|---|
pcb.toml |
Workspace settings, including which .zen file is the board ([board] path) |
main.zen |
The circuit in Zen, Embedr's hardware description language. The Schematics tab draws it. A new workspace starts with Board(name="main", layout_path="layout", layers=2). |
Other .zen files |
Modules and sub-circuits the board imports |
layout/layout.kicad_pcb |
The board layout, generated from the schematic and then placed and routed. Open it in the Board tab or in KiCad. |
layout/layout.kicad_pro |
KiCad project settings, including the design rules for your fabricator |
.pcb/ |
Build cache for the PCB tools. Ignored by Git. |
Larger projects can keep boards in subfolders (for example pcb/boards/main/); pcb.toml says which one is active. See Schematics and PCB and Board and KiCad.
Next to the board file, Embedr keeps a .embedr-board/ folder with check results, cached 3D models, generated documents (deliverables/) and manufacturing readiness. It is regenerated as needed and ignored by Git. Fabrication files you export for ordering are described in Manufacturing and ordering.
Mechanical: mechanical/
| Path | Purpose |
|---|---|
mechanical/<design>.cad.json |
The design manifest: name, parameters (with units and limits), assumptions, checks, and the board or files it builds around |
mechanical/<design>.py |
The generator that builds the 3D model |
mechanical/imports/ |
STEP, STL, DXF, image and other files a generator reads, or an imported STEP model used directly |
mechanical/assembly/<guide>-v<N>.json |
Step-by-step assembly guides. Each new version is a new file; older versions are kept. |
Built revisions of a design (STEP, previews, drawings) are stored with your account, so the Mechanical tab can show history without filling the project folder. See Mechanical design.
Plans: specs/
Plan Mode keeps one Markdown spec per plan under specs/, with the intent, requirements marked confirmed, assumed or open, decisions, what is out of scope and the build plan. It is the only place the agent writes while in Plan Mode. Commit specs alongside the code they describe. See Plan Mode.
Embedr's local state: .embedr/
.embedr/ in the project holds state Embedr and the agent keep for this project:
| Path | Contents |
|---|---|
.embedr/datasheets.json |
The list of datasheets processed for this project |
.embedr/component-assets.json |
Where installed component symbols, footprints and 3D models came from |
.embedr/agents/ |
Your own helper profiles for this project. See Helpers. |
.embedr/agent-artifacts/ |
Files the agent saved for itself, such as long pasted requests or backups it made before an edit |
The default .gitignore ignores all of .embedr/. If you want teammates to share helper profiles or the component provenance file, add exceptions:
.embedr/
!.embedr/agents/
!.embedr/component-assets.json
Chat threads are not in the project folder. On desktop they live in ~/EmbedrProjects/.embedr/<project-name>/, outside every project.
What to commit
Commit:
embedr.yaml,platformio.ini,src/,include/,lib/pcb/sources:pcb.toml,.zenfiles,layout/*.kicad_pcb,layout/*.kicad_pro, and any.kicad_drurule filesmechanical/: manifests, generators,imports/andassembly/specs/and your own docs
Leave out (the default .gitignore already does):
.pio/,.pcb/,.embedr/,.embedr-board/- KiCad local files:
*.kicad_prl,*.lck,fp-info-cache,*-backups/,*.bak .envfiles (.env.exampleand.env.templateare kept)- Editor and OS files:
.vscode/,.idea/,.DS_Store build/,dist/,out/,node_modules/
When you share a project, Embedr also skips secret-looking files and anything your .gitignore excludes. See Sharing projects.
Managed and linked projects
The home screen tracks two kinds of project:
| Kind | How it got there | Rename on the home screen | Trash button |
|---|---|---|---|
| Managed | Created by Embedr in ~/EmbedrProjects/ |
Yes (Rename project) | Delete project: deletes the folder from disk. This cannot be undone. |
| Linked | Open Folder on an existing folder | No | Remove from Embedr: removes it from the list. "The folder will stay where it is on disk." |
Either way, removing a project from Embedr also deletes its chat history. Commit or copy anything you need first.
In the browser, projects are cloud copies rather than folders. See Embedr in the browser.
Older projects
Projects from early versions of Embedr have a root .ino file and no embedr.yaml. The toolbar shows Migrate Project ("Migrate legacy .ino project to embedr.yaml") for them; Compile and Flash are hidden until you migrate. Migration creates embedr.yaml and a src/ layout PlatformIO can build. Commit first so you can review the change.
Older projects may also have a datasheets/ folder with converted Markdown datasheets, or an .embedr_chat/ folder of old chat transcripts. Both are safe to keep.
