Repository navigation
Tuner
Tuner is a security scanner for WordPress and PHP sites. It finds leaked secrets, exposed files, known vulnerabilities, weak configuration and, on the server, changed core files and malware. It gives you the fix for each one. This page explains what it looks for, how a scan works and when to scan from outside or on the server itself.
rhythm tuner scan yoursite.comTuner ships as its own binary, rhythm-tuner. You normally run it through rhythm tuner (or the short alias rhythm t). The installer sets up both; if you see rhythm: tuner isn't installed, run rhythm install tuner. See Install.
Important
Scan only sites you own or have permission to test. Tuner's checks send plain, rate-limited GET or HEAD requests and never send exploit payloads; a check that asks for any other method doesn't load. Even so, scanning someone else's site without permission may be illegal. See Responsible use.
| Area | What Tuner looks for |
|---|---|
| 🔑 Leaks |
.env files, .git and .svn directories, wp-config.php backups, SQL dumps, backup archives, error and debug logs, phpinfo() pages, .htpasswd, Composer auth tokens. Secrets Tuner recognizes are masked in every report. A value it doesn't recognize as a secret can still show in evidence, so treat reports as private. |
| 🧩 Known vulnerabilities | WordPress core, plugins, themes, PHP, nginx and Apache, matched against CVE, Wordfence, WPScan and Patchstack data, plus Composer packages through OSV.dev. Each finding lists the CVEs and the fixed version. It flags anything actively exploited (CISA KEV). |
| 🪶 WordPress & PHP | User enumeration, XML-RPC, admin-ajax, directory listing, display_errors, Laravel logs and Ignition. Outdated, closed and abandoned plugins and end-of-life PHP. |
| 🛡️ Server & TLS | Security headers, cookie flags, version leaks, server status pages, plain HTTP, expired or untrusted certificates and obsolete TLS 1.0/1.1. |
| 🧪 On the server |
wp-config.php settings, files that don't belong in a web root, core and plugin files that differ from WordPress.org's checksums and common malware patterns. See Local scans and Integrity and malware. |
Every finding comes with a severity, the evidence that triggered it and a fix: usually the exact nginx, Apache or WordPress change. rhythm tuner explain <id> prints a finding's full fix offline and rhythm tuner fix turns a report into one server config. The full list of finding IDs is in the Finding reference.
A scan of a URL runs these steps. A typical default scan of a public site takes 15 to 30 seconds at the default 5 requests a second; your own server on a local or private address gets 50 a second and finishes in a few seconds.
-
Home page. Tuner fetches the home page and follows redirects. If you typed a bare hostname, it tries
https://first and falls back tohttp://if that fails. It follows http to https and apex to www, keeping the path you gave, so a scan ofyoursite.com/blogstays under/blog. A redirect to another host stops the scan unless you pass--follow-host. A firewall challenge or a failing home page marks the scan partial instead of reporting a clean site. - TLS. For https sites it reads the certificate's expiry and trust and tests whether the server still accepts TLS 1.0 or 1.1. (The TLS 1.0/1.1 test is skipped when requests go through a proxy.)
-
Fingerprint. From the home page it detects WordPress (with version), Laravel, PHP, the server and the plugins and themes the page loads. On WordPress it also reads the REST API index (
/wp-json/, one request) to find plugins the page doesn't load;--plugins deepgoes further. Plugin versions then come from each plugin'sreadme.txt, theme versions fromstyle.cssand the WordPress version from/feed/when the page doesn't state it. -
PHP version probe. The PHP version comes from
X-Powered-By, or aPHP/x.y.ztoken inServer. When a page cache strips both from the home page, Tuner asks a few uncacheable PHP endpoints instead (/xmlrpc.php,/wp-admin/admin-ajax.php,/wp-login.phpon WordPress,/index.phpelsewhere) and stops at the first that answers. That's at most three extra requests in every profile. The checks reuse the responses. -
Soft-404 baseline. Tuner requests a random path to learn how the server answers "not found". Before trusting a hit on a file like
/.env, a check compares it with a random path of the same shape (same folder, same extension, dotfile or not). Sites that return200 OKfor everything then don't flood you with false findings. -
Checks and vulnerability matching, together. Each check's requests run without following redirects. Vulnerability matching runs alongside them, comparing the versions found against public advisories; an exposed
composer.lockis matched too. Checks that need a platform (for examplerequires: wordpress) only run when the fingerprint found it. Findings stream in as they're found.
At the end you get the findings grouped by severity and a Tune score out of 100. Reading results walks through the report.
Tuner fetches each URL at most once per scan and shares responses between the steps, so the PHP probe and the checks don't repeat each other's requests.
Tuner has two modes. Point it at a URL and it scans from the outside, like a visitor. Point it at a folder and it scans the site's files in place, usually on the server.
rhythm tuner scan yoursite.com # remote: over HTTP
rhythm tuner scan /var/www/yoursite # local: reads the files| Remote scan | Local scan | |
|---|---|---|
| Runs from | anywhere that can reach the site | the server, or any copy of the site's files |
| Sees | what the public can reach | everything in the site folder |
| Versions | guessed from headers, readme.txt and style.css; PHP may be hidden | read exactly: php, wp-includes/version.php, plugin headers, composer.lock
|
| Confirms exposure | yes: a file is only reported if the server serves it | no: a stray file is reported because it's in the web root |
| Also checks | headers, cookies, TLS, user enumeration, XML-RPC |
wp-config.php settings, file permissions, Composer packages, core and plugin checksums (--integrity), malware signatures, the CVE-2026-115560 session preconditions |
| Sends requests to the site | yes, rate limited | none |
Use a remote scan to see what an attacker sees, for sites you don't have shell access to, for agencies checking many client sites and in CI against staging.
Use a local scan when you can log in to the server: it reads exact versions even when the site hides them, finds plugins that the home page doesn't load and reviews configuration you can't see from outside. The two complement each other; many teams run both. See Local scans.
A target is local when it is ., .. or ~, or starts with ./, ../, /, ~/ or a drive letter such as C:\. A path such as sites/shop counts too, as long as its first part doesn't look like a host. Everything else is a URL or hostname. A bare name that is also a folder here is refused as ambiguous. See scan.
Vulnerability data comes from WPVulnerability (CC0), which aggregates CVE, Wordfence, WPScan and Patchstack, plus the wordpress.org API and php.net. Composer packages are matched with OSV.dev. No API key is needed; a free Wordfence Intelligence key adds its feed. Data is cached and refreshed automatically once a day. Tuner works offline from the cache. See Known vulnerabilities.
Checks are built into the binary. Tuner can also take new checks from a signed check pack without a new binary. Tuner 0.4.0 doesn't trust a pack signing key yet, so it always uses its built-in checks and new checks arrive with new releases. See Check packs.
| You want to… | Read |
|---|---|
| Run your first scan, step by step | Your first scan |
| Understand severities, "likely" findings and the score | Reading results |
| Run fewer or more checks | Choosing checks |
| Tune speed, headers, cookies, proxies | Requests and politeness |
| Save JSON, SARIF, Markdown or HTML reports | Output and reports |
| Scan many sites | Batch scans |
| Scan on the server | Local scans |
| Check core files and look for malware | Integrity and malware |
| See what changed and get notified | Changes and notifications |
| Wire it into CI | CI and code scanning and the GitHub Action |
| Keep settings and accepted risk in the repository | Config file |
| Scan on a schedule or from your own app | Watch and serve |
| Move over from Wordfence CLI or WPScan | Coming from Wordfence CLI or WPScan |
| Look up a flag | CLI reference |
| Fix a problem | FAQ and troubleshooting |
← Extensions · Home · Your first scan →
rhythm · Useful ideas. Working systems. · Check only sites you own or have permission to test. Keep staging sealed (responsible use) · This wiki is published from wiki/ in the rhythm repository; suggest changes there with a pull request.
Get started
rhythm in depth
Tuner
- Overview
- Your first scan
- Reading results
- Choosing checks
- Requests and politeness
- Output and reports
- Batch scans
- Local scans
- Integrity and malware
- Changes and notifications
Tuner in depth
- Known vulnerabilities
- PHP advisories
- CI and code scanning
- GitHub Action
- Config file
- Watch and serve
- Writing checks
- Check packs
- Finding reference
- CLI reference
- Coming from Wordfence CLI or WPScan
- FAQ and troubleshooting
Soundcheck
- Overview
- Your first check
- Reading results
- Discovery
- Page health
- Visual changes
- Interactions
- Forms and flows
- Cache
- Speed
Soundcheck in depth
Echo
- Overview
- Your first run
- Connectors
- Sealing staging
- Echo Inbox
- Messages and checks
- Checks and rules
- Attachments
- Actions and compare
- With Soundcheck
- Replay
- Deliverability
Echo in depth
- Docker and DDEV
- Agency hub and reports
- Schedule
- MCP server
- Conformance kit
- CI
- Configuration
- API
- CLI reference
- FAQ and troubleshooting
- Benchmark
Project