Update Zombie 🧟

All these updates have turned you into a zombie.
Get your own zombie instead.

Seventeen plugin updates every morning. Seventeen changelogs you are never going to read. Update Zombie reads them for you — not the changelog, the code — and installs the ones that actually close a hole.

WordPress 7.0+ · PHP 7.4+ · about a cent per update analysed

A pixel-art zombie eyeing the WordPress logo

What it actually does

When WordPress offers an update, Update Zombie:

  1. Downloads the package to a temp directory. Nothing is installed yet.
  2. Diffs it against what is actually running on your site — so local hacks show up too.
  3. Strips the noisevendor/, node_modules, minified bundles, images, translations, and (for core) your wp-config.php, which is never read.
  4. Scans the diff for facts, no AI involved: lines changed, styling touched, HTML structure modified, new outbound HTTP calls, database schema changes, security checks added or removed, risky PHP functions. Exact, free, same every time.
  5. Sends the interesting parts to a model via OpenRouter, which answers one question with evidence: does this code visibly close a vulnerability? Not “does the changelog say security” — the changelog says security when someone fixed a typo in an esc_html() call.
  6. Derives the verdict from the evidence. The model lists what it found and where. If nothing cites a file, it is not a security fix, whatever the prose says.

Then, in Guarded mode:

  • Security fix, confident, cited → installed automatically, usually within ten to twenty minutes of WordPress.org publishing it.
  • Anything else → left alone. Your existing auto-update settings apply, exactly as before. Update Zombie never widens what WordPress would have done on its own.
  • Judged actively bad → held back from unattended installation. The Update now button still works.

Stop panicking about updates. Let the zombie eat them.

Three modes

Advisory changes nothing about your site. It cannot strand you on a vulnerable version by being wrong, because it never decides anything. Start there, read a few reports, then turn on Guarded when you trust it.

Advisory

the default

  • Security fixes — reported
  • Good updates — reported
  • Bad updates — reported

Watch it work. Nothing on your site changes.

Guarded

the sweet spot

  • Security fixes — auto-installed
  • Good updates — your settings
  • Bad updates — held

Holes get closed while you sleep. Everything else behaves exactly as it does today.

Autopilot

full undead

  • Security fixes — auto-installed
  • Good updates — auto-installed
  • Bad updates — held

The zombie eats everything it judges safe.

What a report looks like

Give 4.16.7.1 → 4.16.7.2                                  Security fix · 90%
Give 4.16.7.2 fixes PHP object injection and stored XSS — apply it, but back up first.

  8,412 lines changed · Security checks added · Risky PHP functions · New files added

  [90%] PHP object injection blocked when reading session data   includes/class-give-session.php
  [90%] Serialized payloads rejected in donation user_info        includes/process-donation.php
  [85%] Stored serialized object payloads scrubbed from meta      src/Donations/Migrations/…
  ...

  MEDIUM  Migration loads entire tables into memory unbatched
  LOW     Quiet database-wide data rewrite not described in release notes

Every finding names a file. The chips on the top line are computed from the diff, not generated — they are there even if the AI call fails.

Setup

  1. Install and activate. Needs WordPress 7.0+ (it uses core’s AI Client API) and PHP 7.4+.
  2. Get an OpenRouter API key.
  3. Put it in wp-config.php:
    define( 'UPDATE_ZOMBIE_OPENROUTER_KEY', 'sk-or-v1-…' );

    Or paste it into the settings screen. The constant wins if both exist, and keeps the key out of your database backups.

  4. Pick a mode. Advisory to watch, Guarded to let it work.

That is it. The default model is z-ai/glm-5.3-flash. A typical update costs well under a cent to analyse; a big one, a couple of cents.

Why WordPress needs a plugin for this

WordPress 7.0 shipped an AI Client API — a provider registry, an HTTP adapter, a prompt builder. It shipped no providers and no key storage. So Update Zombie registers OpenRouter into core’s registry itself, which means any other plugin using wp_ai_client_prompt() can use it too.

Things it does not do

  • Read the whole internet. It reads a filtered diff, capped at 300,000 characters by default. The report lists what it could not fit. (We measured: sending more makes the analysis worse, not better — a 1 MB prompt returned a confident summary with zero cited findings, at thirteen times the cost of the same update at 300 KB.)
  • Install on hearsay. A “security fix” with no file cited never auto-installs, in any mode.
  • Install a major WordPress release unattended, unless you explicitly opt in. Point releases only.
  • Stop you. Holding an update back only affects unattended installs. Manual updates always work.
  • Guarantee anything. It is a model reading a diff. It is a very good second opinion. It is still an opinion.

Without AI

Switch the engine to No AI and it still works: changelog corroborated against the pattern scan. Nothing leaves your site, nothing costs anything. It can tell you security checks were added; it cannot tell you they are correct. By default it reports rather than installs.

For developers

Hooks worth knowing:

// Force advisory mode from an mu-plugin, regardless of settings.
add_filter( 'update_zombie_mode', fn() => 'advisory' );

// Use a stronger model for the findings step only.
add_filter( 'update_zombie_model', fn( $model, $step ) =>
    'findings' === $step ? 'anthropic/claude-sonnet-5' : $model, 10, 2 );

// React to a verdict.
add_action( 'update_zombie_verdict_recorded', fn( $report, $verdict ) => /* … */, 10, 2 );

Analysis runs in two phases across separate cron ticks — download and diff on one, model calls on the next — so no single PHP request has to survive the whole job. A webhook (HMAC-signed) and email notifications are available in settings.

Licensed GPL-2.0-or-later. Same as WordPress. Same as your zombie.

Stop panicking about updates.

Free and open source. Grab it, read the code, let the zombie eat.