Branches
Branches
A branch is a named, isolated slice of a project’s configuration. Every
workflow, DUT, storage item, and label belongs to exactly one branch. This
mirrors the branches in your version-control repository: the configuration on
your main branch can differ from the configuration on a feat/... branch,
and jobs triggered from each land against the matching branch.
A project holds branches, and each branch holds its own configuration:
Branch Types
A branch has a type that records how it was created.
| Type | Created by | Typical use |
|---|---|---|
git | A VCS webhook push or merge | Configuration tracked in your repository, updated automatically on every push. |
archive | Managed by the server | Holds the configuration and jobs of removed branches. Not created or targeted directly. |
Every branch you work with is a git branch — it mirrors a branch of your
repository. The archive type is internal and never a run target.
The Default Branch
Each project has exactly one default branch. When a trigger does not name a
branch, the server resolves the lookup against the default branch. The default
is normally the git branch matching your repository’s default branch (e.g.
main).
The Archive Branch
Each project has a single, server-managed archive branch of type archive.
You never create, push to, or trigger jobs against it directly — it exists so that
nothing is silently lost when a branch goes away.
When you delete a branch (for example by deleting the branch on your remote, see Lifecycle), the server does not discard that branch’s data. Instead it moves the branch’s dependents — workflows, DUTs, storage, and the jobs that ran against them — onto the project’s archive branch. This keeps historical results reachable:
- Job history survives branch deletion. Reports and logs for jobs that ran on a deleted branch remain accessible rather than disappearing with the branch.
- It is read-only in practice. New jobs are never scheduled against the archive branch; it only accumulates the leftovers of removed branches.
- Archived DUTs are kept for the record, not for use. They stay around so the jobs that ran on them remain readable, but no job is ever scheduled onto them and they do not count towards your available hardware.
- One per project. There is at most one archive branch per project, and it is created and maintained automatically.
If you need to revive archived configuration, push it again onto a live git
branch — the archive itself is not a working branch.
Lifecycle
- Creation — A
gitbranch is created automatically the first time a webhook push for that branch reaches the server. - Update — Each subsequent push to the same branch updates that branch’s configuration in place.
- Deletion — Deleting a branch on the remote sends a delete webhook; the
server removes the corresponding
gitbranch (best-effort) and moves its dependents to the archive branch so jobs and history stay reachable.
How Branches Are Selected
The branch a job runs against depends on the trigger:
| Trigger | Branch resolution |
|---|---|
| VCS webhook (GitHub/GitLab) | The pushed branch, as a git branch (full ref name, e.g. feat/new-board). |
| GitHub Action / GitLab CI | The BRANCH input, defaulting to the detected ref. |
fwci job / fwci exec | -b/--branch, else the local git branch, else interactive. Falls back to default. |
REST POST /v0/job | branch_name, else the project default branch. |
See Also
- Workflow Configuration — workflows are scoped per branch
- Running a Job — selecting a branch when triggering