Skip to content
fwozenstart free

docs / getting-started

Your first freeze

Freeze a branch for two minutes, watch the fwozen check land on every open pull request, and let it thaw itself.

complete · updated 29 july 2026

The safest way to see Fwozen work is a two-minute freeze on a real branch. It lifts itself, so the worst case is that a few pull requests wait two minutes.

Freeze it

Three equivalent ways, and all three end up in the same audit log with a real actor. Start with the first one.

From the dashboard

Open Freezes. The Quick freeze band at the top is four buttons: freeze every enabled repository or one of them, merges or deploys. One click each, no dialog. A quick freeze holds until somebody lifts it, and Lift on the freeze underneath is the undo. For a freeze that ends on its own, use Scheduled or scoped freeze… instead and set a duration; the impact preview there tells you how many repositories and open pull requests are about to be affected before you commit.

From the API

You need a key first: Settings → API keys → Create key, tick freeze:write, and copy the secret, which the dashboard shows once. Export it as FWOZEN_TOKEN. The branch id comes from GET /v1/branches, which lists every branch you watch:

Find the branch you want to freeze
curl -s https://api.fwozen.com/v1/branches \
  -H "Authorization: Bearer $FWOZEN_TOKEN"
# => { "data": [ { "id": "wbr_7Fq2Kd9mXbT4hLwR",
#                  "repoFullName": "acme/api-server", "branch": "main", … } ] }
Freeze that branch for two minutes
curl -X POST https://api.fwozen.com/v1/freezes \
  -H "Authorization: Bearer $FWOZEN_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "scope": { "kind": "branches", "branchIds": ["wbr_7Fq2Kd9mXbT4hLwR"] },
    "reason": "Testing Fwozen",
    "durationMinutes": 2
  }'

The Content-Type header is not optional: curl -d declares a form body on its own, and the API answers 400 unsupported_content_type to that. An org-wide or glob scope needs one more field, because a freeze that size cannot be created blind; see impact_preview_required.

From the CLI

The same freeze, from a terminal
fwozen freeze acme/api-server --branch main \
  --duration 2m --reason "Testing Fwozen"

The CLI page covers installing it and signing in. The Slack app takes the same freeze as /fwozen freeze api-server 2h "4.2 cut", and it is free on every plan.

What happens next

  1. Fwozen writes the fwozen check to the head commit of every open pull request in scope, riskiest first: anything queued, on auto-merge, or already approved and green. You can watch the fan-out complete in the dashboard. We are not publishing a propagation time until the load test has run and we have a measured number to publish.
  2. Each pull request shows the check as failing, with your reason verbatim: Frozen by @you · “Testing Fwozen” · thaws in 1m 48s.
  3. Any pull request already in a merge queue has its live merge-group head failed, so it cannot merge behind the freeze.
  4. At expiry the freeze lifts itself, the checks flip to passing, and merges flow again.

Thawing

Every freeze can be lifted from the dashboard, Slack, or the API, and lifting is never blocked by a failed billing state or an in-flight fan-out. A freeze you cannot lift is a worse bug than a freeze that did not apply.