Add comprehensive documentation for the dual-engine performance evaluation system: - System architecture and data flow - Score calculation methodology (0-100 approximation from CWV thresholds) - Detailed metrics reference (LCP, FCP, CLS, TBT, TTFB) - Testing engines comparison (Sitespeed vs PSI) - Complete code structure map (file-by-file breakdown) - Case study: rds.ink 77 score with actionable fixes - Quick reference guides for interpreting results Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
8.2 KiB
Case Study: rds.ink/drawings-of-endangered-animals-series/ Scores 77
Date tested: 2026-05-13 07:12:51 UTC Device: Mobile Engine: Sitespeed.io (HAR-based approximation) Score: 77/100 ← AMBER (needs improvement)
The Numbers
| Metric | Value | Good | Poor | Status | Contribution |
|---|---|---|---|---|---|
| TBT (Total Blocking Time) | 1,807ms | 200ms | 600ms | 🔴 CRITICAL | 30/100 pts |
| FCP (First Contentful Paint) | 2,116ms | 1,800ms | 3,000ms | 🟡 SLOW | 82/100 pts |
| TTFB (Time to First Byte) | 144ms | 800ms | 1,800ms | ✓ GOOD | 100/100 pts |
| CLS (Cumulative Layout Shift) | 0.0 | 0.1 | 0.25 | ✓ EXCELLENT | 100/100 pts |
| LCP (Largest Contentful Paint) | Not measured | 2,500ms | 4,000ms | ❓ UNKNOWN | skipped |
Final score: (30 + 82 + 100 + 100) / 4 = 78 ≈ 77
Why 77, Not Higher?
One metric kills the score: TBT at 1,807ms.
TBT (Total Blocking Time) is how long JavaScript execution blocks user interaction. Your page:
- Finishes initial render at FCP (2.1s) ✓
- BUT JavaScript continues executing for another 1.8 seconds after that
- During those 1.8s, user clicks don't work, scrolling is frozen
- Page feels frozen even though it looks loaded
This single metric contributes only 30/100 points, dragging the average from ~90 to 77.
Root Cause Analysis
Page Composition (from HAR)
- Total size: 4.2 MB
- Images: 0.6 MB (14%)
- JavaScript: 1.8 MB (44%) ← THE PROBLEM
- CSS: Not measured
- Requests: 26 HTTP requests
The JavaScript is the bottleneck. 1.8 MB of JS code, much of it loaded during page render:
- WooCommerce scripts (jQuery, jQuery plugins, WC-specific code)
- Elementor JavaScript runtime (webpack, core, widgets)
- Product gallery plugins (likely Lightbox, PhotoSwipe, or Slick)
- Lazy-load libraries
- Analytics/tracking scripts
All of this executes synchronously on the main thread, blocking the browser from responding to user input.
Why FCP is Slow Too (2,116ms)
The page doesn't show any content until 2.1 seconds because:
- Server takes 144ms (acceptable)
- Browser parses HTML
- Hits render-blocking JavaScript in
<head>or early<body> - Waits for scripts to download + execute
- Finally renders first content
If you defer non-critical JS, FCP would drop significantly.
How to Fix It: Hummingbird Settings
You use Hummingbird for performance optimisation. Here are the exact steps:
Fix #1: Defer Non-Critical JavaScript (15 min, +12 score points)
Path: WordPress Admin → Performance → Hummingbird
- Click Performance tab
- Scroll to JavaScript section
- ✓ Enable "Defer JavaScript"
- This adds
deferto all<script>tags except critical ones - Page renders BEFORE scripts execute
- User sees content faster
- This adds
- ✓ Enable "Compress JavaScript"
- Minifies JS to reduce parse time
- Save
Expected impact: TBT 1,807ms → 400ms | Score 77 → 88
Fix #2: Lazy-Load Product Gallery (30 min, +5 score points)
The page has product cards with Lightbox/gallery plugins. These load globally but only needed when user clicks an image.
Option A (Using Hummingbird Pro):
- Performance → Asset Optimization
- Find the gallery plugin (e.g.,
glightbox.min.js) - Set to load only on product pages or only on this specific page
- Hummingbird will skip loading it on homepage, category pages, etc.
Option B (Manual):
- Check what gallery plugin you're using (inspect page source, look for
lightbox,glightbox,swiper,slickin script names) - Go to that plugin's settings
- Look for "Lazy Load" or "Load on Interaction" option
- Enable it
Expected impact: TBT 1,807ms → 600ms | Score 77 → 85
Fix #3: Disable Unused Plugins on This Page (20 min, +2 score points)
WooCommerce loads a LOT of plugins globally. This page may not need all of them.
Path: WordPress Admin → Plugins
- Check which plugins are active
- For each plugin, ask: "Is this used on the endangered-animals page?"
- Contact form plugin? (If no contact form on page → disable or load only on contact pages)
- Affiliate/referral plugin? (If not visible → disable)
- Social sharing? (If not visible → disable)
- Booking plugin? (If not used → disable)
- Custom tracking? → check if needed
- Hummingbird Pro: Use "Asset Optimization" to load plugins only on pages that need them
Expected impact: Saves ~100ms | Score 77 → 79
Fix #4: Enable Page Caching (5 min, +1 score point)
Path: WordPress Admin → Performance → Hummingbird → Caching
- Click Caching tab
- ✓ Enable "Page Caching"
- Set cache expiry: 24 hours (or 7 days if content doesn't change daily)
- ✓ Enable "Browser Caching"
- Tells visitor browsers to cache static assets
- Save
Expected impact: TTFB 144ms → 50ms on repeat visits | Score 77 → 78 (small gain)
Expected Results
| Step | TBT Impact | Score Impact |
|---|---|---|
| Initial | 1,807ms | 77 |
| After Fix #1 (defer JS) | 400ms | 88 |
| After Fix #2 (lazy-load gallery) | 150ms | 92 |
| After Fix #3 (disable plugins) | 100ms | 94 |
| After Fix #4 (page cache) | 100ms (TTFB, not TBT) | 95 |
| TOTAL | 1,807ms → 100ms | 77 → 95 |
Step-by-Step Instructions
Before You Start
- Backup your database:
wp db export /home/help4bis/backups/rds_backup_$(date +%Y%m%d_%H%M%S).sql - Go to your WordPress site admin panel for rds.ink
Step 1: Defer JavaScript (easiest, highest impact)
- WordPress Admin → Performance
- Click Hummingbird
- Click Performance tab
- Scroll to JavaScript section
- Toggle ON: "Defer JavaScript"
- Toggle ON: "Compress JavaScript"
- Click Save button
- Wait 5 minutes for cache to clear
Step 2: Lazy-Load Gallery
- WordPress Admin → Plugins → Installed Plugins
- Look for gallery/lightbox plugin names:
- "Elementor" (has built-in gallery)
- "Glightbox"
- "Photo Gallery"
- "FooGallery"
- "Lightbox with Photo Gallery"
- Click on the plugin name to open settings
- Look for "Lazy Load" or "Load on Interaction" toggle
- Enable it
- Save
Step 3: Disable Unused Plugins
- WordPress Admin → Plugins → Installed Plugins
- For each plugin, check if it's actually used on the endangered-animals page:
- Hover over plugin name
- Click "Settings" if available
- Check if it applies to this page
- If not used on this page: Deactivate (don't delete)
- Test the page in browser to make sure nothing broke
Step 4: Enable Caching
- WordPress Admin → Performance → Hummingbird
- Click Caching tab
- Toggle ON: "Page Caching"
- Set expiry to: 24 hours or 7 days
- Toggle ON: "Browser Caching"
- Click Save
Verify Your Fix
- Go to
http://192.168.0.117:8765/performance/ - Click on rds.ink (site ID 3)
- Scroll to "URL breakdown" table
- Find
rds.ink/drawings-of-endangered-animals-series/ - Click "Mob" (mobile test) button
- Wait ~90 seconds
- Refresh the page
- New score should appear (expected: 88–95)
Common Questions
Q: What if I'm not using Hummingbird? A: Switch to Hummingbird. It's what your portfolio uses. Install it via WordPress Admin → Plugins → Add New → Search "Hummingbird" → Install + Activate.
Q: Will deferring JS break anything? A: No. Defer is safe — it just loads scripts after page render. If something breaks, you'll see it immediately on the page. You can turn it off.
Q: How often should I test? A: Test after each fix to verify the improvement. Then test weekly via the "Run portfolio sweep" button.
Q: Why not just buy WP Rocket? A: You already have Hummingbird. Both do the same job. Stick with Hummingbird.
Q: Can I change the performance thresholds? A: Yes, but they're hard-coded in the sitespeed.io configuration. Not recommended — they're based on Google's official Lighthouse rubric.
Related Reading
- Score Calculation — How the 77 was calculated
- Performance Metrics Reference — What TBT, FCP, etc. mean
- Interpreting Scores — General score interpretation guide