ongboit.com — SEO + GEO Audit

URL: https://ongboit.com Date: 2026-06-18 Duration: 2h 10m Business: Publisher Market: Auto-detected Mode: first Kit: Claude-Growth v1.3.0 T2 · GSC + DataForSEO MCP + Firecrawl MCP
Technical + CWV
80 /100
Good
GEO + AEO
65 /100
Fair
Overall Search-Readiness
78 /100
Good
83 Technical
95 Schema
39 Sitemap
100 Performance
90 GEO
66 Platform
22 Brand
96 Image
95 Hreflang
75 Accessibility
100 Compliance
100 Visual
90 GSC / Google
82 Geo Llmstxt
74 Audit Health
74 On-Page

This SEO + GEO Audit scores the site on three composite indices — Technical + Core Web Vitals, GEO + AEO readiness, and an Overall Search-Readiness score — built from specialist agents covering technical health, schema, sitemap, performance, AI-crawler access, llms.txt, platform readiness, brand authority, and on-page quality. Every issue is ranked by fix ROI; ready-to-paste fix artifacts and a 90-day roadmap follow.

How to Read This Report

Ordered by what to do, in 3 tiers:

  • ACT (top) — what to fix, in order: Top-3 Priority · Quick Wins · Findings by severity · 90-Day Roadmap · 🤖 Apply with Claude Code (copy-paste prompt) + the ready-to-paste robots.txt / llms.txt artifacts in the Autofix Bundle.
  • INVESTIGATE (middle) — drill down: Score Breakdown · per-category Deep Dives (incl. on-page audit + performance levers) · the 7 charts (CWV, GEO radar, GSC, AI-crawler table, platform, striking-distance) · per-skill cards.
  • TRUST (bottom) — confidence the run was sound: Verification (10 gates) · Methodology timeline · Appendix (formulas, tools, tier coverage, capability checklist).

To apply fixes: hand Claude Code the report MD plus the fixes/ folder, then paste the prompt in the "🤖 Apply These Fixes with Claude Code" section below.

Glossary — what the terms mean

CWV (Core Web Vitals) — Google's UX metrics: LCP (load), INP (responsiveness), CLS (visual stability). They feed ranking + the Technical score.

LCP — Largest Contentful Paint — when the largest element renders. Good <2.5s, Poor ≥4.0s. Driven mostly by server response time (TTFB).

INP / CLS — INP = Interaction-to-Next-Paint (target <200ms, replaced FID). CLS = layout shift (target <0.1).

GEO / AEO — Generative / Answer Engine Optimization — being citable by AI engines (ChatGPT, Perplexity, Gemini, AI Overviews), not just ranking in blue links.

llms.txt — An emerging 2026 manifest that tells LLMs which URLs to read. A broken/missing one costs AI-citation coverage.

AI crawler access — Whether bots like GPTBot / ClaudeBot / PerplexityBot are allowed in robots.txt. Blocking them removes you from AI answers.

Schema (structured data) — JSON-LD that labels your content (Article, FAQ, Organization, Person…). Helps both rich results and AI extraction.

Canonical — The <link rel="canonical"> tag declaring the preferred URL for a page — prevents duplicate-content dilution.

Striking distance — Keywords ranking on page 2 (positions 11-20) with real impressions — small wins can push them to page 1.

Crawl budget — How many pages a search engine will fetch per visit. Wasted on junk URLs = important pages crawled less often.

E-E-A-T — Experience, Expertise, Authoritativeness, Trustworthiness — Google's content-quality framework.

⚠ 10 critical/high issues OUTSIDE the headline score
Overall measures search-readiness; these legal / accessibility / UX risks are scored separately and do not lower it — but they need attention:
  • P1 · Accessibility — Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces
  • P1 · Audit — /privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet
  • P1 · Audit — Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl
  • P1 · Audit — Slow TTFB on 290/299 crawled pages — origin server response bottleneck
  • P1 · Audit — 35 broken internal links + 18 broken external links — crawl-budget waste and equity leak
  • P1 · Audit — Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor
  • P1 · Audit — Brand orange #FF7F00 fails WCAG 1.4.3 AA contrast on white backgrounds — 4 surface types
  • P1 · Compliance — /privacy-policy/ returns 404 — English canonical URL dead

The 3 Problems Hurting You Most Right Now

#1

Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces

H1 hero span `style="color:#FF7F00"` on palette9 #fff7f5 bg: 2.53:1 (needs 3:1 large text). `.obit-catall{color:#FF7F00}` at 0.9em bold on card bg #fff: 2.53:1 (needs 4.5:1). `.home-faq-answer a{color...

