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.
- 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
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...
/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...
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 ...
Quick Wins — Shippable This Week
10.0h total8 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/100Overall 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
Priority breakdown by severity — 115 findings total
The 3 Biggest Problems
- {'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'}
- {'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'}
- {'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
| Category | Score | Weight | Weighted | Rating |
|---|---|---|---|---|
| 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
| Composite | Score | Rating | Formula |
|---|---|---|---|
| Technical + Core Web Vitals | 80/100 | Good | Technical*0.45 + Performance*0.35 + Sitemap*0.20... |
| GEO + AEO Readiness | 65/100 | Fair | Brand*0.30 + Schema*0.25 + Platform*0.25 + Geo*0.20... |
| Overall Search-Readiness | 78/100 | Good | Technical*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.
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
—
2-4 sentence executive summary
_visual_raw 0/100 —
geo-accessibility 62/100 —
geo-brand-mentions 32/100 —
geo-compliance 72/100 —
geo-crawlers 90/100 —
geo-llmstxt 82/100 —
geo-platform-optimizer 68/100 —
geo-schema 95/100 —
geo-technical 81/100 —
seo-audit 74/100 —
seo-backlinks 22/100 —
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 —
Homepage PASS (submitted+indexed); 1,237 queries ranking pos 1-10 (122 in top-3); GA4 organic momentum strong.
seo-hreflang 95/100 —
seo-images 74/100 —
seo-page 74/100 —
seo-performance 89/100 —
Field CWV (CrUX p75) all GREEN on mobile+desktop; only render-blocking Google Fonts CSS + lab LCP gap remain.
seo-sitemap 58/100 —
seo-visual 68/100 —
High Priority — Fix within 1 week
18 issuesThese issues significantly limit your reach. Plan to fix within the next sprint. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Brand orange #FF7F00 fails contrast on white backgrounds — multiple surfaces
HighTechnical 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./privacy-policy/ returns 404 — AdSense policy requirement and trust signal unmet
HighTechnical 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.]Near-zero off-site authority — 0 referring domains detected, absent from Common Crawl
HighTechnical 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.Slow TTFB on 290/299 crawled pages — origin server response bottleneck
HighTechnical 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.35 broken internal links + 18 broken external links — crawl-budget waste and equity leak
HighTechnical 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.Traffic hyper-concentration: top 3 pages = ~64% of clicks at positions 5-8 — fragile traffic floor
HighTechnical 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.Zero third-party mentions on Reddit, X/Twitter, dev.to, Quora — no community amplification
HighTechnical 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 measured external authority — referring domains, domain rank, and backlink count all undetectable at 3 months
HighTechnical 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./privacy-policy/ returns 404 — English canonical URL dead
HighTechnical 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.CCPA 'Do Not Sell or Share' footer link promised in policy but absent in live footer
HighTechnical 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).Vietnamese-only content creates systematic language barrier for English-first AI citation engines
HighTechnical 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.Content-Signal ai-train=no set globally — ai-input (RAG/grounding) not explicitly declared
HighTechnical 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.)35 internal pages linked-to are returning 4xx / broken — crawl budget wasted and link equity lost
HighTechnical 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.14 internal links point to redirect chains instead of canonical URLs
HighTechnical 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.robots.txt conflict: Cloudflare Managed block overrides publisher Allow for AI crawlers
HighTechnical 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.Brand orange #FF7F00 white text fails WCAG AA — 2.53:1 (threshold 3.0 large, 4.5 normal)
HighTechnical 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.Internal links pointing to broken pages — 35 pages🔍 site-crawl
HighInternal links point to URLs that 404 — they leak link equity and frustrate readers.
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)Broken pages returning 4xx — 4 pages🔍 site-crawl
HighVisitors and crawlers hit a dead page (404/410), wasting crawl budget and link equity.
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/Medium Priority — Fix within 1 month
41 issuesThese improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Email newsletter input: outline:none with no focus handler — invisible keyboard focus
MediumTechnical 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.Malformed table HTML in pinned page — missing thead/tbody, broken th attribute
MediumTechnical 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.17 duplicate meta descriptions + 15 duplicate titles — thin metadata across content set
MediumTechnical 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.70 noindex pages (23% of crawl) — author page noindexed, blocking E-E-A-T entity signal
MediumTechnical 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.AI citation recovery pending — access unblocked but re-indexing not yet complete
MediumTechnical 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).Mobile traffic only 16% vs Vietnamese market norm ~72% smartphone penetration
MediumTechnical 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.Brand name collision: '@ongboit97' is a different, larger YouTube channel
MediumTechnical 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.Facebook owned page has only 4 likes — effectively invisible
MediumTechnical 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.YouTube owned channel has only 1 video — no authority or subscriber base yet
MediumTechnical 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.GitHub owned profile not indexed — missing developer-community presence
MediumTechnical 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.18 broken external links leak link equity and signal low editorial quality
MediumTechnical 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.No Moz or DataForSEO API key configured — future audits blind to DA/spam/anchor data
MediumTechnical 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.DSAR channel is a personal Gmail — not a dedicated privacy contact
MediumTechnical 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.Privacy policy page has robots meta 'follow, index' but no structured data (Article/WebPage schema) — not discoverable as a legal document
MediumTechnical 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.llms.txt last-updated 2026-06-16 — articles published after that date absent from AI discovery index
MediumTechnical 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-full.txt covers only 35 of 71 linked articles (49%)
MediumTechnical 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.17 content images missing width+height attributes (CLS risk)
MediumTechnical 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.LCP hero on /claude-code-gioi-han-su-dung/ served as JPEG, not WebP
MediumTechnical 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.og:image width 1024px on 4 of 5 pages — below 1200px recommended minimum
MediumTechnical 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.Missing fetchpriority=high on LCP hero images for 3 article pages
MediumTechnical 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.auto-mode page: H3 (TL;DR box) appears before first H2 — heading hierarchy skip
MediumTechnical 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: only 3 editorial internal links — well below site average of 10-13
MediumTechnical 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.tiet-kiem-token meta description 169 chars — exceeds ~160 char threshold, Google will truncate
MediumTechnical 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.Render-blocking Google Fonts CSS on homepage + pinned page
MediumTechnical details for your developer
geo-technical curl: <link rel=stylesheet fonts.googleapis.com> not deferred; homepage hero missing <link rel=preload>llms.txt activated and reachable — 71 links now crawlable; llms-full.txt covers only 35/71 articles
MediumTechnical 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.)Zero third-party community mentions on Reddit/X — no social proof signal for AI citation engines
MediumTechnical 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.sameAs missing Wikipedia and Wikidata — weakens AI entity graph resolution
MediumTechnical 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.FAQPage Q1 is off-topic for article (DeepClaude question on usage-limits page)
MediumTechnical 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.14 indexable pages crawled but absent from sitemap
MediumTechnical 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.robots.txt has duplicate user-agent blocks creating conflicting directives for AI crawlers
MediumTechnical 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.15 duplicate titles and 17 duplicate meta descriptions across crawled pages
MediumTechnical 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.CSP enforcing but weakened by unsafe-inline + unsafe-eval in script-src
MediumTechnical 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.Homepage hero image missing <link rel=preload> (LCP risk)
MediumTechnical 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.Google Fonts CSS loaded as render-blocking stylesheet
MediumTechnical 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.Homepage meta description 162 chars (2 chars over 160 target)
MediumTechnical 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.'Body text contrast 4.46:1 fails WCAG AA by 0.04 (threshold 4.5)
MediumTechnical 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.Broken JS/CSS resources — 32 pages🔍 site-crawl
MediumA referenced script or stylesheet fails to load.
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 outbound links — 18 pages🔍 site-crawl
MediumOutbound links return 404/410/5xx — a trust and UX signal.
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)Duplicate page titles — 15 pages🔍 site-crawl
MediumMultiple pages share the same <title>, splitting relevance signals.
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)Ai bots blocked — 1 page🔍 site-crawl
MediumFlagged by the deterministic full-site crawl.
Recommended fix
Review the affected URLs and resolve.
Technical details for your developer
1 URL affected: ongboit.com/robots.txtSitemap missing — 1 page🔍 site-crawl
MediumFlagged by the deterministic full-site crawl.
Recommended fix
Review the affected URLs and resolve.
Technical details for your developer
1 URL affected: ongboit.com/sitemap.xmlLow Priority — Backlog
54 issuesNice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Newsletter email input not wrapped in a <form> element
LowTechnical 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.Search input uses JS focus indicator (border-color change) instead of CSS :focus-visible
LowTechnical 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.Sitemap XML served with x-robots-tag: noindex — non-standard signal on sitemap URL
LowTechnical 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.32 broken JS/CSS assets — console errors may affect AdSense rendering
LowTechnical 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.2 independent Threads posts mention ongboit.com — early positive signal
LowTechnical 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.TikTok ongboit.com links appearing on non-owned accounts — potential viral cross-posting
LowTechnical 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.Wikipedia/Wikidata entity absent — expected for 3-month-old blog, but plan ahead
LowTechnical details for your developer
search site:wikipedia.org OR site:wikidata.org 'ongboit' returned 0 results.Brand not yet indexed in Common Crawl — no crawl-graph footprint established
LowTechnical 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.Cookie banner dismissal state 'cmplz-dismissed' visible in raw HTML — verify first-visit behavior
LowTechnical 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.ClaudeUser and OAI-SearchBot listed but not all Anthropic/OpenAI agent variants covered
LowTechnical 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.Last-Updated date is 2 days stale
LowTechnical 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.llms-full.txt cache TTL is 1h; should match static-asset policy (1yr)
LowTechnical 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.Shared-context link count (67) lags actual count (71) by 4
LowTechnical 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.No X-Robots-Tag or explicit AI-bot permission header on llms-full.txt
LowTechnical 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.Query-level click concentration — 3 pages drive majority of clicks
LowTechnical details for your developer
GSC top-3 pages = 432 clicks; traffic floor depends on a few Claude-Code pillarsHreflang implementation is correct and complete for a single-locale Vietnamese site
LowTechnical 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.No hreflang via HTTP Link headers (HTML-only delivery — acceptable)
LowTechnical 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.AVIF format not used anywhere (0%)
LowTechnical 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.External Buy Me A Coffee image (cdn.buymeacoffee.com) lacks width+height dimensions
LowTechnical 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.Avatar images (author thumbnails) served without loading=lazy on article pages
LowTechnical 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.twitter:site tag absent on all 5 pages — Twitter/X Card Validator will not attribute to account
LowTechnical 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.Title ↔ H1 text divergence on 3 of 5 pages (gioi-han, gia-bao-nhieu, tiet-kiem-token)
LowTechnical 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.OG image served at 1024px — below Twitter recommended 1200×630 for summary_large_image
LowTechnical 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).Lab LCP (~9.6s prior) far above field p75 (1.27s) — lab worst-case, field is truth
LowTechnical details for your developer
CrUX field LCP p75=1266ms GOOD vs prior lab ~9.6s; field passesllms.txt Last-Updated is 2 days stale (2026-06-16) — new articles not indexed for AI crawlers
LowTechnical 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.)FAQPage Q1 is off-topic for the pinned article — semantic integrity issue for AI passage extraction
LowTechnical 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.Person schema absent from homepage — AI crawlers visiting / only cannot resolve author entity
LowTechnical 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.BlogPosting missing explicit 'url' property — @id-based reference only
LowTechnical 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.Kadence theme microdata (WebPage, WPHeader) coexists with JSON-LD — format mix
LowTechnical 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.x-robots-tag: noindex on all sitemap files — Googlebot cannot discover or use sitemaps
LowTechnical 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.]sitemap_index.xml was 404 earlier today — now fixed (credit given)
LowTechnical 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.3 pages have multiple H1 tags — structural signal for content quality
LowTechnical 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.Sitemap CSS XSL path uses protocol-relative URL (//ongboit.com/main-sitemap.xsl)
LowTechnical 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.Cache-Control for theme CSS is 30 days vs 1 year for images
LowTechnical 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.Focus-visible rule confirmed present but scope may be narrow (mobile menu only)
LowTechnical 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).Mobile CTA off-screen on 375x667 (iPhone SE) viewport
LowTechnical 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.Carousel off-screen slides extend beyond desktop viewport bounds
LowTechnical 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.CLS = 0.0 on all tested pages/viewports — PASS
LowTechnical 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.Slow server response (TTFB) — 290 pages🔍 site-crawl
LowMany URLs are slow to first byte.
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)Large HTML payload — 279 pages🔍 site-crawl
LowPages ship a large HTML document.
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)Low text-to-HTML ratio — 26 pages🔍 site-crawl
LowHeavy markup versus little text.
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)Duplicate meta descriptions — 17 pages🔍 site-crawl
LowMultiple pages share one meta description.
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)Internal links to redirects — 14 pages🔍 site-crawl
LowInternal links pass through a 301 hop — minor crawl waste.
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)Near-orphan pages (one internal link in) — 14 pages🔍 site-crawl
LowPages with only one internal dofollow link in are weakly connected.
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)Nofollow outbound links (informational) — 13 pages🔍 site-crawl
LowSome external links are nofollow.
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)Incomplete OpenGraph tags — 10 pages🔍 site-crawl
LowMissing og: tags weaken social and AI link previews.
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 structured data — 10 pages🔍 site-crawl
LowJSON-LD entities miss recommended properties.
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)Meta descriptions too short — 8 pages🔍 site-crawl
LowShort descriptions waste SERP real estate.
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 desc too long — 4 pages🔍 site-crawl
LowFlagged by the deterministic full-site crawl.
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/Thin page: H1 duplicates the title — 3 pages🔍 site-crawl
LowOn a thin/short-title page the H1 repeats the title verbatim.
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/Multiple H1 tags — 3 pages🔍 site-crawl
LowPages with more than one H1 muddy the document outline.
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/Too many links on a page — 2 pages🔍 site-crawl
LowExcessive links dilute link equity and crawl focus.
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/Not compressed — 1 page🔍 site-crawl
LowFlagged by the deterministic full-site crawl.
Recommended fix
Review the affected URLs and resolve.
Technical details for your developer
1 URL affected: ongboit.comNo cache control — 1 page🔍 site-crawl
LowFlagged by the deterministic full-site crawl.
Recommended fix
Review the affected URLs and resolve.
Technical details for your developer
1 URL affected: ongboit.comTechnical Deep Dive
83/100Rating: 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
| URL | Broken 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
broken external link — 18 URLs
duplicate title — 15 URLs
| URL | Title | Dupes |
|---|---|---|
| https://ongboit.com | Ông Bố IT | Claude Code, AI Coding & Self-hosting Blog | 2 pages |
| https://ongboit.com/ | Ông Bố IT | Claude Code, AI Coding & Self-hosting Blog | 2 pages |
| https://ongboit.com/contact/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/contact/?subject=Subscribe/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/contact/?subject=Tu+van+30+phut/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/contact/?subject=kit/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/contact/?subject=Content/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/contact/?subject=Automation/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/contact/?subject=SEO+Audit/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 7 pages |
| https://ongboit.com/dataforseo-la-gi/ | DataForSEO Là Gì 2026: Pay-As-You-Go SEO API + Claude Code | 2 pages |
| https://ongboit.com/dataforseo-free-trial/ | DataForSEO Là Gì 2026: Pay-As-You-Go SEO API + Claude Code | 2 pages |
| https://ongboit.com/best-claude-code-skills/ | Best Claude Code Skills 2026: 32 Bundled, Plugins, Community | 2 pages |
| https://ongboit.com/top-20-claude-skills/ | Best Claude Code Skills 2026: 32 Bundled, Plugins, Community | 2 pages |
| https://ongboit.com/claude-code-banana/ | Banana Claude: Tạo Ảnh AI 4K Trong Terminal Cho Dev 2026 | 2 pages |
| https://ongboit.com/banana-claude/ | Banana Claude: Tạo Ảnh AI 4K Trong Terminal Cho Dev 2026 | 2 pages |
ai bots blocked — 1 URL
| URL |
|---|
| https://ongboit.com/robots.txt |
low text html ratio — 26 URLs
duplicate meta desc — 17 URLs
| URL | Meta description | Dupes |
|---|---|---|
| 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/ | 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/2026 | 2 pages |
| https://ongboit.com/chinh-sach-bao-mat/ | Cập nhật lần cuối: 16/06/2026 | 2 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
one dofollow incoming — 14 URLs
nofollow external — 13 URLs
og incomplete — 10 URLs
meta desc too short — 8 URLs
| URL | Meta description | Length |
|---|---|---|
| https://ongboit.com/category/seo/ | Kiến thức SEO cho developer | 27c |
| https://ongboit.com/category/claude-code/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| 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ác | 84c |
| 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 Nam | 62c |
| https://ongboit.com/category/n8n/ | Automation workflows và tutorials với n8n | 41c |
| https://ongboit.com/dieu-khoan-su-dung/ | Cập nhật lần cuối: 16/06/2026 | 29c |
| https://ongboit.com/chinh-sach-bao-mat/ | Cập nhật lần cuối: 16/06/2026 | 29c |
| 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
| URL | Title | Width |
|---|---|---|
| https://ongboit.com/category/seo/ | SEO - Ông Bố IT | 118px |
| https://ongboit.com/category/ai-101/ | AI 101 - Ông Bố IT | 128px |
| https://ongboit.com/category/n8n/ | n8n - Ông Bố IT | 109px |
| https://ongboit.com/dich-vu/ | Dịch Vụ | 58px |
| https://ongboit.com/dieu-khoan-su-dung/ | Điều Khoản Sử Dụng | 140px |
| https://ongboit.com/chinh-sach-bao-mat/ | Chính Sách Bảo Mật | 140px |
meta desc too long — 4 URLs
| URL | Meta description | Length |
|---|---|---|
| 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/ | 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
| URL | No. 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
| URL | Links |
|---|---|
| https://ongboit.com/claude-code-roadmap/ | 273 |
| https://ongboit.com/claude-code-la-gi/ | 161 |
Accessibility Deep Dive
75/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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
slow ttfb — 290 URLs
large html — 279 URLs
not compressed — 1 URL
| URL |
|---|
| https://ongboit.com |
no cache control — 1 URL
| URL |
|---|
| https://ongboit.com |
Platform Deep Dive
66/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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
| URL | Missing 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/100Rating: 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/100Rating: 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.
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)
All-channel session mix
Organic source / medium
Organic sessions over time
Top organic pages by conversions
Conversions by channel (is organic converting?)
Top organic landing pages (entry)
| Landing page | Sessions | Key events | Engaged |
|---|---|---|---|
/claude-code-gioi-han-su-dung | 210 | 456 | 86.2% |
/tiet-kiem-token-claude-code | 177 | 411 | 82.5% |
/claude-code-gia-bao-nhieu | 166 | 391 | 78.3% |
/claude-md-la-gi | 74 | 143 | 67.6% |
/claude-code-vs-code | 61 | 102 | 83.6% |
/claude-code-memory-context | 36 | 4 | 41.7% |
/claude-code-seo-content | 28 | 168 | 96.4% |
/claude-code-token-tracker | 28 | 72 | 89.3% |
/cai-dat-claude-code | 27 | 75 | 85.2% |
Top organic content (by pageviews)
| Page | Views | Sessions | Engaged | Avg time |
|---|---|---|---|---|
/tiet-kiem-token-claude-code/ | 228 | 216 | 80.1% | 5m 2s |
/claude-code-gioi-han-su-dung/ | 223 | 251 | 80.1% | 2m 7s |
/claude-code-gia-bao-nhieu/ | 176 | 186 | 75.8% | 2m 53s |
/claude-md-la-gi/ | 93 | 105 | 72.4% | 3m 19s |
/claude-code-vs-code/ | 70 | 79 | 78.5% | 2m 24s |
/ | 59 | 44 | 95.5% | 1m 29s |
/claude-code-skills/ | 45 | 55 | 78.2% | 2m 18s |
/category/claude-code/ | 43 | 38 | 94.7% | 1m 13s |
/claude-code-memory-context/ | 41 | 44 | 34.1% | 41m 44s |
/claude-code-hooks/ | 38 | 43 | 76.7% | 10m 58s |
Top events (organic engagement)
Device
Top countries
New vs returning
Age
Gender
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:
| Bot | Vendor | Purpose | robots.txt status |
|---|---|---|---|
| GPTBot | allow | ||
| ChatGPT-User | allow | ||
| OAI-SearchBot | allow | ||
| ClaudeBot | allow | ||
| anthropic-ai | allow | ||
| PerplexityBot | allow | ||
| Google-Extended | allow | ||
| Googlebot | allow_via_wildcard | ||
| Bingbot | allow | ||
| CCBot | allow | ||
| Bytespider | allow | ||
| Amazonbot | allow | ||
| Applebot-Extended | allow | ||
| meta-externalagent | allow | ||
| cohere-ai | allow |
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.
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.
| Query | Position | Impressions | Clicks |
|---|---|---|---|
| các gói claude code | 6.4 | 57 | 1 |
| claude.md là gì | 7.3 | 59 | 1 |
| claude.md | 7.8 | 56 | 0 |
| seo audit website dichvuseo365 | 8.9 | 65 | 0 |
| mua claude code giá rẻ | 9.2 | 475 | 0 |
| claude code pricing | 9.2 | 170 | 2 |
| obsidian là gì | 9.5 | 135 | 1 |
| giá claude code | 10.4 | 72 | 1 |
| dataforseo test | 19.8 | 64 | 0 |
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.
What ships each window
- 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
- 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
| Milestone | Projected Score | Delta |
|---|---|---|
| Current baseline | 78/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-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
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/9Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).
| Gate | Check | Status | Detail |
|---|---|---|---|
| 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 patternsreferences/business-type-sampling.md— 5 types × 8 priority pagesreferences/composite-formula.md— 9 weights + 5-tier rubricreferences/pdf-spec.md— Times New Roman + 7 chartsreferences/verification-checklist.md— 10 Phase 6.5 gatesreferences/skill-routing.md— winner-per-pair matrixreferences/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 A1 | 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:#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 A2 | Email 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 A3 | Malformed 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 A4 | Newsletter 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 A5 | Search 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 BM1 | Brand 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 BM2 | Facebook 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 BM3 | YouTube 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 BM4 | 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 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 BM5 | 2 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 BM6 | TikTok 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 BM7 | GitHub 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 BM8 | Wikipedia/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 C2 | CCPA '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 C3 | DSAR 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 C4 | Privacy 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 C5 | Cookie 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 GC1 | RESOLVED 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 GC2 | llms.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 GC3 | ClaudeUser 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 LL1 | Last-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 LL2 | llms-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 LL3 | llms-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 LL4 | Shared-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 LL5 | No 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 PO1 | AI 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 PO2 | Vietnamese-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 PO3 | Content-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 PO4 | llms.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 PO5 | sameAs 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 PO6 | Zero 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 PO7 | llms.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 PO8 | FAQPage 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 S1 | sameAs 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 S2 | FAQPage 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 S3 | Person 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 S4 | BlogPosting 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 S5 | Kadence 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 T1 | robots.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 T2 | CSP 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 T3 | Homepage 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 T4 | Google 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 T5 | Homepage 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 T6 | Sitemap 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 T7 | Cache-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 AU1 | RESOLVED: 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 AU3 | Near-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 AU4 | Slow 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 AU5 | 35 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 AU6 | Traffic 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 AU7 | Brand 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 AU8 | 17 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 AU9 | 70 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 AU10 | AI 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 AU11 | Mobile 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 AU12 | Sitemap 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 AU13 | 32 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 BL1 | Zero 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 BL2 | 18 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 BL3 | No 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 BL4 | Brand 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 GG1 | Query-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 H1 | Hreflang 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 H2 | No 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 IM1 | 17 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 IM2 | LCP 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 IM3 | og: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 IM4 | Missing 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 IM5 | AVIF 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 IM6 | External 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 IM7 | Avatar 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 P1 | auto-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 P2 | auto-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 P3 | tiet-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 P4 | twitter: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 P5 | Title ↔ 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 P6 | OG 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 PF1 | Render-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 PF2 | Lab 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 SM1 | x-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 SM2 | 35 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 SM3 | 14 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 SM4 | 14 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 SM5 | robots.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 SM6 | 15 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 SM7 | sitemap_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 SM8 | 3 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 V1 | Brand 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 V2 | Body 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 V3 | Focus-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 V4 | Mobile 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 V5 | Carousel 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 V6 | CLS = 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. |