Dragon Speed Doctor – Find What Slows Your Site Down

Description

Every slow WordPress site raises the same question: which plugin is doing this? Dragon Speed Doctor answers it with measurements, not guesswork.

Press one button and the doctor times your site over a few minutes of internal test requests, with each plugin briefly left out of those test requests only, then tells you what each plugin actually costs:

  • Per-plugin timing, front-end and wp-admin: “Adds about 180–260ms to page loads.” Real measured ranges, never invented precision. When results are too noisy to trust, it says so instead of making a number up.
  • Asset audit: every script and stylesheet on your pages, attributed to the plugin that ships it, with sizes and render-blocking flags. Sometimes a plugin’s PHP is fast but it sends 900KB of JavaScript to every visitor, and the doctor catches that too.
  • Database signals: autoloaded-option weight (a common hidden slowdown) with probable owners.
  • Plain-English verdicts with Low / Medium / High impact badges, sorted worst first.
  • Before/after comparison: run a scan before updating plugins and another after, and see what changed. A rolling history of recent scans is kept automatically.
  • Dependency awareness: plugins that can’t be separated (a WooCommerce payment gateway, say) are measured together and labelled honestly.
  • WP-CLI: wp speed-doctor scan.

Visitors are never affected: plugin loading is only altered for the doctor’s own internal, cryptographically signed test requests. Your live traffic always sees the site exactly as configured.

Features

  • Per-Plugin Timing – What each plugin costs on the front end and in wp-admin, as honest measured ranges
  • Asset Audit – Every script and stylesheet on your pages, attributed to the plugin that ships it, with render-blocking flags
  • Database Signals – Autoloaded-option weight and probable owners, a common hidden slowdown
  • Plain-English Verdicts – Low, Medium and High impact badges, sorted worst first, no jargon
  • Before & After – Scan before updating plugins and again after, and see exactly what changed
  • Dependency Awareness – Plugins that cannot be separated are measured together and labelled honestly
  • Honest Confidence – Says “inconclusive” when the server is too noisy, instead of inventing a number
  • WP-CLIwp speed-doctor scan for scripted or scheduled diagnosis
  • No External Services – Everything runs on your own server; nothing is sent anywhere

Everything above is free, fully functional and unlimited.

How it measures

The method is built for noisy shared hosting: repeated interleaved timings, medians with confidence bands, warmup passes discarded, early stopping when a result is already clear, and honest “inconclusive” verdicts when server noise wins. A pre-scan check verifies your site can be measured (loopback requests allowed, no page cache serving the test requests, no background jobs adding noise) before anything runs.

The measurement loader

Timing a plugin’s absence requires briefly loading the site without it, for signed internal requests only. A small helper file in mu-plugins does this. It is installed only when you click the button, shown with its status on the Doctor screen, does nothing for any normal request, and is removed automatically when you deactivate the plugin.

External services

None. The doctor measures your site by requesting your own pages from your own server. Nothing is sent to Dragon Core or any third party. No telemetry, no accounts, no cloud.

Screenshots

Installation

  1. Upload the dragon-speed-doctor folder to /wp-content/plugins/, or install via the Plugins screen.
  2. Activate the plugin.
  3. Go to Tools Speed Doctor, install the measurement loader, and run a diagnosis.

FAQ

Why is my WordPress site slow?

Usually one of four things: a plugin doing heavy work on every request, a plugin shipping large scripts to every page, bloated autoloaded options in the database, or slow hosting. The doctor measures the first three directly and tells you which plugin is responsible, so you fix the actual cause instead of guessing.

Is it safe to run on a live site?

Yes, with one caveat. Visitors are never served a modified site. Plugin loading changes only for the doctor’s own signed internal requests. The caveat: a scan sends a few hundred requests to your server over several minutes, which adds load. On a busy site, run it at a quiet time, or enable host-safe mode in Settings to slow it down further.

How is this different from Query Monitor?

