FAQ
Is Zoo free?
Yes. No editions, no licence key, no licensing code in the plugin.
Will it delete something by accident?
It cannot delete anything you have not selected and submitted. Beyond that: the default is Craft's trash rather than a permanent delete, every element is re-proved immediately before it goes, a finding whose element has been edited since the census is refused, a census older than an hour cannot be acted on, a permanent delete has to be armed by typing the number of rows selected, and a database backup is taken first.
The honest answer is that any tool that deletes things can be wrong. Zoo's design goal is that being wrong requires ignoring a screen that told you what it had and had not checked.
Does it make outbound requests?
No. Not at install, not during a census, not ever. Everything it knows it works out from your database, your templates and your schema.
How is this different from Craft's own garbage collection?
Craft's GC removes things Craft itself created and no longer needs — expired sessions, orphaned
search rows, elements past softDeleteDuration. It has no opinion about your content. Zoo audits
the content: the assets, entries, categories and tags nothing points at any more.
How is this different from Nuke?
Nuke deletes what you name — a section, a volume, a group — with its drafts, revisions and relations, and sweeps the housekeeping tables on a schedule. Zoo finds what nobody named.
Nuke's question is "delete all of this". Zoo's is "what is nobody using". They compose, and neither needs the other.
Why does it report a page that is obviously live?
It should not, and by default it does not: an entry with its own URL counts as reachable. If you
turned urlCountsAsReachable off, you asked for the other list — pages linked from nowhere on the
site — and every page reachable only by its URL is in it.
Can I add my own audit?
Yes. Implement AuditInterface — in practice extend BaseAudit and write one candidates()
method — and register it on Audits::EVENT_REGISTER_AUDITS. It gets the probes, the keep list, the
freshness checks and the delete guards for free.
An audit deliberately cannot decide whether its own candidates are referenced. That is one service for the whole plugin, so "unreferenced" means one thing everywhere.
Does it work with Commerce / Formie / Navigation / a plugin I wrote?
Yes, without knowing they exist. Zoo reads information_schema for every column with a foreign key
into elements and asks each one, so a variant sitting in an old order or an entry held by a
navigation node keeps itself alive automatically.
The one thing that will not be seen is a plugin storing element IDs in a column with no foreign key — a JSON blob of settings, say. Turn on template scanning, check the evidence on a few findings, and keep-list anything that turns out to be held that way.
Will it slow my site down?
No. Zoo does nothing during a front-end request. It has no response filter, no Twig hook and no event listeners on saving. It runs when you press the button.
Can I run it on production?
Yes, and reading the census is the safe half. zoo/census/report costs nothing. Consider giving
production a smaller maximumBatchSize and leaving deleteMode on trash.
What about multi-site?
Candidates are per element, not per site row, and every site's URI is given to the probes. An entry that is an orphan in one site and linked in another is not an orphan.
Does deleting a field really delete its content?
Yes, everywhere, permanently, in every site — and it is a project-config change, so it deploys. That is why the schema audits are off by default.
What happens if I uninstall Zoo?
Its three tables are dropped and the project-config entry goes. Nothing Zoo found or deleted is affected — the deletions were Craft's own.