→ Fix: 8h · Fails WCAG 1.4.3 AA on 4 distinct surface types. Orange on dark backgrounds (foo
#2

/privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet

curl -sI https://ongboit.com/privacy-policy/ → HTTP/1.1 404 Not Found (curl-verified 2026-06-18). A privacy policy page is mandatory for Google AdSense publisher program compliance (Google Publisher P...

→ Fix: 2h · AdSense non-compliance risk: Google's review process checks for accessible priva
#3

Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification

All searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit (site:reddit.com), X/Twitter, dev.to, and Quora returned 0 on-brand results. All Reddit hits were false positives (generic phrase 'ông ...

→ Fix: 24h · No community-driven mentions = no trust signals for AI search citation (Perplexi

Quick Wins — Shippable This Week

10.0h total

8 fixes shippable this week (effort = S). Estimated overall score lift +5-15 points.

  • CR1Internal links pointing to broken pages (35 URLs) 2h Resolving improves crawlability and on-page quality across the affected pages.
  • CR2Broken pages returning 4xx (4 URLs) 2h Resolving improves crawlability and on-page quality across the affected pages.
  • AU2/privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet 1h AdSense non-compliance risk: Google's review process checks for accessible priva
  • C1/privacy-policy/ returns 404 — English canonical URL dead 1h AdSense policy-compliance risk; 404 on expected EN slug; any external link or ad
  • C2CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer 1h CPRA non-compliance for California users; policy-vs-reality mismatch undermines
  • PO3Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared 1h Adding 'ai-input=yes' to the Content-Signal line explicitly grants permission fo
  • SM314 internal links point to redirect chains instead of canonical URLs 1h Update internal links to point directly to canonical (post-redirect) URLs. One-t
  • T1robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers 1h AI crawlers (ClaudeBot, GPTBot, Google-Extended etc.) may read the Disallow rule

Executive Summary

78/100

Overall Score: 78/100 (Good)

Website audit found 115 issues across 16 weighted categories. Technical fundamentals score 80/100 (Good), while AI search readiness scores 65/100 (Fair).

Issue Distribution

P1: 19 P2: 41 P3: 55

Priority breakdown by severity — 115 findings total

The 3 Biggest Problems

  1. {'id': 'A1', 'severity': 'P1', 'category': 'accessibility', 'title': 'Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces', 'evidence': 'H1 hero span `style="color:#FF7F00"` on palette9 #fff7f5 bg: 2.53:1 (needs 3:1 large text). `.obit-catall{color:#FF7F00}` at 0.9em bold on card bg #fff: 2.53:1 (needs 4.5:1). `.home-faq-answer a{color:#FF7F00}` on white: 2.53:1. `.entry-content table a{color:#FF7F00}` on `background:white` in pinned page tables: 2.53:1.', 'effort': 'M', 'impact': 'Fails WCAG 1.4.3 AA on 4 distinct surface types. Orange on dark backgrounds (footer, dark table headers) passes — fix scope is white-bg surfaces only. Darken to ~#C05F00 (~3.2:1 large, ~5:1 normal) or shift to #B35900.', 'confidence': 'high', 'fix': '', 'source_skill': 'geo-accessibility'}
  2. {'id': 'AU2', 'severity': 'P1', 'category': 'audit', 'title': '/privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet', 'evidence': 'curl -sI https://ongboit.com/privacy-policy/ → HTTP/1.1 404 Not Found (curl-verified 2026-06-18). A privacy policy page is mandatory for Google AdSense publisher program compliance (Google Publisher Policy) and for GDPR/PDPD (Vietnam Personal Data Protection Decree 13/2023). 404 on this URL means the page is either missing, moved, or unpublished. [SYNTHESIS CORRECTION: the privacy policy EXISTS + is footer-linked at /chinh-sach-bao-mat/ (HTTP 200); /privacy-policy/ is only a missing ALIAS, not a missing policy — fix = add a 301 redirect. Downgraded P0→P1.]', 'effort': 'S', 'impact': "AdSense non-compliance risk: Google's review process checks for accessible privacy policy. If AdSense ad-serving is live but policy page is 404, account is flagged. Fix: publish privacy policy to /privacy-policy/ in WordPress (re-publish if accidentally set to Draft), or add a redirect from /privacy-policy/ to the correct URL. Estimated: 15 minutes.", 'confidence': 'high', 'fix': '', 'source_skill': 'seo-audit'}
  3. {'id': 'BM4', 'severity': 'P1', 'category': 'brand', 'title': 'Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification', 'evidence': "All searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit (site:reddit.com), X/Twitter, dev.to, and Quora returned 0 on-brand results. All Reddit hits were false positives (generic phrase 'ông bố IT' in unrelated posts).", 'effort': 'L', 'impact': 'No community-driven mentions = no trust signals for AI search citation (Perplexity, ChatGPT weight Reddit/community mentions heavily for Vietnamese tech queries). Growth ceiling until community seeding begins.', 'confidence': 'high', 'fix': '', 'source_skill': 'geo-brand-mentions'}

Audit Details:

  • URL: https://ongboit.com
  • Business Type: Publisher (confidence: medium)
  • Market: Auto-detected
  • Pages Analyzed: 8
  • Sampled Deep: 8 business-type-prioritized pages

Score Breakdown

Overall Composite

CategoryScoreWeightWeightedRating
Technical 83/100 17% 14.4 Good
Sitemap 39/100 6% 2.2 Critical
Image 96/100 6% 5.5 Excellent
Hreflang 95/100 4% 3.6 Excellent
Performance 100/100 12% 12.5 Excellent
Platform 66/100 6% 3.8 Fair
Brand 22/100 12% 2.8 Critical
Geo 90/100 24% 21.6 Excellent
Schema 95/100 12% 11.9 Excellent
Accessibility* 75/100 Good
Compliance* 100/100 Excellent
Visual* 100/100 Excellent
Google-Api* 90/100 Excellent
Geo-Llmstxt* 82/100 Good
Audit* 74/100 Fair
Page-Deep-Dive* 74/100 Fair
OVERALL 100% 78.4 → 78/100 Good

* Informational categories with 0% weight in overall formula — surfaced from agent findings for context but not double-counted toward overall score.

Three Composite Scores

CompositeScoreRatingFormula
Technical + Core Web Vitals80/100GoodTechnical*0.45 + Performance*0.35 + Sitemap*0.20...
GEO + AEO Readiness65/100FairBrand*0.30 + Schema*0.25 + Platform*0.25 + Geo*0.20...
Overall Search-Readiness78/100GoodTechnical*0.18 + Schema*0.13 + Sitemap*0.06 + Performance*0.13 + Geo*0.25 + Plat...

Score Interpretation

  • 90-100: Excellent
  • 75-89: Good
  • 60-74: Fair
  • 40-59: Poor
  • 0-39: Critical

How this audit was conducted

Audit timeline

Audit ran in 2h 10m across 11 phases. 16 category scores computed.

0_setup
Setup
2s
1_discovery
Live Discovery
1s
2_sampling
Page Sampling
5s
3_issues
Issue Catalog Scan
1s
4_agents
Parallel Agents
1h21m
5_synthesis
Synthesis
48m54s
6_score
Score Calculation
0s
6.5_verification
Verification (10 gates)
0s
7_deliverable
Deliverable Generation
0s
8_pdf
PDF Generation
0s
9_cleanup
Cleanup
0s

Total: 2h 10m

Specialist tools used (click to inspect)

Specialist agents ran in parallel during Phase 4. Each examined a different dimension of your site. Click any agent to see its sub-scores, cost, and output file.

0/100
Why this tool:

2-4 sentence executive summary

_visual_raw 0/100
Why this tool:
geo-accessibility 62/100
Why this tool:
geo-brand-mentions 32/100
Why this tool: Off-site brand authority scan (Reddit/YouTube/Wikipedia/LinkedIn)
geo-compliance 72/100
Why this tool:
geo-crawlers 90/100
Why this tool: AI bot robots.txt audit (11 bots)
geo-llmstxt 82/100
Why this tool: llms.txt validate + generate
geo-platform-optimizer 68/100
Why this tool: Per-platform readiness (AIO/ChatGPT/Perplexity/Gemini/Copilot)
geo-schema 95/100
Why this tool: Winner over seo-schema — sameAs 14-platform strategy, per-type GEO rules
geo-technical 81/100
Why this tool: Winner over seo-technical — 449 lines, SSR 15pt dedicated, 11-bot matrix
seo-audit 74/100
Why this tool: Master orchestrator — 15 subagents, 500-page crawl, built-in PDF
seo-backlinks 22/100
Why this tool: Profile health + toxic links + authority gap

No third-party backlink data is available: DataForSEO MCP tool is not registered in this environment, Common Crawl (Jan-Mar 2026) does not index ongboit.com (expected for a ~3-month-old domain), and no Moz or Bing API keys are configured. Score reflects domain age reality (near-zero external authority is normal at 3 months) rather than a penalty — but zero authority is the confirmed #1 growth leve…

seo-google 86/100
Why this tool:

Homepage PASS (submitted+indexed); 1,237 queries ranking pos 1-10 (122 in top-3); GA4 organic momentum strong.

seo-hreflang 95/100
Why this tool:
seo-images 74/100
Why this tool:
seo-page 74/100
Why this tool:
seo-performance 89/100
Why this tool: Core Web Vitals + field vs lab data

Field CWV (CrUX p75) all GREEN on mobile+desktop; only render-blocking Google Fonts CSS + lab LCP gap remain.

seo-sitemap 58/100
Why this tool: Sitemap health + URL structure analysis
seo-visual 68/100
Why this tool:

High Priority — Fix within 1 week

18 issues

These issues significantly limit your reach. Plan to fix within the next sprint. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

A1

Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces

High
4h (M) HIGH Fails WCAG 1.4.3 AA on 4 distinct surface types. Orange on dark backgrounds (footer, dark table headers) passes — fix scope is white-bg surfaces only. Darken to ~#C05F00 (~3.2:1 large, ~5:1 normal) or shift to #B35900.
Technical details for your developer
H1 hero span `style="color:#FF7F00"` on palette9 #fff7f5 bg: 2.53:1 (needs 3:1 large text). `.obit-catall{color:#FF7F00}` at 0.9em bold on card bg #fff: 2.53:1 (needs 4.5:1). `.home-faq-answer a{color:#FF7F00}` on white: 2.53:1. `.entry-content table a{color:#FF7F00}` on `background:white` in pinned page tables: 2.53:1.
Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces
accessibility
geo-accessibility + seo-audit
AU2

/privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet

High
1h (S) HIGH AdSense non-compliance risk: Google's review process checks for accessible privacy policy. If AdSense ad-serving is live but policy page is 404, account is flagged. Fix: publish privacy policy to /privacy-policy/ in WordPress (re-publish if accidentally set to Draft), or add a redirect from /privacy-policy/ to the correct URL. Estimated: 15 minutes.
Technical details for your developer
curl -sI https://ongboit.com/privacy-policy/ → HTTP/1.1 404 Not Found (curl-verified 2026-06-18). A privacy policy page is mandatory for Google AdSense publisher program compliance (Google Publisher Policy) and for GDPR/PDPD (Vietnam Personal Data Protection Decree 13/2023). 404 on this URL means the page is either missing, moved, or unpublished. [SYNTHESIS CORRECTION: the privacy policy EXISTS + is footer-linked at /chinh-sach-bao-mat/ (HTTP 200); /privacy-policy/ is only a missing ALIAS, not a missing policy — fix = add a 301 redirect. Downgraded P0→P1.]
/privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet
audit
seo-audit
AU3

Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl

High
12h (L) HIGH External authority is the primary long-term ranking lever. Even 5-10 quality referring domains (Vietnamese IT media, GitHub profiles, tech communities, developer forums) would establish a CC PageRank seed node and provide position stability. Target: 10+ referring domains within 6 months. Immediate step: submit sitemap to Bing Webmaster Tools + IndexNow to accelerate CC discovery.
Technical details for your developer
seo-backlinks.json: Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, referring_domains_sample=0. DataForSEO/Moz/Bing APIs unavailable. Domain age ~3 months (launched ~Mar 2026). GSC top 3 pages at positions 5.1, 7.9, 6.1 — competitive positions achieved on content quality alone, but no equity buffer if competitors acquire links.
Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl
audit
seo-audit
AU4

Slow TTFB on 290/299 crawled pages — origin server response bottleneck

High
4h (M) HIGH TTFB is a direct LCP prerequisite; slow TTFB delays Largest Contentful Paint on all pages. Fix: enable Cloudflare Cache Rules for WordPress pages (Cache Everything rule for GET requests excluding admin/cart paths), or install WP Rocket / LiteSpeed Cache for full-page caching. Target: TTFB < 200ms on cached requests. Expected: 85-95% of pages edge-served after cache warm.
Technical details for your developer
crawl-summary.json: slow_ttfb count = 290 out of 299 pages (97%). Homepage curl: HTTP 200, Connection: keep-alive, cf-cache-status: DYNAMIC — pages are hitting origin on every request, not serving from Cloudflare edge cache. Origin WP/PHP response overhead not mitigated.
Slow TTFB on 290/299 crawled pages — origin server response bottleneck
audit
seo-audit
AU5

35 broken internal links + 18 broken external links — crawl-budget waste and equity leak

High
4h (M) HIGH Fix broken internal links first (redirect or update href): run Screaming Frog / Ahrefs broken link report. For external, remove or replace with live alternatives. Each fixed link restores link equity flow and removes crawl waste signal. Target: 0 broken internal, <5 broken external.
Technical details for your developer
crawl-summary.json: links_to_broken_page = 35 (internal 4xx destinations), broken_external_link = 18. With 299 pages crawled, 35 broken internal links represents systematic crawl-budget waste. 18 broken external links degrade perceived editorial quality.
35 broken internal links + 18 broken external links — crawl-budget waste and equity leak
audit
seo-audit
AU6

Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor

High
12h (L) HIGH Diversify by pushing tier-2 pages (claude-code-vs-code pos 7.4, claude-code-auto-mode pos 4.9, obsidian-claude-code pos 7.8) into top 5 via internal link equity from top-3 pages. Target: 5+ pages contributing >10 clicks each within 90 days.
Technical details for your developer
gsc-top-pages.json: claude-code-gioi-han-su-dung 188 clicks (pos 5.1) + claude-code-gia-bao-nhieu 142 clicks (pos 7.9) + tiet-kiem-token-claude-code 102 clicks (pos 6.1) = 432 of ~670 total top-12 clicks. All three pages sit in a zone (positions 5-9) where a single algorithm update or AI Overview injection pushes them off page 1.
Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor
audit
seo-audit
BM4

Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification

High
12h (L) HIGH No community-driven mentions = no trust signals for AI search citation (Perplexity, ChatGPT weight Reddit/community mentions heavily for Vietnamese tech queries). Growth ceiling until community seeding begins.
Technical details for your developer
All searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit (site:reddit.com), X/Twitter, dev.to, and Quora returned 0 on-brand results. All Reddit hits were false positives (generic phrase 'ông bố IT' in unrelated posts).
Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification
brand
geo-brand-mentions
BL1

Zero measured external authority — referring domains, domain rank, and backlink count all undetectable at 3 months

High
12h (L) HIGH External authority is the single largest long-term ranking lever for competitive Vietnamese tech queries. Even 5-10 quality referring domains (tech media, Vietnamese IT forums, GitHub profiles, community roundups) would establish a footprint in the next CC snapshot and improve GSC position stability. Target: 10+ referring domains within 6 months.
Technical details for your developer
Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, in_rankings=false, pagerank=null, referring_domains_sample=0. DataForSEO MCP unavailable. Moz/Bing API keys absent. Domain age ~3 months (launched ~Mar 2026). No inbound link signal from any source.
Zero measured external authority — referring domains, domain rank, and backlink count all undetectable at 3 months
brand
seo-backlinks
C1

/privacy-policy/ returns 404 — English canonical URL dead

High
1h (S) HIGH AdSense policy-compliance risk; 404 on expected EN slug; any external link or ad-network check pointing to /privacy-policy/ silently fails
Technical details for your developer
https://ongboit.com/privacy-policy/ → HTTP 404 (Firecrawl statusCode=404, title='Page Not Found'); real policy is at /chinh-sach-bao-mat/ (HTTP 200). Google AdSense publisher guidelines and GDPR Art.13 require a consistently accessible privacy policy URL. Many third-party platforms (AdSense approval, ad networks, affiliate programs) ping /privacy-policy/ directly.
/privacy-policy/ returns 404 — English canonical URL dead
compliance
geo-compliance
C2

CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer

High
1h (S) HIGH CPRA non-compliance for California users; policy-vs-reality mismatch undermines trust; AdSense policy violation risk
Technical details for your developer
Policy section 10 states: 'you can opt out via the cookie banner or the "Do Not Sell or Share My Personal Information" link in the footer.' Live footer HTML (scraped 2026-06-18) contains three links only: Chính Sách Bảo Mật, Điều Khoản Sử Dụng, Liên Hệ — no DNS/DSMY link present. CPRA §1798.135 requires a clear and conspicuous link for businesses that 'share' personal data (AdSense qualifies under CPRA 'sharing' definition).
CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer
compliance
geo-compliance
PO2

Vietnamese-only content creates systematic language barrier for English-first AI citation engines

High
12h (L) HIGH An English-language 'Key Facts' summary section (3-5 bullets with source citations) on top-traffic Claude Code articles could break into ChatGPT/Perplexity English citation streams. Medium-term strategic investment; prioritize for /claude-code-gioi-han-su-dung/ (188 GSC clicks, pos 5.1) and other top-3 GSC articles.
Technical details for your developer
Pre-unblock citation tests (DataForSEO ai_optimization_llm_response, 2026-06-18): GPT-4o web search cited 6 English sources only (Anthropic, TechRadar, TrueFoundry, Reddit, usagebar.com, productcompass.pm); Perplexity sonar-pro cited 7 English sources only (usagebar.com, truefoundry.com, reddit.com, anthropic.com, support.claude.com, productcompass.pm, YouTube). Zero Vietnamese-language sources in either response. Content language is 'vi' throughout. Crawler access resolves P0, but language barrier is a persistent structural limit for global AI citation engines — even with full indexing, English-first source preference will suppress Vietnamese citations for non-locale-targeted queries.
Vietnamese-only content creates systematic language barrier for English-first AI citation engines
platform
geo-platform-optimizer
PO3

Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared

High
1h (S) MEDIUM Adding 'ai-input=yes' to the Content-Signal line explicitly grants permission for retrieval/grounding/RAG use while keeping training blocked. Unambiguous signal to AI citation engines (ChatGPT, Perplexity, Gemini) that grounding use is authorized. Low effort, direct citation-pathway benefit.
Technical details for your developer
robots.txt line: 'User-agent: *' / 'Content-Signal: search=yes,ai-train=no'. This blocks AI training (EU Directive 2019/790 reservation — intentional). However 'ai-input=yes' (covering RAG/retrieval/grounding — the primary AI citation path) is absent. Crawlers that do not distinguish training from inference may apply ai-train=no conservatively to all AI use, suppressing citation even with explicit Allow: / per-bot rules. (Source: geo-crawlers.json GC3, confidence: medium.)
Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared
platform
geo-platform-optimizer
SM2

35 internal pages linked-to are returning 4xx / broken — crawl budget wasted and link equity lost

High
4h (M) HIGH Fix or redirect broken targets; update anchor links pointing to them. Eliminates crawl-budget drain and removes negative signals from internal link graph.
Technical details for your developer
crawl-summary.json by_check.links_to_broken_page = 35 (across 299 crawled URLs). Separate by_check.4xx_error = 4 pages themselves returning 4xx. These broken link targets absorb crawl budget and produce soft-404 signals.
35 internal pages linked-to are returning 4xx / broken — crawl budget wasted and link equity lost
sitemap
seo-sitemap
SM3

14 internal links point to redirect chains instead of canonical URLs

High
1h (S) HIGH Update internal links to point directly to canonical (post-redirect) URLs. One-time Screaming Frog / wp-cli bulk replace recommended.
Technical details for your developer
crawl-summary.json by_check.links_to_redirect = 14. Each redirect hop dilutes PageRank and slows Googlebot. URLs in the sitemap should also be verified as final-destination URLs, not redirect sources.
14 internal links point to redirect chains instead of canonical URLs
sitemap
seo-sitemap
T1

robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers

High
1h (S) HIGH AI crawlers (ClaudeBot, GPTBot, Google-Extended etc.) may read the Disallow rule from the Cloudflare Managed section and skip the site. Publisher should remove the Cloudflare Managed Content block or toggle the Cloudflare dashboard setting to 'Allow AI scrapers' which removes those Disallow directives. This is the single highest-risk GEO finding.
Technical details for your developer
curl https://ongboit.com/robots.txt | grep -n ClaudeBot => line 44: 'ClaudeBot\nDisallow: /' (Cloudflare Managed block); line 78: 'ClaudeBot\nAllow: /' (publisher manual section). Per RFC 9309, for same user-agent the last matching rule wins — however Cloudflare's managed block appears FIRST and some crawler implementations use first-match. GPTBot, Amazonbot, CCBot, Applebot-Extended, Bytespider, Google-Extended, meta-externalagent all affected by same pattern. Publisher intent is Allow (25 bots welcomed), but the Cloudflare Managed Content block creates real ambiguity.
robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers
technical
geo-technical
V1

Brand orange #FF7F00 white text fails WCAG AA — 2.53:1 (threshold 3.0 large, 4.5 normal)

High
1h (S) HIGH Sitewide accessibility failure on primary CTA and any orange-badged elements. Fix: (a) darken orange to #C96000 for text contexts (gives ~4.6:1 on white); or (b) switch CTA to dark text #0A1F41 on orange (8.29:1 passes easily); or (c) add dark text class for small-text orange uses. Primary CTA is highest-traffic interactive element — fixing impacts conversion + a11y.
Technical details for your developer
Python WCAG calc: white rgb(255,255,255) on orange rgb(255,127,0) = 2.53:1. WCAG AA large-text threshold = 3.0:1; normal-text = 4.5:1. Both failed. Confirmed on homepage CTA 'Bắt Đầu Lộ Trình →' button (white text on orange bg). Any other UI elements using white-on-orange inherit this failure. Brand orange on white backgrounds (inverted) would be 2.53:1 against white — also fails for normal text.
Brand orange #FF7F00 white text fails WCAG AA — 2.53:1 (threshold 3.0 large, 4.5 normal)
visual
seo-visual
CR1

Internal links pointing to broken pages — 35 pages🔍 site-crawl

High

Internal links point to URLs that 404 — they leak link equity and frustrate readers.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Fix or remove the broken internal links, or publish the missing target pages.

Technical details for your developer
35 URLs affected: ongboit.com/about/; ongboit.com/contact/; ongboit.com/dich-vu/; ongboit.com/claude-code-cho-team-enterprise/; ongboit.com/claude-growth-kit-viet-blog-claude-code/; ongboit.com/n8n-claude-code/ (+29 more)
Internal links pointing to broken pages (35 URLs)
technical
full-site-crawl
CR2

Broken pages returning 4xx — 4 pages🔍 site-crawl

High

Visitors and crawlers hit a dead page (404/410), wasting crawl budget and link equity.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Restore the page, 301-redirect it to the right URL, or remove the links pointing to it.

Technical details for your developer
4 URLs affected: ongboit.com/obsidian-markdown-cu-phap/url.md; ongboit.com/obsidian-markdown-cu-phap/path.md; ongboit.com/obsidian-memory-3-layer-architecture/page-name.md; ongboit.com/wiki-lint-fold-maintenance/path/
Broken pages returning 4xx (4 URLs)
technical
full-site-crawl

Medium Priority — Fix within 1 month

41 issues

These improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

A2

Email newsletter input: outline:none with no focus handler — invisible keyboard focus

Medium
1h (S) HIGH Keyboard users cannot see focus on newsletter email field — WCAG 2.4.7 violation on this specific input. Fix: add `onfocus/onblur` border-color change matching search input pattern, or remove `outline:none` to let the :focus-visible rule apply.
Technical details for your developer
`<input type="email" ... style="... outline: none;" />` — no onfocus handler, no :focus-visible override scoped to this element. Compare: search input has `onfocus="this.style.borderColor='#6366f1'"` (acceptable substitute) but email input has none. Email input is not inside a `<form>` element.
Email newsletter input: outline:none with no focus handler — invisible keyboard focus
accessibility
geo-accessibility
A3

Malformed table HTML in pinned page — missing thead/tbody, broken th attribute

Medium
1h (S) HIGH Screen readers rely on thead/tbody structure for table navigation. Malformed th attribute will be unparsed by browsers (attribute ignored). Fix: correct HTML structure — `<thead><tr><th scope="col">...</th></tr></thead><tbody>...</tbody>`.
Technical details for your developer
Table at position 72905 in /claude-code-gioi-han-su-dung/: `<table ...><th scope="col" style="min-width: 100px;"ead style="background: #312e81; color: #e0e0e0;">` — th tag has truncated/corrupted attribute (`"ead style=...`). Missing `<thead>` wrapper. Then `</thead>` appears after `</tr>` (out of order). This breaks AT reading order and screen-reader table navigation.
Malformed table HTML in pinned page — missing thead/tbody, broken th attribute
accessibility
geo-accessibility
AU8

17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set

Medium
4h (M) HIGH Duplicate titles/descriptions reduce individual page differentiation in SERP. Fix: configure RankMath archive meta templates with dynamic variables (%category%, %archive_title%, %page%) to generate unique metadata per page. Target: 0 exact-duplicate title/desc pairs.
Technical details for your developer
crawl-summary.json: duplicate_meta_desc = 17, duplicate_title = 15. Combined 32 pages with duplicated metadata. Likely WordPress category/tag/archive pages using fallback templates. Specific URLs not enumerated in crawl-summary.
17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set
audit
seo-audit
AU9

70 noindex pages (23% of crawl) — author page noindexed, blocking E-E-A-T entity signal

Medium
1h (S) MEDIUM Audit the 70 noindex pages: keep admin/feed noindex; unblock author page (https://ongboit.com/author/ongboit138/) to allow Google to validate Person schema + E-E-A-T signals. Author page indexation directly supports article ranking via author entity recognition.
Technical details for your developer
crawl-summary.json: noindex_pages = 70 out of 299 (23.4%). For a ~130-article site, 70 noindex suggests WordPress admin/feeds/attachments PLUS likely tag archives, date archives, and author page. Author page E-E-A-T opportunity lost if noindexed.
70 noindex pages (23% of crawl) — author page noindexed, blocking E-E-A-T entity signal
audit
seo-audit
AU10

AI citation recovery pending — access unblocked but re-indexing not yet complete

Medium
1h (S) HIGH Monitor GA4 AI Assistant channel weekly post-fix. Set 30-day milestone: target 25+ AI Assistant sessions by 2026-07-18. Accelerate re-indexing by ensuring llms.txt is updated with latest articles (currently dated 2026-06-16, 2 days stale) and pinging AI search endpoints. Do NOT report citations as restored until re-crawl completes.
Technical details for your developer
ga4-cli.json: AI Assistant channel = 9 sessions of ~2431 total (0.4%). robots.txt Cloudflare block removed 2026-06-18 (curl-verified). AI crawlers must re-discover and re-index content before citations appear. llms.txt live at 200 with 67 links; Speakable schema present on homepage. Citation test today would still show ~0 (expected).
AI citation recovery pending — access unblocked but re-indexing not yet complete
audit
seo-audit
AU11

Mobile traffic only 16% vs Vietnamese market norm ~72% smartphone penetration

Medium
4h (M) MEDIUM If mobile friction: fix Google Fonts render-blocking (geo-technical T4), improve mobile LCP. If audience-inherent: ensure AdSense renders correctly on mobile layout and code-heavy articles have horizontal scroll for code blocks. Target: understand cause before investing in mobile optimization.
Technical details for your developer
ga4-cli.json: desktop = 1365 sessions (84%), mobile = 257 (16%), tablet = 6. Vietnam smartphone internet penetration ~72% (VNPT/Statista 2025). 16% mobile share is 4.5x below market average. May reflect developer audience (plausible for Claude Code content) or mobile UX friction.
Mobile traffic only 16% vs Vietnamese market norm ~72% smartphone penetration
audit
seo-audit
BM1

Brand name collision: '@ongboit97' is a different, larger YouTube channel

Medium
4h (M) HIGH YouTube handle ambiguity dilutes brand recall and misdirects search traffic; @ongboit97 appears first in results for 'ông bố IT' YouTube searches.
Technical details for your developer
Search site:youtube.com 'ongboit channel' returns TWO channels: UCOhOyDYdfqrldzWO0jzQD8g (@ongboit, 1 video — owned) and UCwakJ2N0D0FQgrwHEHyX6Fg (@ongboit97, multiple videos with IT/tech content). Brand search is polluted; users may land on the wrong channel.
Brand name collision: '@ongboit97' is a different, larger YouTube channel
brand
geo-brand-mentions
BM2

Facebook owned page has only 4 likes — effectively invisible

Medium
12h (L) HIGH Social proof gap weakens E-E-A-T and sameAs authority signals for AI crawlers (ChatGPT/Perplexity entity resolution relies on consistent cross-platform presence).
Technical details for your developer
facebook.com/ongboitvuitinh confirmed live: 'OngBo.IT. 4 likes.' Very low social proof signal. Page exists but has near-zero authority.
Facebook owned page has only 4 likes — effectively invisible
brand
geo-brand-mentions
BM3

YouTube owned channel has only 1 video — no authority or subscriber base yet

Medium
12h (L) HIGH YouTube is the #1 Vietnamese content platform. Zero video authority = zero referral traffic and no citability signal from video content.
Technical details for your developer
youtube.com/channel/UCOhOyDYdfqrldzWO0jzQD8g (@ongboit): '1 video. More about this channel.' The @ongboitvuitinh handle (listed in sameAs) returned 0 search results — may not be the active handle, or not yet indexed.
YouTube owned channel has only 1 video — no authority or subscriber base yet
brand
geo-brand-mentions
BM7

GitHub owned profile not indexed — missing developer-community presence

Medium
4h (M) MEDIUM Claude Code / AI coding blog with no GitHub presence loses developer trust signal. Publishing a public repo (even a simple claude-prompts or tools collection) would build authority with the core audience.
Technical details for your developer
search site:github.com 'ongboit' OR 'ongboitvuitinh' returned 0 results. GitHub profile exists (listed in sameAs) but has no public repositories or activity visible to search.
GitHub owned profile not indexed — missing developer-community presence
brand
geo-brand-mentions
BL2

18 broken external links leak link equity and signal low editorial quality

Medium
4h (M) HIGH Fix or remove all 18 broken external links. Each live, relevant outbound link to authoritative sources (Vietnamese government tech portals, Anthropic docs, GitHub) reinforces topical authority signals. Target: 0 broken external links.
Technical details for your developer
seo-audit.json finding AU4: broken_external_link = 18 (out of 299 pages crawled). Source: site crawler (confidence: high). Broken outbound links reduce perceived page quality for crawlers and degrade UX.
18 broken external links leak link equity and signal low editorial quality
brand
seo-backlinks
BL3

No Moz or DataForSEO API key configured — future audits blind to DA/spam/anchor data

Medium
1h (S) HIGH Configure free Moz API key (2,500 rows/month) at moz.com/products/api. Enables DA/PA tracking, spam score, anchor text distribution, and referring domain history. Unlocks Tier 1 confidence (0.85) for all future audits.
Technical details for your developer
backlinks_auth.py --check: tier=0, moz.available=false ('No Moz API key found'), dataforseo extension absent. Without these, every subsequent backlink audit will remain qualitative.
No Moz or DataForSEO API key configured — future audits blind to DA/spam/anchor data
brand
seo-backlinks
C3

DSAR channel is a personal Gmail — not a dedicated privacy contact

Medium
1h (S) HIGH Low trust signal for EU/California users; no routing guarantee; GDPR Art.57 supervisory compliance question if DPA investigates
Technical details for your developer
Policy sections 1 and 14 list thenguyen.ai.automation@gmail.com as the sole privacy/DSAR contact. GDPR Art.13(1)(a) requires identifying the controller and Art.77 complaint rights; while a Gmail is technically valid for a personal blog, it signals lack of separation between personal and data-controller roles, and risks missing DSAR emails if Gmail spam-filters automated requests.
DSAR channel is a personal Gmail — not a dedicated privacy contact
compliance
geo-compliance
C4

Privacy policy page has robots meta 'follow, index' but no structured data (Article/WebPage schema) — not discoverable as a legal document

Medium
1h (S) MEDIUM Minor: no automated compliance scanner credit; future AdSense policy-link verification may miss it
Technical details for your developer
https://ongboit.com/chinh-sach-bao-mat/ metadata: robots='follow, index, max-snippet:-1'. No SpecialAnnouncement or WebPage schema with @type=PrivacyPolicy detected in scrape. Google's AdSense automated checks and some compliance scanners look for machine-readable policy markers.
Privacy policy page has robots meta 'follow, index' but no structured data (Article/WebPage schema) — not discoverable as a legal document
compliance
geo-compliance
GC2

llms.txt last-updated 2026-06-16 — articles published after that date absent from AI discovery index

Medium
1h (S) HIGH AI crawlers fetching llms.txt will miss post-06-16 content. Recommend weekly or post-publish regeneration of llms.txt / llms-full.txt.
Technical details for your developer
curl https://ongboit.com/llms.txt: 'Last-Updated: 2026-06-16'. Audit date: 2026-06-18. 71 article links present across 6 clusters. Any new articles published since 06-16 are not listed.
llms.txt last-updated 2026-06-16 — articles published after that date absent from AI discovery index
geo
geo-crawlers
LL2

llms-full.txt covers only 35 of 71 linked articles (49%)

Medium
4h (M) HIGH AI models that ingest llms-full for single-fetch deep context see only half the site; reduces citation probability for missing articles
Technical details for your developer
curl https://ongboit.com/llms-full.txt | grep '^URL:' | wc -l → 35; llms.txt link count = 71. 36 articles (AI 101 primers, several Claude Code guides, Codex CLI deep-dives, n8n series) linked in llms.txt but full markdown absent from llms-full. Examples missing: /claude-code-roadmap/, /claude-code-vs-code/, /claude-code-skills/, /claude-code-hooks/, /context-window-la-gi/, /token-la-gi/ and 30 others.
llms-full.txt covers only 35 of 71 linked articles (49%)
geo-llmstxt
geo-llmstxt
IM1

17 content images missing width+height attributes (CLS risk)

Medium
4h (M) HIGH Adding width+height to 17 inline content images prevents layout shift, protects CWV CLS score. High-traffic article (/gia-bao-nhieu/) has 7 such images.
Technical details for your developer
gia-bao-nhieu: 7 imgs (pricing-section-tiers.webp, chart-*.webp) — no width/height; claude-md-la-gi: 7 carousel imgs (claudemd-carousel-*.webp) — no width/height; tiet-kiem-token: 3 section imgs (token-section-*.webp) — no width/height. All use CSS 'width:100%;height:auto' only. Browser cannot reserve layout space → CLS.
17 content images missing width+height attributes (CLS risk)
image
seo-images
IM2

LCP hero on /claude-code-gioi-han-su-dung/ served as JPEG, not WebP

Medium
1h (S) HIGH Highest-traffic page (188 clicks/28d, pos 5.1). Converting LCP hero to WebP cuts ~30-40% image payload → faster LCP. og:image JPEG also sub-optimal for social sharing.
Technical details for your developer
<img src="claude-code-gioi-han-hero-sketch-scaled.jpg" ... width="1200" height="675"> — .jpg extension confirmed. og:image also JPEG: <meta property="og:image" content="...claude-code-gioi-han-hero-sketch-1024x572.jpg">. All other article heroes are WebP.
LCP hero on /claude-code-gioi-han-su-dung/ served as JPEG, not WebP
image
seo-images
IM3

og:image width 1024px on 4 of 5 pages — below 1200px recommended minimum

Medium
4h (M) HIGH Upgrading og:image to 1200x630 across all articles ensures large card preview on Facebook/LinkedIn — measurable CTR lift for shared posts.
Technical details for your developer
<meta property="og:image:width" content="1024"> on /gioi-han/, /gia-bao-nhieu/, /tiet-kiem-token/, /claude-md-la-gi/. Only homepage serves 1200x630. Facebook recommends ≥1200px for large link previews; 1024px degrades to small card on some platforms.
og:image width 1024px on 4 of 5 pages — below 1200px recommended minimum
image
seo-images
IM4

Missing fetchpriority=high on LCP hero images for 3 article pages

Medium
1h (S) HIGH fetchpriority=high on LCP hero signals browser to fetch immediately (before layout parsing completes) — direct LCP improvement. One-line HTML attribute change per page.
Technical details for your developer
/claude-md-la-gi/: loading="eager" but no fetchpriority on claude-md-la-gi-hero.webp 1200x675. /claude-code-gia-bao-nhieu/: loading="eager" but no fetchpriority on claude-code-gia-bao-nhieu.webp 1200x675. /tiet-kiem-token/: logo has fetchpriority but content hero (first inline img) has loading=lazy. Contrast: /gioi-han/ correctly has loading="eager" fetchpriority="high" on hero.
Missing fetchpriority=high on LCP hero images for 3 article pages
image
seo-images
P1

auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip

Medium
1h (S) HIGH Fix hierarchy: change TL;DR heading to a styled <p> or <div> (it is already visually a callout box, not a real section). Eliminates heading-order warning in Lighthouse, aligns with WCAG 1.3.1 (info & relationships).
Technical details for your developer
https://ongboit.com/claude-code-auto-mode/ — grep: line 478 '<h3 style="color: #FF7F00">TL;DR</h3>' precedes line 506 '<h2>Auto Mode Là Gì...' — H1→H3 jump violates sequential heading order; screen readers and Google's heading parser treats TL;DR as a subsection of H1 with no parent H2.
auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip
page-deep-dive
seo-page
P2

auto-mode page: only 3 editorial internal links — well below site average of 10-13

Medium
1h (S) HIGH Add 5–7 topically related internal links (e.g. permission-modes, tiet-kiem-token, claude-md, gioi-han). Improves PageRank flow to this page's cluster and increases session depth from this entry point.
Technical details for your developer
https://ongboit.com/claude-code-auto-mode/ — body links extracted lines 460–735: /claude-code-hooks/, /claude-code-roadmap/, /tiet-kiem-token-claude-code/ (3 total). Comparable pages average 10-13 editorial links. Word count 4684 is also lowest of the 5 audited.
auto-mode page: only 3 editorial internal links — well below site average of 10-13
page-deep-dive
seo-page
P3

tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate

Medium
1h (S) HIGH Trim to ≤155 chars while keeping primary KW and CTA at front. Prevents Google-generated snippet from replacing the crafted description.
Technical details for your developer
https://ongboit.com/tiet-kiem-token-claude-code/ — meta name='description' content length=169 chars (198 bytes). Measured directly: 'Tiết kiệm token Claude Code: 15 mẹo giảm bill API từ $290 xuống $82/tháng. Hiểu cơ chế history gửi lại mỗi turn + cách quản lý CLAUDE.md, session và context window 2026.' Google pixel-truncates at ~920px (~155-160 chars for Vietnamese). CTA portion '...context window 2026' will be cut.
tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate
page-deep-dive
seo-page
PF1

Render-blocking Google Fonts CSS on homepage + pinned page

Medium
4h (M) HIGH ~100-300ms LCP on first paint
Technical details for your developer
geo-technical curl: <link rel=stylesheet fonts.googleapis.com> not deferred; homepage hero missing <link rel=preload>
Render-blocking Google Fonts CSS on homepage + pinned page
performance
seo-performance
PO4

llms.txt activated and reachable — 71 links now crawlable; llms-full.txt covers only 35/71 articles

Medium
4h (M) HIGH Completing llms-full.txt to 100% coverage (71 articles) gives AI models full site context in one fetch — highest density citation signal available. Prioritize the 36 missing articles, especially those in the Claude Code cluster (highest traffic).
Technical details for your developer
curl https://ongboit.com/llms.txt (2026-06-18): HTTP 200; 71 article links in 9 clusters (Claude Code top-traffic, SEO & Audit, Claude-Growth kit, n8n, Codex CLI, AI 101). llms-full.txt HTTP 200; 1,165,294 bytes but contains only 35 articles (~49% coverage). 36 articles linked in llms.txt are absent from llms-full (e.g., /claude-code-roadmap/, /claude-code-vs-code/, /claude-code-skills/). AI models fetching llms-full for single-pass deep context see only half the site. (Source: geo-llmstxt.json LL2.)
llms.txt activated and reachable — 71 links now crawlable; llms-full.txt covers only 35/71 articles
platform
geo-platform-optimizer
PO6

Zero third-party community mentions on Reddit/X — no social proof signal for AI citation engines

Medium
12h (L) HIGH Community seeding on Reddit (r/ClaudeAI, r/ChatGPT, r/singularity, r/vietcetera) with authentic contributions citing ongboit.com articles would directly build Perplexity and ChatGPT citation probability. This is a medium-term growth lever, not a quick fix.
Technical details for your developer
geo-brand-mentions.json BM4: searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit, X/Twitter, dev.to, Quora returned 0 on-brand results. Perplexity and ChatGPT heavily weight Reddit and community platform mentions for tech queries. Positive signal: 2 organic Threads mentions detected (irenejuann, tekkijournal) and TikTok cross-posting observed. No Reddit presence discovered.
Zero third-party community mentions on Reddit/X — no social proof signal for AI citation engines
platform
geo-platform-optimizer
S1

sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution

Medium
1h (S) HIGH Wikipedia sameAs is the strongest single signal for AI models to resolve entity identity across sources. Without it, ChatGPT, Perplexity, and Google AI may not confidently deduplicate 'Ông Bố IT' across platforms. Wikidata adds machine-readable entity ID (Q-number) for structured knowledge graph integration.
Technical details for your developer
curl https://ongboit.com/ | grep -c wikipedia → 0; sameAs array has 5 entries: Facebook, GitHub, TikTok, LinkedIn, YouTube. Wikipedia and Wikidata absent on both Organization and Person schemas.
sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution
schema
geo-schema
S2

FAQPage Q1 is off-topic for article (DeepClaude question on usage-limits page)

Medium
1h (S) HIGH Google evaluates FAQ schema relevance. A mismatched question does not cause penalty but dilutes schema quality signal and may surface misleading rich snippets. FAQPage is restricted (Aug 2023) so rich result benefit is already limited; nevertheless fixing content accuracy maintains semantic integrity for AI crawlers.
Technical details for your developer
Article URL: /claude-code-gioi-han-su-dung/ (usage limits). FAQPage Block 1 Q1 name='DeepClaude Có An Toàn Không?' — topic is DeepClaude+Qwen27B, unrelated to session/weekly limits. Remaining 7 questions are on-topic. Source: curl https://ongboit.com/claude-code-gioi-han-su-dung/ | python3 -c '...'; FAQPage parsed and Q1 name verified.
FAQPage Q1 is off-topic for article (DeepClaude question on usage-limits page)
schema
geo-schema
SM4

14 indexable pages crawled but absent from sitemap

Medium
1h (S) MEDIUM Missing pages rely solely on crawl discovery; adding them to the sitemap accelerates re-crawl after updates.
Technical details for your developer
Crawl: 299 URLs, noindex_pages: 70 → 229 indexable. Sitemap total: post-sitemap1 (201) + post-sitemap2 (2) + page-sitemap (6) + category-sitemap (6) = 215. Gap = 229 − 215 = 14 pages. Note: crawl may include pages Rank Math has excluded intentionally (tag archives, author pages); verify before adding blindly.
14 indexable pages crawled but absent from sitemap
sitemap
seo-sitemap
SM5

robots.txt has duplicate user-agent blocks creating conflicting directives for AI crawlers

Medium
1h (S) HIGH Remove or deconflict the Cloudflare-managed Disallow block. Keep a single user-agent group per bot with Allow: /. Prevents ambiguity and ensures AI citation crawlers (Perplexity, ClaudeBot) can access all content.
Technical details for your developer
curl https://ongboit.com/robots.txt — Cloudflare-managed section (lines ~22-38) issues Disallow: / for ClaudeBot, GPTBot, Google-Extended, Amazonbot, Applebot-Extended, Bytespider, CCBot, meta-externalagent. A subsequent manual block (lines ~44+) issues Allow: / for the same bots. Per RFC 9309, when multiple groups match, Google uses the most specific / longest-match rule, but duplicate blocks for the same user-agent can cause undefined behaviour in other crawlers. The intent (allow AI) may not be reliably honoured.
robots.txt has duplicate user-agent blocks creating conflicting directives for AI crawlers
sitemap
seo-sitemap
SM6

15 duplicate titles and 17 duplicate meta descriptions across crawled pages

Medium
4h (M) HIGH Audit which pages share titles/descriptions. For category/tag archives, either uniquify or add noindex. For posts, rewrite meta to be page-specific.
Technical details for your developer
crawl-summary.json by_check.duplicate_title = 15, duplicate_meta_desc = 17. Duplicate titles reduce click-through differentiation; duplicate meta descriptions are a signal of thin or template-driven pages that may trigger Panda-style quality filters.
15 duplicate titles and 17 duplicate meta descriptions across crawled pages
sitemap
seo-sitemap
T2

CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src

Medium
4h (M) HIGH CSP is present and enforcing (credit for live fix 2026-06-17), but unsafe-inline/unsafe-eval negate most XSS protection. WordPress + AdSense + GTM make this hard to fix without nonce/hash implementation. Recommendation: migrate to nonce-based CSP via Cloudflare Transform Rules or a WordPress CSP plugin.
Technical details for your developer
curl -sI https://ongboit.com/ | grep content-security-policy => 'script-src self unsafe-inline unsafe-eval https: blob:'. Header is ENFORCING (no Content-Security-Policy-Report-Only). unsafe-inline allows inline script injection; unsafe-eval allows eval()-based XSS.
CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src
technical
geo-technical
T3

Homepage hero image missing <link rel=preload> (LCP risk)

Medium
1h (S) HIGH LCP image on homepage is not preloaded, requiring the browser to discover it after CSS/HTML parse. Adding <link rel='preload' as='image' href='...' fetchpriority='high'> in <head> can improve LCP by 200-500ms. Pinned page already correctly implements this.
Technical details for your developer
grep 'rel="preload"' /tmp/homepage.html => 0 results. Homepage hero img: <img src='ongboit-homepage-hero.webp' fetchpriority='high' width='1376' height='768'>. Pinned page has preload: <link rel='preload' as='image' href='claude-code-gioi-han-hero-sketch-scaled.jpg' fetchpriority='high'>. Homepage lacks this.
Homepage hero image missing <link rel=preload> (LCP risk)
technical
geo-technical
T4

Google Fonts CSS loaded as render-blocking stylesheet

Medium
4h (M) HIGH Google Fonts CSS is a third-party render-blocking request. Use media='print' onload='this.media="all"' technique or load fonts via font-face in local CSS, or use a Cloudflare Worker to self-host fonts. This affects LCP on both pages.
Technical details for your developer
grep 'kadence-fonts-gfonts-css' /tmp/homepage.html => <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open+Sans:regular,700|Rubik:700..&display=swap' media='all'>. The media='all' attribute causes render-blocking. display=swap is present in URL but the CSS request itself blocks rendering.
Google Fonts CSS loaded as render-blocking stylesheet
technical
geo-technical
T5

Homepage meta description 162 chars (2 chars over 160 target)

Medium
1h (S) HIGH Minor — Google may truncate the description in SERPs. Trim to 155-160 chars for clean display. Pinned page description is 138 chars (fine).
Technical details for your developer
grep 'name="description"' /tmp/homepage.html => content length measured as 162 chars: 'Mình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.'
Homepage meta description 162 chars (2 chars over 160 target)
technical
geo-technical
V2

Body text contrast 4.46:1 fails WCAG AA by 0.04 (threshold 4.5)

Medium
1h (S) HIGH Borderline failure — 0.04 shortfall. Fix: darken body text color to rgb(100,106,114) or #64686F to clear 4.5. Negligible visual change, full compliance achieved. Priority below V1 but simple one-line CSS change.
Technical details for your developer
Playwright computed: body-text fg=rgb(110,116,124) on bg=rgb(255,247,245) = 4.46:1. WCAG AA requires 4.5:1 for normal-sized text. Delta = -0.04. Applies sitewide to all body copy and meta text.
Body text contrast 4.46:1 fails WCAG AA by 0.04 (threshold 4.5)
visual
seo-visual
CR3

Broken JS/CSS resources — 32 pages🔍 site-crawl

Medium

A referenced script or stylesheet fails to load.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Fix or remove the broken asset references.

Technical details for your developer
32 URLs affected: ongboit.com; ongboit.com/; ongboit.com/about/; ongboit.com/contact/; ongboit.com/dich-vu/; ongboit.com/claude-code-cho-team-enterprise/ (+26 more)
Broken JS/CSS resources (32 URLs)
performance
full-site-crawl
CR4

Broken outbound links — 18 pages🔍 site-crawl

Medium

Outbound links return 404/410/5xx — a trust and UX signal.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Update or remove the dead external links.

Technical details for your developer
18 URLs affected: ongboit.com/claude-code-cho-team-enterprise/; ongboit.com/claude-code-cho-sinh-vien/; ongboit.com/claude-code-vs-semrush-ahrefs/; ongboit.com/mcp-la-gi/; ongboit.com/dataforseo-la-gi/; ongboit.com/dataforseo-api-tutorial/ (+12 more)
Broken outbound links (18 URLs)
technical
full-site-crawl
CR5

Duplicate page titles — 15 pages🔍 site-crawl

Medium

Multiple pages share the same <title>, splitting relevance signals.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Make each title unique and descriptive.

Technical details for your developer
15 URLs affected: ongboit.com; ongboit.com/; ongboit.com/contact/; ongboit.com/contact/?subject=Subscribe/; ongboit.com/contact/?subject=Tu+van+30+phut/; ongboit.com/contact/?subject=kit/ (+9 more)
Duplicate page titles (15 URLs)
technical
full-site-crawl
CR6

Ai bots blocked — 1 page🔍 site-crawl

Medium

Flagged by the deterministic full-site crawl.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Review the affected URLs and resolve.

Technical details for your developer
1 URL affected: ongboit.com/robots.txt
Ai bots blocked (1 URL)
technical
full-site-crawl
CR7

Sitemap missing — 1 page🔍 site-crawl

Medium

Flagged by the deterministic full-site crawl.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Review the affected URLs and resolve.

Technical details for your developer
1 URL affected: ongboit.com/sitemap.xml
Sitemap missing (1 URL)
sitemap
full-site-crawl

Low Priority — Backlog

54 issues

Nice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

A4

Newsletter email input not wrapped in a <form> element

Low
1h (S) HIGH Keyboard users expecting to submit via Enter key will navigate away (anchor click) instead of submitting a form. Screen readers announce the link as a link not a submit button. Low severity as the flow still works, but semantics are incorrect for 4.1.2.
Technical details for your developer
`<input type="email" ...>` followed by `<a href="/contact/?subject=Subscribe">Đăng ký</a>` — this is a decorative input with no form submission. The subscribe 'button' is an anchor link, not a submit button. No form role or action defined.
Newsletter email input not wrapped in a <form> element
accessibility
geo-accessibility
A5

Search input uses JS focus indicator (border-color change) instead of CSS :focus-visible

Low
1h (S) MEDIUM The border-color change provides a visible focus indicator (PARTIAL pass for 2.4.7) but: (1) relies on JS — if JS disabled, no focus indicator at all; (2) 2px border color change is below the WCAG 2.2 AA 2.4.11 non-text contrast 3:1 threshold (new in 2.2). The site :focus-visible CSS rule should handle this. Fix: remove inline `outline:none` and rely on the existing `:focus-visible{outline:2px solid #4386fc}` rule.
Technical details for your developer
`<input type="search" ... style="... outline:none; ..." onfocus="this.style.borderColor='#6366f1'" onblur="this.style.borderColor='#e2e8f0'">` — outline suppressed inline. Focus indicator is JS-driven border-color change from #e2e8f0 to #6366f1.
Search input uses JS focus indicator (border-color change) instead of CSS :focus-visible
accessibility
geo-accessibility
AU12

Sitemap XML served with x-robots-tag: noindex — non-standard signal on sitemap URL

Low
1h (S) HIGH Low urgency but non-standard. Remove x-robots-tag: noindex from sitemap responses via Cloudflare Cache Rule or RankMath sitemap settings. Signal hygiene — no confirmed indexability impact on listed pages.
Technical details for your developer
curl -sI https://ongboit.com/sitemap_index.xml → 'x-robots-tag: noindex' (curl-verified 2026-06-18). Sitemap content returns 200 and child sitemaps (post-sitemap1, post-sitemap2, page-sitemap, category-sitemap) are enumerated correctly. Most crawlers ignore x-robots-tag on sitemaps — Google processes the content, not the URL.
Sitemap XML served with x-robots-tag: noindex — non-standard signal on sitemap URL
audit
seo-audit
AU13

32 broken JS/CSS assets — console errors may affect AdSense rendering

Low
4h (M) MEDIUM Identify broken asset URLs via browser DevTools on affected pages. Update plugin/theme or add Cloudflare redirect rules. Risk: if broken assets include AdSense ad script references, ad slots may fail to render on affected pages — missed revenue.
Technical details for your developer
crawl-summary.json: broken_js_css = 32. Likely stale plugin or theme asset references returning 404. Not a ranking signal but Console errors visible in DevTools.
32 broken JS/CSS assets — console errors may affect AdSense rendering
audit
seo-audit
BM5

2 independent Threads posts mention ongboit.com — early positive signal

Low
1h (S) MEDIUM Earliest third-party mention signals detected. Nurture by engaging Threads community; reply to both posts to reinforce brand relationship.
Technical details for your developer
threads.com/@irenejuann/post/DWWQu4GCW5T and threads.com/@tekkijournal/post/DWYiXxRmGAL both reference ongboit.com organically with link preview. Both are Claude AI / growth-digital context, matching brand positioning.
2 independent Threads posts mention ongboit.com — early positive signal
brand
geo-brand-mentions
BM6

TikTok ongboit.com links appearing on non-owned accounts — potential viral cross-posting

Low
1h (S) MEDIUM TikTok content is circulating beyond the owned channel — brand URL is reaching international audiences. Opportunity to build the @ongboitvuitinh TikTok handle into a discovery engine.
Technical details for your developer
Multiple TikTok videos from @section.store, @zachdoesai, @emeliaossai, @abhinav.bcode, @devbernardo contain comments/captions with ongboit.com URLs and '#ÔngBốIT' hashtag (claude-code-wordpress-mcp article). These appear to be reposts or comment cross-shares of ongboit's own TikTok videos.
TikTok ongboit.com links appearing on non-owned accounts — potential viral cross-posting
brand
geo-brand-mentions
BM8

Wikipedia/Wikidata entity absent — expected for 3-month-old blog, but plan ahead

Low
12h (L) LOW No Wikipedia entity means no Knowledge Panel. Not actionable now, but publishing original research and earning backlinks from .edu/.org sources is the prerequisite. Flag for 12-month horizon.
Technical details for your developer
search site:wikipedia.org OR site:wikidata.org 'ongboit' returned 0 results.
Wikipedia/Wikidata entity absent — expected for 3-month-old blog, but plan ahead
brand
geo-brand-mentions
BL4

Brand not yet indexed in Common Crawl — no crawl-graph footprint established

Low
1h (S) MEDIUM Submit sitemap to Bing Webmaster Tools and IndexNow to accelerate discovery. Ensure at least one high-DA Vietnamese site links to ongboit.com before next CC crawl window to establish a PageRank seed node. Low direct impact, but foundational for future audit data availability.
Technical details for your developer
commoncrawl_graph.py: in_crawl=false. CC Jan-Mar 2026 snapshot covers the period when ongboit.com launched. Next CC release (Apr-Jun 2026) will determine if the domain has been discovered. A domain absent from CC has no third-party PageRank signal independent of Google.
Brand not yet indexed in Common Crawl — no crawl-graph footprint established
brand
seo-backlinks
C5

Cookie banner dismissal state 'cmplz-dismissed' visible in raw HTML — verify first-visit behavior

Low
1h (S) MEDIUM If banner pre-dismissed for new visitors, GDPR opt-in consent is invalid for Analytics/AdSense; needs manual first-visit incognito verification
Technical details for your developer
Firecrawl HTML on /privacy-policy/ 404 page shows: class='cmplz-cookiebanner ... cmplz-dismissed'. This 'dismissed' class may indicate the banner was already closed by a prior session cookie in the scraper's browser context, not a structural bug. However, if the banner does not re-show on first visit across all pages including 404, new visitors may skip consent entirely.
Cookie banner dismissal state 'cmplz-dismissed' visible in raw HTML — verify first-visit behavior
compliance
geo-compliance
GC3

ClaudeUser and OAI-SearchBot listed but not all Anthropic/OpenAI agent variants covered

Low
1h (S) HIGH Negligible: wildcard covers unlisted bots. Explicit listing is best practice for forward-proofing against future Cloudflare managed-block expansions.
Technical details for your developer
robots.txt includes ClaudeBot, anthropic-ai, ClaudeUser (allow), GPTBot, ChatGPT-User, OAI-SearchBot (allow). No listing for 'Claude-Web' (Anthropic browsing agent) — falls through to wildcard Allow:/ which is functionally safe but lacks explicit signal.
ClaudeUser and OAI-SearchBot listed but not all Anthropic/OpenAI agent variants covered
geo
geo-crawlers
LL1

Last-Updated date is 2 days stale

Low
1h (S) HIGH AI crawlers (GPTBot, PerplexityBot) may cache stale index; fresh articles invisible until next rebuild
Technical details for your developer
curl https://ongboit.com/llms.txt → 'Last-Updated: 2026-06-16'; audit date is 2026-06-18. File was last rebuilt 2 days ago; if new articles published since then they are missing.
Last-Updated date is 2 days stale
geo-llmstxt
geo-llmstxt
LL3

llms-full.txt cache TTL is 1h; should match static-asset policy (1yr)

Low
1h (S) HIGH Higher origin bandwidth load; Cloudflare won't serve from edge cache efficiently; crawler quota burned on repeat fetches
Technical details for your developer
curl -sI https://ongboit.com/llms-full.txt → 'Cache-Control: public, max-age=3600'. Other static assets set 1yr (31536000) per Phase-4 shared context (Cloudflare CDN + static Cache-Control 1yr live fix 06-17). llms-full at 1.1 MB re-fetched hourly wastes crawler bandwidth.
llms-full.txt cache TTL is 1h; should match static-asset policy (1yr)
geo-llmstxt
geo-llmstxt
LL4

Shared-context link count (67) lags actual count (71) by 4

Low
1h (S) HIGH Internal audit baseline drift; no user-facing impact
Technical details for your developer
phase4-shared-context.md states 'llms.txt 67 links'; curl https://ongboit.com/llms.txt | grep -c '^- \[' → 71. Delta +4 indicates 4 articles added since shared context was written (2026-06-17). Not a live site problem — internal tracking note only.
Shared-context link count (67) lags actual count (71) by 4
geo-llmstxt
geo-llmstxt
LL5

No X-Robots-Tag or explicit AI-bot permission header on llms-full.txt

Low
1h (S) MEDIUM Marginal — AI crawlers already permitted via robots.txt; no blocking observed
Technical details for your developer
curl -sI https://ongboit.com/llms-full.txt — no X-Robots-Tag header present. robots.txt already allows 25 AI bots (per shared context), so crawl access is fine; however an explicit 'X-Robots-Tag: all' on the llms-full endpoint would signal unambiguous AI-indexing intent.
No X-Robots-Tag or explicit AI-bot permission header on llms-full.txt
geo-llmstxt
geo-llmstxt
GG1

Query-level click concentration — 3 pages drive majority of clicks

Low
12h (L) HIGH diversify pillar coverage to de-risk
Technical details for your developer
GSC top-3 pages = 432 clicks; traffic floor depends on a few Claude-Code pillars
Query-level click concentration — 3 pages drive majority of clicks
google-api
seo-google
H1

Hreflang implementation is correct and complete for a single-locale Vietnamese site

Low
1h (S) HIGH Informational — no action required. Fix already live (2026-06-17). Self-referential vi + x-default is the correct minimal set for a single-locale site per Google's hreflang spec.
Technical details for your developer
curl https://ongboit.com/ grep hreflang: <link rel="alternate" hreflang="vi" href="https://ongboit.com/" /> + <link rel="alternate" hreflang="x-default" href="https://ongboit.com/" />. Same pattern on pinned page /claude-code-gioi-han-su-dung/: hreflang="vi" href="https://ongboit.com/claude-code-gioi-han-su-dung/" + hreflang="x-default" href="https://ongboit.com/claude-code-gioi-han-su-dung/". Self-referential vi + x-default both pointing to canonical URL on each page. No other locales exist on the site, so no cross-locale return tags are needed or missing.
Hreflang implementation is correct and complete for a single-locale Vietnamese site
hreflang
seo-hreflang
H2

No hreflang via HTTP Link headers (HTML-only delivery — acceptable)

Low
1h (S) HIGH No ranking impact. HTTP-header method only required for PDFs/non-HTML resources. WordPress HTML delivery is correct.
Technical details for your developer
curl -sI https://ongboit.com/ | grep -i link: no hreflang Link headers present in HTTP response. Tags delivered via <head> HTML only. Both HTML and HTTP-header delivery are valid per Google spec; HTML-only is standard for WordPress sites.
No hreflang via HTTP Link headers (HTML-only delivery — acceptable)
hreflang
seo-hreflang
IM5

AVIF format not used anywhere (0%)

Low
12h (L) HIGH Medium-term: enabling Cloudflare Image Optimization or a server-side AVIF pipeline reduces image payload across all pages. Lower priority given WebP already active.
Technical details for your developer
0 of 116 sampled img src URLs contain .avif extension. WebP covers 93.1%. AVIF offers 20-30% additional size savings over WebP, now supported by all major browsers.
AVIF format not used anywhere (0%)
image
seo-images
IM6

External Buy Me A Coffee image (cdn.buymeacoffee.com) lacks width+height dimensions

Low
1h (S) HIGH Low. Add width="160" height="40" to eliminate minor layout shift from third-party badge.
Technical details for your developer
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 40px; width: auto;"> — no width/height attributes; only inline CSS height. Minor CLS since it is small and third-party.
External Buy Me A Coffee image (cdn.buymeacoffee.com) lacks width+height dimensions
image
seo-images
IM7

Avatar images (author thumbnails) served without loading=lazy on article pages

Low
1h (S) MEDIUM Minor bandwidth savings on pages with long related-post lists. WordPress avatar function does not add loading=lazy by default.
Technical details for your developer
On /gioi-han/: multiple <img src="the-avatar-600-150x150.webp" width="50" height="50"> without loading=lazy — at least 5 instances. These are above/near fold but repeating avatar pattern across related posts sidebar; lazy would not hurt as sidebars are below fold.
Avatar images (author thumbnails) served without loading=lazy on article pages
image
seo-images
P4

twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account

Low
1h (S) HIGH Add <meta name='twitter:site' content='@ongboitvuitinh'> to RankMath global social settings (applies sitewide in one edit). Low friction, improves brand attribution on Twitter shares.
Technical details for your developer
curl grep 'twitter:site' on all 5 pages returns 0 matches. Pages have twitter:card=summary_large_image + twitter:title + twitter:description + twitter:image but no twitter:site='@ongboitvuitinh' (the TikTok handle used in sameAs schema suggests account exists). Without twitter:site, share cards appear without @attribution.
twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account
page-deep-dive
seo-page
P5

Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token)

Low
1h (S) HIGH Divergence is intentional SEO practice (title=SERP click-bait, H1=on-page context) and Google handles it. No fix required if divergence is deliberate; document as accepted pattern. Flag only if divergence was accidental (e.g., RankMath title override was forgotten). Severity P3 = monitor, not urgent.
Technical details for your developer
gioi-han: title='...2026: Session 5h, Weekly 7 Ngày' vs H1='...Session, Weekly & Cách Tối Ưu (2026)'. gia-bao-nhieu: title='...$20-$200 + Cách Mua Rẻ Nhất' vs H1='...Pro vs Max + Mua Giá Rẻ'. tiet-kiem-token: title starts 'Tiết Kiệm Token Claude Code...' vs H1 starts '15 Mẹo Tiết Kiệm...' — measured via sed/grep on live pages 2026-06-18.
Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token)
page-deep-dive
seo-page
P6

OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image

Low
4h (M) HIGH Update og:image references to point to 1200-wide crop (WP crop at 1200x630 or use existing *-scaled.jpg). Affects how cards render on Twitter/X share preview — sharper on retina displays, no letterboxing.
Technical details for your developer
All 5 pages: og:image:width=1024 (confirmed via og:image:width meta tag). Twitter summary_large_image recommends minimum 1200×630 for lossless display on modern hi-DPI screens. Source images exist at scaled sizes (e.g. gioi-han hero at 2560×1429 in WP media library per JSON-LD ImageObject).
OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image
page-deep-dive
seo-page
PF2

Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth

Low
1h (S) HIGH none — field green
Technical details for your developer
CrUX field LCP p75=1266ms GOOD vs prior lab ~9.6s; field passes
Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth
performance
seo-performance
PO7

llms.txt Last-Updated is 2 days stale (2026-06-16) — new articles not indexed for AI crawlers

Low
1h (S) HIGH Automate llms.txt rebuild on each WP publish hook (e.g., via n8n or WP action hook) to keep the AI discovery index current. Low effort if an automation already exists for WP publish events.
Technical details for your developer
curl https://ongboit.com/llms.txt → 'Last-Updated: 2026-06-16'. Audit date: 2026-06-18. llms.txt has 71 links (4 more than the 67 in shared-context, suggesting manual update since), but any articles published after 06-16 are absent. (Source: geo-llmstxt.json LL1 + LL4.)
llms.txt Last-Updated is 2 days stale (2026-06-16) — new articles not indexed for AI crawlers
platform
geo-platform-optimizer
PO8

FAQPage Q1 is off-topic for the pinned article — semantic integrity issue for AI passage extraction

Low
1h (S) HIGH Replace Q1 with an on-topic usage-limits question (e.g., 'Claude Code giới hạn sử dụng reset như thế nào?'). Small schema edit via RankMath FAQ block; directly improves AI passage classification accuracy.
Technical details for your developer
geo-schema.json S2: Article URL /claude-code-gioi-han-su-dung/ (usage limits). FAQPage Block 1 Q1 name='DeepClaude Có An Toàn Không?' — topic is DeepClaude+Qwen27B, unrelated to session/weekly limits. 7 remaining questions are on-topic. AI crawlers doing passage-level extraction may miscategorize the article's topic cluster based on the first FAQ question.
FAQPage Q1 is off-topic for the pinned article — semantic integrity issue for AI passage extraction
platform
geo-platform-optimizer
S3

Person schema absent from homepage — AI crawlers visiting / only cannot resolve author entity

Low
1h (S) HIGH AI crawlers (GPTBot, ClaudeBot) that land on the homepage cannot link the Organization to its human author/founder. Adding Person to the homepage @graph with worksFor + sameAs creates a full entity web from the root URL.
Technical details for your developer
curl https://ongboit.com/ | grep Person → 0 matches in JSON-LD. Homepage @graph types: ['Organization', 'WebSite', 'ImageObject', 'WebPage']. Person node only present on article pages.
Person schema absent from homepage — AI crawlers visiting / only cannot resolve author entity
schema
geo-schema
S4

BlogPosting missing explicit 'url' property — @id-based reference only

Low
1h (S) MEDIUM Minor. Google's Rich Results Test accepts @id-to-WebPage linking, but explicit url='https://ongboit.com/claude-code-gioi-han-su-dung/' on BlogPosting improves robustness and AI parser compatibility.
Technical details for your developer
curl article page | BlogPosting node: url property MISSING. @id='https://ongboit.com/claude-code-gioi-han-su-dung/#richSnippet' (fragment URL, not canonical). mainEntityOfPage references WebPage @id which has the canonical url. Rich result validators prefer explicit url on the Article node.
BlogPosting missing explicit 'url' property — @id-based reference only
schema
geo-schema
S5

Kadence theme microdata (WebPage, WPHeader) coexists with JSON-LD — format mix

Low
1h (S) HIGH Low practical risk — no itemprop means no actual property data exposed via microdata. Google ignores empty Microdata wrappers. However, the presence of itemscope without properties wastes markup and may confuse validator tools. Consider disabling theme microdata output if RankMath controls all structured data.
Technical details for your developer
curl https://ongboit.com/ | grep itemscope → 2 matches: itemtype=schema.org/WebPage and schema.org/WPHeader. itemprop count=0 (no property markup attached). These are Kadence theme structural attributes.
Kadence theme microdata (WebPage, WPHeader) coexists with JSON-LD — format mix
schema
geo-schema
SM1

x-robots-tag: noindex on all sitemap files — Googlebot cannot discover or use sitemaps

Low
1h (S) HIGH Until resolved, Google cannot process the sitemap; URL discovery falls back to crawl only. Fix: add Rank Math / server rule to suppress x-robots-tag on *.xml sitemap paths, or ensure Cloudflare page rule does not apply a blanket noindex header to XML responses.
Technical details for your developer
curl -sI https://ongboit.com/sitemap_index.xml → x-robots-tag: noindex (confirmed 2026-06-18T00:54:38). Same header on post-sitemap1.xml, post-sitemap2.xml, page-sitemap.xml, category-sitemap.xml. Google ignores any sitemap file it receives a noindex header on, rendering all 215 submitted URLs invisible to the sitemap pipeline despite sitemap_index.xml returning HTTP 200. [SYNTHESIS CORRECTION: X-Robots-Tag:noindex on sitemap XML is RankMath default + standard — Google still fetches/processes noindex sitemaps (confirmed by Google's J. Mueller). Not a crawl blocker; downgraded P0→P3.]
x-robots-tag: noindex on all sitemap files — Googlebot cannot discover or use sitemaps
sitemap
seo-sitemap
SM7

sitemap_index.xml was 404 earlier today — now fixed (credit given)

Low
1h (S) HIGH Fix confirmed. No further action required for the 404 itself. Monitor GSC Coverage report for sitemap re-processing over next 7 days.
Technical details for your developer
phase4-shared-context.md notes sitemap_index.xml was 404 pre-rewrite-flush 2026-06-18. Live curl at 00:54:38 UTC confirms HTTP 200. crawl-summary.json by_check.sitemap_missing: 1 is stale and reflects the pre-fix state.
sitemap_index.xml was 404 earlier today — now fixed (credit given)
sitemap
seo-sitemap
SM8

3 pages have multiple H1 tags — structural signal for content quality

Low
1h (S) HIGH Reduce each affected page to a single H1. Typically caused by theme/block-editor theme header components outputting a redundant H1.
Technical details for your developer
crawl-summary.json by_check.h1_multiple = 3. Multiple H1s per page are valid HTML5 but remain a best-practice violation; Google has stated it uses the first H1 as primary heading signal. Risk is low but nonzero for these pages.
3 pages have multiple H1 tags — structural signal for content quality
sitemap
seo-sitemap
T6

Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl)

Low
1h (S) HIGH Cosmetic — does not affect crawler parsing of sitemap URLs. Fix by updating RankMath sitemap XSL path to absolute HTTPS URL. No crawlability impact.
Technical details for your developer
curl https://ongboit.com/sitemap_index.xml | head -2 => '<?xml-stylesheet type="text/xsl" href="//ongboit.com/main-sitemap.xsl"?>'. Protocol-relative path; functional over HTTPS but non-standard.
Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl)
technical
geo-technical
T7

