murus

See what a Cloudflare deploy will change, before it changes it.

$ murus plan

admin-api  account 00000000  no environment
./wrangler.jsonc

  settings
  ~ compatibility_date  2025-01-01 → 2025-11-01

  bindings
  + RATE_LIMITS   kv_namespace
      rate-limits-prod (0000000000000000000000000000aaaa)
  ~ ADMIN_DB      d1
      prod-admin (9f3c2211-4d5e-6f70-8192-a3b4c5d6e7f8)
    → staging-admin (aaaa1111-bbbb-2222-cccc-333344445555)
  - LEGACY_CACHE  kv_namespace old-cache (0000000000000000000000000000cccc)

  vars
  - LEGACY_FLAG  true

  !  LEGACY_FLAG is set on the deployed Worker but absent from config, and will
     be deleted.
     Add them to `vars`, or set `keep_vars = true` in the config to preserve
     them.

     1 secret set outside config and left untouched. STRIPE_KEY

1 to add, 2 to change, 2 to destroy.

You ran a command that cannot change anything, and got that. To see the same list from wrangler you have to start the deploy, and it only prints when the difference destroys something.

Install

curl -fsSL https://murus.dev/install.sh | sh

Picks the binary for your platform, checks it against the published SHA256SUMS, and refuses to install on a mismatch. Read it first, the way you should with any installer.

No state file

Cloudflare already returns a deployed Worker's complete configuration, so plan is a structural comparison against live infrastructure. There is no .tfstate to store, share, lock or drift, and nothing is deployed into your account to hold state on your behalf. Delete ~/.config/murus and murus is gone.

Least privilege, derived

wrangler login asks for 28 OAuth scopes to deploy a Worker that needs six. Your config already declares every binding, so murus computes the minimal set and shows you the difference on a credential you already hold.

A status code is not proof

Three of the four Cloudflare create endpoints tested return 200 while silently dropping fields they do not recognise. So apply reads the resource back afterwards and checks it against what the plan promised.

Pre-1.0

Workers only for now, and minor versions may break things. Open source under Apache-2.0. Read the source.