Skip to content
fwozenstart free

merge & deploy freezes for GitHub · v1.0

Stop the merge.
Not the team.

Fwozen is a code freeze for a whole GitHub organisation. Turn it on for a release window, a holiday or an incident, from the web app, Slack, the REST API or a schedule. Every open pull request in scope gets a failing fwozen check until somebody lifts it, and one hotfix can still go through with a reason attached.

free · 5 private repos · no per-user pricing
scheduling, slack and the api are in the free tier
never reads your code

the problem

You already have a code freeze. It isn’t a control.

  • #releases topic

    FREEZE — DO NOT MERGE. Works until somebody merges anyway.

  • 30 × settings pages

    Hand-edited branch protection, at 5pm on a Friday, by an admin.

    Rulesets, and the free commands →

  • cron.freeze.sh

    Somebody wrote it. It broke in December, quietly.

None of them can tell you whether the freeze was in force, who lifted it, or why.

rulesets

You could do this with GitHub rulesets. Here’s where it stops.

  • Turn it on at 17:00 Friday, off 09:00 Monday

    github rulesets

    No time dimension exists. A human with a reminder, or a script you own.

    fwozen

    A recurring schedule, timezone- and DST-correct. In the free tier.

  • Let a non-admin freeze during an incident

    github rulesets

    No, changing a ruleset is an admin action.

    fwozen

    Freezing is a Fwozen permission. The Release Manager role needs no repo admin.

  • Let one hotfix through, with a record

    github rulesets

    Add the person to bypass_actors and hope somebody remembers to remove them.

    fwozen

    A per-PR exception with a required reason and a TTL that expires itself.

  • Show an auditor who froze main on 23 December, and why

    github rulesets

    The org audit log names who changed the ruleset. It carries no reason and no TTL.

    fwozen

    Append-only log with an actor, a source, a required reason, a timestamp and every exception.

Three repos and one admin? Use rulesets, with our blessing. The other five rows, free commands included →

a freeze

Three ways a freeze starts. One board it lands on.

A freeze means no pull request in its scope can merge. A thaw lifts it. Both carry an actor, a reason and a timestamp.

on a schedule
A recurring window or a one-off date, timezone- and DST-correct. Free tier.
right now
Pick the repositories, type a reason, freeze. It lands on every blocked pull request and in the log.
one exception
Let one pull request through, with a reason and a time limit that expires itself. Team plan.

1 freeze active

acme

Frozen branches

24

Watched branches

31

Blocked PRs

12

Worst enforcement

Verified

Active freezes
acme · org-wideFrozen

24 branches

Release freeze for 4.2. Cutting Thursday morning.

Frozen by
Priya Raman @praman from the dashboard
Thaws in
2d 04:11:38
Started
3 hours ago
Blocked
12 open pull requests
Exceptions allowedBlocks deploys
illustration of the dashboard · fictional org · built from the components the app renders

deploys

The freeze doesn’t stop at the merge button.

A merge freeze that lets a deploy through is half a control. The gate is fwozen/gate-action, plus GET /v1/freeze-state for pipelines that aren’t GitHub Actions. It refuses the deploy while a freeze is on.

Both work on every plan, Free included. Team, $29/mo, adds fwozen/deploy-gate, a second required check you turn on per branch. A job that never calls the gate is never gated. How deploy gating works →

.github/workflows/deploy.yml
- name: Check the freeze
  uses: fwozen/gate-action@v1
  with:
    token: ${{ secrets.FWOZEN_TOKEN }}
    environment: production

# Fails while a freeze is in force.

scope

Eight repository and org permissions. Not one call for your file contents.

checkswriteCreate and update the fwozen check run that blocks the merge.
statuseswriteThe legacy fwozen/status mode, for orgs still on classic branch protection.
pull_requestsreadList open pull requests so we know which head SHAs to write to.
contentsreadGitHub requires it to deliver push events and to read the default branch ref.
metadatareadRepository names and visibility. Mandatory for every GitHub App.
merge_queuesreadSee a pull request queued to merge, so it cannot slip through a freeze.
Organization membersreadVerify that the person clicking Freeze is in your org.
administrationwriteon approvalWrite the one rule that makes the fwozen check required on a branch you protect, with the App’s own short-lived token. No GitHub credential of yours is stored or used.

Installing grants every permission Fwozen asks for, repository administration included. Fwozen never asks for contents: write and never reads your code. Every API call we make, itemised →

agents

Prefer a terminal, or an agent?

The CLI, the REST API and an MCP server are all in the free tier. An agent can take an organisation from nothing to an enforced freeze, with a person there only for consent. What agents may do here →

The CLI installs with curl -fsSL https://fwozen.com/install | sh. One file, Node 24 or newer, checked against a published sha256. It is not on npm, so npx fwozen does not work yet.

price

Priced so you don’t have to ask anyone.

free$0

5 private repos · scheduling, Slack and the API included

team$29/mo

Unlimited private repos · fwozen/deploy-gate · per-PR exceptions

business$99/mo

Unlimited orgs · Release Manager role · two-person exceptions · audit export

The whole table, by plan →

start

Freeze something this afternoon.

Install the app. Make the fwozen check required. Fwozen writes that rule where your installation has granted it, and shows you the exact values where it has not. Then watch a two-minute freeze land on a real branch and thaw itself. If it isn’t obviously useful in ten minutes, we would rather you didn’t pay us.