Cache-Control for theme CSS is 30 days vs 1 year for images

Low
1h (S) HIGH CSS/JS assets could benefit from 1-year cache with versioned URLs (Kadence uses ?ver= query strings, so cache-busting is handled). Increasing to max-age=31536000 for theme CSS/JS would improve repeat-visit performance. Configure via Cloudflare Cache Rules.
Technical details for your developer
curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css => Cache-Control: max-age=2592000 (30d), cf-cache-status: MISS. Image: Cache-Control: max-age=31536000 (1yr), cf-cache-status: HIT.
Cache-Control for theme CSS is 30 days vs 1 year for images
technical
geo-technical
V3

Focus-visible rule confirmed present but scope may be narrow (mobile menu only)

Low
1h (S) MEDIUM If no broader focus rule exists, keyboard users see no focus ring on nav links, content links, search input button. Add global: 'a:focus-visible, button:focus-visible, [tabindex]:focus-visible { outline: 3px solid #4386FC; outline-offset: 2px; }' to custom CSS.
Technical details for your developer
Stylesheet scan found exactly one :focus-visible rule: '.mobile-toggle-open-container .menu-toggle-open:hover, .mobile-toggle-open-container .menu-toggle-open:focus-visible'. Shared context notes 'focus-visible CSS' was added 2026-06-17. No global a:focus-visible or button:focus-visible rule surfaced from accessible sheets. Cross-origin Kadence/Cloudflare sheets blocked from cssRules access — global rule may exist there (confidence: medium).
Focus-visible rule confirmed present but scope may be narrow (mobile menu only)
visual
seo-visual
V4

Mobile CTA off-screen on 375x667 (iPhone SE) viewport

Low
1h (S) MEDIUM Users on smallest supported phones must scroll to see CTA. Reduce hero illustration height on mobile or reorder: CTA above hero image. Low business impact given traffic mix but quick fix.
Technical details for your developer
Homepage mobile 390x844: primary CTA top=552px (above fold on 844px device). On 375x667 (iPhone SE, ~4-6% of mobile users), CTA at ~552px would be below fold requiring scroll. H1 visible at 151px on all viewports.
Mobile CTA off-screen on 375x667 (iPhone SE) viewport
visual
seo-visual
V5

Carousel off-screen slides extend beyond desktop viewport bounds

Low
1h (S) MEDIUM Verify .splide__track has overflow:hidden in computed CSS. If already clipped, no action needed. If not, add overflow:hidden to prevent keyboard/AT users from reaching hidden slides.
Technical details for your developer
Pinned page desktop 1920px: Splide carousel .splide__slide/.entry-list-item elements render to x=2038 (+118px outside viewport). Body bodyScrollWidth=1920 — no horizontal scroll at body level. This is standard Splide off-canvas slide pattern. Risk: if .splide__track overflow is not hidden, screen reader or keyboard users could tab to off-screen slide content.
Carousel off-screen slides extend beyond desktop viewport bounds
visual
seo-visual
V6

CLS = 0.0 on all tested pages/viewports — PASS

Low
1h (S) HIGH Positive. CWV CLS target <0.1 met with margin. No action needed.
Technical details for your developer
PerformanceObserver layout-shift entries = 0 on homepage+pinned, desktop+mobile. networkidle+2s settle window used. Hero preload fix (2026-06-17) credited.
CLS = 0.0 on all tested pages/viewports — PASS
visual
seo-visual
CR8

Slow server response (TTFB) — 290 pages🔍 site-crawl

Low

Many URLs are slow to first byte.

24h (L) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Add caching/CDN to cut TTFB.

Technical details for your developer
290 URLs affected: ongboit.com/about/; ongboit.com/category/seo/; ongboit.com/category/claude-code/; ongboit.com/category/self-hosting/; ongboit.com/category/codex-cli/; ongboit.com/category/ai-101/ (+284 more)
Slow server response (TTFB) (290 URLs)
performance
full-site-crawl
CR9

Large HTML payload — 279 pages🔍 site-crawl

Low

Pages ship a large HTML document.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Reduce inline bloat or split content.

Technical details for your developer
279 URLs affected: ongboit.com; ongboit.com/; ongboit.com/about/; ongboit.com/category/seo/; ongboit.com/category/claude-code/; ongboit.com/category/codex-cli/ (+273 more)
Large HTML payload (279 URLs)
performance
full-site-crawl
CR10

Low text-to-HTML ratio — 26 pages🔍 site-crawl

Low

Heavy markup versus little text.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Trim markup or add substantive content.

Technical details for your developer
26 URLs affected: ongboit.com; ongboit.com/; ongboit.com/about/; ongboit.com/category/seo/; ongboit.com/category/claude-code/; ongboit.com/category/self-hosting/ (+20 more)
Low text-to-HTML ratio (26 URLs)
technical
full-site-crawl
CR11

Duplicate meta descriptions — 17 pages🔍 site-crawl

Low

Multiple pages share one meta description.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Write a unique description per page.

Technical details for your developer
17 URLs affected: ongboit.com; ongboit.com/; ongboit.com/contact/; ongboit.com/contact/?subject=Subscribe/; ongboit.com/contact/?subject=Tu+van+30+phut/; ongboit.com/contact/?subject=kit/ (+11 more)
Duplicate meta descriptions (17 URLs)
technical
full-site-crawl
CR12

Internal links to redirects — 14 pages🔍 site-crawl

Low

Internal links pass through a 301 hop — minor crawl waste.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Point links straight at the final URL.

Technical details for your developer
14 URLs affected: ongboit.com/claude-code-design-skill/; ongboit.com/claude-code-marketing-skills/; ongboit.com/claude-code-master-hacks/; ongboit.com/claude-code-gioi-han-su-dung/; ongboit.com/dataforseo-pricing/; ongboit.com/claude-code-sub-agents/ (+8 more)
Internal links to redirects (14 URLs)
technical
full-site-crawl
CR13

Near-orphan pages (one internal link in) — 14 pages🔍 site-crawl

Low

Pages with only one internal dofollow link in are weakly connected.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Add internal links from related content.

Technical details for your developer
14 URLs affected: ongboit.com/category/ai-101/page/2/; ongboit.com/category/n8n/page/2/; ongboit.com/contact/?subject=Tu+van+30+phut/; ongboit.com/contact/?subject=kit/; ongboit.com/contact/?subject=Content/; ongboit.com/contact/?subject=Automation/ (+8 more)
Near-orphan pages (one internal link in) (14 URLs)
technical
full-site-crawl
CR14

Nofollow outbound links (informational) — 13 pages🔍 site-crawl

Low

Some external links are nofollow.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Review whether intended.

Technical details for your developer
13 URLs affected: ongboit.com/chinh-sach-bao-mat/; ongboit.com/claude-code-master-hacks/; ongboit.com/dataforseo-mcp-setup/; ongboit.com/dataforseo-la-gi/; ongboit.com/dataforseo-api-tutorial/; ongboit.com/dataforseo-pricing/ (+7 more)
Nofollow outbound links (informational) (13 URLs)
technical
full-site-crawl
CR15

Incomplete OpenGraph tags — 10 pages🔍 site-crawl

Low

Missing og: tags weaken social and AI link previews.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Add the missing OpenGraph tags.

Technical details for your developer
10 URLs affected: ongboit.com/category/seo/; ongboit.com/category/claude-code/; ongboit.com/category/self-hosting/; ongboit.com/category/codex-cli/; ongboit.com/category/ai-101/; ongboit.com/category/n8n/ (+4 more)
Incomplete OpenGraph tags (10 URLs)
technical
full-site-crawl
CR16

Incomplete structured data — 10 pages🔍 site-crawl

Low

JSON-LD entities miss recommended properties.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Add the missing schema properties.

Technical details for your developer
10 URLs affected: ongboit.com/category/seo/; ongboit.com/category/claude-code/; ongboit.com/category/self-hosting/; ongboit.com/category/codex-cli/; ongboit.com/category/ai-101/; ongboit.com/category/n8n/ (+4 more)
Incomplete structured data (10 URLs)
schema
full-site-crawl
CR17

Meta descriptions too short — 8 pages🔍 site-crawl

Low

Short descriptions waste SERP real estate.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Expand to ~150 characters.

Technical details for your developer
8 URLs affected: ongboit.com/category/seo/; ongboit.com/category/claude-code/; ongboit.com/category/self-hosting/; ongboit.com/category/ai-101/; ongboit.com/category/n8n/; ongboit.com/dieu-khoan-su-dung/ (+2 more)
Meta descriptions too short (8 URLs)
technical
full-site-crawl
CR19

Meta desc too long — 4 pages🔍 site-crawl

Low

Flagged by the deterministic full-site crawl.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Review the affected URLs and resolve.

Technical details for your developer
4 URLs affected: ongboit.com; ongboit.com/; ongboit.com/tiet-kiem-token-claude-code/; ongboit.com/claude-code-audit-website/
Meta desc too long (4 URLs)
technical
full-site-crawl
CR20

Thin page: H1 duplicates the title — 3 pages🔍 site-crawl

Low

On a thin/short-title page the H1 repeats the title verbatim.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Differentiate the H1 or enrich the page.

Technical details for your developer
3 URLs affected: ongboit.com/dich-vu/; ongboit.com/dieu-khoan-su-dung/; ongboit.com/chinh-sach-bao-mat/
Thin page: H1 duplicates the title (3 URLs)
technical
full-site-crawl
CR21

Multiple H1 tags — 3 pages🔍 site-crawl

Low

Pages with more than one H1 muddy the document outline.

2h (S) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Keep a single H1 per page.

Technical details for your developer
3 URLs affected: ongboit.com/system-prompt-la-gi/; ongboit.com/dataforseo-mcp-setup/; ongboit.com/dataforseo-api-tutorial/
Multiple H1 tags (3 URLs)
technical
full-site-crawl
CR22

Too many links on a page — 2 pages🔍 site-crawl

Low

Excessive links dilute link equity and crawl focus.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Trim to the most useful links.

Technical details for your developer
2 URLs affected: ongboit.com/claude-code-roadmap/; ongboit.com/claude-code-la-gi/
Too many links on a page (2 URLs)
technical
full-site-crawl
CR23

Not compressed — 1 page🔍 site-crawl

Low

Flagged by the deterministic full-site crawl.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Review the affected URLs and resolve.

Technical details for your developer
1 URL affected: ongboit.com
Not compressed (1 URL)
performance
full-site-crawl
CR24

No cache control — 1 page🔍 site-crawl

Low

Flagged by the deterministic full-site crawl.

8h (M) HIGH Resolving improves crawlability and on-page quality across the affected pages.

Recommended fix

Review the affected URLs and resolve.

Technical details for your developer
1 URL affected: ongboit.com
No cache control (1 URL)
performance
full-site-crawl

Technical Deep Dive

83/100

Rating: Good · Primary source: /geo-technical (81/100)

Cross-checked by: seo-audit: 74/100seo-page: 74/100

Findings from /geo-technical (7)

P1 robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers

Evidence: curl https://ongboit.com/robots.txt | grep -n ClaudeBot => line 44: 'ClaudeBot\nDisallow: /' (Cloudflare Managed block); line 78: 'ClaudeBot\nAllow: /' (publisher manual section). Per RFC 9309, for same user-agent the last matching rule wins — however Cloudflare's managed block a

Impact: AI crawlers (ClaudeBot, GPTBot, Google-Extended etc.) may read the Disallow rule from the Cloudflare Managed section and skip the site. Publisher should remove the Cloudflare Managed Content block or toggle the Cloudflare dashboard setting to 'Allow AI scrapers' which removes tho

P2 CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src

Evidence: curl -sI https://ongboit.com/ | grep content-security-policy => 'script-src self unsafe-inline unsafe-eval https: blob:'. Header is ENFORCING (no Content-Security-Policy-Report-Only). unsafe-inline allows inline script injection; unsafe-eval allows eval()-based XSS.

Impact: CSP is present and enforcing (credit for live fix 2026-06-17), but unsafe-inline/unsafe-eval negate most XSS protection. WordPress + AdSense + GTM make this hard to fix without nonce/hash implementation. Recommendation: migrate to nonce-based CSP via Cloudflare Transform Rules or

P2 Homepage hero image missing <link rel=preload> (LCP risk)

Evidence: grep 'rel="preload"' /tmp/homepage.html => 0 results. Homepage hero img: <img src='ongboit-homepage-hero.webp' fetchpriority='high' width='1376' height='768'>. Pinned page has preload: <link rel='preload' as='image' href='claude-code-gioi-han-hero-sketch-scaled.jpg' fetchpriority

Impact: LCP image on homepage is not preloaded, requiring the browser to discover it after CSS/HTML parse. Adding <link rel='preload' as='image' href='...' fetchpriority='high'> in <head> can improve LCP by 200-500ms. Pinned page already correctly implements this.

P2 Google Fonts CSS loaded as render-blocking stylesheet

Evidence: grep 'kadence-fonts-gfonts-css' /tmp/homepage.html => <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open+Sans:regular,700|Rubik:700..&display=swap' media='all'>. The media='all' attribute causes render-blocking. display=swap is

Impact: Google Fonts CSS is a third-party render-blocking request. Use media='print' onload='this.media="all"' technique or load fonts via font-face in local CSS, or use a Cloudflare Worker to self-host fonts. This affects LCP on both pages.

P2 Homepage meta description 162 chars (2 chars over 160 target)

Evidence: grep 'name="description"' /tmp/homepage.html => content length measured as 162 chars: 'Mình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.'

Impact: Minor — Google may truncate the description in SERPs. Trim to 155-160 chars for clean display. Pinned page description is 138 chars (fine).

P3 Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl)

Evidence: curl https://ongboit.com/sitemap_index.xml | head -2 => '<?xml-stylesheet type="text/xsl" href="//ongboit.com/main-sitemap.xsl"?>'. Protocol-relative path; functional over HTTPS but non-standard.

Impact: Cosmetic — does not affect crawler parsing of sitemap URLs. Fix by updating RankMath sitemap XSL path to absolute HTTPS URL. No crawlability impact.

P3 Cache-Control for theme CSS is 30 days vs 1 year for images

Evidence: curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css => Cache-Control: max-age=2592000 (30d), cf-cache-status: MISS. Image: Cache-Control: max-age=31536000 (1yr), cf-cache-status: HIT.

Impact: CSS/JS assets could benefit from 1-year cache with versioned URLs (Kadence uses ?ver= query strings, so cache-busting is handled). Increasing to max-age=31536000 for theme CSS/JS would improve repeat-visit performance. Configure via Cloudflare Cache Rules.

Findings from /seo-audit (13)

P0 RESOLVED: Cloudflare AI-crawler robots.txt block removed — all 14 named AI bots now explicitly Allowed

Evidence: Prior run: '# BEGIN Cloudflare Managed content' block Disallowed GPTBot, ClaudeBot, Google-Extended, CCBot, Amazonbot, Applebot-Extended, Bytespider, meta-externalagent before publisher Allow rules. POST-FIX curl 2026-06-18: robots.txt shows NO Cloudflare Managed block. All 14 na

Impact: RESOLVED. Crawler access restored. AI citation recovery is NOT instant — GPTBot/ClaudeBot/Google-Extended must re-crawl and re-index (expected 1-4 weeks). GA4 AI Assistant channel (currently 9 sessions) expected to grow post-reindex. Monitor weekly. Do NOT claim citations restore

P0 /privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet

Evidence: curl -sI https://ongboit.com/privacy-policy/ → HTTP/1.1 404 Not Found (curl-verified 2026-06-18). A privacy policy page is mandatory for Google AdSense publisher program compliance (Google Publisher Policy) and for GDPR/PDPD (Vietnam Personal Data Protection Decree 13/2023). 404

Impact: AdSense non-compliance risk: Google's review process checks for accessible privacy policy. If AdSense ad-serving is live but policy page is 404, account is flagged. Fix: publish privacy policy to /privacy-policy/ in WordPress (re-publish if accidentally set to Draft), or add a re

P1 Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl

