docs
all pages (13)
every page is public.
no signup wall.
llms.txt · llms-full.txt · openapi.json
api reference
docs
Install, freeze, and let the hotfix through.
About ten minutes from nothing to a branch that cannot be merged to. Every page here is public and static, so reading how the freeze engine behaves before you install anything is the correct order.
13 pages · no signup wall
I’m setting up
Install the app, enable repos, and make the fwozen check required.
I want to understand the model
What a freeze is, how a check becomes a block, and what Fwozen verifies against GitHub.
I’m integrating
The REST API, the deploy gate, the CLI, and the compatibility namespace for older freeze tools.
Quickstart
Install, make the check required, then freeze. This is the whole path from nothing to a branch that cannot be merged to, and every command below runs as written.
step 1 — install
Start free — the first step of setup is the GitHub App install, where you pick the repositories Fwozen watches. It asks for eight repository and organisation permissions, and none of them can write to your code. The account permission is the other axis, granted by the person signing in rather than by the organisation. Sign-in requests the
read:useranduser:emailscopes, and the App’s own account permission is one row, email addresses at read. Neither reaches a repository, and the address is only how Fwozen tells one person from another. Installing grants every permission Fwozen asks for, repository administration included. An installation made before Fwozen asked for it keeps its old set until an organisation owner approves, and some never will. The full inventory carries every row, including repositoryadministrationand where its rollout stands.The CLI is optional and separate. It needs Node 24 or newer, adds nothing to your shell profile, and checks a published sha256 before it writes anything:
install the CLI curl -fsSL https://fwozen.com/install | shRead it before you run it — it is plain text at that URL. It verifies the sha256 of everything it downloads, and the same digest is published separately at
https://fwozen.com/cli/release.json, so you can check the two agree before piping anything into a shell.step 2 — make the check required
Fwozen writes the current
fwozenresult to every relevant commit, then does one of two things. On an installation that has granted it repositoryadministration: write, it writes the ruleset itself and reads it back from GitHub before saying it exists. Otherwise it opens GitHub’s Rules settings with the exact values to enter, you save one native rule, and Fwozen verifies it when you come back. /security says which installations have granted that. Either way the rule is the same object, and if you manage rules as code it is generated asgh apiand Terraform:require the fwozen check FWOZEN_APP_ID=$(curl -fsSL https://api.fwozen.com/.well-known/fwozen-app \ | jq -r .githubAppId) gh api -X POST repos/acme/api-server/rulesets \ -f name='fwozen' -f target='branch' \ -f enforcement='active' \ -F conditions[ref_name][include][]='refs/heads/main' \ -F rules[][type]='required_status_checks' \ -F 'rules[][parameters][required_status_checks][][context]=fwozen' \ -F "rules[][parameters][required_status_checks][][integration_id]=$FWOZEN_APP_ID"The
integration_idpins the required check to Fwozen’s GitHub App. Without it any app can satisfy the check, and Fwozen reports the branch as needing attention rather than verified.step 3 — get a key
Only if you are freezing from a script. In the dashboard, the quick-freeze band on the freezes tab is one click and needs no key at all. Settings → API keys → Create key → tick
freeze:writefor the command below, orfreeze:readfor a deploy gate → copy the secret, which is shown once. Thenexport FWOZEN_TOKEN=fwz_live_…. Minting a key needs the owner or admin role.step 4 — freeze
freeze the whole org for two minutes curl -X POST https://api.fwozen.com/v1/freezes \ -H "Authorization: Bearer $FWOZEN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"scope":{"kind":"org"}, "reason":"Testing Fwozen", "durationMinutes":2, "impactAcknowledged":true}'Two fields carry their weight there.
Content-Typeis required becausecurl -ddeclares a form body on its own.impactAcknowledgedis how an org-wide freeze says it accepts an uncalculated blast radius; sendpreviewedRepoCountfromPOST /v1/scope/previewinstead to record the number you actually saw. Either way it is in the audit log, and neither changes what gets frozen. A single-branch freeze needs neither.step 5 — check a pull request
Open any pull request in scope. The
fwozencheck is failing with your reason on it, and the merge button is disabled. In two minutes it lifts itself.
machine-readable
The OpenAPI document is at api.fwozen.com/v1/openapi.json and there is an llms.txt at the root of this site — llms-full.txt is the same document with every page here and the public route table appended. Both are served from this origin and from the API, byte for byte.