Builds
You pushed a commit, or pressed Build, and a build appeared. This page covers what actually ran, what came out of it, and where to read the result.
A build is one dispatch of the deploy workflow in the project's mirror repository. The mirror lives in a platform-owned org: your source is checked out into the runner, and every Actions minute burns there, never in your repository.
What a build produces
Each enabled browser carries its own installCommand, buildCommand and outputDirectory, and each emits its own artifacts:
| Artifact | Contents |
|---|---|
<browser>-extension.zip | The packed extension |
<browser>.json | Build metadata |
<browser>.integrity.json | The integrity record, see Integrity |
The enabled browsers are chrome, edge and firefox. Builds also emit executables per browser. Safari artifacts come from the store lane, not from the build dispatch.
What starts a build
Four triggers exist: console, webhook, release, api. Only console counts as attended. Unattended builds are the paid boundary, see Plans and limits.
Push and PR webhooks are debounced 75 seconds. Every trigger resolves to one of three dispatch decisions: dispatch, debounce, drop-duplicate.
Concurrency is keyed per ref with cancel-in-progress. A new push cancels the older build on the same ref instead of billing both.
Reading a build
| Route | Returns |
|---|---|
GET /api/projects/{id}/builds | The build list |
GET /api/projects/{id}/builds/{buildId} | One build |
GET /api/projects/{id}/builds/{buildId}/artifacts | Its artifacts |
GET /api/projects/{id}/builds/{buildId}/logs | Logs, streamed from the CI jobs and grouped by browser |
GET /api/projects/{id}/builds/{buildId}/integrity/{browser} | The integrity record for one browser |
GET /api/projects/{id}/usage | Build usage |
GET /api/projects/{id}/builds/live-status | Live status of in-flight builds |
Environments and rebuilds
Every build is stamped with the environment it compiled in: staging by default, production when the trigger asks for it. Promotion checks the stamp against the target channel, see Promote gates.
Rebuilding a commit whose artifacts a live channel serves is refused with 409 REBUILD_REPLACES_LIVE_ARTIFACT. Pass force: true to overwrite anyway. A rebuild that takes a staging build to production is recognized as an upgrade and passes without force.
When it fails
- Pushed, nothing built. A push within 75 seconds of the previous one is decided
debounceordrop-duplicate, notdispatch. Wait it out, or dispatch from the console or the API. - Build cancelled. A newer push on the same ref cancelled it. The newer build has the ref; only one is billed.
- Webhook or API trigger refused. Unattended builds sit behind the paid boundary. See Plans and limits.
409 REBUILD_REPLACES_LIVE_ARTIFACT. A live channel serves the artifacts you are about to replace. Build a new commit, or passforce: trueif replacing them is the point.