Evidence: seo-backlinks.json: Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, referring_domains_sample=0. DataForSEO/Moz/Bing APIs unavailable. Domain age ~3 months (launched ~Mar 2026). GSC top 3 pages at positions 5.1, 7.9, 6.1 — competitive positions achieved on content quality a

Impact: External authority is the primary long-term ranking lever. Even 5-10 quality referring domains (Vietnamese IT media, GitHub profiles, tech communities, developer forums) would establish a CC PageRank seed node and provide position stability. Target: 10+ referring domains within 6

P1 Slow TTFB on 290/299 crawled pages — origin server response bottleneck

Evidence: crawl-summary.json: slow_ttfb count = 290 out of 299 pages (97%). Homepage curl: HTTP 200, Connection: keep-alive, cf-cache-status: DYNAMIC — pages are hitting origin on every request, not serving from Cloudflare edge cache. Origin WP/PHP response overhead not mitigated.

Impact: TTFB is a direct LCP prerequisite; slow TTFB delays Largest Contentful Paint on all pages. Fix: enable Cloudflare Cache Rules for WordPress pages (Cache Everything rule for GET requests excluding admin/cart paths), or install WP Rocket / LiteSpeed Cache for full-page caching. Tar

P1 35 broken internal links + 18 broken external links — crawl-budget waste and equity leak

Evidence: crawl-summary.json: links_to_broken_page = 35 (internal 4xx destinations), broken_external_link = 18. With 299 pages crawled, 35 broken internal links represents systematic crawl-budget waste. 18 broken external links degrade perceived editorial quality.

Impact: Fix broken internal links first (redirect or update href): run Screaming Frog / Ahrefs broken link report. For external, remove or replace with live alternatives. Each fixed link restores link equity flow and removes crawl waste signal. Target: 0 broken internal, <5 broken extern

P1 Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor

Evidence: gsc-top-pages.json: claude-code-gioi-han-su-dung 188 clicks (pos 5.1) + claude-code-gia-bao-nhieu 142 clicks (pos 7.9) + tiet-kiem-token-claude-code 102 clicks (pos 6.1) = 432 of ~670 total top-12 clicks. All three pages sit in a zone (positions 5-9) where a single algorithm upda

Impact: Diversify by pushing tier-2 pages (claude-code-vs-code pos 7.4, claude-code-auto-mode pos 4.9, obsidian-claude-code pos 7.8) into top 5 via internal link equity from top-3 pages. Target: 5+ pages contributing >10 clicks each within 90 days.

P1 Brand orange #FF7F00 fails WCAG 1.4.3 AA contrast on white backgrounds — 4 surface types

Evidence: geo-accessibility.json: #FF7F00 on #ffffff = 2.53:1 (large text needs 3:1, normal text needs 4.5:1). Affected: H1 hero span, .obit-catall links (0.9em bold), .home-faq-answer a, .entry-content table a. curl-verified colors present on homepage.

Impact: WCAG AA failure on 4 surfaces. Affects AdSense publisher quality signals and Core Web Vitals accessibility scoring. Fix: darken brand orange to #C05F00 (~3.2:1 large, ~5:1 normal) or #B35900 for white-background surfaces only. Dark-background uses (footer, dark table headers) alr

P2 17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set

Evidence: crawl-summary.json: duplicate_meta_desc = 17, duplicate_title = 15. Combined 32 pages with duplicated metadata. Likely WordPress category/tag/archive pages using fallback templates. Specific URLs not enumerated in crawl-summary.

Impact: Duplicate titles/descriptions reduce individual page differentiation in SERP. Fix: configure RankMath archive meta templates with dynamic variables (%category%, %archive_title%, %page%) to generate unique metadata per page. Target: 0 exact-duplicate title/desc pairs.

Findings from /seo-page (6)

P2 auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip

Evidence: https://ongboit.com/claude-code-auto-mode/ — grep: line 478 '<h3 style="color: #FF7F00">TL;DR</h3>' precedes line 506 '<h2>Auto Mode Là Gì...' — H1→H3 jump violates sequential heading order; screen readers and Google's heading parser treats TL;DR as a subsection of H1 with no pa

Impact: Fix hierarchy: change TL;DR heading to a styled <p> or <div> (it is already visually a callout box, not a real section). Eliminates heading-order warning in Lighthouse, aligns with WCAG 1.3.1 (info & relationships).

P2 auto-mode page: only 3 editorial internal links — well below site average of 10-13

Evidence: https://ongboit.com/claude-code-auto-mode/ — body links extracted lines 460–735: /claude-code-hooks/, /claude-code-roadmap/, /tiet-kiem-token-claude-code/ (3 total). Comparable pages average 10-13 editorial links. Word count 4684 is also lowest of the 5 audited.

Impact: Add 5–7 topically related internal links (e.g. permission-modes, tiet-kiem-token, claude-md, gioi-han). Improves PageRank flow to this page's cluster and increases session depth from this entry point.

P2 tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate

Evidence: https://ongboit.com/tiet-kiem-token-claude-code/ — meta name='description' content length=169 chars (198 bytes). Measured directly: 'Tiết kiệm token Claude Code: 15 mẹo giảm bill API từ $290 xuống $82/tháng. Hiểu cơ chế history gửi lại mỗi turn + cách quản lý CLAUDE.md, session v

Impact: Trim to ≤155 chars while keeping primary KW and CTA at front. Prevents Google-generated snippet from replacing the crafted description.

P3 twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account

Evidence: curl grep 'twitter:site' on all 5 pages returns 0 matches. Pages have twitter:card=summary_large_image + twitter:title + twitter:description + twitter:image but no twitter:site='@ongboitvuitinh' (the TikTok handle used in sameAs schema suggests account exists). Without twitter:si

Impact: Add <meta name='twitter:site' content='@ongboitvuitinh'> to RankMath global social settings (applies sitewide in one edit). Low friction, improves brand attribution on Twitter shares.

P3 Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token)

Evidence: gioi-han: title='...2026: Session 5h, Weekly 7 Ngày' vs H1='...Session, Weekly & Cách Tối Ưu (2026)'. gia-bao-nhieu: title='...$20-$200 + Cách Mua Rẻ Nhất' vs H1='...Pro vs Max + Mua Giá Rẻ'. tiet-kiem-token: title starts 'Tiết Kiệm Token Claude Code...' vs H1 starts '15 Mẹo Tiết

Impact: Divergence is intentional SEO practice (title=SERP click-bait, H1=on-page context) and Google handles it. No fix required if divergence is deliberate; document as accepted pattern. Flag only if divergence was accidental (e.g., RankMath title override was forgotten). Severity P3 =

P3 OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image

Evidence: All 5 pages: og:image:width=1024 (confirmed via og:image:width meta tag). Twitter summary_large_image recommends minimum 1200×630 for lossless display on modern hi-DPI screens. Source images exist at scaled sizes (e.g. gioi-han hero at 2560×1429 in WP media library per JSON-LD Im

Impact: Update og:image references to point to 1200-wide crop (WP crop at 1200x630 or use existing *-scaled.jpg). Affects how cards render on Twitter/X share preview — sharper on retina displays, no letterboxing.

🔍 Full-crawl per-URL findings (193 deterministic issues — every page scanned, complements the AI score above)

links to broken page — 35 URLs
URLBroken target
https://ongboit.com/about/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/contact/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/dich-vu/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-code-cho-team-enterprise/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-growth-kit-viet-blog-claude-code/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/n8n-claude-code/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/contact/?subject=Subscribe/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/dieu-khoan-su-dung/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/chinh-sach-bao-mat/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/dich-vu-seo-audit-website/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-code-plugin-marketplace-third-party/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/ccpi-tonsofskills-marketplace/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-code-audit-blog-portfolio/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/n8n-self-host/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/contact/?subject=Tu+van+30+phut/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/contact/?subject=kit/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/contact/?subject=Content/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/contact/?subject=Automation/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-code-prompt-engineering/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/mcp-servers-claude-code/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/dataforseo-mcp-setup/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/dataforseo-api-tutorial/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-code-plugins/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/claude-code-autonomous-agents/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/obsidian-sync-multi-device-mobile/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/plugin-obsidian-must-have-cho-dev/https://ongboit.com/cdn-cgi/l/email-protection/
https://ongboit.com/obsidian-markdown-cu-phap/https://ongboit.com/obsidian-markdown-cu-phap/url.md
https://ongboit.com/obsidian-markdown-cu-phap/https://ongboit.com/obsidian-markdown-cu-phap/path.md
https://ongboit.com/obsidian-markdown-cu-phap/https://ongboit.com/obsidian-markdown-cu-phap/image.png
https://ongboit.com/claude-code-audit-website/https://ongboit.com/cdn-cgi/l/email-protection/
…and 5 more
4xx error — 4 URLs
URLStatus
https://ongboit.com/obsidian-markdown-cu-phap/url.md404
https://ongboit.com/obsidian-markdown-cu-phap/path.md404
https://ongboit.com/obsidian-memory-3-layer-architecture/page-name.md404
https://ongboit.com/wiki-lint-fold-maintenance/path/404
broken external link — 18 URLs
URLBroken URL
https://ongboit.com/claude-code-cho-team-enterprise/https://redresscompliance.com/anthropic-claude-pricing-2026.html
https://ongboit.com/claude-code-cho-sinh-vien/https://www.anthropic.com/campus-ambassadors
https://ongboit.com/claude-code-vs-semrush-ahrefs/https://developers.google.com/search/blog/2023/08/changes-to-faq-and-howto-rich-
https://ongboit.com/mcp-la-gi/https://openai.com/index/mcp-for-chatgpt/
https://ongboit.com/dataforseo-la-gi/https://dataforseo.com/about
https://ongboit.com/dataforseo-api-tutorial/https://dataforseo.com/about
https://ongboit.com/dataforseo-pricing/https://dataforseo.com/about
https://ongboit.com/dataforseo-serp-api/https://dataforseo.com/about
https://ongboit.com/dataforseo-backlinks-api/https://dataforseo.com/about
https://ongboit.com/dataforseo-review/https://dataforseo.com/about
https://ongboit.com/dataforseo-vs-ahrefs/https://dataforseo.com/about
https://ongboit.com/c-compiler-parallel-claudes/https://www.anthropic.com/engineering/building-a-c-compiler-with-parallel-claude
https://ongboit.com/claude-code-last30days-skill/https://scrapecreators.com/pricing
https://ongboit.com/claude-code-cho-non-coder-vibe-coding/https://github.com/bmad-method/bmad
https://ongboit.com/claude-for-microsoft-365/https://www.anthropic.com/microsoft-365
https://ongboit.com/claude-growth-setup-tool-api-mcp/https://github.com/thenguyenvn90/claude-growth/releases/latest
https://ongboit.com/claude-code-audit-geo-ai-search/https://yoursite.com/sitemap.xml
https://ongboit.com/dataforseo-free-trial/https://dataforseo.com/about
duplicate title — 15 URLs
URLTitleDupes
https://ongboit.comÔng Bố IT | Claude Code, AI Coding & Self-hosting Blog2 pages
https://ongboit.com/Ông Bố IT | Claude Code, AI Coding & Self-hosting Blog2 pages
https://ongboit.com/contact/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/contact/?subject=Subscribe/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/contact/?subject=Tu+van+30+phut/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/contact/?subject=kit/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/contact/?subject=Content/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/contact/?subject=Automation/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/contact/?subject=SEO+Audit/Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow7 pages
https://ongboit.com/dataforseo-la-gi/DataForSEO Là Gì 2026: Pay-As-You-Go SEO API + Claude Code2 pages
https://ongboit.com/dataforseo-free-trial/DataForSEO Là Gì 2026: Pay-As-You-Go SEO API + Claude Code2 pages
https://ongboit.com/best-claude-code-skills/Best Claude Code Skills 2026: 32 Bundled, Plugins, Community2 pages
https://ongboit.com/top-20-claude-skills/Best Claude Code Skills 2026: 32 Bundled, Plugins, Community2 pages
https://ongboit.com/claude-code-banana/Banana Claude: Tạo Ảnh AI 4K Trong Terminal Cho Dev 20262 pages
https://ongboit.com/banana-claude/Banana Claude: Tạo Ảnh AI 4K Trong Terminal Cho Dev 20262 pages
ai bots blocked — 1 URL
URL
https://ongboit.com/robots.txt
low text html ratio — 26 URLs
URLText ratio
https://ongboit.com5%
https://ongboit.com/5%
https://ongboit.com/about/5%
https://ongboit.com/category/seo/3%
https://ongboit.com/category/claude-code/3%
https://ongboit.com/category/self-hosting/3%
https://ongboit.com/category/codex-cli/3%
https://ongboit.com/category/ai-101/3%
https://ongboit.com/contact/3%
https://ongboit.com/category/n8n/3%
https://ongboit.com/dich-vu/7%
https://ongboit.com/claude-code-dynamic-workflows/9%
https://ongboit.com/cdn-la-gi/9%
https://ongboit.com/contact/?subject=Subscribe/3%
https://ongboit.com/dieu-khoan-su-dung/6%
https://ongboit.com/blog/3%
https://ongboit.com/seo-audit-la-gi/10%
https://ongboit.com/claude-radio-fm-command/10%
https://ongboit.com/contact/?subject=Tu+van+30+phut/3%
https://ongboit.com/contact/?subject=kit/3%
https://ongboit.com/contact/?subject=Content/3%
https://ongboit.com/contact/?subject=Automation/3%
https://ongboit.com/claude-code-context-compaction/10%
https://ongboit.com/claude-code-autonomous-agents/10%
https://ongboit.com/contact/?subject=SEO+Audit/3%
https://ongboit.com/claude-code-patterns-obsidian-vault/10%
duplicate meta desc — 17 URLs
URLMeta descriptionDupes
https://ongboit.comMình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.2 pages
https://ongboit.com/Mình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.2 pages
https://ongboit.com/contact/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/contact/?subject=Subscribe/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/contact/?subject=Tu+van+30+phut/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/contact/?subject=kit/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/contact/?subject=Content/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/contact/?subject=Automation/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/contact/?subject=SEO+Audit/Liên hệ Nguyễn Minh Thế (Ông Bố IT) để tư vấn Claude Code, AI coding workflow, n8n automation, self-hosting. Trao đổi qua email, TikTok, hoặc GitHub.7 pages
https://ongboit.com/dieu-khoan-su-dung/Cập nhật lần cuối: 16/06/20262 pages
https://ongboit.com/chinh-sach-bao-mat/Cập nhật lần cuối: 16/06/20262 pages
https://ongboit.com/dataforseo-la-gi/DataForSEO là gì? SEO API pay-as-you-go $0.0006/call: 3 tháng tốn $9 thay vì $747 Ahrefs (-98.8%), data khớp 100% Google. 9 nhóm API + free trial $1.2 pages
https://ongboit.com/dataforseo-free-trial/DataForSEO là gì? SEO API pay-as-you-go $0.0006/call: 3 tháng tốn $9 thay vì $747 Ahrefs (-98.8%), data khớp 100% Google. 9 nhóm API + free trial $1.2 pages
https://ongboit.com/best-claude-code-skills/Best Claude Code Skills 2026: 32 skill curated từ bundled, plugins, community. /graphify 71x token, frontend-design 277K installs. Security audit 36% lỗ hổng.2 pages
https://ongboit.com/top-20-claude-skills/Best Claude Code Skills 2026: 32 skill curated từ bundled, plugins, community. /graphify 71x token, frontend-design 277K installs. Security audit 36% lỗ hổng.2 pages
https://ongboit.com/claude-code-banana/Banana Claude (skill Claude Code, 543 GitHub stars): 9 domain modes, 5-Component Formula, 4K resolution, free thay Midjourney $10/tháng. Tạo ảnh từ terminal.2 pages
https://ongboit.com/banana-claude/Banana Claude (skill Claude Code, 543 GitHub stars): 9 domain modes, 5-Component Formula, 4K resolution, free thay Midjourney $10/tháng. Tạo ảnh từ terminal.2 pages
links to redirect — 14 URLs
URLRedirect target
https://ongboit.com/claude-code-design-skill/https://ongboit.com/banana-claude/
https://ongboit.com/claude-code-marketing-skills/https://ongboit.com/banana-claude/
https://ongboit.com/claude-code-master-hacks/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/claude-code-gioi-han-su-dung/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/dataforseo-pricing/https://ongboit.com/dataforseo-free-trial/
https://ongboit.com/claude-code-sub-agents/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/claude-code-excalidraw/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/claude-gif-skill/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/autoresearch-claude-code/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/claude-code-vs-codex/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/claude-code-last30days-skill/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/xay-dung-ai-agent-hieu-qua/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/5-trang-web-tim-claude-skills/https://ongboit.com/top-20-claude-skills/
https://ongboit.com/claude-growth-setup-tool-api-mcp/https://ongboit.com/dataforseo-free-trial/
one dofollow incoming — 14 URLs
URL
https://ongboit.com/category/ai-101/page/2/
https://ongboit.com/category/n8n/page/2/
https://ongboit.com/contact/?subject=Tu+van+30+phut/
https://ongboit.com/contact/?subject=kit/
https://ongboit.com/contact/?subject=Content/
https://ongboit.com/contact/?subject=Automation/
https://ongboit.com/tag/skills/page/2/
https://ongboit.com/tag/huong-dan/page/2/
https://ongboit.com/tag/so-sanh/page/2/
https://ongboit.com/contact/?subject=SEO+Audit/
https://ongboit.com/obsidian-markdown-cu-phap/url.md
https://ongboit.com/obsidian-markdown-cu-phap/path.md
https://ongboit.com/obsidian-memory-3-layer-architecture/page-name.md
https://ongboit.com/wiki-lint-fold-maintenance/path/
nofollow external — 13 URLs
URL
https://ongboit.com/chinh-sach-bao-mat/
https://ongboit.com/claude-code-master-hacks/
https://ongboit.com/dataforseo-mcp-setup/
https://ongboit.com/dataforseo-la-gi/
https://ongboit.com/dataforseo-api-tutorial/
https://ongboit.com/dataforseo-pricing/
https://ongboit.com/dataforseo-serp-api/
https://ongboit.com/dataforseo-backlinks-api/
https://ongboit.com/dataforseo-vs-ahrefs/
https://ongboit.com/claude-code-google-workspace/
https://ongboit.com/claude-code-notebooklm/
https://ongboit.com/claude-code-sub-agents/
https://ongboit.com/dataforseo-free-trial/
og incomplete — 10 URLs
URLMissing OG tags
https://ongboit.com/category/seo/image
https://ongboit.com/category/claude-code/image
https://ongboit.com/category/self-hosting/image
https://ongboit.com/category/codex-cli/image
https://ongboit.com/category/ai-101/image
https://ongboit.com/category/n8n/image
https://ongboit.com/dich-vu/image
https://ongboit.com/dieu-khoan-su-dung/image
https://ongboit.com/chinh-sach-bao-mat/image
https://ongboit.com/blog/image
meta desc too short — 8 URLs
URLMeta descriptionLength
https://ongboit.com/category/seo/Kiến thức SEO cho developer27c
https://ongboit.com/category/claude-code/Hướng dẫn, tips, và projects với Claude Code44c
https://ongboit.com/category/self-hosting/Hướng dẫn tự host ứng dụng trên VPS: Coolify, Docker, WordPress, và các dịch vụ khác84c
https://ongboit.com/category/ai-101/Giải thích các khái niệm AI cơ bản cho lập trình viên Việt Nam62c
https://ongboit.com/category/n8n/Automation workflows và tutorials với n8n41c
https://ongboit.com/dieu-khoan-su-dung/Cập nhật lần cuối: 16/06/202629c
https://ongboit.com/chinh-sach-bao-mat/Cập nhật lần cuối: 16/06/202629c
https://ongboit.com/claude-code-wordpress-mcp/Kết nối Claude Code với WordPress qua MCP. Quản lý posts, pages, media trực tiếp từ terminal (2026).100c
title too short — 6 URLs
URLTitleWidth
https://ongboit.com/category/seo/SEO - Ông Bố IT118px
https://ongboit.com/category/ai-101/AI 101 - Ông Bố IT128px
https://ongboit.com/category/n8n/n8n - Ông Bố IT109px
https://ongboit.com/dich-vu/Dịch Vụ58px
https://ongboit.com/dieu-khoan-su-dung/Điều Khoản Sử Dụng140px
https://ongboit.com/chinh-sach-bao-mat/Chính Sách Bảo Mật140px
meta desc too long — 4 URLs
URLMeta descriptionLength
https://ongboit.comMình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.164c
https://ongboit.com/Mình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.164c
https://ongboit.com/tiet-kiem-token-claude-code/Tiết kiệm token Claude Code: 15 mẹo giảm bill API từ $290 xuống $82/tháng. Hiểu cơ chế history gửi lại mỗi turn + cách quản lý CLAUDE.md, session và context window 2026.169c
https://ongboit.com/claude-code-audit-website/Claude Code audit website 2026 chạy 1 lệnh: 16 agent qua 8 category SEO + GEO, 3 composite score, 10 cổng kiểm chứng + 23 autofix paste-and-ship. Không cần tool SEO trả phí.173c
h1 title duplicate — 3 URLs
URL
https://ongboit.com/dich-vu/
https://ongboit.com/dieu-khoan-su-dung/
https://ongboit.com/chinh-sach-bao-mat/
h1 multiple — 3 URLs
URLNo. of H1
https://ongboit.com/system-prompt-la-gi/2
https://ongboit.com/dataforseo-mcp-setup/2
https://ongboit.com/dataforseo-api-tutorial/2
too many links — 2 URLs
URLLinks
https://ongboit.com/claude-code-roadmap/273
https://ongboit.com/claude-code-la-gi/161

Accessibility Deep Dive

75/100

Rating: Good · Primary source: /geo-accessibility (62/100)

Findings from /geo-accessibility (5)

P1 Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces

Evidence: H1 hero span `style="color:#FF7F00"` on palette9 #fff7f5 bg: 2.53:1 (needs 3:1 large text). `.obit-catall{color:#FF7F00}` at 0.9em bold on card bg #fff: 2.53:1 (needs 4.5:1). `.home-faq-answer a{color:#FF7F00}` on white: 2.53:1. `.entry-content table a{color:#FF7F00}` on `backgro

Impact: Fails WCAG 1.4.3 AA on 4 distinct surface types. Orange on dark backgrounds (footer, dark table headers) passes — fix scope is white-bg surfaces only. Darken to ~#C05F00 (~3.2:1 large, ~5:1 normal) or shift to #B35900.

P2 Email newsletter input: outline:none with no focus handler — invisible keyboard focus

Evidence: `<input type="email" ... style="... outline: none;" />` — no onfocus handler, no :focus-visible override scoped to this element. Compare: search input has `onfocus="this.style.borderColor='#6366f1'"` (acceptable substitute) but email input has none. Email input is not inside a `<

Impact: Keyboard users cannot see focus on newsletter email field — WCAG 2.4.7 violation on this specific input. Fix: add `onfocus/onblur` border-color change matching search input pattern, or remove `outline:none` to let the :focus-visible rule apply.

P2 Malformed table HTML in pinned page — missing thead/tbody, broken th attribute

Evidence: Table at position 72905 in /claude-code-gioi-han-su-dung/: `<table ...><th scope="col" style="min-width: 100px;"ead style="background: #312e81; color: #e0e0e0;">` — th tag has truncated/corrupted attribute (`"ead style=...`). Missing `<thead>` wrapper. Then `</thead>` appears aft

Impact: Screen readers rely on thead/tbody structure for table navigation. Malformed th attribute will be unparsed by browsers (attribute ignored). Fix: correct HTML structure — `<thead><tr><th scope="col">...</th></tr></thead><tbody>...</tbody>`.

P3 Newsletter email input not wrapped in a <form> element

Evidence: `<input type="email" ...>` followed by `<a href="/contact/?subject=Subscribe">Đăng ký</a>` — this is a decorative input with no form submission. The subscribe 'button' is an anchor link, not a submit button. No form role or action defined.

Impact: Keyboard users expecting to submit via Enter key will navigate away (anchor click) instead of submitting a form. Screen readers announce the link as a link not a submit button. Low severity as the flow still works, but semantics are incorrect for 4.1.2.

P3 Search input uses JS focus indicator (border-color change) instead of CSS :focus-visible

Evidence: `<input type="search" ... style="... outline:none; ..." onfocus="this.style.borderColor='#6366f1'" onblur="this.style.borderColor='#e2e8f0'">` — outline suppressed inline. Focus indicator is JS-driven border-color change from #e2e8f0 to #6366f1.

Impact: The border-color change provides a visible focus indicator (PARTIAL pass for 2.4.7) but: (1) relies on JS — if JS disabled, no focus indicator at all; (2) 2px border color change is below the WCAG 2.2 AA 2.4.11 non-text contrast 3:1 threshold (new in 2.2). The site :focus-visible

Compliance Deep Dive

100/100

Rating: Excellent · Primary source: /geo-compliance (72/100)

Findings from /geo-compliance (5)

P1 /privacy-policy/ returns 404 — English canonical URL dead

Evidence: https://ongboit.com/privacy-policy/ → HTTP 404 (Firecrawl statusCode=404, title='Page Not Found'); real policy is at /chinh-sach-bao-mat/ (HTTP 200). Google AdSense publisher guidelines and GDPR Art.13 require a consistently accessible privacy policy URL. Many third-party platfor

Impact: AdSense policy-compliance risk; 404 on expected EN slug; any external link or ad-network check pointing to /privacy-policy/ silently fails

P1 CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer

Evidence: Policy section 10 states: 'you can opt out via the cookie banner or the "Do Not Sell or Share My Personal Information" link in the footer.' Live footer HTML (scraped 2026-06-18) contains three links only: Chính Sách Bảo Mật, Điều Khoản Sử Dụng, Liên Hệ — no DNS/DSMY link present.

Impact: CPRA non-compliance for California users; policy-vs-reality mismatch undermines trust; AdSense policy violation risk

P2 DSAR channel is a personal Gmail — not a dedicated privacy contact

Evidence: Policy sections 1 and 14 list thenguyen.ai.automation@gmail.com as the sole privacy/DSAR contact. GDPR Art.13(1)(a) requires identifying the controller and Art.77 complaint rights; while a Gmail is technically valid for a personal blog, it signals lack of separation between perso

Impact: Low trust signal for EU/California users; no routing guarantee; GDPR Art.57 supervisory compliance question if DPA investigates

P2 Privacy policy page has robots meta 'follow, index' but no structured data (Article/WebPage schema) — not discoverable as a legal document

Evidence: https://ongboit.com/chinh-sach-bao-mat/ metadata: robots='follow, index, max-snippet:-1'. No SpecialAnnouncement or WebPage schema with @type=PrivacyPolicy detected in scrape. Google's AdSense automated checks and some compliance scanners look for machine-readable policy markers.

Impact: Minor: no automated compliance scanner credit; future AdSense policy-link verification may miss it

P3 Cookie banner dismissal state 'cmplz-dismissed' visible in raw HTML — verify first-visit behavior

Evidence: Firecrawl HTML on /privacy-policy/ 404 page shows: class='cmplz-cookiebanner ... cmplz-dismissed'. This 'dismissed' class may indicate the banner was already closed by a prior session cookie in the scraper's browser context, not a structural bug. However, if the banner does not r

Impact: If banner pre-dismissed for new visitors, GDPR opt-in consent is invalid for Analytics/AdSense; needs manual first-visit incognito verification

Sitemap Deep Dive

39/100

Rating: Critical · Primary source: /seo-sitemap (58/100)

Findings from /seo-sitemap (8)

P0 x-robots-tag: noindex on all sitemap files — Googlebot cannot discover or use sitemaps

Evidence: curl -sI https://ongboit.com/sitemap_index.xml → x-robots-tag: noindex (confirmed 2026-06-18T00:54:38). Same header on post-sitemap1.xml, post-sitemap2.xml, page-sitemap.xml, category-sitemap.xml. Google ignores any sitemap file it receives a noindex header on, rendering all 215

Impact: Until resolved, Google cannot process the sitemap; URL discovery falls back to crawl only. Fix: add Rank Math / server rule to suppress x-robots-tag on *.xml sitemap paths, or ensure Cloudflare page rule does not apply a blanket noindex header to XML responses.

P1 35 internal pages linked-to are returning 4xx / broken — crawl budget wasted and link equity lost

Evidence: crawl-summary.json by_check.links_to_broken_page = 35 (across 299 crawled URLs). Separate by_check.4xx_error = 4 pages themselves returning 4xx. These broken link targets absorb crawl budget and produce soft-404 signals.

Impact: Fix or redirect broken targets; update anchor links pointing to them. Eliminates crawl-budget drain and removes negative signals from internal link graph.

P1 14 internal links point to redirect chains instead of canonical URLs

Evidence: crawl-summary.json by_check.links_to_redirect = 14. Each redirect hop dilutes PageRank and slows Googlebot. URLs in the sitemap should also be verified as final-destination URLs, not redirect sources.

Impact: Update internal links to point directly to canonical (post-redirect) URLs. One-time Screaming Frog / wp-cli bulk replace recommended.

P2 14 indexable pages crawled but absent from sitemap

Evidence: Crawl: 299 URLs, noindex_pages: 70 → 229 indexable. Sitemap total: post-sitemap1 (201) + post-sitemap2 (2) + page-sitemap (6) + category-sitemap (6) = 215. Gap = 229 − 215 = 14 pages. Note: crawl may include pages Rank Math has excluded intentionally (tag archives, author pages);

Impact: Missing pages rely solely on crawl discovery; adding them to the sitemap accelerates re-crawl after updates.

P2 robots.txt has duplicate user-agent blocks creating conflicting directives for AI crawlers

Evidence: curl https://ongboit.com/robots.txt — Cloudflare-managed section (lines ~22-38) issues Disallow: / for ClaudeBot, GPTBot, Google-Extended, Amazonbot, Applebot-Extended, Bytespider, CCBot, meta-externalagent. A subsequent manual block (lines ~44+) issues Allow: / for the same bots

Impact: Remove or deconflict the Cloudflare-managed Disallow block. Keep a single user-agent group per bot with Allow: /. Prevents ambiguity and ensures AI citation crawlers (Perplexity, ClaudeBot) can access all content.

P2 15 duplicate titles and 17 duplicate meta descriptions across crawled pages

Evidence: crawl-summary.json by_check.duplicate_title = 15, duplicate_meta_desc = 17. Duplicate titles reduce click-through differentiation; duplicate meta descriptions are a signal of thin or template-driven pages that may trigger Panda-style quality filters.

Impact: Audit which pages share titles/descriptions. For category/tag archives, either uniquify or add noindex. For posts, rewrite meta to be page-specific.

P3 sitemap_index.xml was 404 earlier today — now fixed (credit given)

Evidence: phase4-shared-context.md notes sitemap_index.xml was 404 pre-rewrite-flush 2026-06-18. Live curl at 00:54:38 UTC confirms HTTP 200. crawl-summary.json by_check.sitemap_missing: 1 is stale and reflects the pre-fix state.

Impact: Fix confirmed. No further action required for the 404 itself. Monitor GSC Coverage report for sitemap re-processing over next 7 days.

P3 3 pages have multiple H1 tags — structural signal for content quality

Evidence: crawl-summary.json by_check.h1_multiple = 3. Multiple H1s per page are valid HTML5 but remain a best-practice violation; Google has stated it uses the first H1 as primary heading signal. Risk is low but nonzero for these pages.

Impact: Reduce each affected page to a single H1. Typically caused by theme/block-editor theme header components outputting a redundant H1.

🔍 Full-crawl per-URL findings (1 deterministic issues — every page scanned, complements the AI score above)

sitemap missing — 1 URL
URL
https://ongboit.com/sitemap.xml

Image Deep Dive

96/100

Rating: Excellent · Primary source: /seo-performance (89/100)

Field CWV (CrUX p75) all GREEN on mobile+desktop; only render-blocking Google Fonts CSS + lab LCP gap remain.

Findings from /seo-performance (2)

P2 Render-blocking Google Fonts CSS on homepage + pinned page

Evidence: geo-technical curl: <link rel=stylesheet fonts.googleapis.com> not deferred; homepage hero missing <link rel=preload>

Impact: ~100-300ms LCP on first paint

P3 Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth

Evidence: CrUX field LCP p75=1266ms GOOD vs prior lab ~9.6s; field passes

Impact: none — field green

Hreflang Deep Dive

95/100

Rating: Excellent

No Phase 4 agent JSON found for this category. Findings related to this category appear in the issue list above.

Performance Deep Dive

100/100

Rating: Excellent · Primary source: /seo-performance (89/100)

Field CWV (CrUX p75) all GREEN on mobile+desktop; only render-blocking Google Fonts CSS + lab LCP gap remain.

Cross-checked by: geo-technical: 81/100seo-google: 86/100

Findings from /seo-performance (2)

P2 Render-blocking Google Fonts CSS on homepage + pinned page

Evidence: geo-technical curl: <link rel=stylesheet fonts.googleapis.com> not deferred; homepage hero missing <link rel=preload>

Impact: ~100-300ms LCP on first paint

P3 Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth

Evidence: CrUX field LCP p75=1266ms GOOD vs prior lab ~9.6s; field passes

Impact: none — field green

Findings from /geo-technical (7)

P1 robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers

Evidence: curl https://ongboit.com/robots.txt | grep -n ClaudeBot => line 44: 'ClaudeBot\nDisallow: /' (Cloudflare Managed block); line 78: 'ClaudeBot\nAllow: /' (publisher manual section). Per RFC 9309, for same user-agent the last matching rule wins — however Cloudflare's managed block a

Impact: AI crawlers (ClaudeBot, GPTBot, Google-Extended etc.) may read the Disallow rule from the Cloudflare Managed section and skip the site. Publisher should remove the Cloudflare Managed Content block or toggle the Cloudflare dashboard setting to 'Allow AI scrapers' which removes tho

P2 CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src

Evidence: curl -sI https://ongboit.com/ | grep content-security-policy => 'script-src self unsafe-inline unsafe-eval https: blob:'. Header is ENFORCING (no Content-Security-Policy-Report-Only). unsafe-inline allows inline script injection; unsafe-eval allows eval()-based XSS.

Impact: CSP is present and enforcing (credit for live fix 2026-06-17), but unsafe-inline/unsafe-eval negate most XSS protection. WordPress + AdSense + GTM make this hard to fix without nonce/hash implementation. Recommendation: migrate to nonce-based CSP via Cloudflare Transform Rules or

P2 Homepage hero image missing <link rel=preload> (LCP risk)

Evidence: grep 'rel="preload"' /tmp/homepage.html => 0 results. Homepage hero img: <img src='ongboit-homepage-hero.webp' fetchpriority='high' width='1376' height='768'>. Pinned page has preload: <link rel='preload' as='image' href='claude-code-gioi-han-hero-sketch-scaled.jpg' fetchpriority

Impact: LCP image on homepage is not preloaded, requiring the browser to discover it after CSS/HTML parse. Adding <link rel='preload' as='image' href='...' fetchpriority='high'> in <head> can improve LCP by 200-500ms. Pinned page already correctly implements this.

P2 Google Fonts CSS loaded as render-blocking stylesheet

Evidence: grep 'kadence-fonts-gfonts-css' /tmp/homepage.html => <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open+Sans:regular,700|Rubik:700..&display=swap' media='all'>. The media='all' attribute causes render-blocking. display=swap is

Impact: Google Fonts CSS is a third-party render-blocking request. Use media='print' onload='this.media="all"' technique or load fonts via font-face in local CSS, or use a Cloudflare Worker to self-host fonts. This affects LCP on both pages.

P2 Homepage meta description 162 chars (2 chars over 160 target)

Evidence: grep 'name="description"' /tmp/homepage.html => content length measured as 162 chars: 'Mình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.'

Impact: Minor — Google may truncate the description in SERPs. Trim to 155-160 chars for clean display. Pinned page description is 138 chars (fine).

P3 Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl)