Query Monitor is a superb developer tool that inspects the current request in deep technical detail. The doctor answers a different question, namely which plugin to blame, by measuring whole pages with and without each plugin, and it answers in sentences rather than stack traces. Many people will want both.

Is this a profiler?

Not in the function-call sense. It does not hook into PHP or list which functions ran. It measures whole page loads with and without each plugin, so the result is a per-plugin cost in milliseconds rather than a call tree. The asset and database audits are separate, single-pass checks.

Why does a plugin say “measured together with plugins that depend on it”?

Some plugins fatal when a plugin they depend on is missing, such as a WooCommerce extension without WooCommerce. The doctor detects this and measures the group as a whole rather than breaking your test requests.

Does it work behind a reverse proxy or in a container?

Usually yes, automatically. If your server cannot reach its own public URL, define DRAGONSPEEDDOCTOR_LOOPBACK_BASE in wp-config.php with an address the server can reach (for example http://app-container or a private IP). Only the scheme, host and port are used; any path on the address is ignored because each request keeps its own path. The doctor keeps the correct Host header so WordPress routes normally. For safety the override is honoured only when the host is localhost, a loopback, private or link-local IP address written in full (dotted IPv4 or bracketed IPv6), or a hostname whose every DNS address is in one of those ranges. Anything else, including a name that does not resolve, is ignored, so measurement traffic never leaves your infrastructure.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Dragon Speed Doctor – Find What Slows Your Site Down” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.0.6

  • Added: an occasional, dismissible request for a WordPress.org review once the doctor has produced results, shown only on its own screen.
  • Changed: listing title and tags for the WordPress.org directory.

1.0.5

  • Fixed: two active plugins whose Requires Plugins headers point at each other (or a longer loop of them) made the dependency grouping recurse until PHP ran out of memory before a diagnosis could start. Chains are now walked without recursion, and every plugin in such a loop is measured as one group.
  • Changed: readme wording tidied.

1.0.4

  • Fixed: asset sizes were reported as 0 for scripts and styles with a scheme-relative (//), http:// or document-relative address, for percent-encoded file names, on subdirectory installs, and when wp-content lives outside the WordPress folder. Every address is now resolved against the page it was found on, then located with the site path stripped and wp-content resolved to its real directory. Only files inside the WordPress and wp-content folders are ever read.
  • Fixed: the asset table could attribute a plugin’s scripts to “core/other” when the address differed from the site’s wp-content URL in scheme, letter case or a www. prefix, or used ../ segments. Attribution now matches on the resolved host and path.
  • Fixed: DRAGONSPEEDDOCTOR_LOOPBACK_BASE with a path (for example http://app-container/wp) doubled that path on subdirectory installs and timed 404 pages. The base is now used as an origin only; each request keeps its own path.
  • Security: the loopback base is validated more strictly. IP literals must be a full dotted IPv4 or bracketed IPv6 address in a loopback, private or link-local range (integer, shorthand and public IPv6 forms are refused), and a hostname is accepted only when every address it resolves to is in such a range. Unresolvable names are refused.
  • Fixed: activation recorded the install as complete even when the scans table or the signing secret had not been stored. Both are now verified first; an incomplete install is retried on the next admin load and shown as an admin notice until it succeeds. Existing sites are checked once on upgrade.
  • Fixed: a diagnosis that could not be started, saved or finished in the database is now reported as an error instead of appearing to start or finish without results.

1.0.3

  • Wording tidied across the readme and the plugin screens for clarity. No functional changes.

1.0.2

  • Readme: changelog and upgrade notice now cover 1.0.1, which shipped without entries.
  • Code comments reworded to describe the filter hooks they document.

1.0.1

  • Safety: during a measurement request the active-plugins list can no longer be written back to the database, so a probe can never deactivate your other plugins.
  • Reliability: an abandoned scan is reclaimed after 15 minutes so it cannot block future scans; the measurement loader is refreshed before each run.

1.0.0

  • Initial release: per-plugin timing attribution (front-end and wp-admin), asset audit, database signals, plain-English verdicts, before/after comparison, WP-CLI.