pybar.121group.dev (PYBAR staging)
Pre-Launch Audit

QA Audit — pybar.121group.dev (PYBAR staging)

Pre-launch audit — public surface only (no wp-admin / cPanel access used yet)

2026-05-06 WordPress 6.9.4 • PHP 8.4.20 • LiteSpeed • Astra + Astra Pro + Spectra Pro + RankMath
3
Blockers
7
Important
6
Recommended
0
Already Good
16
Total Items
Executive summary

Executive summary

Staging site is mostly healthy with solid fundamentals (modern PHP, current WP core, noindex correctly set, most sensitive files blocked). But there are three blocker-level issues that MUST be fixed before launch plus a handful of important hardening and performance items.

| Severity | Count | |---|---| | Blocker (fix before launch) | 3 | | Important | 7 | | Recommended | 6 | | Already good | 8 |

---

BLOCKERS

BLOCKERS — must fix before launch

B1Plugin readme.txt files publicly expose plugin versions
Blocker
  • Evidence:
  • /wp-content/plugins/astra-addon/readme.txt → HTTP 200 (Stable tag: 4.13.1)
  • /wp-content/plugins/ewww-image-optimizer/readme.txt → 200 (v8.5.0)
  • /wp-content/plugins/mailchimp-for-wp/readme.txt → 200 (v4.12.2)
  • /wp-content/plugins/spectra-pro/readme.txt → 200 (v1.2.10)
  • /wp-content/plugins/ultimate-addons-for-gutenberg/readme.txt → 200 (v2.19.25)

Why it matters: Attackers use automated scanners to match plugin versions against the CVE database. Exposing exact versions is the #1 enabler of "targeted vulnerability scans."

Fix: Add to .htaccess (or LiteSpeed config): ``apache <FilesMatch "^(readme|license|changelog|CHANGELOG)\.(txt|html|md)$"> Require all denied </FilesMatch> ``

Or simpler — a WP security plugin (Wordfence / SolidWP) can handle this automatically.

---

Assigned to:
B2`/wp-admin/install.php` is publicly accessible (HTTP 200)
Blocker

Evidence: Returns "Already Installed" page, but the endpoint itself should not be reachable.

Why it matters: Low-risk in isolation (site is installed), but install.php becomes dangerous if the DB ever gets corrupted or dropped — an attacker who hits the page at that moment can take over the installation. Best practice is to block it outright.

Fix: Block via .htaccess: ``apache <Files install.php> Require all denied </Files> ``

---

Assigned to:
B3Author enumeration leaks admin username
Blocker

Evidence: GET /?author=1 → 301 redirects to /author/121-josh/

So the first user (likely an Administrator) has the slug 121-josh — meaning "Josh" is an admin, and the username is exposed. Combined with wp-login.php being publicly accessible, this gives attackers half the credentials needed for a brute-force attack.

  1. Fix (pick at least one):
  2. Force author slugs to differ from login — change the "Nicename" field in wp_users via phpMyAdmin to something neutral (e.g. pybar-editor)
  3. Block ?author=N enumeration — add to functions.php or security plugin: ``php add_action( 'template_redirect', function () { if ( isset( $_GET['author'] ) ) { wp_safe_redirect( home_url(), 301 ); exit; } }); ``
  4. Rename the admin login slug via "WPS Hide Login" or similar plugin (mitigates brute-force)

---

Assigned to:
IMPORTANT

IMPORTANT — address before launch if possible

I1No modern security headers
Important

Evidence: None of Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Content-Security-Policy, Referrer-Policy, or Permissions-Policy are set.

Fix: Add to .htaccess: ``apache <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" env=HTTPS Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" </IfModule> ``

Defer CSP until live site is profiled (it breaks things if mis-configured).

---

Assigned to:
I2`X-Powered-By: PHP/8.4.20` header leaks PHP version
Important

Fix: Add to .htaccess / LiteSpeed config / php.ini: `` Header unset X-Powered-By ``

or in php.ini: expose_php = Off

---

Assigned to:
I3`readme.html` exposed at site root → leaks WP version (6.9.4)
Important

Fix: Same FilesMatch rule as B1 also catches this. Or just delete the file — WP core updates will recreate it but you can re-delete as part of your post-deploy checklist.

---

Assigned to:
I4TTFB is slow: 1.11s
Important

Evidence: time_starttransfer=1.108s, total page 1.71s, HTML size 336 KB.