Evidence: curl https://ongboit.com/sitemap_index.xml | head -2 => '<?xml-stylesheet type="text/xsl" href="//ongboit.com/main-sitemap.xsl"?>'. Protocol-relative path; functional over HTTPS but non-standard.

Impact: Cosmetic — does not affect crawler parsing of sitemap URLs. Fix by updating RankMath sitemap XSL path to absolute HTTPS URL. No crawlability impact.

P3 Cache-Control for theme CSS is 30 days vs 1 year for images

Evidence: curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css => Cache-Control: max-age=2592000 (30d), cf-cache-status: MISS. Image: Cache-Control: max-age=31536000 (1yr), cf-cache-status: HIT.

Impact: CSS/JS assets could benefit from 1-year cache with versioned URLs (Kadence uses ?ver= query strings, so cache-busting is handled). Increasing to max-age=31536000 for theme CSS/JS would improve repeat-visit performance. Configure via Cloudflare Cache Rules.

Findings from /seo-google (1)

P3 Query-level click concentration — 3 pages drive majority of clicks

Evidence: GSC top-3 pages = 432 clicks; traffic floor depends on a few Claude-Code pillars

Impact: diversify pillar coverage to de-risk

🔍 Full-crawl per-URL findings (603 deterministic issues — every page scanned, complements the AI score above)

broken js css — 32 URLs
URL
https://ongboit.com
https://ongboit.com/
https://ongboit.com/about/
https://ongboit.com/contact/
https://ongboit.com/dich-vu/
https://ongboit.com/claude-code-cho-team-enterprise/
https://ongboit.com/claude-growth-kit-viet-blog-claude-code/
https://ongboit.com/n8n-claude-code/
https://ongboit.com/contact/?subject=Subscribe/
https://ongboit.com/dieu-khoan-su-dung/
https://ongboit.com/chinh-sach-bao-mat/
https://ongboit.com/dich-vu-seo-audit-website/
https://ongboit.com/claude-code-plugin-marketplace-third-party/
https://ongboit.com/ccpi-tonsofskills-marketplace/
https://ongboit.com/claude-code-audit-blog-portfolio/
https://ongboit.com/n8n-self-host/
https://ongboit.com/contact/?subject=Tu+van+30+phut/
https://ongboit.com/contact/?subject=kit/
https://ongboit.com/contact/?subject=Content/
https://ongboit.com/contact/?subject=Automation/
https://ongboit.com/claude-code-prompt-engineering/
https://ongboit.com/mcp-servers-claude-code/
https://ongboit.com/dataforseo-mcp-setup/
https://ongboit.com/dataforseo-api-tutorial/
https://ongboit.com/claude-code-plugins/
https://ongboit.com/claude-code-autonomous-agents/
https://ongboit.com/obsidian-sync-multi-device-mobile/
https://ongboit.com/plugin-obsidian-must-have-cho-dev/
https://ongboit.com/claude-code-audit-website/
https://ongboit.com/claude-growth-setup-tool-api-mcp/
…and 2 more
slow ttfb — 290 URLs
URLTTFB
https://ongboit.com/about/1723ms
https://ongboit.com/category/seo/2741ms
https://ongboit.com/category/claude-code/3332ms
https://ongboit.com/category/self-hosting/3099ms
https://ongboit.com/category/codex-cli/3536ms
https://ongboit.com/category/ai-101/3425ms
https://ongboit.com/contact/3163ms
https://ongboit.com/category/n8n/3501ms
https://ongboit.com/dich-vu/3286ms
https://ongboit.com/claude-code-roadmap/3591ms
https://ongboit.com/tag/bat-dau/3828ms
https://ongboit.com/tag/obsidian/3253ms
https://ongboit.com/tag/skills/4315ms
https://ongboit.com/tag/dataforseo/2639ms
https://ongboit.com/tag/huong-dan/2332ms
https://ongboit.com/tag/so-sanh/2688ms
https://ongboit.com/claude-code-skills-developers/2601ms
https://ongboit.com/claude-code-design-skill/2612ms
https://ongboit.com/claude-code-marketing-skills/2807ms
https://ongboit.com/claude-cybersecurity/2789ms
https://ongboit.com/claude-code-seo-content/2976ms
https://ongboit.com/claude-code-cho-product-manager/2638ms
https://ongboit.com/claude-code-blog-skill/2864ms
https://ongboit.com/claude-code-cho-team-enterprise/2476ms
https://ongboit.com/claude-code-dynamic-workflows/2518ms
https://ongboit.com/claude-code-cho-sinh-vien/2714ms
https://ongboit.com/claude-deepclaude-qwen-local/2098ms
https://ongboit.com/claude-growth-kit-viet-blog-claude-code/2470ms
https://ongboit.com/claude-code-google-analytics/2249ms
https://ongboit.com/cdn-la-gi/1979ms
…and 260 more
large html — 279 URLs
URLHTML size
https://ongboit.com127KB
https://ongboit.com/127KB
https://ongboit.com/about/105KB
https://ongboit.com/category/seo/120KB
https://ongboit.com/category/claude-code/123KB
https://ongboit.com/category/codex-cli/121KB
https://ongboit.com/category/ai-101/121KB
https://ongboit.com/category/n8n/121KB
https://ongboit.com/claude-code-roadmap/214KB
https://ongboit.com/tag/bat-dau/121KB
https://ongboit.com/tag/obsidian/121KB
https://ongboit.com/tag/skills/121KB
https://ongboit.com/tag/dataforseo/113KB
https://ongboit.com/tag/huong-dan/121KB
https://ongboit.com/tag/so-sanh/121KB
https://ongboit.com/claude-code-skills-developers/172KB
https://ongboit.com/claude-code-design-skill/162KB
https://ongboit.com/claude-code-marketing-skills/168KB
https://ongboit.com/claude-cybersecurity/164KB
https://ongboit.com/claude-code-seo-content/161KB
https://ongboit.com/claude-code-cho-product-manager/153KB
https://ongboit.com/claude-code-blog-skill/215KB
https://ongboit.com/claude-code-cho-team-enterprise/151KB
https://ongboit.com/claude-code-dynamic-workflows/134KB
https://ongboit.com/claude-code-cho-sinh-vien/158KB
https://ongboit.com/claude-deepclaude-qwen-local/144KB
https://ongboit.com/claude-growth-kit-viet-blog-claude-code/196KB
https://ongboit.com/claude-code-google-analytics/153KB
https://ongboit.com/cdn-la-gi/132KB
https://ongboit.com/https-la-gi/136KB
…and 249 more
not compressed — 1 URL
URL
https://ongboit.com
no cache control — 1 URL
URL
https://ongboit.com

Platform Deep Dive

66/100

Rating: Fair · Primary source: /geo-platform-optimizer (68/100)

Findings from /geo-platform-optimizer (8)

P0 AI crawler block RESOLVED — all major AI bots now allowed by robots.txt (verified 2026-06-18)

Evidence: curl https://ongboit.com/robots.txt (2026-06-18): No Cloudflare Managed block. GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, anthropic-ai, PerplexityBot, Google-Extended, bingbot, Meta-ExternalAgent, CCBot — all explicitly listed with 'Allow: /'. Only /wp-admin/ disallowed. Pre

Impact: P0 resolved. Structural platform readiness rises from 31 (blocked baseline) to 68 (unblocked). All AI citation pipelines now have crawl access. Measure lift in 2-4 weeks with re-run of ai_optimization_llm_response on 'Claude Code giới hạn sử dụng' and 'Claude Code usage limits'.

P1 Vietnamese-only content creates systematic language barrier for English-first AI citation engines

