finds.dev← search

// the find

johnbillion/query-monitor

★ 1,757 · PHP · GPL-2.0 · updated May 2026

The developer tools panel for WordPress and WooCommerce

Query Monitor is a browser-panel debugger for WordPress that surfaces database queries, hooks, HTTP requests, PHP errors, and a dozen other runtime details directly in the admin toolbar. It's the closest thing WordPress has to browser DevTools, and it's been the de facto standard debugging plugin for serious WordPress developers for years. If you're building or debugging anything on WordPress, you install this on day one.

The db.php drop-in that symlinks into WP_CONTENT_DIR is genuinely clever — it hooks before WordPress loads, so you get complete query visibility including early bootstrap queries that other profilers miss entirely. The component attribution (which plugin or theme is responsible for a slow query or a hook callback) is the feature that saves the most time in practice; it turns a vague 'something is slow' into a specific culprit in seconds. PSR-3 compatible logging via WordPress actions is a clean API: no dependencies, no class imports, just do_action('qm/debug', $data) and it shows up in the panel. The hybrid PHP/React output architecture is worth noting — panels migrate to TSX progressively while keeping PHP fallbacks, which keeps the plugin installable on any WordPress version.

The db.php symlink is also the main operational pain point: on hosts with read-only WP_CONTENT_DIR (Pantheon, WP Engine, some VIP configs) the symlink silently fails and you lose early query tracking with no obvious error to the user. There's no persistent storage or export — every page load is a blank slate, so you can't compare query counts between two deploys or share a trace with a teammate. The small font sizes called out in the accessibility statement aren't just an a11y issue; on high-density displays in a browser panel the UI is genuinely cramped and hard to scan quickly. The Guzzle middleware support is useful but requires manually wiring the HandlerStack in every client instance — there's no automatic instrumentation, so any library that creates its own Guzzle client internally stays invisible.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →