You're shipping it
The review queue hands your plugin back over an unescaped echo or a missing nonce check. You hear about it days later, fix one line, and rejoin the queue at the end.
Catch that class of problem in seconds, before you submit.
Static analysis for WordPress plugins, themes and blocks
FledgePress reads a WordPress addon inside a sealed container and scores it out of 100 across five categories. Every point it takes off names the problem, the file, and the line.
Who it's for
So most WordPress code gets shipped, and gets installed, on trust. This replaces the trust with a report you can argue with.
The review queue hands your plugin back over an unescaped echo or a missing nonce check. You hear about it days later, fix one line, and rejoin the queue at the end.
Catch that class of problem in seconds, before you submit.
A client site runs thirty plugins by thirty authors. Install counts and star ratings say nothing about what the code does, and you are the one who carries it when something goes wrong.
Scan anything public before it reaches a site you're responsible for.
Whoever built the site is long gone. The plugins directory is full of code nobody has opened in years, some of it written in-house and never reviewed by anyone else.
Get a scored inventory with a file and a line against every problem.
How it works
No agent to install and no pipeline to wire up. Submit an addon and read the report.
Paste a public GitHub repo URL, or drop in a .zip of something you have not published. Nothing to install and no config file to write.
The addon is unpacked in a throwaway container with no network and hard memory and CPU caps. Its PHP is read as a syntax tree, never run.
Five category scores, each one 100 minus the findings against it, and the file and line for every finding you can go and fix.
What we check
Every addon meets the same 22 checks, so two scans of the same code always agree. They read a PHP syntax tree, which means commented-out code and strings that merely mention eval never cost you anything.
eval() runs a string as codeshell_exec() and other shell execution$wpdb query built from a raw string$_POST handled without nonce verificationwp_enqueue_scripts not used to enqueue assetswp_remote_get() with no cachingmysqli_query() used instead of $wpdb<? short open tagssplit() removed in PHP 7split() unavailable on PHP 7 and laterTested up to missing from readmeRequires at least missing from readmeRequires PHP missing from readmeHow scoring works
There are two sums behind the number, and both of them are on this page. Nothing else happens to your score on the way out.
Isolation
We treat submitted code as hostile until proven otherwise. This is not a promise about how we behave. It is what the container your scan runs in will actually allow.
docker run --rm \ --network none \There is no network device inside to reach --memory 512m --cpus 1 \Ceilings the kernel enforces, not ones we ask for --tmpfs /extract:size=50m \Capped, in memory, and gone when the scan ends -v upload.zip:/work/upload.zip:ro \Your zip, mounted read only fledgepress-scanner:latestAn image that ships no PHP runtime--network bridge, so it can clone the repo and nothing else.No. The scanner parses your PHP into a syntax tree and inspects the tree. There is no PHP runtime in the scanner image, so there would be nothing to execute it with even if something tried to.
No. The addon is unpacked inside a container that is destroyed when the scan ends, and an uploaded zip is deleted as soon as the job finishes. What we keep is the report: the score, the findings, and the file and line each one came from.
No, and we would rather say so plainly. A score of 100 means this scanner found none of the things it knows how to look for. Static analysis cannot understand intent and cannot see a logic flaw. Treat the report as a floor to clear, not a certificate to hang on the wall.
Those are excellent, and they are what a reviewer runs. They hand you a list of violations. FledgePress gives you one number you can watch move, across five categories, with a fixed cost per finding, so you can tell whether a change made things better or worse. Running Plugin Check and PHPCS inside the scan is the next thing on our list.
Yes. Upload the .zip, up to 10 MB, and no account is needed for your first scan either way. The zip is unpacked inside the container and deleted from disk as soon as the scan finishes, so nothing has to be published for us to read it.
Yes. Create an API token in your dashboard and post to the same endpoint the site uses, with the token as a bearer header. The score-diff-on-pull-request flow is specified but not built yet, so for now it is a normal HTTP call you can wire into any pipeline.
It happens, and you should be able to tell. Every finding names the check that produced it and the exact line that triggered it, so you can look at the code and judge it yourself. Nothing sits behind a weighting you cannot inspect.
Yes. A scan costs us a container and a few seconds of CPU. Scanning public addons stays free permanently, because a score nobody can check is not worth much.
One free scan without an account, a repo or a zip. Sign up for three a day and every report kept in one place.