Evidence: Pre-unblock citation tests (DataForSEO ai_optimization_llm_response, 2026-06-18): GPT-4o web search cited 6 English sources only (Anthropic, TechRadar, TrueFoundry, Reddit, usagebar.com, productcompass.pm); Perplexity sonar-pro cited 7 English sources only (usagebar.com, truefoun

Impact: An English-language 'Key Facts' summary section (3-5 bullets with source citations) on top-traffic Claude Code articles could break into ChatGPT/Perplexity English citation streams. Medium-term strategic investment; prioritize for /claude-code-gioi-han-su-dung/ (188 GSC clicks, p

P1 Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared

Evidence: robots.txt line: 'User-agent: *' / 'Content-Signal: search=yes,ai-train=no'. This blocks AI training (EU Directive 2019/790 reservation — intentional). However 'ai-input=yes' (covering RAG/retrieval/grounding — the primary AI citation path) is absent. Crawlers that do not disting

Impact: Adding 'ai-input=yes' to the Content-Signal line explicitly grants permission for retrieval/grounding/RAG use while keeping training blocked. Unambiguous signal to AI citation engines (ChatGPT, Perplexity, Gemini) that grounding use is authorized. Low effort, direct citation-path

P2 llms.txt activated and reachable — 71 links now crawlable; llms-full.txt covers only 35/71 articles

Evidence: curl https://ongboit.com/llms.txt (2026-06-18): HTTP 200; 71 article links in 9 clusters (Claude Code top-traffic, SEO & Audit, Claude-Growth kit, n8n, Codex CLI, AI 101). llms-full.txt HTTP 200; 1,165,294 bytes but contains only 35 articles (~49% coverage). 36 articles linked in

Impact: Completing llms-full.txt to 100% coverage (71 articles) gives AI models full site context in one fetch — highest density citation signal available. Prioritize the 36 missing articles, especially those in the Claude Code cluster (highest traffic).

P2 sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution across all platforms

Evidence: geo-schema.json: Organization and Person sameAs arrays contain 5 entries (Facebook, GitHub, TikTok, LinkedIn, YouTube). Wikipedia and Wikidata absent. AI models (ChatGPT, Gemini, Perplexity) rely on Wikipedia/Wikidata Q-numbers to deduplicate entities across sources; absence mean

Impact: Adding Wikipedia and/or Wikidata sameAs links (once entries exist) is the single highest-leverage entity-graph fix. Prerequisite: create a Wikidata entry (Q-number) for the site and its author — feasible now as a small, notable Vietnamese AI blog; Wikipedia article requires notab

P2 Zero third-party community mentions on Reddit/X — no social proof signal for AI citation engines

Evidence: geo-brand-mentions.json BM4: searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit, X/Twitter, dev.to, Quora returned 0 on-brand results. Perplexity and ChatGPT heavily weight Reddit and community platform mentions for tech queries. Positive signal: 2 organic Threads menti

Impact: Community seeding on Reddit (r/ClaudeAI, r/ChatGPT, r/singularity, r/vietcetera) with authentic contributions citing ongboit.com articles would directly build Perplexity and ChatGPT citation probability. This is a medium-term growth lever, not a quick fix.

P3 llms.txt Last-Updated is 2 days stale (2026-06-16) — new articles not indexed for AI crawlers

Evidence: curl https://ongboit.com/llms.txt → 'Last-Updated: 2026-06-16'. Audit date: 2026-06-18. llms.txt has 71 links (4 more than the 67 in shared-context, suggesting manual update since), but any articles published after 06-16 are absent. (Source: geo-llmstxt.json LL1 + LL4.)

Impact: Automate llms.txt rebuild on each WP publish hook (e.g., via n8n or WP action hook) to keep the AI discovery index current. Low effort if an automation already exists for WP publish events.

P3 FAQPage Q1 is off-topic for the pinned article — semantic integrity issue for AI passage extraction

Evidence: geo-schema.json S2: Article URL /claude-code-gioi-han-su-dung/ (usage limits). FAQPage Block 1 Q1 name='DeepClaude Có An Toàn Không?' — topic is DeepClaude+Qwen27B, unrelated to session/weekly limits. 7 remaining questions are on-topic. AI crawlers doing passage-level extraction

Impact: Replace Q1 with an on-topic usage-limits question (e.g., 'Claude Code giới hạn sử dụng reset như thế nào?'). Small schema edit via RankMath FAQ block; directly improves AI passage classification accuracy.

Visual Deep Dive

100/100

Rating: Excellent · Primary source: /seo-visual (68/100)

Findings from /seo-visual (6)

P1 Brand orange #FF7F00 white text fails WCAG AA — 2.53:1 (threshold 3.0 large, 4.5 normal)

Evidence: Python WCAG calc: white rgb(255,255,255) on orange rgb(255,127,0) = 2.53:1. WCAG AA large-text threshold = 3.0:1; normal-text = 4.5:1. Both failed. Confirmed on homepage CTA 'Bắt Đầu Lộ Trình →' button (white text on orange bg). Any other UI elements using white-on-orange inherit

Impact: Sitewide accessibility failure on primary CTA and any orange-badged elements. Fix: (a) darken orange to #C96000 for text contexts (gives ~4.6:1 on white); or (b) switch CTA to dark text #0A1F41 on orange (8.29:1 passes easily); or (c) add dark text class for small-text orange use

P2 Body text contrast 4.46:1 fails WCAG AA by 0.04 (threshold 4.5)

Evidence: Playwright computed: body-text fg=rgb(110,116,124) on bg=rgb(255,247,245) = 4.46:1. WCAG AA requires 4.5:1 for normal-sized text. Delta = -0.04. Applies sitewide to all body copy and meta text.

Impact: Borderline failure — 0.04 shortfall. Fix: darken body text color to rgb(100,106,114) or #64686F to clear 4.5. Negligible visual change, full compliance achieved. Priority below V1 but simple one-line CSS change.

P3 Focus-visible rule confirmed present but scope may be narrow (mobile menu only)

Evidence: Stylesheet scan found exactly one :focus-visible rule: '.mobile-toggle-open-container .menu-toggle-open:hover, .mobile-toggle-open-container .menu-toggle-open:focus-visible'. Shared context notes 'focus-visible CSS' was added 2026-06-17. No global a:focus-visible or button:focus-

Impact: If no broader focus rule exists, keyboard users see no focus ring on nav links, content links, search input button. Add global: 'a:focus-visible, button:focus-visible, [tabindex]:focus-visible { outline: 3px solid #4386FC; outline-offset: 2px; }' to custom CSS.

P3 Mobile CTA off-screen on 375x667 (iPhone SE) viewport

Evidence: Homepage mobile 390x844: primary CTA top=552px (above fold on 844px device). On 375x667 (iPhone SE, ~4-6% of mobile users), CTA at ~552px would be below fold requiring scroll. H1 visible at 151px on all viewports.

Impact: Users on smallest supported phones must scroll to see CTA. Reduce hero illustration height on mobile or reorder: CTA above hero image. Low business impact given traffic mix but quick fix.

P3 Carousel off-screen slides extend beyond desktop viewport bounds

Evidence: Pinned page desktop 1920px: Splide carousel .splide__slide/.entry-list-item elements render to x=2038 (+118px outside viewport). Body bodyScrollWidth=1920 — no horizontal scroll at body level. This is standard Splide off-canvas slide pattern. Risk: if .splide__track overflow is n

Impact: Verify .splide__track has overflow:hidden in computed CSS. If already clipped, no action needed. If not, add overflow:hidden to prevent keyboard/AT users from reaching hidden slides.

P3 CLS = 0.0 on all tested pages/viewports — PASS

Evidence: PerformanceObserver layout-shift entries = 0 on homepage+pinned, desktop+mobile. networkidle+2s settle window used. Hero preload fix (2026-06-17) credited.

Impact: Positive. CWV CLS target <0.1 met with margin. No action needed.

Google-Api Deep Dive

90/100

Rating: Excellent · Primary source: /seo-google (86/100)

Homepage PASS (submitted+indexed); 1,237 queries ranking pos 1-10 (122 in top-3); GA4 organic momentum strong.

Findings from /seo-google (1)

P3 Query-level click concentration — 3 pages drive majority of clicks

Evidence: GSC top-3 pages = 432 clicks; traffic floor depends on a few Claude-Code pillars

Impact: diversify pillar coverage to de-risk

Brand Deep Dive

22/100

Rating: Critical · Primary source: /geo-brand-mentions (32/100)

Cross-checked by: seo-backlinks: 22/100

Findings from /geo-brand-mentions (8)

P2 Brand name collision: '@ongboit97' is a different, larger YouTube channel

Evidence: Search site:youtube.com 'ongboit channel' returns TWO channels: UCOhOyDYdfqrldzWO0jzQD8g (@ongboit, 1 video — owned) and UCwakJ2N0D0FQgrwHEHyX6Fg (@ongboit97, multiple videos with IT/tech content). Brand search is polluted; users may land on the wrong channel.

Impact: YouTube handle ambiguity dilutes brand recall and misdirects search traffic; @ongboit97 appears first in results for 'ông bố IT' YouTube searches.

P2 Facebook owned page has only 4 likes — effectively invisible

Evidence: facebook.com/ongboitvuitinh confirmed live: 'OngBo.IT. 4 likes.' Very low social proof signal. Page exists but has near-zero authority.

Impact: Social proof gap weakens E-E-A-T and sameAs authority signals for AI crawlers (ChatGPT/Perplexity entity resolution relies on consistent cross-platform presence).

P2 YouTube owned channel has only 1 video — no authority or subscriber base yet

Evidence: youtube.com/channel/UCOhOyDYdfqrldzWO0jzQD8g (@ongboit): '1 video. More about this channel.' The @ongboitvuitinh handle (listed in sameAs) returned 0 search results — may not be the active handle, or not yet indexed.

Impact: YouTube is the #1 Vietnamese content platform. Zero video authority = zero referral traffic and no citability signal from video content.

P1 Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification

Evidence: All searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit (site:reddit.com), X/Twitter, dev.to, and Quora returned 0 on-brand results. All Reddit hits were false positives (generic phrase 'ông bố IT' in unrelated posts).

Impact: No community-driven mentions = no trust signals for AI search citation (Perplexity, ChatGPT weight Reddit/community mentions heavily for Vietnamese tech queries). Growth ceiling until community seeding begins.

P3 2 independent Threads posts mention ongboit.com — early positive signal

Evidence: threads.com/@irenejuann/post/DWWQu4GCW5T and threads.com/@tekkijournal/post/DWYiXxRmGAL both reference ongboit.com organically with link preview. Both are Claude AI / growth-digital context, matching brand positioning.

Impact: Earliest third-party mention signals detected. Nurture by engaging Threads community; reply to both posts to reinforce brand relationship.

P3 TikTok ongboit.com links appearing on non-owned accounts — potential viral cross-posting

Evidence: Multiple TikTok videos from @section.store, @zachdoesai, @emeliaossai, @abhinav.bcode, @devbernardo contain comments/captions with ongboit.com URLs and '#ÔngBốIT' hashtag (claude-code-wordpress-mcp article). These appear to be reposts or comment cross-shares of ongboit's own TikT

Impact: TikTok content is circulating beyond the owned channel — brand URL is reaching international audiences. Opportunity to build the @ongboitvuitinh TikTok handle into a discovery engine.

P2 GitHub owned profile not indexed — missing developer-community presence

Evidence: search site:github.com 'ongboit' OR 'ongboitvuitinh' returned 0 results. GitHub profile exists (listed in sameAs) but has no public repositories or activity visible to search.

Impact: Claude Code / AI coding blog with no GitHub presence loses developer trust signal. Publishing a public repo (even a simple claude-prompts or tools collection) would build authority with the core audience.

P3 Wikipedia/Wikidata entity absent — expected for 3-month-old blog, but plan ahead

Evidence: search site:wikipedia.org OR site:wikidata.org 'ongboit' returned 0 results.

Impact: No Wikipedia entity means no Knowledge Panel. Not actionable now, but publishing original research and earning backlinks from .edu/.org sources is the prerequisite. Flag for 12-month horizon.

Findings from /seo-backlinks (4)

P1 Zero measured external authority — referring domains, domain rank, and backlink count all undetectable at 3 months

Evidence: Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, in_rankings=false, pagerank=null, referring_domains_sample=0. DataForSEO MCP unavailable. Moz/Bing API keys absent. Domain age ~3 months (launched ~Mar 2026). No inbound link signal from any source.

Impact: External authority is the single largest long-term ranking lever for competitive Vietnamese tech queries. Even 5-10 quality referring domains (tech media, Vietnamese IT forums, GitHub profiles, community roundups) would establish a footprint in the next CC snapshot and improve GS

P2 18 broken external links leak link equity and signal low editorial quality

Evidence: seo-audit.json finding AU4: broken_external_link = 18 (out of 299 pages crawled). Source: site crawler (confidence: high). Broken outbound links reduce perceived page quality for crawlers and degrade UX.

Impact: Fix or remove all 18 broken external links. Each live, relevant outbound link to authoritative sources (Vietnamese government tech portals, Anthropic docs, GitHub) reinforces topical authority signals. Target: 0 broken external links.

P2 No Moz or DataForSEO API key configured — future audits blind to DA/spam/anchor data

Evidence: backlinks_auth.py --check: tier=0, moz.available=false ('No Moz API key found'), dataforseo extension absent. Without these, every subsequent backlink audit will remain qualitative.

Impact: Configure free Moz API key (2,500 rows/month) at moz.com/products/api. Enables DA/PA tracking, spam score, anchor text distribution, and referring domain history. Unlocks Tier 1 confidence (0.85) for all future audits.

P3 Brand not yet indexed in Common Crawl — no crawl-graph footprint established

Evidence: commoncrawl_graph.py: in_crawl=false. CC Jan-Mar 2026 snapshot covers the period when ongboit.com launched. Next CC release (Apr-Jun 2026) will determine if the domain has been discovered. A domain absent from CC has no third-party PageRank signal independent of Google.

Impact: Submit sitemap to Bing Webmaster Tools and IndexNow to accelerate discovery. Ensure at least one high-DA Vietnamese site links to ongboit.com before next CC crawl window to establish a PageRank seed node. Low direct impact, but foundational for future audit data availability.

Geo Deep Dive

90/100

Rating: Excellent · Primary source: /geo-llmstxt (82/100)

Findings from /geo-llmstxt (5)

P3 Last-Updated date is 2 days stale

Evidence: curl https://ongboit.com/llms.txt → 'Last-Updated: 2026-06-16'; audit date is 2026-06-18. File was last rebuilt 2 days ago; if new articles published since then they are missing.

Impact: AI crawlers (GPTBot, PerplexityBot) may cache stale index; fresh articles invisible until next rebuild

P2 llms-full.txt covers only 35 of 71 linked articles (49%)

Evidence: curl https://ongboit.com/llms-full.txt | grep '^URL:' | wc -l → 35; llms.txt link count = 71. 36 articles (AI 101 primers, several Claude Code guides, Codex CLI deep-dives, n8n series) linked in llms.txt but full markdown absent from llms-full. Examples missing: /claude-code-road

Impact: AI models that ingest llms-full for single-fetch deep context see only half the site; reduces citation probability for missing articles

P3 llms-full.txt cache TTL is 1h; should match static-asset policy (1yr)

Evidence: curl -sI https://ongboit.com/llms-full.txt → 'Cache-Control: public, max-age=3600'. Other static assets set 1yr (31536000) per Phase-4 shared context (Cloudflare CDN + static Cache-Control 1yr live fix 06-17). llms-full at 1.1 MB re-fetched hourly wastes crawler bandwidth.

Impact: Higher origin bandwidth load; Cloudflare won't serve from edge cache efficiently; crawler quota burned on repeat fetches

P3 Shared-context link count (67) lags actual count (71) by 4

Evidence: phase4-shared-context.md states 'llms.txt 67 links'; curl https://ongboit.com/llms.txt | grep -c '^- \[' → 71. Delta +4 indicates 4 articles added since shared context was written (2026-06-17). Not a live site problem — internal tracking note only.

Impact: Internal audit baseline drift; no user-facing impact

P3 No X-Robots-Tag or explicit AI-bot permission header on llms-full.txt

Evidence: curl -sI https://ongboit.com/llms-full.txt — no X-Robots-Tag header present. robots.txt already allows 25 AI bots (per shared context), so crawl access is fine; however an explicit 'X-Robots-Tag: all' on the llms-full endpoint would signal unambiguous AI-indexing intent.

Impact: Marginal — AI crawlers already permitted via robots.txt; no blocking observed

Geo-Llmstxt Deep Dive

82/100

Rating: Good

No Phase 4 agent JSON found for this category. Findings related to this category appear in the issue list above.

Schema Deep Dive

95/100

Rating: Excellent · Primary source: /geo-schema (95/100)

Findings from /geo-schema (5)

P2 sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution

Evidence: curl https://ongboit.com/ | grep -c wikipedia → 0; sameAs array has 5 entries: Facebook, GitHub, TikTok, LinkedIn, YouTube. Wikipedia and Wikidata absent on both Organization and Person schemas.

Impact: Wikipedia sameAs is the strongest single signal for AI models to resolve entity identity across sources. Without it, ChatGPT, Perplexity, and Google AI may not confidently deduplicate 'Ông Bố IT' across platforms. Wikidata adds machine-readable entity ID (Q-number) for structured

P2 FAQPage Q1 is off-topic for article (DeepClaude question on usage-limits page)

Evidence: Article URL: /claude-code-gioi-han-su-dung/ (usage limits). FAQPage Block 1 Q1 name='DeepClaude Có An Toàn Không?' — topic is DeepClaude+Qwen27B, unrelated to session/weekly limits. Remaining 7 questions are on-topic. Source: curl https://ongboit.com/claude-code-gioi-han-su-dung/

Impact: Google evaluates FAQ schema relevance. A mismatched question does not cause penalty but dilutes schema quality signal and may surface misleading rich snippets. FAQPage is restricted (Aug 2023) so rich result benefit is already limited; nevertheless fixing content accuracy maintai

P3 Person schema absent from homepage — AI crawlers visiting / only cannot resolve author entity

Evidence: curl https://ongboit.com/ | grep Person → 0 matches in JSON-LD. Homepage @graph types: ['Organization', 'WebSite', 'ImageObject', 'WebPage']. Person node only present on article pages.

Impact: AI crawlers (GPTBot, ClaudeBot) that land on the homepage cannot link the Organization to its human author/founder. Adding Person to the homepage @graph with worksFor + sameAs creates a full entity web from the root URL.

P3 BlogPosting missing explicit 'url' property — @id-based reference only

Evidence: curl article page | BlogPosting node: url property MISSING. @id='https://ongboit.com/claude-code-gioi-han-su-dung/#richSnippet' (fragment URL, not canonical). mainEntityOfPage references WebPage @id which has the canonical url. Rich result validators prefer explicit url on the Ar

Impact: Minor. Google's Rich Results Test accepts @id-to-WebPage linking, but explicit url='https://ongboit.com/claude-code-gioi-han-su-dung/' on BlogPosting improves robustness and AI parser compatibility.

P3 Kadence theme microdata (WebPage, WPHeader) coexists with JSON-LD — format mix

Evidence: curl https://ongboit.com/ | grep itemscope → 2 matches: itemtype=schema.org/WebPage and schema.org/WPHeader. itemprop count=0 (no property markup attached). These are Kadence theme structural attributes.

Impact: Low practical risk — no itemprop means no actual property data exposed via microdata. Google ignores empty Microdata wrappers. However, the presence of itemscope without properties wastes markup and may confuse validator tools. Consider disabling theme microdata output if RankMat

🔍 Full-crawl per-URL findings (10 deterministic issues — every page scanned, complements the AI score above)

schema incomplete — 10 URLs
URLMissing properties
https://ongboit.com/category/seo/Organization: missing logo
https://ongboit.com/category/claude-code/Organization: missing logo
https://ongboit.com/category/self-hosting/Organization: missing logo
https://ongboit.com/category/codex-cli/Organization: missing logo
https://ongboit.com/category/ai-101/Organization: missing logo
https://ongboit.com/category/n8n/Organization: missing logo
https://ongboit.com/dich-vu/Article: missing image
https://ongboit.com/dieu-khoan-su-dung/Article: missing image
https://ongboit.com/chinh-sach-bao-mat/Article: missing image
https://ongboit.com/blog/Organization: missing logo

Audit Deep Dive

74/100

Rating: Fair · Primary source: /seo-audit (74/100)

Findings from /seo-audit (13)

P0 RESOLVED: Cloudflare AI-crawler robots.txt block removed — all 14 named AI bots now explicitly Allowed

Evidence: Prior run: '# BEGIN Cloudflare Managed content' block Disallowed GPTBot, ClaudeBot, Google-Extended, CCBot, Amazonbot, Applebot-Extended, Bytespider, meta-externalagent before publisher Allow rules. POST-FIX curl 2026-06-18: robots.txt shows NO Cloudflare Managed block. All 14 na

Impact: RESOLVED. Crawler access restored. AI citation recovery is NOT instant — GPTBot/ClaudeBot/Google-Extended must re-crawl and re-index (expected 1-4 weeks). GA4 AI Assistant channel (currently 9 sessions) expected to grow post-reindex. Monitor weekly. Do NOT claim citations restore

P0 /privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet

Evidence: curl -sI https://ongboit.com/privacy-policy/ → HTTP/1.1 404 Not Found (curl-verified 2026-06-18). A privacy policy page is mandatory for Google AdSense publisher program compliance (Google Publisher Policy) and for GDPR/PDPD (Vietnam Personal Data Protection Decree 13/2023). 404

Impact: AdSense non-compliance risk: Google's review process checks for accessible privacy policy. If AdSense ad-serving is live but policy page is 404, account is flagged. Fix: publish privacy policy to /privacy-policy/ in WordPress (re-publish if accidentally set to Draft), or add a re

P1 Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl

Evidence: seo-backlinks.json: Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, referring_domains_sample=0. DataForSEO/Moz/Bing APIs unavailable. Domain age ~3 months (launched ~Mar 2026). GSC top 3 pages at positions 5.1, 7.9, 6.1 — competitive positions achieved on content quality a

Impact: External authority is the primary long-term ranking lever. Even 5-10 quality referring domains (Vietnamese IT media, GitHub profiles, tech communities, developer forums) would establish a CC PageRank seed node and provide position stability. Target: 10+ referring domains within 6

P1 Slow TTFB on 290/299 crawled pages — origin server response bottleneck

Evidence: crawl-summary.json: slow_ttfb count = 290 out of 299 pages (97%). Homepage curl: HTTP 200, Connection: keep-alive, cf-cache-status: DYNAMIC — pages are hitting origin on every request, not serving from Cloudflare edge cache. Origin WP/PHP response overhead not mitigated.

Impact: TTFB is a direct LCP prerequisite; slow TTFB delays Largest Contentful Paint on all pages. Fix: enable Cloudflare Cache Rules for WordPress pages (Cache Everything rule for GET requests excluding admin/cart paths), or install WP Rocket / LiteSpeed Cache for full-page caching. Tar

P1 35 broken internal links + 18 broken external links — crawl-budget waste and equity leak

Evidence: crawl-summary.json: links_to_broken_page = 35 (internal 4xx destinations), broken_external_link = 18. With 299 pages crawled, 35 broken internal links represents systematic crawl-budget waste. 18 broken external links degrade perceived editorial quality.

Impact: Fix broken internal links first (redirect or update href): run Screaming Frog / Ahrefs broken link report. For external, remove or replace with live alternatives. Each fixed link restores link equity flow and removes crawl waste signal. Target: 0 broken internal, <5 broken extern

P1 Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor

Evidence: gsc-top-pages.json: claude-code-gioi-han-su-dung 188 clicks (pos 5.1) + claude-code-gia-bao-nhieu 142 clicks (pos 7.9) + tiet-kiem-token-claude-code 102 clicks (pos 6.1) = 432 of ~670 total top-12 clicks. All three pages sit in a zone (positions 5-9) where a single algorithm upda

Impact: Diversify by pushing tier-2 pages (claude-code-vs-code pos 7.4, claude-code-auto-mode pos 4.9, obsidian-claude-code pos 7.8) into top 5 via internal link equity from top-3 pages. Target: 5+ pages contributing >10 clicks each within 90 days.

P1 Brand orange #FF7F00 fails WCAG 1.4.3 AA contrast on white backgrounds — 4 surface types

Evidence: geo-accessibility.json: #FF7F00 on #ffffff = 2.53:1 (large text needs 3:1, normal text needs 4.5:1). Affected: H1 hero span, .obit-catall links (0.9em bold), .home-faq-answer a, .entry-content table a. curl-verified colors present on homepage.

Impact: WCAG AA failure on 4 surfaces. Affects AdSense publisher quality signals and Core Web Vitals accessibility scoring. Fix: darken brand orange to #C05F00 (~3.2:1 large, ~5:1 normal) or #B35900 for white-background surfaces only. Dark-background uses (footer, dark table headers) alr

P2 17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set

Evidence: crawl-summary.json: duplicate_meta_desc = 17, duplicate_title = 15. Combined 32 pages with duplicated metadata. Likely WordPress category/tag/archive pages using fallback templates. Specific URLs not enumerated in crawl-summary.

Impact: Duplicate titles/descriptions reduce individual page differentiation in SERP. Fix: configure RankMath archive meta templates with dynamic variables (%category%, %archive_title%, %page%) to generate unique metadata per page. Target: 0 exact-duplicate title/desc pairs.

Page-Deep-Dive Deep Dive

74/100

Rating: Fair · Primary source: /seo-page (74/100)

Findings from /seo-page (6)

P2 auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip

Evidence: https://ongboit.com/claude-code-auto-mode/ — grep: line 478 '<h3 style="color: #FF7F00">TL;DR</h3>' precedes line 506 '<h2>Auto Mode Là Gì...' — H1→H3 jump violates sequential heading order; screen readers and Google's heading parser treats TL;DR as a subsection of H1 with no pa

Impact: Fix hierarchy: change TL;DR heading to a styled <p> or <div> (it is already visually a callout box, not a real section). Eliminates heading-order warning in Lighthouse, aligns with WCAG 1.3.1 (info & relationships).

P2 auto-mode page: only 3 editorial internal links — well below site average of 10-13

Evidence: https://ongboit.com/claude-code-auto-mode/ — body links extracted lines 460–735: /claude-code-hooks/, /claude-code-roadmap/, /tiet-kiem-token-claude-code/ (3 total). Comparable pages average 10-13 editorial links. Word count 4684 is also lowest of the 5 audited.

Impact: Add 5–7 topically related internal links (e.g. permission-modes, tiet-kiem-token, claude-md, gioi-han). Improves PageRank flow to this page's cluster and increases session depth from this entry point.

P2 tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate

Evidence: https://ongboit.com/tiet-kiem-token-claude-code/ — meta name='description' content length=169 chars (198 bytes). Measured directly: 'Tiết kiệm token Claude Code: 15 mẹo giảm bill API từ $290 xuống $82/tháng. Hiểu cơ chế history gửi lại mỗi turn + cách quản lý CLAUDE.md, session v

Impact: Trim to ≤155 chars while keeping primary KW and CTA at front. Prevents Google-generated snippet from replacing the crafted description.

P3 twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account

Evidence: curl grep 'twitter:site' on all 5 pages returns 0 matches. Pages have twitter:card=summary_large_image + twitter:title + twitter:description + twitter:image but no twitter:site='@ongboitvuitinh' (the TikTok handle used in sameAs schema suggests account exists). Without twitter:si

Impact: Add <meta name='twitter:site' content='@ongboitvuitinh'> to RankMath global social settings (applies sitewide in one edit). Low friction, improves brand attribution on Twitter shares.

P3 Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token)

Evidence: gioi-han: title='...2026: Session 5h, Weekly 7 Ngày' vs H1='...Session, Weekly & Cách Tối Ưu (2026)'. gia-bao-nhieu: title='...$20-$200 + Cách Mua Rẻ Nhất' vs H1='...Pro vs Max + Mua Giá Rẻ'. tiet-kiem-token: title starts 'Tiết Kiệm Token Claude Code...' vs H1 starts '15 Mẹo Tiết

Impact: Divergence is intentional SEO practice (title=SERP click-bait, H1=on-page context) and Google handles it. No fix required if divergence is deliberate; document as accepted pattern. Flag only if divergence was accidental (e.g., RankMath title override was forgotten). Severity P3 =

P3 OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image

Evidence: All 5 pages: og:image:width=1024 (confirmed via og:image:width meta tag). Twitter summary_large_image recommends minimum 1200×630 for lossless display on modern hi-DPI screens. Source images exist at scaled sizes (e.g. gioi-han hero at 2560×1429 in WP media library per JSON-LD Im

Impact: Update og:image references to point to 1200-wide crop (WP crop at 1200x630 or use existing *-scaled.jpg). Affects how cards render on Twitter/X share preview — sharper on retina displays, no letterboxing.

Visualizations

Site-infrastructure charts. Keyword-gap, competitor, and internal-link visualizations live in /blog-audit-pipeline (content-portfolio audit) after the v0.5.15 split. Where data is unavailable for this tier/source, a disclosure callout is shown instead of placeholder numbers.

Chart 1: Core Web Vitals

Targets: LCP <2.5s · INP <200ms · CLS <0.1. LCP (load speed) is driven mostly by server response time (TTFB) — see Performance deep dive.

📊 Core Web Vitals — Data not available in this audit.

No Chrome DevTools MCP or CrUX field-data connected. Real LCP/INP/CLS requires Tier-1 MCP setup.

Chart 2: GEO Readiness Radar

How citable the site is to AI engines. Each axis 0-100; further from center is better. Weak axes (llms.txt, brand authority) are the biggest AI-visibility gaps.

Citability(90)Brand(32)Platform(68)Crawler(90)llms.txt(82)Schema AI(95)Answer(74)

Fig 2: GEO readiness across 7 dimensions

Chart 3: Backlink Authority Distribution

DR/DA 0-20 = low-authority links; 61-100 = high-authority. You want more referring domains, weighted toward the right.

📊 Backlink Authority Distribution

Direct backlink metrics could not be measured this run — the histogram needs referring-domain data that is unavailable.
No third-party backlink data is available: DataForSEO MCP tool is not registered in this environment, Common Crawl (Jan-Mar 2026) does not index ongboit.com (expected for a ~3-month-old domain), and no Moz or Bing API keys are configured. Score reflects domain age reality (near-zero external authority is normal at 3 months) rather than a penalty — but zero authority is the confirmed #1 growth lever. The 18 broken external links observed by the site crawler represent an internal link-equity leak

Chart 4 — What your search + behavior data says

Auto-derived from GSC (search) + GA4 (behavior) — deterministic, computed straight from the measured numbers (no estimates).

  • 🎯 8 striking-distance queries at position ≤15 — the highest-ROI quick win. Biggest near-miss: mua claude code giá rẻ (pos 9.2, 475 impr).
  • 🟢 Organic sessions +103.0% vs the prior period — behavior data confirms the growth.
  • ⚠️ Organic under-converts — 226.5% vs Direct 238.5%. Check organic landing-page intent match + CTAs.
  • Top converting entry page: /claude-code-gioi-han-su-dung — 456 key events from 210 sessions.

Chart 4b: GA4 Organic — Traffic, Conversions & Audience (2026-05-19 → 2026-06-16)

1,628
Organic sessions
1,031
Users
226.47%
Conversion rate
3,687
Key events
Organic sessions +103.0% vs prior period
Acquisition

All-channel session mix

Organic Search 67%Direct 27%Referral 3%Organic Social 2%

Organic source / medium

google / organic
1,399
bing / organic
198
vn.search.yahoo.com / referral
19
yahoo / organic
9
duckduckgo / organic
3

Organic sessions over time

010020005/19: 2305/20: 2605/21: 3705/22: 3805/23: 2605/24: 3505/25: 4605/26: 5105/27: 4605/28: 3805/29: 6005/30: 1805/31: 1606/01: 5206/02: 6106/03: 8106/04: 7106/05: 7106/06: 4306/07: 5506/08: 9606/09: 8706/10: 8306/11: 10006/12: 9306/13: 5806/14: 5606/15: 9506/16: 6705/1905/2405/2806/0206/0706/1106/16
Hover a point for the exact day · peak 100 sessions/day
SEO-ROI

Top organic pages by conversions

/claude-code-gioi-han-su-dung/
469 conv · 186.9% · 251 sess
/tiet-kiem-token-claude-code/
421 conv · 194.9% · 216 sess
/claude-code-gia-bao-nhieu/
352 conv · 189.2% · 186 sess
/claude-md-la-gi/
151 conv · 143.8% · 105 sess
/claude-code-design-skill/
118 conv · 368.8% · 32 sess
/claude-code-marketing-skills/
117 conv · 265.9% · 44 sess
/claude-code-seo-content/
107 conv · 261.0% · 41 sess
/claude-code-vs-code/
99 conv · 125.3% · 79 sess

Conversions by channel (is organic converting?)

Organic Search
3687 conv · 226.5% · 1,628 sess
Direct
1572 conv · 238.5% · 659 sess
Organic Social
132 conv · 264.0% · 50 sess
Referral
106 conv · 126.2% · 84 sess
AI Assistant
37 conv · 411.1% · 9 sess
Unassigned
3 conv · 30.0% · 10 sess
Engagement

Top organic landing pages (entry)

Landing pageSessionsKey eventsEngaged
/claude-code-gioi-han-su-dung21045686.2%
/tiet-kiem-token-claude-code17741182.5%
/claude-code-gia-bao-nhieu16639178.3%
/claude-md-la-gi7414367.6%
/claude-code-vs-code6110283.6%
/claude-code-memory-context36441.7%
/claude-code-seo-content2816896.4%
/claude-code-token-tracker287289.3%
/cai-dat-claude-code277585.2%

Top organic content (by pageviews)

PageViewsSessionsEngagedAvg time
/tiet-kiem-token-claude-code/22821680.1%5m 2s
/claude-code-gioi-han-su-dung/22325180.1%2m 7s
/claude-code-gia-bao-nhieu/17618675.8%2m 53s
/claude-md-la-gi/9310572.4%3m 19s
/claude-code-vs-code/707978.5%2m 24s
/594495.5%1m 29s
/claude-code-skills/455578.2%2m 18s
/category/claude-code/433894.7%1m 13s
/claude-code-memory-context/414434.1%41m 44s
/claude-code-hooks/384376.7%10m 58s

Top events (organic engagement)

page_view
2,032 · 1,029 usr
session_start
1,648 · 1,031 usr
user_engagement
1,439 · 819 usr
first_visit
1,006 · 1,006 usr
scroll
445 · 189 usr
click
126 · 73 usr
generate_lead
9 · 8 usr
form_start
6 · 4 usr
form_submit
6 · 4 usr
view_search_results
6 · 4 usr
Audience

Device

desktop
1,365
mobile
257
tablet
6

Top countries

Vietnam
1,454
Japan
60
United States
44
Singapore
17
Australia
8
Taiwan
8

New vs returning

new
1,005
returning
464

Age

unknown
1,279
18-24
226
25-34
60
35-44
41

Gender

unknown
1,258
male
198
female
171

On-site searches: mcp, Claude Code Design , RAG, opencode, plan mode

Chart 5: AI Crawler Access (15 bots)

robots.txt — 15 bots allowed via "User-agent: *" (no per-bot rules). Status per known AI/LLM crawler:

BotVendorPurposerobots.txt status
GPTBotallow
ChatGPT-Userallow
OAI-SearchBotallow
ClaudeBotallow
anthropic-aiallow
PerplexityBotallow
Google-Extendedallow
Googlebotallow_via_wildcard
Bingbotallow
CCBotallow
Bytespiderallow
Amazonbotallow
Applebot-Extendedallow
meta-externalagentallow
cohere-aiallow

Each row is an AI/search bot. Allowed = it can read and cite your pages; Blocked removes you from that engine's answers.

Chart 6: AI Platform Readiness (per engine)

Per-platform GEO readiness 0-100 — each engine uses different ranking signals, so a page strong on one can be invisible on another.

Gemini
74
Google AI Overviews
72
Perplexity
63
Bing Copilot
62
ChatGPT
60

Chart 7: Striking-Distance Keywords (page 2 → page 1)

Queries ranking positions 8–30 with impressions — a small push lands page 1. Highest near-term ROI.

QueryPositionImpressionsClicks
các gói claude code6.4571
claude.md là gì7.3591
claude.md7.8560
seo audit website dichvuseo3658.9650
mua claude code giá rẻ9.24750
claude code pricing9.21702
obsidian là gì9.51351
giá claude code10.4721
dataforseo test19.8640

The Priority Breakdown figure is in the Executive Summary. All charts use Okabe-Ito color-blind safe palette.

90-Day Roadmap

Visual phased plan. Each block clickable in full HTML; here shown as Gantt-style timeline.

Weeks 1-2 (Critical)
Weeks 3-6 (Schema + Perf)
Weeks 7-12 (Authority + Content)
P0 Critical fixes
P1 High fixes
P2 Medium fixes
Content expansion
Internal links
Authority building

What ships each window

Weeks 3-6 · P1
  • A1 · Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces
  • AU2 · /privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet
  • AU3 · Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl
Weeks 7-12 · P2
  • A2 · Email newsletter input: outline:none with no focus handler — invisible keyboard focus
  • A3 · Malformed table HTML in pinned page — missing thead/tbody, broken th attribute
  • AU8 · 17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set

Expected Score Progression

MilestoneProjected ScoreDelta
Current baseline78/100
After Week 1-2 (all P0 fixed)78/100+0
After Week 6 (P0+P1 fixed)96/100+18 (cumulative +18)
After Week 12 (P0+P1+P2 fixed)100/100+12 (cumulative +30)

Projection model: sums each finding's impact_quantified per-axis score points (geo/technical/brand/schema/…) per severity bucket, capped at 25/18/12 pts respectively to avoid double-counting overlapping fixes. Real-world deltas depend on execution quality.

Autofix Bundle

115 fixes

Pipeline generates fix artifacts into audits/[client]/[date]/fixes/. Generate-only mode — review + apply manually via WP MCP / direct upload.

📋 MANUAL (step-by-step guides) — 115 fixes
A1 · Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces manual-guide
AU2 · /privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet manual-guide
AU3 · Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl manual-guide
AU4 · Slow TTFB on 290/299 crawled pages — origin server response bottleneck manual-guide
AU5 · 35 broken internal links + 18 broken external links — crawl-budget waste and equity leak manual-guide
AU6 · Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor manual-guide
AU7 · Brand orange #FF7F00 fails WCAG 1.4.3 AA contrast on white backgrounds — 4 surface types manual-guide
BM4 · Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification manual-guide
BL1 · Zero measured external authority — referring domains, domain rank, and backlink count all undetectable at 3 months manual-guide
C1 · /privacy-policy/ returns 404 — English canonical URL dead manual-guide
C2 · CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer manual-guide
PO2 · Vietnamese-only content creates systematic language barrier for English-first AI citation engines manual-guide
PO3 · Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared manual-guide
SM2 · 35 internal pages linked-to are returning 4xx / broken — crawl budget wasted and link equity lost manual-guide
SM3 · 14 internal links point to redirect chains instead of canonical URLs manual-guide
T1 · robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers manual-guide
V1 · Brand orange #FF7F00 white text fails WCAG AA — 2.53:1 (threshold 3.0 large, 4.5 normal) manual-guide
A2 · Email newsletter input: outline:none with no focus handler — invisible keyboard focus manual-guide
A3 · Malformed table HTML in pinned page — missing thead/tbody, broken th attribute manual-guide
AU8 · 17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set manual-guide
AU9 · 70 noindex pages (23% of crawl) — author page noindexed, blocking E-E-A-T entity signal manual-guide
AU10 · AI citation recovery pending — access unblocked but re-indexing not yet complete manual-guide
AU11 · Mobile traffic only 16% vs Vietnamese market norm ~72% smartphone penetration manual-guide
BM1 · Brand name collision: '@ongboit97' is a different, larger YouTube channel manual-guide
BM2 · Facebook owned page has only 4 likes — effectively invisible manual-guide
BM3 · YouTube owned channel has only 1 video — no authority or subscriber base yet manual-guide
BM7 · GitHub owned profile not indexed — missing developer-community presence manual-guide
BL2 · 18 broken external links leak link equity and signal low editorial quality manual-guide
BL3 · No Moz or DataForSEO API key configured — future audits blind to DA/spam/anchor data manual-guide
C3 · DSAR channel is a personal Gmail — not a dedicated privacy contact manual-guide
C4 · Privacy policy page has robots meta 'follow, index' but no structured data (Article/WebPage schema) — not discoverable as a legal document manual-guide
GC2 · llms.txt last-updated 2026-06-16 — articles published after that date absent from AI discovery index manual-guide
LL2 · llms-full.txt covers only 35 of 71 linked articles (49%) manual-guide
IM1 · 17 content images missing width+height attributes (CLS risk) manual-guide
IM2 · LCP hero on /claude-code-gioi-han-su-dung/ served as JPEG, not WebP manual-guide
IM3 · og:image width 1024px on 4 of 5 pages — below 1200px recommended minimum manual-guide
IM4 · Missing fetchpriority=high on LCP hero images for 3 article pages manual-guide
P1 · auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip manual-guide
P2 · auto-mode page: only 3 editorial internal links — well below site average of 10-13 manual-guide
P3 · tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate manual-guide
PF1 · Render-blocking Google Fonts CSS on homepage + pinned page manual-guide
PO4 · llms.txt activated and reachable — 71 links now crawlable; llms-full.txt covers only 35/71 articles manual-guide
PO6 · Zero third-party community mentions on Reddit/X — no social proof signal for AI citation engines manual-guide
S1 · sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution manual-guide
S2 · FAQPage Q1 is off-topic for article (DeepClaude question on usage-limits page) manual-guide
SM4 · 14 indexable pages crawled but absent from sitemap manual-guide
SM5 · robots.txt has duplicate user-agent blocks creating conflicting directives for AI crawlers manual-guide
SM6 · 15 duplicate titles and 17 duplicate meta descriptions across crawled pages manual-guide
T2 · CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src manual-guide
T3 · Homepage hero image missing (LCP risk) manual-guide
T4 · Google Fonts CSS loaded as render-blocking stylesheet manual-guide
T5 · Homepage meta description 162 chars (2 chars over 160 target) manual-guide
V2 · Body text contrast 4.46:1 fails WCAG AA by 0.04 (threshold 4.5) manual-guide
A4 · Newsletter email input not wrapped in a
element manual-guide
A5 · Search input uses JS focus indicator (border-color change) instead of CSS :focus-visible manual-guide
AU12 · Sitemap XML served with x-robots-tag: noindex — non-standard signal on sitemap URL manual-guide
AU13 · 32 broken JS/CSS assets — console errors may affect AdSense rendering manual-guide
BM5 · 2 independent Threads posts mention ongboit.com — early positive signal manual-guide
BM6 · TikTok ongboit.com links appearing on non-owned accounts — potential viral cross-posting manual-guide
BM8 · Wikipedia/Wikidata entity absent — expected for 3-month-old blog, but plan ahead manual-guide
BL4 · Brand not yet indexed in Common Crawl — no crawl-graph footprint established manual-guide
C5 · Cookie banner dismissal state 'cmplz-dismissed' visible in raw HTML — verify first-visit behavior manual-guide
GC3 · ClaudeUser and OAI-SearchBot listed but not all Anthropic/OpenAI agent variants covered manual-guide
LL1 · Last-Updated date is 2 days stale manual-guide
LL3 · llms-full.txt cache TTL is 1h; should match static-asset policy (1yr) manual-guide
LL4 · Shared-context link count (67) lags actual count (71) by 4 manual-guide
LL5 · No X-Robots-Tag or explicit AI-bot permission header on llms-full.txt manual-guide
GG1 · Query-level click concentration — 3 pages drive majority of clicks manual-guide
H1 · Hreflang implementation is correct and complete for a single-locale Vietnamese site manual-guide
H2 · No hreflang via HTTP Link headers (HTML-only delivery — acceptable) manual-guide
IM5 · AVIF format not used anywhere (0%) manual-guide
IM6 · External Buy Me A Coffee image (cdn.buymeacoffee.com) lacks width+height dimensions manual-guide
IM7 · Avatar images (author thumbnails) served without loading=lazy on article pages manual-guide
P4 · twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account manual-guide
P5 · Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token) manual-guide
P6 · OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image manual-guide
PF2 · Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth manual-guide
PO7 · llms.txt Last-Updated is 2 days stale (2026-06-16) — new articles not indexed for AI crawlers manual-guide
PO8 · FAQPage Q1 is off-topic for the pinned article — semantic integrity issue for AI passage extraction manual-guide
S3 · Person schema absent from homepage — AI crawlers visiting / only cannot resolve author entity manual-guide
S4 · BlogPosting missing explicit 'url' property — @id-based reference only manual-guide
S5 · Kadence theme microdata (WebPage, WPHeader) coexists with JSON-LD — format mix manual-guide
SM1 · x-robots-tag: noindex on all sitemap files — Googlebot cannot discover or use sitemaps manual-guide
SM7 · sitemap_index.xml was 404 earlier today — now fixed (credit given) manual-guide
SM8 · 3 pages have multiple H1 tags — structural signal for content quality manual-guide
T6 · Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl) manual-guide
T7 · Cache-Control for theme CSS is 30 days vs 1 year for images manual-guide
V3 · Focus-visible rule confirmed present but scope may be narrow (mobile menu only) manual-guide
V4 · Mobile CTA off-screen on 375x667 (iPhone SE) viewport manual-guide
V5 · Carousel off-screen slides extend beyond desktop viewport bounds manual-guide
V6 · CLS = 0.0 on all tested pages/viewports — PASS manual-guide
CR1 · Internal links pointing to broken pages (35 URLs) manual-guide
CR2 · Broken pages returning 4xx (4 URLs) manual-guide
CR3 · Broken JS/CSS resources (32 URLs) manual-guide
CR4 · Broken outbound links (18 URLs) manual-guide
CR5 · Duplicate page titles (15 URLs) manual-guide
CR6 · Ai bots blocked (1 URL) manual-guide
CR7 · Sitemap missing (1 URL) manual-guide
CR8 · Slow server response (TTFB) (290 URLs) manual-guide
CR9 · Large HTML payload (279 URLs) manual-guide
CR10 · Low text-to-HTML ratio (26 URLs) manual-guide
CR11 · Duplicate meta descriptions (17 URLs) manual-guide
CR12 · Internal links to redirects (14 URLs) manual-guide
CR13 · Near-orphan pages (one internal link in) (14 URLs) manual-guide
CR14 · Nofollow outbound links (informational) (13 URLs) manual-guide
CR15 · Incomplete OpenGraph tags (10 URLs) manual-guide
CR16 · Incomplete structured data (10 URLs) manual-guide
CR17 · Meta descriptions too short (8 URLs) manual-guide
CR18 · Titles too short (6 URLs) manual-guide
CR19 · Meta desc too long (4 URLs) manual-guide
CR20 · Thin page: H1 duplicates the title (3 URLs) manual-guide
CR21 · Multiple H1 tags (3 URLs) manual-guide
CR22 · Too many links on a page (2 URLs) manual-guide
CR23 · Not compressed (1 URL) manual-guide
CR24 · No cache control (1 URL) manual-guide

How to apply

# For AUTO-SAFE / AUTO-REVIEW artifacts:
python ~/.claude/scripts/wp_push_safe.py [post_id] fixes/[category]/[file] --expected-slug [slug]

# For MANUAL guides:
# Read fixes/manual-guides/*.md and execute steps manually

🤖 Apply These Fixes with Claude Code

Most teams apply these with Claude Code. Hand Claude just the report MD seo-audit_ongboit.com_2026-06-18.md (plus the fixes/ folder for ready-to-apply artifacts) — not the whole folder — then paste the prompt below.

You are a senior SEO + GEO engineer applying a completed audit for the SITE OWNER (not a developer).

COMMUNICATE PLAINLY
- The person running you is the site owner and is NOT technical. Before each change, explain in ONE
  plain sentence what you'll change and why it helps. When you ask them to approve, give a simple
  yes/no recommendation. Don't assume they know SEO/dev terms — define any jargon in a few words.

CONTEXT
- Run me from THIS audit folder (the one holding the report + the fixes/ folder) so the paths below resolve.
- Read the report seo-audit_ongboit.com_2026-06-18.md (in this folder): Top-3 Priority, findings by severity, per-category deep dives, 90-Day Roadmap.
- Ready-to-apply artifacts are in the fixes/ folder here (robots.txt AI policy, llms.txt, schema JSON-LD, meta).
- Site: ongboit.com (WordPress -> apply via WP REST / Application Password, or WP MCP if your setup uses it).