Why it matters: Google considers >0.8s TTFB a problem for Core Web Vitals. 336 KB of HTML on the homepage is also heavy (likely a lot of inline CSS/JS from Spectra & Astra).

  • Likely causes (need wp-admin to confirm):
  • No page cache (LiteSpeed Cache not installed / not configured)
  • Spectra + Astra Pro + UAG + RankMath running heavy backend for every page
  • No object cache (Redis/Memcached)
  1. Fix:
  2. Install LiteSpeed Cache plugin (free, works beautifully on Synergy's LiteSpeed servers)
  3. Enable object caching if Synergy offers Redis
  4. Audit for unused plugin features (Spectra Pro + UAG duplicate a lot of functionality — consider removing one)

---

Assigned to:
I524 inline `<script>` + 14 inline `<style>` blocks on the homepage
Important

Why: Inline JS/CSS can't be cached across page loads and bloats HTML. Most of these are likely from Spectra / UAG / Astra Pro pushing per-block critical CSS.

  • Fix (after plugin audit):
  • Review Astra Pro / Spectra "performance" settings — both have "combine CSS/JS" toggles
  • In LiteSpeed Cache: enable CSS/JS combine + minify
  • Consider disabling "Spectra Block Editor" blocks you're not using (each loads its own CSS)

---

Assigned to:
I6Astra parent theme version number matches Astra Pro version number (both 4.13.1)
Important

Astra 4.13.1 is current as of early 2026, but Astra Pro paid add-on typically lags 1–2 weeks behind. Worth verifying in wp-admin → Updates that nothing's pending. Also confirm you have a valid Astra Pro license for the client (staging licenses don't always carry over to production).

---

Assigned to:
I710/24 images on homepage missing `loading="lazy"` attribute
Important

Fix: WordPress has native lazy-loading since 5.5, but if a theme bypasses wp_get_attachment_image() it won't apply. Add to child theme: ``php add_filter( 'wp_lazy_loading_enabled', '__return_true' ); ``

Or ensure all images go through the_post_thumbnail() / wp_get_attachment_image().

---

Assigned to:
GOOD

GOOD — no action needed

  1. WordPress 6.9.4 — current major version
  2. PHP 8.4.20 — modern, well-supported
  3. Let's Encrypt SSL valid, auto-renews (issued 2026-05-03, expires 2026-08-01)
  4. noindex, nofollow meta tag correctly set on homepage — staging content won't leak into Google
  5. wp-config.php, .htaccess, .env, debug.log, backup files all return 403
  6. .git/config returns 403 (no source leak)
  7. robots.txt correctly disallows /wp-admin/ and references sitemap
  8. REST API user enumeration returns 403

---

Detected plugin stack (for your reference)

Detected plugin stack (for your reference)

| Plugin | Version | Purpose | |---|---|---| | astra-addon (Astra Pro) | 4.13.1 | Premium Astra features | | spectra-pro | 1.2.10 | Gutenberg blocks (paid) | | ultimate-addons-for-gutenberg (UAG) | 2.19.25 | Gutenberg blocks (free) | | ewww-image-optimizer | 8.5.0 | Image optimisation | | mailchimp-for-wp | 4.12.2 | Newsletter signup | | RankMath (via REST namespace) |? | SEO | | Meta Box (via REST) |? | Custom fields | | WP Grid Builder (wpgb) |? | Filterable grid/map | | BSF Custom Fonts |? | Font manager |

Duplication concern: You're running both Spectra Pro and UAG — these are sister products from Brainstorm Force with ~70% overlap. Pick one unless a specific block is only available in one.

---

WHAT I COULDN'T CHECK (needs cPanel / wp-admin access)

WHAT I COULDN'T CHECK (needs cPanel / wp-admin access)

The following require authenticated access — ready to run when you provide it:

  • [ ] WP-CLI audit: exact plugin versions vs latest, outdated plugin list
  • [ ] Known CVE match for each plugin version
  • [ ] User list + weak password audit
  • [ ] wp-config.php review (DEBUG off? SAVEQUERIES off? FS_METHOD set? salts rotated from boilerplate?)
  • [ ] debug.log review
  • [ ] Database: autoload size, transient bloat, orphaned meta, post revisions count
  • [ ] wp_options for staging-only URLs or test content
  • [ ] Cron schedule (any zombie jobs?)
  • [ ] PHPCS against the custom child theme astra-child (custom code quality)
  • [ ] Disk / quota / error log analysis in cPanel
  • [ ] Email deliverability config (SMTP plugin? SPF/DKIM for @pybar.com.au?)
  • [ ] Backup configuration

---

PRE-LAUNCH GO/NO-GO CHECKLIST

PRE-LAUNCH GO/NO-GO CHECKLIST

Before pointing pybar.com.au at this build, I'd recommend:

  • [ ] Fix all 3 blockers (B1, B2, B3)
  • [ ] Fix at least I1, I2, I3 (trivial.htaccess additions)
  • [ ] Install LiteSpeed Cache + configure (huge TTFB win)
  • [ ] Full wp-admin walkthrough with me for the items marked "needs access"
  • [ ] Run a full search-replace plan for pybar.121group.devpybar.com.au
  • [ ] Create a rollback plan (current live site backup + DNS TTL lowered 24h pre-launch)
  • [ ] Remove noindex, nofollow on production (keep on staging forever)
  • [ ] Verify Google Analytics / GTM IDs are client's production IDs, not test
  • [ ] Verify Mailchimp API key is client's, not a dev one
  • [ ] Confirm forms deliver to correct email inbox
  • [ ] 404 page works
  • [ ] Broken link scan across all pages

---

Report generated by Pi. Ready to dive deeper — just grant wp-admin / cPanel access and I'll complete the audit.

Saved