WORKFLOW
1. Read the report. Summarize the Top 3 Fixes + the quick wins in plain language. Change nothing yet.
2. Propose a simple plan split into TWO buckets, then wait for my OK:
   A) "I can do these in your WordPress" — schema, meta titles/descriptions, FAQ markup, internal
      links, on-page content (you create a draft I approve).
   B) "These need your developer / host" — robots.txt, llms.txt, .htaccess, security headers
      (you give me the ready file + a one-line note to forward; you can't deploy these for me).
3. Applying each fix:
   - Bucket A -> edit in WP, create a REVISION/DRAFT, NEVER publish live. I click Publish myself.
   - Bucket B -> output the ready file + 1-2 plain steps for my host; do not attempt to deploy it.
4. After each fix, VERIFY using the exact signal the finding measured (header present, bot allowed,
   schema present, llms.txt loads) and report pass/fail in plain language.

RULES
- Don't fabricate or weaken a fix to make it "pass". Evidence-only.
- NEVER publish or delete anything live -> always a draft/revision for my review.
- BEFORE applying a fix, check the seo-pipeline skill's references/site-fix-gotchas.md (in your
  installed Claude skills, not this folder) for a known footgun or false alarm (e.g. a CDN-injected
  robots block, a noindex sitemap that is actually fine) -> apply the safe fix it documents.
- LOG every live change to CHANGELOG-live-fixes.md in this folder: What / How / Verify / Revert
  (one entry per change). Never apply a change you can't revert.
- Keep a simple checklist: [finding] -> done / drafted / handed to developer / skipped + why.

Verification Pass — 10 Gates

9/9

Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).

GateCheckStatusDetail
Gate 1 Every finding ties to evidence (5 attrs) ✓ PASS All 115 findings have evidence + severity + effort + impact + confidence
Gate 2 Every chart hydrates from real source or shows disclosure ✓ PASS 7 chart slots: real data populates where agent JSON available; placeholder data eliminated v0.5.7
Gate 3 Every score documents calculation in appendix ✓ PASS Formula audit trail in phase6-scores.json
Gate 4 No fabricated data (confidence field required) ✓ PASS All 115 findings carry confidence field; chart values traced to agent JSON
Gate 5 Reproducibility log present ✓ PASS Appendix C populated with tools/versions/data sources
Gate 6 Severity not inflated (P0 ≤ P1 generally) ✓ PASS 0 P0 vs 19 P1 — distribution healthy
Gate 7 Low-confidence findings flagged inline ✓ PASS 18 medium-confidence + 1 low-confidence findings flagged in evidence cards
Gate 8 Reaudit matrix complete (if reaudit mode) — N/A N/A — first audit mode
Gate 9 Quick wins separated from roadmap ✓ PASS Quick Wins section distinct from 90-Day Roadmap
Gate 10 Composite scores match category breakdown ✓ PASS All 3 composites reverse-compute correctly (±0.5 tolerance)

Appendix

Appendix A — Score Calculation Methodology

Technical + CWV Composite

Technical*0.45 + Performance*0.35 + Sitemap*0.20

Components:
  technical: 83 × 0.45 = 37.35
  performance: 100 × 0.35 = 35.00
  sitemap: 39 × 0.20 = 7.80

Sum: 80.1
Rounded: 80

GEO + AEO Composite

Brand*0.30 + Schema*0.25 + Platform*0.25 + Geo*0.20

Components:
  brand: 22 × 0.30 = 6.60
  schema: 95 × 0.25 = 23.75
  platform: 66 × 0.25 = 16.50
  geo: 90 × 0.20 = 18.00

Sum: 64.8
Rounded: 65

Overall Search-Readiness Composite

Technical*0.18 + Schema*0.13 + Sitemap*0.06 + Performance*0.13 + Geo*0.25 + Platform*0.06 + Brand*0.13 + Image*0.06 + Hreflang*0.04

Components:
  technical: 83 × 0.17 = 14.37
  schema: 95 × 0.12 = 11.88
  sitemap: 39 × 0.06 = 2.25
  performance: 100 × 0.12 = 12.50
  geo: 90 × 0.24 = 21.63
  platform: 66 × 0.06 = 3.81
  brand: 22 × 0.12 = 2.75
  image: 96 × 0.06 = 5.54
  hreflang: 95 × 0.04 = 3.65

Sum: 78.4
Rounded: 78

Appendix B — Reproducibility

  • Kit version: Claude-Growth v1.3.0
  • Audit timestamp: 2026-06-18T00:25:30.674741+00:00
  • Audit duration: 2h 10m
  • Mode: first
  • Tier detected: T2 (capability detection)
  • Coverage at this tier: ~85-95% — external SERP + full crawl, but no first-party GSC clicks/impressions.

Capability checklist

  • Google Search Console (GSC)
  • DataForSEO MCP
  • Firecrawl MCP
  • Chrome DevTools MCP (field CWV)
  • WordPress MCP

Missing a connector lowers coverage — see the setup guide: ongboit.com/claude-growth-setup-tool-api-mcp.

Data sources consulted

  • GSC API: ✓ (OAuth granted)
  • DataForSEO MCP: ✓
  • Firecrawl MCP: ✓ (N/A pages)
  • reportlab: ✓ (PDF generation)

Skill routing decisions

See skills/seo-pipeline/references/skill-routing.md for winner-per-pair analysis (4 duplicate skills compared head-to-head across 8-12 dimensions each).

Reference files

  • references/issue-catalog.md — 23 detection patterns
  • references/business-type-sampling.md — 5 types × 8 priority pages
  • references/composite-formula.md — 9 weights + 5-tier rubric
  • references/pdf-spec.md — Times New Roman + 7 charts
  • references/verification-checklist.md — 10 Phase 6.5 gates
  • references/skill-routing.md — winner-per-pair matrix
  • references/autofix-catalog.md — 23 autofix scenarios

Glossary

Plain-language definitions of every term (CWV, GEO/AEO, llms.txt, canonical, striking distance, crawl budget, E-E-A-T…) are in the How to Read This Report section near the top.

Appendix C — All Agent Findings (95 raw, 17 agents)

Every finding from every agent, ungrouped — nothing consolidated away. The prioritized Issues sections above are the deduped, board-grade view of these.

geo-accessibility — score 62/100 · 5 finding(s)
High A1Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces
H1 hero span `style="color:#FF7F00"` on palette9 #fff7f5 bg: 2.53:1 (needs 3:1 large text). `.obit-catall{color:#FF7F00}` at 0.9em bold on card bg #fff: 2.53:1 (needs 4.5:1). `.home-faq-answer a{color:#FF7F00}` on white: 2.53:1. `.entry-content table a{color:#FF7F00}` on `background:white` in pinned page tables: 2.53:1.
→ Fails WCAG 1.4.3 AA on 4 distinct surface types. Orange on dark backgrounds (footer, dark table headers) passes — fix scope is white-bg surfaces only. Darken to ~#C05F00 (~3.2:1 large, ~5:1 normal) or shift to #B35900.
Medium A2Email newsletter input: outline:none with no focus handler — invisible keyboard focus
`<input type="email" ... style="... outline: none;" />` — no onfocus handler, no :focus-visible override scoped to this element. Compare: search input has `onfocus="this.style.borderColor='#6366f1'"` (acceptable substitute) but email input has none. Email input is not inside a `<form>` element.
→ Keyboard users cannot see focus on newsletter email field — WCAG 2.4.7 violation on this specific input. Fix: add `onfocus/onblur` border-color change matching search input pattern, or remove `outline:none` to let the :focus-visible rule apply.
Medium A3Malformed table HTML in pinned page — missing thead/tbody, broken th attribute
Table at position 72905 in /claude-code-gioi-han-su-dung/: `<table ...><th scope="col" style="min-width: 100px;"ead style="background: #312e81; color: #e0e0e0;">` — th tag has truncated/corrupted attribute (`"ead style=...`). Missing `<thead>` wrapper. Then `</thead>` appears after `</tr>` (out of order). This breaks AT reading order and screen-reader table navigation.
→ Screen readers rely on thead/tbody structure for table navigation. Malformed th attribute will be unparsed by browsers (attribute ignored). Fix: correct HTML structure — `<thead><tr><th scope="col">...</th></tr></thead><tbody>...</tbody>`.
Low A4Newsletter email input not wrapped in a <form> element
`<input type="email" ...>` followed by `<a href="/contact/?subject=Subscribe">Đăng ký</a>` — this is a decorative input with no form submission. The subscribe 'button' is an anchor link, not a submit button. No form role or action defined.
→ Keyboard users expecting to submit via Enter key will navigate away (anchor click) instead of submitting a form. Screen readers announce the link as a link not a submit button. Low severity as the flow still works, but semantics are incorrect for 4.1.2.
Low A5Search input uses JS focus indicator (border-color change) instead of CSS :focus-visible
`<input type="search" ... style="... outline:none; ..." onfocus="this.style.borderColor='#6366f1'" onblur="this.style.borderColor='#e2e8f0'">` — outline suppressed inline. Focus indicator is JS-driven border-color change from #e2e8f0 to #6366f1.
→ The border-color change provides a visible focus indicator (PARTIAL pass for 2.4.7) but: (1) relies on JS — if JS disabled, no focus indicator at all; (2) 2px border color change is below the WCAG 2.2 AA 2.4.11 non-text contrast 3:1 threshold (new in 2.2). The site :focus-visible CSS rule should handle this. Fix: remove inline `outline:none` and rely on the existing `:focus-visible{outline:2px solid #4386fc}` rule.
geo-brand-mentions — score 32/100 · 8 finding(s)
Medium BM1Brand name collision: '@ongboit97' is a different, larger YouTube channel
Search site:youtube.com 'ongboit channel' returns TWO channels: UCOhOyDYdfqrldzWO0jzQD8g (@ongboit, 1 video — owned) and UCwakJ2N0D0FQgrwHEHyX6Fg (@ongboit97, multiple videos with IT/tech content). Brand search is polluted; users may land on the wrong channel.
→ YouTube handle ambiguity dilutes brand recall and misdirects search traffic; @ongboit97 appears first in results for 'ông bố IT' YouTube searches.
Medium BM2Facebook owned page has only 4 likes — effectively invisible
facebook.com/ongboitvuitinh confirmed live: 'OngBo.IT. 4 likes.' Very low social proof signal. Page exists but has near-zero authority.
→ Social proof gap weakens E-E-A-T and sameAs authority signals for AI crawlers (ChatGPT/Perplexity entity resolution relies on consistent cross-platform presence).
Medium BM3YouTube owned channel has only 1 video — no authority or subscriber base yet
youtube.com/channel/UCOhOyDYdfqrldzWO0jzQD8g (@ongboit): '1 video. More about this channel.' The @ongboitvuitinh handle (listed in sameAs) returned 0 search results — may not be the active handle, or not yet indexed.
→ YouTube is the #1 Vietnamese content platform. Zero video authority = zero referral traffic and no citability signal from video content.
High BM4Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification
All searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit (site:reddit.com), X/Twitter, dev.to, and Quora returned 0 on-brand results. All Reddit hits were false positives (generic phrase 'ông bố IT' in unrelated posts).
→ No community-driven mentions = no trust signals for AI search citation (Perplexity, ChatGPT weight Reddit/community mentions heavily for Vietnamese tech queries). Growth ceiling until community seeding begins.
Low BM52 independent Threads posts mention ongboit.com — early positive signal
threads.com/@irenejuann/post/DWWQu4GCW5T and threads.com/@tekkijournal/post/DWYiXxRmGAL both reference ongboit.com organically with link preview. Both are Claude AI / growth-digital context, matching brand positioning.
→ Earliest third-party mention signals detected. Nurture by engaging Threads community; reply to both posts to reinforce brand relationship.
Low BM6TikTok ongboit.com links appearing on non-owned accounts — potential viral cross-posting
Multiple TikTok videos from @section.store, @zachdoesai, @emeliaossai, @abhinav.bcode, @devbernardo contain comments/captions with ongboit.com URLs and '#ÔngBốIT' hashtag (claude-code-wordpress-mcp article). These appear to be reposts or comment cross-shares of ongboit's own TikTok videos.
→ TikTok content is circulating beyond the owned channel — brand URL is reaching international audiences. Opportunity to build the @ongboitvuitinh TikTok handle into a discovery engine.
Medium BM7GitHub owned profile not indexed — missing developer-community presence
search site:github.com 'ongboit' OR 'ongboitvuitinh' returned 0 results. GitHub profile exists (listed in sameAs) but has no public repositories or activity visible to search.
→ Claude Code / AI coding blog with no GitHub presence loses developer trust signal. Publishing a public repo (even a simple claude-prompts or tools collection) would build authority with the core audience.
Low BM8Wikipedia/Wikidata entity absent — expected for 3-month-old blog, but plan ahead
search site:wikipedia.org OR site:wikidata.org 'ongboit' returned 0 results.
→ No Wikipedia entity means no Knowledge Panel. Not actionable now, but publishing original research and earning backlinks from .edu/.org sources is the prerequisite. Flag for 12-month horizon.
geo-compliance — score 72/100 · 5 finding(s)
High C1/privacy-policy/ returns 404 — English canonical URL dead
https://ongboit.com/privacy-policy/ → HTTP 404 (Firecrawl statusCode=404, title='Page Not Found'); real policy is at /chinh-sach-bao-mat/ (HTTP 200). Google AdSense publisher guidelines and GDPR Art.13 require a consistently accessible privacy policy URL. Many third-party platforms (AdSense approval, ad networks, affiliate programs) ping /privacy-policy/ directly.
→ AdSense policy-compliance risk; 404 on expected EN slug; any external link or ad-network check pointing to /privacy-policy/ silently fails
High C2CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer
Policy section 10 states: 'you can opt out via the cookie banner or the "Do Not Sell or Share My Personal Information" link in the footer.' Live footer HTML (scraped 2026-06-18) contains three links only: Chính Sách Bảo Mật, Điều Khoản Sử Dụng, Liên Hệ — no DNS/DSMY link present. CPRA §1798.135 requires a clear and conspicuous link for businesses that 'share' personal data (AdSense qualifies under CPRA 'sharing' definition).
→ CPRA non-compliance for California users; policy-vs-reality mismatch undermines trust; AdSense policy violation risk
Medium C3DSAR channel is a personal Gmail — not a dedicated privacy contact
Policy sections 1 and 14 list thenguyen.ai.automation@gmail.com as the sole privacy/DSAR contact. GDPR Art.13(1)(a) requires identifying the controller and Art.77 complaint rights; while a Gmail is technically valid for a personal blog, it signals lack of separation between personal and data-controller roles, and risks missing DSAR emails if Gmail spam-filters automated requests.
→ Low trust signal for EU/California users; no routing guarantee; GDPR Art.57 supervisory compliance question if DPA investigates
Medium C4Privacy policy page has robots meta 'follow, index' but no structured data (Article/WebPage schema) — not discoverable as a legal document
https://ongboit.com/chinh-sach-bao-mat/ metadata: robots='follow, index, max-snippet:-1'. No SpecialAnnouncement or WebPage schema with @type=PrivacyPolicy detected in scrape. Google's AdSense automated checks and some compliance scanners look for machine-readable policy markers.
→ Minor: no automated compliance scanner credit; future AdSense policy-link verification may miss it
Low C5Cookie banner dismissal state 'cmplz-dismissed' visible in raw HTML — verify first-visit behavior
Firecrawl HTML on /privacy-policy/ 404 page shows: class='cmplz-cookiebanner ... cmplz-dismissed'. This 'dismissed' class may indicate the banner was already closed by a prior session cookie in the scraper's browser context, not a structural bug. However, if the banner does not re-show on first visit across all pages including 404, new visitors may skip consent entirely.
→ If banner pre-dismissed for new visitors, GDPR opt-in consent is invalid for Analytics/AdSense; needs manual first-visit incognito verification
geo-crawlers — score 90/100 · 3 finding(s)
Critical GC1RESOLVED 2026-06-18: Cloudflare Managed robots block removed — all AI crawlers now allowed
curl -A 'Mozilla/5.0' https://ongboit.com/robots.txt (2026-06-18): grep count for '# BEGIN Cloudflare Managed content' = 0. Only Disallow present is 'Disallow: /wp-admin/'. GPTBot, ClaudeBot, Google-Extended, CCBot, Bytespider, Amazonbot, Applebot-Extended, meta-externalagent all have explicit 'Allow: /' with no preceding override. Prior P0 (Cloudflare-managed Disallow: / for 8 bots) is confirmed fixed. Note: AI-citation recovery is NOT instant — engines must re-crawl + re-index (estimated days to weeks); citation counts remain near zero today but access is fully restored.
→ All 15 audited AI crawlers now unblocked. Full AI-citation surface restored for GPTBot (ChatGPT search), ClaudeBot (Anthropic), Google-Extended (Gemini / AI Overviews), Meta-ExternalAgent (Meta AI), PerplexityBot, CCBot, Bytespider, Amazonbot, Applebot-Extended, cohere-ai. Re-crawl window: days to weeks before citations recover.
Medium GC2llms.txt last-updated 2026-06-16 — articles published after that date absent from AI discovery index
curl https://ongboit.com/llms.txt: 'Last-Updated: 2026-06-16'. Audit date: 2026-06-18. 71 article links present across 6 clusters. Any new articles published since 06-16 are not listed.
→ AI crawlers fetching llms.txt will miss post-06-16 content. Recommend weekly or post-publish regeneration of llms.txt / llms-full.txt.
Low GC3ClaudeUser and OAI-SearchBot listed but not all Anthropic/OpenAI agent variants covered
robots.txt includes ClaudeBot, anthropic-ai, ClaudeUser (allow), GPTBot, ChatGPT-User, OAI-SearchBot (allow). No listing for 'Claude-Web' (Anthropic browsing agent) — falls through to wildcard Allow:/ which is functionally safe but lacks explicit signal.
→ Negligible: wildcard covers unlisted bots. Explicit listing is best practice for forward-proofing against future Cloudflare managed-block expansions.
geo-llmstxt — score 82/100 · 5 finding(s)
Low LL1Last-Updated date is 2 days stale
curl https://ongboit.com/llms.txt → 'Last-Updated: 2026-06-16'; audit date is 2026-06-18. File was last rebuilt 2 days ago; if new articles published since then they are missing.
→ AI crawlers (GPTBot, PerplexityBot) may cache stale index; fresh articles invisible until next rebuild
Medium LL2llms-full.txt covers only 35 of 71 linked articles (49%)
curl https://ongboit.com/llms-full.txt | grep '^URL:' | wc -l → 35; llms.txt link count = 71. 36 articles (AI 101 primers, several Claude Code guides, Codex CLI deep-dives, n8n series) linked in llms.txt but full markdown absent from llms-full. Examples missing: /claude-code-roadmap/, /claude-code-vs-code/, /claude-code-skills/, /claude-code-hooks/, /context-window-la-gi/, /token-la-gi/ and 30 others.
→ AI models that ingest llms-full for single-fetch deep context see only half the site; reduces citation probability for missing articles
Low LL3llms-full.txt cache TTL is 1h; should match static-asset policy (1yr)
curl -sI https://ongboit.com/llms-full.txt → 'Cache-Control: public, max-age=3600'. Other static assets set 1yr (31536000) per Phase-4 shared context (Cloudflare CDN + static Cache-Control 1yr live fix 06-17). llms-full at 1.1 MB re-fetched hourly wastes crawler bandwidth.
→ Higher origin bandwidth load; Cloudflare won't serve from edge cache efficiently; crawler quota burned on repeat fetches
Low LL4Shared-context link count (67) lags actual count (71) by 4
phase4-shared-context.md states 'llms.txt 67 links'; curl https://ongboit.com/llms.txt | grep -c '^- \[' → 71. Delta +4 indicates 4 articles added since shared context was written (2026-06-17). Not a live site problem — internal tracking note only.
→ Internal audit baseline drift; no user-facing impact
Low LL5No X-Robots-Tag or explicit AI-bot permission header on llms-full.txt
curl -sI https://ongboit.com/llms-full.txt — no X-Robots-Tag header present. robots.txt already allows 25 AI bots (per shared context), so crawl access is fine; however an explicit 'X-Robots-Tag: all' on the llms-full endpoint would signal unambiguous AI-indexing intent.
→ Marginal — AI crawlers already permitted via robots.txt; no blocking observed
geo-platform-optimizer — score 68/100 · 8 finding(s)
Critical PO1AI crawler block RESOLVED — all major AI bots now allowed by robots.txt (verified 2026-06-18)
curl https://ongboit.com/robots.txt (2026-06-18): No Cloudflare Managed block. GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, anthropic-ai, PerplexityBot, Google-Extended, bingbot, Meta-ExternalAgent, CCBot — all explicitly listed with 'Allow: /'. Only /wp-admin/ disallowed. Previous P0 (Cloudflare managed Disallow before publisher Allow) is eliminated. Citation tests will still read ~0 today due to re-indexing lag — structural readiness is now high, realized citations pending 2-4 weeks.
→ P0 resolved. Structural platform readiness rises from 31 (blocked baseline) to 68 (unblocked). All AI citation pipelines now have crawl access. Measure lift in 2-4 weeks with re-run of ai_optimization_llm_response on 'Claude Code giới hạn sử dụng' and 'Claude Code usage limits'.
High PO2Vietnamese-only content creates systematic language barrier for English-first AI citation engines
Pre-unblock citation tests (DataForSEO ai_optimization_llm_response, 2026-06-18): GPT-4o web search cited 6 English sources only (Anthropic, TechRadar, TrueFoundry, Reddit, usagebar.com, productcompass.pm); Perplexity sonar-pro cited 7 English sources only (usagebar.com, truefoundry.com, reddit.com, anthropic.com, support.claude.com, productcompass.pm, YouTube). Zero Vietnamese-language sources in either response. Content language is 'vi' throughout. Crawler access resolves P0, but language barrier is a persistent structural limit for global AI citation engines — even with full indexing, English-first source preference will suppress Vietnamese citations for non-locale-targeted queries.
→ An English-language 'Key Facts' summary section (3-5 bullets with source citations) on top-traffic Claude Code articles could break into ChatGPT/Perplexity English citation streams. Medium-term strategic investment; prioritize for /claude-code-gioi-han-su-dung/ (188 GSC clicks, pos 5.1) and other top-3 GSC articles.
High PO3Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared
robots.txt line: 'User-agent: *' / 'Content-Signal: search=yes,ai-train=no'. This blocks AI training (EU Directive 2019/790 reservation — intentional). However 'ai-input=yes' (covering RAG/retrieval/grounding — the primary AI citation path) is absent. Crawlers that do not distinguish training from inference may apply ai-train=no conservatively to all AI use, suppressing citation even with explicit Allow: / per-bot rules. (Source: geo-crawlers.json GC3, confidence: medium.)
→ Adding 'ai-input=yes' to the Content-Signal line explicitly grants permission for retrieval/grounding/RAG use while keeping training blocked. Unambiguous signal to AI citation engines (ChatGPT, Perplexity, Gemini) that grounding use is authorized. Low effort, direct citation-pathway benefit.
Medium PO4llms.txt activated and reachable — 71 links now crawlable; llms-full.txt covers only 35/71 articles
curl https://ongboit.com/llms.txt (2026-06-18): HTTP 200; 71 article links in 9 clusters (Claude Code top-traffic, SEO & Audit, Claude-Growth kit, n8n, Codex CLI, AI 101). llms-full.txt HTTP 200; 1,165,294 bytes but contains only 35 articles (~49% coverage). 36 articles linked in llms.txt are absent from llms-full (e.g., /claude-code-roadmap/, /claude-code-vs-code/, /claude-code-skills/). AI models fetching llms-full for single-pass deep context see only half the site. (Source: geo-llmstxt.json LL2.)
→ Completing llms-full.txt to 100% coverage (71 articles) gives AI models full site context in one fetch — highest density citation signal available. Prioritize the 36 missing articles, especially those in the Claude Code cluster (highest traffic).
Medium PO5sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution across all platforms
geo-schema.json: Organization and Person sameAs arrays contain 5 entries (Facebook, GitHub, TikTok, LinkedIn, YouTube). Wikipedia and Wikidata absent. AI models (ChatGPT, Gemini, Perplexity) rely on Wikipedia/Wikidata Q-numbers to deduplicate entities across sources; absence means 'Ông Bố IT' may not be confidently resolved as a unique, authoritative entity when cited.
→ Adding Wikipedia and/or Wikidata sameAs links (once entries exist) is the single highest-leverage entity-graph fix. Prerequisite: create a Wikidata entry (Q-number) for the site and its author — feasible now as a small, notable Vietnamese AI blog; Wikipedia article requires notability threshold (longer horizon).
Medium PO6Zero third-party community mentions on Reddit/X — no social proof signal for AI citation engines
geo-brand-mentions.json BM4: searches for 'ongboit', 'ông bố IT', 'ongboit.com' on Reddit, X/Twitter, dev.to, Quora returned 0 on-brand results. Perplexity and ChatGPT heavily weight Reddit and community platform mentions for tech queries. Positive signal: 2 organic Threads mentions detected (irenejuann, tekkijournal) and TikTok cross-posting observed. No Reddit presence discovered.
→ Community seeding on Reddit (r/ClaudeAI, r/ChatGPT, r/singularity, r/vietcetera) with authentic contributions citing ongboit.com articles would directly build Perplexity and ChatGPT citation probability. This is a medium-term growth lever, not a quick fix.
Low PO7llms.txt Last-Updated is 2 days stale (2026-06-16) — new articles not indexed for AI crawlers
curl https://ongboit.com/llms.txt → 'Last-Updated: 2026-06-16'. Audit date: 2026-06-18. llms.txt has 71 links (4 more than the 67 in shared-context, suggesting manual update since), but any articles published after 06-16 are absent. (Source: geo-llmstxt.json LL1 + LL4.)
→ Automate llms.txt rebuild on each WP publish hook (e.g., via n8n or WP action hook) to keep the AI discovery index current. Low effort if an automation already exists for WP publish events.
Low PO8FAQPage Q1 is off-topic for the pinned article — semantic integrity issue for AI passage extraction
geo-schema.json S2: Article URL /claude-code-gioi-han-su-dung/ (usage limits). FAQPage Block 1 Q1 name='DeepClaude Có An Toàn Không?' — topic is DeepClaude+Qwen27B, unrelated to session/weekly limits. 7 remaining questions are on-topic. AI crawlers doing passage-level extraction may miscategorize the article's topic cluster based on the first FAQ question.
→ Replace Q1 with an on-topic usage-limits question (e.g., 'Claude Code giới hạn sử dụng reset như thế nào?'). Small schema edit via RankMath FAQ block; directly improves AI passage classification accuracy.
geo-schema — score 95/100 · 5 finding(s)
Medium S1sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution
curl https://ongboit.com/ | grep -c wikipedia → 0; sameAs array has 5 entries: Facebook, GitHub, TikTok, LinkedIn, YouTube. Wikipedia and Wikidata absent on both Organization and Person schemas.
→ Wikipedia sameAs is the strongest single signal for AI models to resolve entity identity across sources. Without it, ChatGPT, Perplexity, and Google AI may not confidently deduplicate 'Ông Bố IT' across platforms. Wikidata adds machine-readable entity ID (Q-number) for structured knowledge graph integration.
Medium S2FAQPage Q1 is off-topic for article (DeepClaude question on usage-limits page)
Article URL: /claude-code-gioi-han-su-dung/ (usage limits). FAQPage Block 1 Q1 name='DeepClaude Có An Toàn Không?' — topic is DeepClaude+Qwen27B, unrelated to session/weekly limits. Remaining 7 questions are on-topic. Source: curl https://ongboit.com/claude-code-gioi-han-su-dung/ | python3 -c '...'; FAQPage parsed and Q1 name verified.
→ Google evaluates FAQ schema relevance. A mismatched question does not cause penalty but dilutes schema quality signal and may surface misleading rich snippets. FAQPage is restricted (Aug 2023) so rich result benefit is already limited; nevertheless fixing content accuracy maintains semantic integrity for AI crawlers.
Low S3Person schema absent from homepage — AI crawlers visiting / only cannot resolve author entity
curl https://ongboit.com/ | grep Person → 0 matches in JSON-LD. Homepage @graph types: ['Organization', 'WebSite', 'ImageObject', 'WebPage']. Person node only present on article pages.
→ AI crawlers (GPTBot, ClaudeBot) that land on the homepage cannot link the Organization to its human author/founder. Adding Person to the homepage @graph with worksFor + sameAs creates a full entity web from the root URL.
Low S4BlogPosting missing explicit 'url' property — @id-based reference only
curl article page | BlogPosting node: url property MISSING. @id='https://ongboit.com/claude-code-gioi-han-su-dung/#richSnippet' (fragment URL, not canonical). mainEntityOfPage references WebPage @id which has the canonical url. Rich result validators prefer explicit url on the Article node.
→ Minor. Google's Rich Results Test accepts @id-to-WebPage linking, but explicit url='https://ongboit.com/claude-code-gioi-han-su-dung/' on BlogPosting improves robustness and AI parser compatibility.
Low S5Kadence theme microdata (WebPage, WPHeader) coexists with JSON-LD — format mix
curl https://ongboit.com/ | grep itemscope → 2 matches: itemtype=schema.org/WebPage and schema.org/WPHeader. itemprop count=0 (no property markup attached). These are Kadence theme structural attributes.
→ Low practical risk — no itemprop means no actual property data exposed via microdata. Google ignores empty Microdata wrappers. However, the presence of itemscope without properties wastes markup and may confuse validator tools. Consider disabling theme microdata output if RankMath controls all structured data.
geo-technical — score 81/100 · 7 finding(s)
High T1robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers
curl https://ongboit.com/robots.txt | grep -n ClaudeBot => line 44: 'ClaudeBot\nDisallow: /' (Cloudflare Managed block); line 78: 'ClaudeBot\nAllow: /' (publisher manual section). Per RFC 9309, for same user-agent the last matching rule wins — however Cloudflare's managed block appears FIRST and some crawler implementations use first-match. GPTBot, Amazonbot, CCBot, Applebot-Extended, Bytespider, Google-Extended, meta-externalagent all affected by same pattern. Publisher intent is Allow (25 bots welcomed), but the Cloudflare Managed Content block creates real ambiguity.
→ AI crawlers (ClaudeBot, GPTBot, Google-Extended etc.) may read the Disallow rule from the Cloudflare Managed section and skip the site. Publisher should remove the Cloudflare Managed Content block or toggle the Cloudflare dashboard setting to 'Allow AI scrapers' which removes those Disallow directives. This is the single highest-risk GEO finding.
Medium T2CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src
curl -sI https://ongboit.com/ | grep content-security-policy => 'script-src self unsafe-inline unsafe-eval https: blob:'. Header is ENFORCING (no Content-Security-Policy-Report-Only). unsafe-inline allows inline script injection; unsafe-eval allows eval()-based XSS.
→ CSP is present and enforcing (credit for live fix 2026-06-17), but unsafe-inline/unsafe-eval negate most XSS protection. WordPress + AdSense + GTM make this hard to fix without nonce/hash implementation. Recommendation: migrate to nonce-based CSP via Cloudflare Transform Rules or a WordPress CSP plugin.
Medium T3Homepage hero image missing <link rel=preload> (LCP risk)
grep 'rel="preload"' /tmp/homepage.html => 0 results. Homepage hero img: <img src='ongboit-homepage-hero.webp' fetchpriority='high' width='1376' height='768'>. Pinned page has preload: <link rel='preload' as='image' href='claude-code-gioi-han-hero-sketch-scaled.jpg' fetchpriority='high'>. Homepage lacks this.
→ LCP image on homepage is not preloaded, requiring the browser to discover it after CSS/HTML parse. Adding <link rel='preload' as='image' href='...' fetchpriority='high'> in <head> can improve LCP by 200-500ms. Pinned page already correctly implements this.
Medium T4Google Fonts CSS loaded as render-blocking stylesheet
grep 'kadence-fonts-gfonts-css' /tmp/homepage.html => <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open+Sans:regular,700|Rubik:700..&display=swap' media='all'>. The media='all' attribute causes render-blocking. display=swap is present in URL but the CSS request itself blocks rendering.
→ Google Fonts CSS is a third-party render-blocking request. Use media='print' onload='this.media="all"' technique or load fonts via font-face in local CSS, or use a Cloudflare Worker to self-host fonts. This affects LCP on both pages.
Medium T5Homepage meta description 162 chars (2 chars over 160 target)
grep 'name="description"' /tmp/homepage.html => content length measured as 162 chars: 'Mình là Thế, DevOps Engineer. Hướng dẫn first-party về Claude Code, n8n automation, tiết kiệm token & audit SEO/GEO bằng Claude Code — thực chiến, dễ làm theo 2026.'
→ Minor — Google may truncate the description in SERPs. Trim to 155-160 chars for clean display. Pinned page description is 138 chars (fine).
Low T6Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl)
curl https://ongboit.com/sitemap_index.xml | head -2 => '<?xml-stylesheet type="text/xsl" href="//ongboit.com/main-sitemap.xsl"?>'. Protocol-relative path; functional over HTTPS but non-standard.
→ Cosmetic — does not affect crawler parsing of sitemap URLs. Fix by updating RankMath sitemap XSL path to absolute HTTPS URL. No crawlability impact.
Low T7Cache-Control for theme CSS is 30 days vs 1 year for images
curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css => Cache-Control: max-age=2592000 (30d), cf-cache-status: MISS. Image: Cache-Control: max-age=31536000 (1yr), cf-cache-status: HIT.
→ CSS/JS assets could benefit from 1-year cache with versioned URLs (Kadence uses ?ver= query strings, so cache-busting is handled). Increasing to max-age=31536000 for theme CSS/JS would improve repeat-visit performance. Configure via Cloudflare Cache Rules.
seo-audit — score 74/100 · 13 finding(s)
Critical AU1RESOLVED: Cloudflare AI-crawler robots.txt block removed — all 14 named AI bots now explicitly Allowed
Prior run: '# BEGIN Cloudflare Managed content' block Disallowed GPTBot, ClaudeBot, Google-Extended, CCBot, Amazonbot, Applebot-Extended, Bytespider, meta-externalagent before publisher Allow rules. POST-FIX curl 2026-06-18: robots.txt shows NO Cloudflare Managed block. All 14 named AI bots (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, anthropic-ai, ClaudeUser, PerplexityBot, PerplexityUser, Google-Extended, GoogleOther, Applebot, Applebot-Extended, bingbot, Meta-ExternalAgent, Meta-ExternalFetcher) have explicit Allow: /. Only Disallow is /wp-admin/. Fix confirmed: Cloudflare 'Block AI Scrapers' toggle disabled in dashboard.
→ RESOLVED. Crawler access restored. AI citation recovery is NOT instant — GPTBot/ClaudeBot/Google-Extended must re-crawl and re-index (expected 1-4 weeks). GA4 AI Assistant channel (currently 9 sessions) expected to grow post-reindex. Monitor weekly. Do NOT claim citations restored — access is fixed, re-indexing is pending.
Critical AU2/privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet
curl -sI https://ongboit.com/privacy-policy/ → HTTP/1.1 404 Not Found (curl-verified 2026-06-18). A privacy policy page is mandatory for Google AdSense publisher program compliance (Google Publisher Policy) and for GDPR/PDPD (Vietnam Personal Data Protection Decree 13/2023). 404 on this URL means the page is either missing, moved, or unpublished.
→ AdSense non-compliance risk: Google's review process checks for accessible privacy policy. If AdSense ad-serving is live but policy page is 404, account is flagged. Fix: publish privacy policy to /privacy-policy/ in WordPress (re-publish if accidentally set to Draft), or add a redirect from /privacy-policy/ to the correct URL. Estimated: 15 minutes.
High AU3Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl
seo-backlinks.json: Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, referring_domains_sample=0. DataForSEO/Moz/Bing APIs unavailable. Domain age ~3 months (launched ~Mar 2026). GSC top 3 pages at positions 5.1, 7.9, 6.1 — competitive positions achieved on content quality alone, but no equity buffer if competitors acquire links.
→ External authority is the primary long-term ranking lever. Even 5-10 quality referring domains (Vietnamese IT media, GitHub profiles, tech communities, developer forums) would establish a CC PageRank seed node and provide position stability. Target: 10+ referring domains within 6 months. Immediate step: submit sitemap to Bing Webmaster Tools + IndexNow to accelerate CC discovery.
High AU4Slow TTFB on 290/299 crawled pages — origin server response bottleneck
crawl-summary.json: slow_ttfb count = 290 out of 299 pages (97%). Homepage curl: HTTP 200, Connection: keep-alive, cf-cache-status: DYNAMIC — pages are hitting origin on every request, not serving from Cloudflare edge cache. Origin WP/PHP response overhead not mitigated.
→ TTFB is a direct LCP prerequisite; slow TTFB delays Largest Contentful Paint on all pages. Fix: enable Cloudflare Cache Rules for WordPress pages (Cache Everything rule for GET requests excluding admin/cart paths), or install WP Rocket / LiteSpeed Cache for full-page caching. Target: TTFB < 200ms on cached requests. Expected: 85-95% of pages edge-served after cache warm.
High AU535 broken internal links + 18 broken external links — crawl-budget waste and equity leak
crawl-summary.json: links_to_broken_page = 35 (internal 4xx destinations), broken_external_link = 18. With 299 pages crawled, 35 broken internal links represents systematic crawl-budget waste. 18 broken external links degrade perceived editorial quality.
→ Fix broken internal links first (redirect or update href): run Screaming Frog / Ahrefs broken link report. For external, remove or replace with live alternatives. Each fixed link restores link equity flow and removes crawl waste signal. Target: 0 broken internal, <5 broken external.
High AU6Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor
gsc-top-pages.json: claude-code-gioi-han-su-dung 188 clicks (pos 5.1) + claude-code-gia-bao-nhieu 142 clicks (pos 7.9) + tiet-kiem-token-claude-code 102 clicks (pos 6.1) = 432 of ~670 total top-12 clicks. All three pages sit in a zone (positions 5-9) where a single algorithm update or AI Overview injection pushes them off page 1.
→ Diversify by pushing tier-2 pages (claude-code-vs-code pos 7.4, claude-code-auto-mode pos 4.9, obsidian-claude-code pos 7.8) into top 5 via internal link equity from top-3 pages. Target: 5+ pages contributing >10 clicks each within 90 days.
High AU7Brand orange #FF7F00 fails WCAG 1.4.3 AA contrast on white backgrounds — 4 surface types
geo-accessibility.json: #FF7F00 on #ffffff = 2.53:1 (large text needs 3:1, normal text needs 4.5:1). Affected: H1 hero span, .obit-catall links (0.9em bold), .home-faq-answer a, .entry-content table a. curl-verified colors present on homepage.
→ WCAG AA failure on 4 surfaces. Affects AdSense publisher quality signals and Core Web Vitals accessibility scoring. Fix: darken brand orange to #C05F00 (~3.2:1 large, ~5:1 normal) or #B35900 for white-background surfaces only. Dark-background uses (footer, dark table headers) already pass — no change needed there.
Medium AU817 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set
crawl-summary.json: duplicate_meta_desc = 17, duplicate_title = 15. Combined 32 pages with duplicated metadata. Likely WordPress category/tag/archive pages using fallback templates. Specific URLs not enumerated in crawl-summary.
→ Duplicate titles/descriptions reduce individual page differentiation in SERP. Fix: configure RankMath archive meta templates with dynamic variables (%category%, %archive_title%, %page%) to generate unique metadata per page. Target: 0 exact-duplicate title/desc pairs.
Medium AU970 noindex pages (23% of crawl) — author page noindexed, blocking E-E-A-T entity signal
crawl-summary.json: noindex_pages = 70 out of 299 (23.4%). For a ~130-article site, 70 noindex suggests WordPress admin/feeds/attachments PLUS likely tag archives, date archives, and author page. Author page E-E-A-T opportunity lost if noindexed.
→ Audit the 70 noindex pages: keep admin/feed noindex; unblock author page (https://ongboit.com/author/ongboit138/) to allow Google to validate Person schema + E-E-A-T signals. Author page indexation directly supports article ranking via author entity recognition.
Medium AU10AI citation recovery pending — access unblocked but re-indexing not yet complete
ga4-cli.json: AI Assistant channel = 9 sessions of ~2431 total (0.4%). robots.txt Cloudflare block removed 2026-06-18 (curl-verified). AI crawlers must re-discover and re-index content before citations appear. llms.txt live at 200 with 67 links; Speakable schema present on homepage. Citation test today would still show ~0 (expected).
→ Monitor GA4 AI Assistant channel weekly post-fix. Set 30-day milestone: target 25+ AI Assistant sessions by 2026-07-18. Accelerate re-indexing by ensuring llms.txt is updated with latest articles (currently dated 2026-06-16, 2 days stale) and pinging AI search endpoints. Do NOT report citations as restored until re-crawl completes.
Medium AU11Mobile traffic only 16% vs Vietnamese market norm ~72% smartphone penetration
ga4-cli.json: desktop = 1365 sessions (84%), mobile = 257 (16%), tablet = 6. Vietnam smartphone internet penetration ~72% (VNPT/Statista 2025). 16% mobile share is 4.5x below market average. May reflect developer audience (plausible for Claude Code content) or mobile UX friction.
→ If mobile friction: fix Google Fonts render-blocking (geo-technical T4), improve mobile LCP. If audience-inherent: ensure AdSense renders correctly on mobile layout and code-heavy articles have horizontal scroll for code blocks. Target: understand cause before investing in mobile optimization.
Low AU12Sitemap XML served with x-robots-tag: noindex — non-standard signal on sitemap URL
curl -sI https://ongboit.com/sitemap_index.xml → 'x-robots-tag: noindex' (curl-verified 2026-06-18). Sitemap content returns 200 and child sitemaps (post-sitemap1, post-sitemap2, page-sitemap, category-sitemap) are enumerated correctly. Most crawlers ignore x-robots-tag on sitemaps — Google processes the content, not the URL.
→ Low urgency but non-standard. Remove x-robots-tag: noindex from sitemap responses via Cloudflare Cache Rule or RankMath sitemap settings. Signal hygiene — no confirmed indexability impact on listed pages.
Low AU1332 broken JS/CSS assets — console errors may affect AdSense rendering
crawl-summary.json: broken_js_css = 32. Likely stale plugin or theme asset references returning 404. Not a ranking signal but Console errors visible in DevTools.
→ Identify broken asset URLs via browser DevTools on affected pages. Update plugin/theme or add Cloudflare redirect rules. Risk: if broken assets include AdSense ad script references, ad slots may fail to render on affected pages — missed revenue.
seo-backlinks — score 22/100 · 4 finding(s)
High BL1Zero measured external authority — referring domains, domain rank, and backlink count all undetectable at 3 months
Common Crawl cc-main-2026-jan-feb-mar: in_crawl=false, in_rankings=false, pagerank=null, referring_domains_sample=0. DataForSEO MCP unavailable. Moz/Bing API keys absent. Domain age ~3 months (launched ~Mar 2026). No inbound link signal from any source.
→ External authority is the single largest long-term ranking lever for competitive Vietnamese tech queries. Even 5-10 quality referring domains (tech media, Vietnamese IT forums, GitHub profiles, community roundups) would establish a footprint in the next CC snapshot and improve GSC position stability. Target: 10+ referring domains within 6 months.
Medium BL218 broken external links leak link equity and signal low editorial quality
seo-audit.json finding AU4: broken_external_link = 18 (out of 299 pages crawled). Source: site crawler (confidence: high). Broken outbound links reduce perceived page quality for crawlers and degrade UX.
→ Fix or remove all 18 broken external links. Each live, relevant outbound link to authoritative sources (Vietnamese government tech portals, Anthropic docs, GitHub) reinforces topical authority signals. Target: 0 broken external links.
Medium BL3No Moz or DataForSEO API key configured — future audits blind to DA/spam/anchor data
backlinks_auth.py --check: tier=0, moz.available=false ('No Moz API key found'), dataforseo extension absent. Without these, every subsequent backlink audit will remain qualitative.
→ Configure free Moz API key (2,500 rows/month) at moz.com/products/api. Enables DA/PA tracking, spam score, anchor text distribution, and referring domain history. Unlocks Tier 1 confidence (0.85) for all future audits.
Low BL4Brand not yet indexed in Common Crawl — no crawl-graph footprint established
commoncrawl_graph.py: in_crawl=false. CC Jan-Mar 2026 snapshot covers the period when ongboit.com launched. Next CC release (Apr-Jun 2026) will determine if the domain has been discovered. A domain absent from CC has no third-party PageRank signal independent of Google.
→ Submit sitemap to Bing Webmaster Tools and IndexNow to accelerate discovery. Ensure at least one high-DA Vietnamese site links to ongboit.com before next CC crawl window to establish a PageRank seed node. Low direct impact, but foundational for future audit data availability.
seo-google — score 86/100 · 1 finding(s)
Low GG1Query-level click concentration — 3 pages drive majority of clicks
GSC top-3 pages = 432 clicks; traffic floor depends on a few Claude-Code pillars
→ diversify pillar coverage to de-risk
seo-hreflang — score 95/100 · 2 finding(s)
Low H1Hreflang implementation is correct and complete for a single-locale Vietnamese site
curl https://ongboit.com/ grep hreflang: <link rel="alternate" hreflang="vi" href="https://ongboit.com/" /> + <link rel="alternate" hreflang="x-default" href="https://ongboit.com/" />. Same pattern on pinned page /claude-code-gioi-han-su-dung/: hreflang="vi" href="https://ongboit.com/claude-code-gioi-han-su-dung/" + hreflang="x-default" href="https://ongboit.com/claude-code-gioi-han-su-dung/". Self-referential vi + x-default both pointing to canonical URL on each page. No other locales exist on the site, so no cross-locale return tags are needed or missing.
→ Informational — no action required. Fix already live (2026-06-17). Self-referential vi + x-default is the correct minimal set for a single-locale site per Google's hreflang spec.
Low H2No hreflang via HTTP Link headers (HTML-only delivery — acceptable)
curl -sI https://ongboit.com/ | grep -i link: no hreflang Link headers present in HTTP response. Tags delivered via <head> HTML only. Both HTML and HTTP-header delivery are valid per Google spec; HTML-only is standard for WordPress sites.
→ No ranking impact. HTTP-header method only required for PDFs/non-HTML resources. WordPress HTML delivery is correct.
seo-images — score 74/100 · 7 finding(s)
Medium IM117 content images missing width+height attributes (CLS risk)
gia-bao-nhieu: 7 imgs (pricing-section-tiers.webp, chart-*.webp) — no width/height; claude-md-la-gi: 7 carousel imgs (claudemd-carousel-*.webp) — no width/height; tiet-kiem-token: 3 section imgs (token-section-*.webp) — no width/height. All use CSS 'width:100%;height:auto' only. Browser cannot reserve layout space → CLS.
→ Adding width+height to 17 inline content images prevents layout shift, protects CWV CLS score. High-traffic article (/gia-bao-nhieu/) has 7 such images.
Medium IM2LCP hero on /claude-code-gioi-han-su-dung/ served as JPEG, not WebP
<img src="claude-code-gioi-han-hero-sketch-scaled.jpg" ... width="1200" height="675"> — .jpg extension confirmed. og:image also JPEG: <meta property="og:image" content="...claude-code-gioi-han-hero-sketch-1024x572.jpg">. All other article heroes are WebP.
→ Highest-traffic page (188 clicks/28d, pos 5.1). Converting LCP hero to WebP cuts ~30-40% image payload → faster LCP. og:image JPEG also sub-optimal for social sharing.
Medium IM3og:image width 1024px on 4 of 5 pages — below 1200px recommended minimum
<meta property="og:image:width" content="1024"> on /gioi-han/, /gia-bao-nhieu/, /tiet-kiem-token/, /claude-md-la-gi/. Only homepage serves 1200x630. Facebook recommends ≥1200px for large link previews; 1024px degrades to small card on some platforms.
→ Upgrading og:image to 1200x630 across all articles ensures large card preview on Facebook/LinkedIn — measurable CTR lift for shared posts.
Medium IM4Missing fetchpriority=high on LCP hero images for 3 article pages
/claude-md-la-gi/: loading="eager" but no fetchpriority on claude-md-la-gi-hero.webp 1200x675. /claude-code-gia-bao-nhieu/: loading="eager" but no fetchpriority on claude-code-gia-bao-nhieu.webp 1200x675. /tiet-kiem-token/: logo has fetchpriority but content hero (first inline img) has loading=lazy. Contrast: /gioi-han/ correctly has loading="eager" fetchpriority="high" on hero.
→ fetchpriority=high on LCP hero signals browser to fetch immediately (before layout parsing completes) — direct LCP improvement. One-line HTML attribute change per page.
Low IM5AVIF format not used anywhere (0%)
0 of 116 sampled img src URLs contain .avif extension. WebP covers 93.1%. AVIF offers 20-30% additional size savings over WebP, now supported by all major browsers.
→ Medium-term: enabling Cloudflare Image Optimization or a server-side AVIF pipeline reduces image payload across all pages. Lower priority given WebP already active.
Low IM6External Buy Me A Coffee image (cdn.buymeacoffee.com) lacks width+height dimensions
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 40px; width: auto;"> — no width/height attributes; only inline CSS height. Minor CLS since it is small and third-party.
→ Low. Add width="160" height="40" to eliminate minor layout shift from third-party badge.
Low IM7Avatar images (author thumbnails) served without loading=lazy on article pages
On /gioi-han/: multiple <img src="the-avatar-600-150x150.webp" width="50" height="50"> without loading=lazy — at least 5 instances. These are above/near fold but repeating avatar pattern across related posts sidebar; lazy would not hurt as sidebars are below fold.
→ Minor bandwidth savings on pages with long related-post lists. WordPress avatar function does not add loading=lazy by default.
seo-page — score 74/100 · 6 finding(s)
Medium P1auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip
https://ongboit.com/claude-code-auto-mode/ — grep: line 478 '<h3 style="color: #FF7F00">TL;DR</h3>' precedes line 506 '<h2>Auto Mode Là Gì...' — H1→H3 jump violates sequential heading order; screen readers and Google's heading parser treats TL;DR as a subsection of H1 with no parent H2.
→ Fix hierarchy: change TL;DR heading to a styled <p> or <div> (it is already visually a callout box, not a real section). Eliminates heading-order warning in Lighthouse, aligns with WCAG 1.3.1 (info & relationships).
Medium P2auto-mode page: only 3 editorial internal links — well below site average of 10-13
https://ongboit.com/claude-code-auto-mode/ — body links extracted lines 460–735: /claude-code-hooks/, /claude-code-roadmap/, /tiet-kiem-token-claude-code/ (3 total). Comparable pages average 10-13 editorial links. Word count 4684 is also lowest of the 5 audited.
→ Add 5–7 topically related internal links (e.g. permission-modes, tiet-kiem-token, claude-md, gioi-han). Improves PageRank flow to this page's cluster and increases session depth from this entry point.
Medium P3tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate
https://ongboit.com/tiet-kiem-token-claude-code/ — meta name='description' content length=169 chars (198 bytes). Measured directly: 'Tiết kiệm token Claude Code: 15 mẹo giảm bill API từ $290 xuống $82/tháng. Hiểu cơ chế history gửi lại mỗi turn + cách quản lý CLAUDE.md, session và context window 2026.' Google pixel-truncates at ~920px (~155-160 chars for Vietnamese). CTA portion '...context window 2026' will be cut.
→ Trim to ≤155 chars while keeping primary KW and CTA at front. Prevents Google-generated snippet from replacing the crafted description.
Low P4twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account
curl grep 'twitter:site' on all 5 pages returns 0 matches. Pages have twitter:card=summary_large_image + twitter:title + twitter:description + twitter:image but no twitter:site='@ongboitvuitinh' (the TikTok handle used in sameAs schema suggests account exists). Without twitter:site, share cards appear without @attribution.
→ Add <meta name='twitter:site' content='@ongboitvuitinh'> to RankMath global social settings (applies sitewide in one edit). Low friction, improves brand attribution on Twitter shares.
Low P5Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token)
gioi-han: title='...2026: Session 5h, Weekly 7 Ngày' vs H1='...Session, Weekly & Cách Tối Ưu (2026)'. gia-bao-nhieu: title='...$20-$200 + Cách Mua Rẻ Nhất' vs H1='...Pro vs Max + Mua Giá Rẻ'. tiet-kiem-token: title starts 'Tiết Kiệm Token Claude Code...' vs H1 starts '15 Mẹo Tiết Kiệm...' — measured via sed/grep on live pages 2026-06-18.
→ Divergence is intentional SEO practice (title=SERP click-bait, H1=on-page context) and Google handles it. No fix required if divergence is deliberate; document as accepted pattern. Flag only if divergence was accidental (e.g., RankMath title override was forgotten). Severity P3 = monitor, not urgent.
Low P6OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image
All 5 pages: og:image:width=1024 (confirmed via og:image:width meta tag). Twitter summary_large_image recommends minimum 1200×630 for lossless display on modern hi-DPI screens. Source images exist at scaled sizes (e.g. gioi-han hero at 2560×1429 in WP media library per JSON-LD ImageObject).
→ Update og:image references to point to 1200-wide crop (WP crop at 1200x630 or use existing *-scaled.jpg). Affects how cards render on Twitter/X share preview — sharper on retina displays, no letterboxing.
seo-performance — score 89/100 · 2 finding(s)
Medium PF1Render-blocking Google Fonts CSS on homepage + pinned page
geo-technical curl: <link rel=stylesheet fonts.googleapis.com> not deferred; homepage hero missing <link rel=preload>
→ ~100-300ms LCP on first paint
Low PF2Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth
CrUX field LCP p75=1266ms GOOD vs prior lab ~9.6s; field passes
→ none — field green
seo-sitemap — score 58/100 · 8 finding(s)
Critical SM1x-robots-tag: noindex on all sitemap files — Googlebot cannot discover or use sitemaps
curl -sI https://ongboit.com/sitemap_index.xml → x-robots-tag: noindex (confirmed 2026-06-18T00:54:38). Same header on post-sitemap1.xml, post-sitemap2.xml, page-sitemap.xml, category-sitemap.xml. Google ignores any sitemap file it receives a noindex header on, rendering all 215 submitted URLs invisible to the sitemap pipeline despite sitemap_index.xml returning HTTP 200.
→ Until resolved, Google cannot process the sitemap; URL discovery falls back to crawl only. Fix: add Rank Math / server rule to suppress x-robots-tag on *.xml sitemap paths, or ensure Cloudflare page rule does not apply a blanket noindex header to XML responses.
High SM235 internal pages linked-to are returning 4xx / broken — crawl budget wasted and link equity lost
crawl-summary.json by_check.links_to_broken_page = 35 (across 299 crawled URLs). Separate by_check.4xx_error = 4 pages themselves returning 4xx. These broken link targets absorb crawl budget and produce soft-404 signals.
→ Fix or redirect broken targets; update anchor links pointing to them. Eliminates crawl-budget drain and removes negative signals from internal link graph.
High SM314 internal links point to redirect chains instead of canonical URLs
crawl-summary.json by_check.links_to_redirect = 14. Each redirect hop dilutes PageRank and slows Googlebot. URLs in the sitemap should also be verified as final-destination URLs, not redirect sources.
→ Update internal links to point directly to canonical (post-redirect) URLs. One-time Screaming Frog / wp-cli bulk replace recommended.
Medium SM414 indexable pages crawled but absent from sitemap
Crawl: 299 URLs, noindex_pages: 70 → 229 indexable. Sitemap total: post-sitemap1 (201) + post-sitemap2 (2) + page-sitemap (6) + category-sitemap (6) = 215. Gap = 229 − 215 = 14 pages. Note: crawl may include pages Rank Math has excluded intentionally (tag archives, author pages); verify before adding blindly.
→ Missing pages rely solely on crawl discovery; adding them to the sitemap accelerates re-crawl after updates.
Medium SM5robots.txt has duplicate user-agent blocks creating conflicting directives for AI crawlers
curl https://ongboit.com/robots.txt — Cloudflare-managed section (lines ~22-38) issues Disallow: / for ClaudeBot, GPTBot, Google-Extended, Amazonbot, Applebot-Extended, Bytespider, CCBot, meta-externalagent. A subsequent manual block (lines ~44+) issues Allow: / for the same bots. Per RFC 9309, when multiple groups match, Google uses the most specific / longest-match rule, but duplicate blocks for the same user-agent can cause undefined behaviour in other crawlers. The intent (allow AI) may not be reliably honoured.
→ Remove or deconflict the Cloudflare-managed Disallow block. Keep a single user-agent group per bot with Allow: /. Prevents ambiguity and ensures AI citation crawlers (Perplexity, ClaudeBot) can access all content.
Medium SM615 duplicate titles and 17 duplicate meta descriptions across crawled pages
crawl-summary.json by_check.duplicate_title = 15, duplicate_meta_desc = 17. Duplicate titles reduce click-through differentiation; duplicate meta descriptions are a signal of thin or template-driven pages that may trigger Panda-style quality filters.
→ Audit which pages share titles/descriptions. For category/tag archives, either uniquify or add noindex. For posts, rewrite meta to be page-specific.
Low SM7sitemap_index.xml was 404 earlier today — now fixed (credit given)
phase4-shared-context.md notes sitemap_index.xml was 404 pre-rewrite-flush 2026-06-18. Live curl at 00:54:38 UTC confirms HTTP 200. crawl-summary.json by_check.sitemap_missing: 1 is stale and reflects the pre-fix state.
→ Fix confirmed. No further action required for the 404 itself. Monitor GSC Coverage report for sitemap re-processing over next 7 days.
Low SM83 pages have multiple H1 tags — structural signal for content quality
crawl-summary.json by_check.h1_multiple = 3. Multiple H1s per page are valid HTML5 but remain a best-practice violation; Google has stated it uses the first H1 as primary heading signal. Risk is low but nonzero for these pages.
→ Reduce each affected page to a single H1. Typically caused by theme/block-editor theme header components outputting a redundant H1.
seo-visual — score 68/100 · 6 finding(s)
High V1Brand orange #FF7F00 white text fails WCAG AA — 2.53:1 (threshold 3.0 large, 4.5 normal)
Python WCAG calc: white rgb(255,255,255) on orange rgb(255,127,0) = 2.53:1. WCAG AA large-text threshold = 3.0:1; normal-text = 4.5:1. Both failed. Confirmed on homepage CTA 'Bắt Đầu Lộ Trình →' button (white text on orange bg). Any other UI elements using white-on-orange inherit this failure. Brand orange on white backgrounds (inverted) would be 2.53:1 against white — also fails for normal text.
→ Sitewide accessibility failure on primary CTA and any orange-badged elements. Fix: (a) darken orange to #C96000 for text contexts (gives ~4.6:1 on white); or (b) switch CTA to dark text #0A1F41 on orange (8.29:1 passes easily); or (c) add dark text class for small-text orange uses. Primary CTA is highest-traffic interactive element — fixing impacts conversion + a11y.
Medium V2Body text contrast 4.46:1 fails WCAG AA by 0.04 (threshold 4.5)
Playwright computed: body-text fg=rgb(110,116,124) on bg=rgb(255,247,245) = 4.46:1. WCAG AA requires 4.5:1 for normal-sized text. Delta = -0.04. Applies sitewide to all body copy and meta text.
→ Borderline failure — 0.04 shortfall. Fix: darken body text color to rgb(100,106,114) or #64686F to clear 4.5. Negligible visual change, full compliance achieved. Priority below V1 but simple one-line CSS change.
Low V3Focus-visible rule confirmed present but scope may be narrow (mobile menu only)
Stylesheet scan found exactly one :focus-visible rule: '.mobile-toggle-open-container .menu-toggle-open:hover, .mobile-toggle-open-container .menu-toggle-open:focus-visible'. Shared context notes 'focus-visible CSS' was added 2026-06-17. No global a:focus-visible or button:focus-visible rule surfaced from accessible sheets. Cross-origin Kadence/Cloudflare sheets blocked from cssRules access — global rule may exist there (confidence: medium).
→ If no broader focus rule exists, keyboard users see no focus ring on nav links, content links, search input button. Add global: 'a:focus-visible, button:focus-visible, [tabindex]:focus-visible { outline: 3px solid #4386FC; outline-offset: 2px; }' to custom CSS.
Low V4Mobile CTA off-screen on 375x667 (iPhone SE) viewport
Homepage mobile 390x844: primary CTA top=552px (above fold on 844px device). On 375x667 (iPhone SE, ~4-6% of mobile users), CTA at ~552px would be below fold requiring scroll. H1 visible at 151px on all viewports.
→ Users on smallest supported phones must scroll to see CTA. Reduce hero illustration height on mobile or reorder: CTA above hero image. Low business impact given traffic mix but quick fix.
Low V5Carousel off-screen slides extend beyond desktop viewport bounds
Pinned page desktop 1920px: Splide carousel .splide__slide/.entry-list-item elements render to x=2038 (+118px outside viewport). Body bodyScrollWidth=1920 — no horizontal scroll at body level. This is standard Splide off-canvas slide pattern. Risk: if .splide__track overflow is not hidden, screen reader or keyboard users could tab to off-screen slide content.
→ Verify .splide__track has overflow:hidden in computed CSS. If already clipped, no action needed. If not, add overflow:hidden to prevent keyboard/AT users from reaching hidden slides.
Low V6CLS = 0.0 on all tested pages/viewports — PASS
PerformanceObserver layout-shift entries = 0 on homepage+pinned, desktop+mobile. networkidle+2s settle window used. Hero preload fix (2026-06-17) credited.
→ Positive. CWV CLS target <0.1 met with margin. No action needed.