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.
Show all 57 prior findings
| ✅ Fixed (18) | ||
| C1 | No cookie consent banner | Complianz live + Consent Mode v2 (all 7 storage denied default); curl-verified |
| C2 | /privacy 301 to blog post | Now 301 -> /chinh-sach-bao-mat/ (bilingual policy) |
| C3 | Zero FAQPage on flagship | FAQPage now on 199/202 articles + 2 backfilled this session; HowTo deprecated (skip) |
| H4 | No top-level Organization | Organization entity @id #organization live (Rank Math Company) |
| H5 | Author Person missing E-E-A-T | jobTitle/knowsAbout/sameAs/worksFor enriched (snippet #8) + real avatar |
| H6 | Privacy policy missing GDPR/CCPA | Bilingual policy w/ GDPR/CCPA/PDPD/controller/legal-basis/SCC/breach/DPO |
| H12 | llms.txt 301 redirect | Now HTTP 200 at root (snippet #9) |
| H13 | llms-full.txt missing | Created, 748KB, 25 posts, HTTP 200 |
| H14 | llms.txt prose not markdown links | Regenerated, 25 markdown links + sections |
| M6 | robots.txt no AI crawler directives | 11 AI crawlers explicit Allow (snippet #9) |
| M7 | llms.txt 32 days stale | Regenerated Last-Updated 2026-06-15 |
| M9 | llms.txt covers 6/171 posts | Now 25 verified links |
| M12 | No granular cookie categories | Complianz 3-category opt-in |
| M13 | No DPO + cross-border clause | Policy has DPO exemption + cross-border (SCC/DPF) |
| L2 | robots.txt no llms.txt Sitemap | Added - BUT reaudit flags it as a NEW issue (Google parses text/plain as XML); reconsider |
| L3 | llms.txt author plain text | Now markdown links |
| L6 | Avatar alt='Avatar' | Now alt='Nguyen Minh The' (real avatar) |
| L8 | Email inconsistency | Aligned to gmail across policy/terms/contact |
| 🟡 Partial (7) | ||
| H1 | All 6 security headers missing | 5/6 added (HSTS/X-Frame/nosniff/Referrer/Permissions); CSP intentionally skipped |
| H3 | sameAs under-linked + dup Org | Duplicate Org removed + top-level Org created; sameAs still 4 platforms (X/YT/Wikidata not added) |
| M2 | Flagship cite zero external sources | Several articles do cite sources now (content audit); inconsistent |
| M3 | xmlrpc.php exposed | xmlrpc_enabled=false (auth blocked) + X-Pingback removed; BUT POST still returns 80 methods incl pingback - ne |
| M11 | No DSAR form | Policy has DSAR email + 30-day SLA; no dedicated form |
| M18 | Color contrast muted text | Footer legal-link contrast fixed (9.9:1); muted body text marginal AA |
| M19 | Focus indicators | Search input OK; email input outline:none still open |
| □ Not fixed (out of scope) (30) | ||
| C4 | Zero Reddit presence | Strategic off-site - not addressed |
| C5 | No Wikipedia/Wikidata | Strategic off-site - not addressed |
| H2 | Severe SERP visibility gap | Strategic; slightly improved 4->8 ranked kw but still page 4-8 |
| H7 | Authority deficit | Strategic backlinks - not addressed |
| H8 | 16 earned mentions not backlinking | Strategic - not addressed |
| H9 | Google Fonts render-blocking | Infra/theme (Kadence local-fonts toggle) - not addressed |
| H10 | TTFB 657ms no CDN | Infra - not addressed (field LCP still FAST) |
| H11 | LCP image no fetchpriority | Not addressed |
| H15 | HowTo schema missing | Google deprecated HowTo rich result - skip |
| H16 | Not top-10 organic | Strategic - not addressed |
| H17 | No X/Twitter account | Strategic off-site - not addressed |
| H18 | Zero viblo/tinhte presence | Strategic off-site - not addressed |
| M1 | Footer FB/X social hrefs empty | Footer legal-nav added this session; theme social block not addressed |
| M4 | Zero speakable | Claimed via snippet #5 but reaudit grep = 0 live hits - NOT deployed |
| M5 | dateModified == datePublished | Not addressed (note: dateModified now updates on edits) |
| M8 | No markdown alternates | Not addressed |
| M10 | Google Fonts Schrems II | Infra - not addressed |
| M14 | IG/FB reposts no backlink | Strategic - not addressed |
| M15 | No YouTube channel | Strategic - not addressed |
| M16 | Zero Quora presence | Strategic - not addressed |
| M17 | Inputs no programmatic label | Reaudit confirmed still open (search + email inputs) |
| M21 | No image sitemap | Not addressed |
| M22 | 6 render-blocking CSS | Infra/theme - not addressed |
| M24 | Perplexity not surfacing | Strategic - not addressed |
| L1 | 308 vs 301 redirect | Not addressed |
| L4 | SearchAction homepage only | Not addressed |
| L5 | Tables no scope/caption | Reaudit confirmed still open |
| L7 | buymeacoffee CLS | Not addressed |
| L9 | GitHub bio no link | Strategic - not addressed |
| L10 | No Bing/IndexNow | Not addressed (user deprioritized) |
| ⏭ Intentional skip (1) | ||
| M20 | sitemap noindex header | Rank Math default - intentional, not a real issue (false-positive) |
| — Unauditable (1) | ||
| M23 | DataForSEO Backlinks blocked | Subscription still inactive (40204) |
Geo +38, Compliance +33, Image +20, Schema +12
H1, H3, M2, M3, M11
Not-fixed are dominated by strategic off-site (Brand=28 roadmap: Reddit/X/YouTube/Wikidata/backlinks) + infra (TTFB/CDN/fonts/CSS) - intentionally deferred. The
- P1 · Accessibility — Search + newsletter inputs have no programmatic label (WCAG 1.3.1/4.1.2)
The 3 Problems Hurting You Most Right Now
speakable property not live despite claimed fix
grep speakable on home + 2 articles = 0 hits
xmlrpc.php not fully blocked - POST still returns 80 methods incl pingback
POST system.listMethods -> HTTP 200, 80 methods; pingback.ping present
robots.txt declares llms.txt as a Sitemap - Google parses text/plain as XML (GSC errors)
robots.txt Sitemap: https://ongboit.com/llms.txt; file is text/plain
Quick Wins — Shippable This Week
18.0h total6 fixes shippable this week (effort = S). Estimated overall score lift +5-15 points.
- ☐ R-H3speakable property not live despite claimed fix 2h +voice/AI assistant readout signal
- ☐ R-M1robots.txt declares llms.txt as a Sitemap - Google parses text/plain as XML (GSC errors) 2h avoids GSC parse errors
- ☐ R-H4Search + newsletter inputs have no programmatic label (WCAG 1.3.1/4.1.2) 2h WCAG AA compliance
- ☐ R-M2Organization missing url, description, foundingDate, contactPoint 2h Knowledge Graph resolution
- ☐ R-M5Comparison tables: 13 th, 0 scope, 0 caption 2h WCAG AA
- ☐ R-H2Content-Security-Policy absent on all public pages 8h XSS hardening; start report-only
Executive Summary
74/100Overall Score: 74/100 (Fair)
Website audit found 41 issues across 13 weighted categories. Technical fundamentals score 73/100 (Fair), while AI search readiness scores 62/100 (Fair).
Issue Distribution
Priority breakdown by severity — 41 findings total
The 3 Biggest Problems
- R-H3
- R-H1
- R-M1
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 |
|---|---|---|---|---|
| Geo | 100/100 | 25% | 25.0 | Excellent |
| Brand | 30/100 | 13% | 3.9 | Critical |
| Platform | 60/100 | 6% | 3.6 | Fair |
| Schema | 74/100 | 13% | 9.6 | Fair |
| Technical | 74/100 | 18% | 13.3 | Fair |
| Image | 80/100 | 6% | 4.8 | Good |
| Performance | 71/100 | 13% | 9.2 | Fair |
| Sitemap | 76/100 | 6% | 4.6 | Good |
| Accessibility* | 87/100 | — | — | Good |
| Compliance* | 84/100 | — | — | Good |
| Google-Api* | 48/100 | — | — | Poor |
| Page-Deep-Dive* | 74/100 | — | — | Fair |
| Visual* | 80/100 | — | — | Good |
| OVERALL | 100% | 74.0 → 74/100 | Fair |
* 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 | 73/100 | Fair | Technical*0.45 + Performance*0.35 + Sitemap*0.20... |
| GEO + AEO Readiness | 62/100 | Fair | Brand*0.30 + Schema*0.25 + Platform*0.25 + Geo*0.20... |
| Overall Search-Readiness | 74/100 | Fair | 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 35m 48s across 11 phases. 13 category scores computed.
Total: 35m 48s
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
geo-accessibility 87/100 —
ongboit.com sits at 87/100 (AA, good) - up 1 point from the 86 baseline. Two baseline items verified fixed by grep: the author avatar now has alt text (L6) and the footer legal nav link was darkened to #93c5fd giving 9.9:1 contrast on the dark footer (this session's stated change CONFIRMED).
Strong fundamentals persist: lang="vi", single H1 with clean H1->H2->H3 nesting, 26/26 article images with…
geo-brand-mentions 30/100 —
Off-site brand authority essentially unchanged (28->30): entity graph cleaner (Organization + deduped sameAs) but strategic presence gaps remain - no X/Reddit/YouTube/Quora/Wikidata, 16 earned mentions un-recovered. Brand=28 roadmap: off-site account-building + backlink recovery, not a code task.
geo-compliance 84/100 —
ongboit.com compliance jumped from 51/100 (Poor) at the 2026-05-29 baseline to 84/100 (Good). All seven claimed fixes are curl-verified: Google Consent Mode v2 is live with every storage type denied by default and geo-targeted to 32 EEA/EU regions via Complianz; the bilingual VI/EN privacy policy covers GDPR, CCPA and Vietnam PDPD (Decree 13/2023) with data-controller, legal-basis, SCC, cross-bord…
| Component | Score | Rating |
|---|---|---|
| Cookie Consent Banner | 95/100 | Excellent |
| Consent Mode V2 | 95/100 | Excellent |
| Privacy Policy Quality | 88/100 | Good |
| Terms Of Use | 90/100 | Excellent |
| Security Headers | 72/100 | Fair |
| Dsar Mechanism | 60/100 | Fair |
| Third Party Tags | 85/100 | Good |
| Data Subject Rights | 85/100 | Good |
| Footer Legal Links | 100/100 | Excellent |
| Privacy Redirect | 100/100 | Excellent |
geo-crawlers 97/100 —
robots.txt fully remediated. All 11 targeted AI crawlers have explicit Allow: / stanzas covering every major citation-generating platform (ChatGPT, Claude.ai, Perplexity, Google AIO, Apple Intelligence) plus training crawlers. Score rises from 78 to 97. Only gap is 3 secondary crawlers (cohere-ai, Amazonbot, meta-externalagent) lacking explicit stanzas — low-priority since wildcard inheritance is…
geo-llmstxt 88/100 —
llms.txt fully remediated from a broken 301→404 state to a well-structured, spec-compliant file at HTTP 200. llms-full.txt is newly present at 748 KB with 25 articles and per-article metadata. Score rises from 62 to 88. Remaining gaps are:
- RSL 1.0 license field — medium priority for AI training trust signals;
- missing ETag/Last-Modified response headers — medium priority for crawl efficienc…
geo-platform-optimizer 60/100 —
AI-platform crawl/ingest foundation is now strong (robots AI-crawlers 97, llms.txt 88, llms-full present) - infrastructure side fixed. But actual citation requires top-10 ranking + community/authority, still weak (page 4-8, no Reddit/X). Strategic, off-site.
geo-schema 74/100 —
Score improved from 62 to 74 (+12 points). All major structural fixes confirmed live: Organization entity (@id #organization) with logo and sameAs 4 platforms, no duplicate Organization block, Author Person with E-E-A-T properties (jobTitle, knowsAbout, sameAs, worksFor), FAQPage on sampled articles, BreadcrumbList, WebSite+SearchAction.
Critical gap: speakable property was claimed as fixed in bas…
geo-technical 74/100 —
Reaudit of https://ongboit.com on 2026-06-16 vs baseline 2026-05-29 (score 78). Technical score: 74/100. The site is a WordPress installation with strong server-side rendering (all content visible in initial HTML, AI crawlers can read everything), good meta tag coverage, clean URL structure, and correct mobile viewport configuration.
The robots.txt is exemplary for AI SEO — 11 AI crawlers explicit…
seo-backlinks 0/100 —
Backlinks API access denied (subscription inactive), identical to baseline limitation M23. Indirect DataForSEO signal shows a thin link profile. Authority-building untouched this session - strategic.
seo-google 48/100 —
SERP visibility weak but improving: 8 ranked keywords (VN) vs baseline 4, best #12. High-volume terms still page 4-8. AI Overview appears on target queries but ongboit below the citation threshold. Strategic authority/backlink gap, not addressed this session.
seo-images 80/100 —
Image SEO strong: 100% alt-text coverage across sampled images, WebP heroes, author avatar carries the real name (L6 fixed). Remaining: no image sitemap (M21) + missing explicit width/height (minor CLS).
seo-page 74/100 —
ongboit.com demonstrates a strong on-page SEO baseline for a Vietnamese-language WordPress blog: all 4 pages pass canonical self-referencing, have 100% image alt coverage (78/78 images), no noindex anomalies, and the 3 article pages carry deep structured data (BlogPosting + FAQPage + BreadcrumbList + Person).
Meta descriptions are well-crafted and within length targets on article pages. The site h…
seo-performance 71/100 —
Field Core Web Vitals FAST (CrUX desktop LCP 1.09s / INP 38ms / CLS 0.03). Lab mobile perf 82. Main gap: origin TTFB slow (no CDN, 288/305 URLs) - infra (H10), unchanged. Field CWV FAST caps real-world severity at P2.
seo-sitemap 76/100 —
Sitemap architecture healthy (305 URLs, 70 legit noindex tag/category pages, current lastmod). New minor issue: robots.txt 'Sitemap: llms.txt' (added this session) points Googlebot at a plain-text file as if XML - remove to avoid GSC parse errors.
seo-visual 80/100 —
Above-fold renders cleanly; field CLS ~0.03 (FAST). Footer legal-link contrast fixed this session (9.9:1). Minor: muted body text passes AA only marginally; email input lacks a visible focus indicator.
High Priority — Fix within 1 week
10 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.
xmlrpc.php not fully blocked - POST still returns 80 methods incl pingback
HighThe attack surface fix only blocked auth methods; pingback DDoS vector is still open.
Recommended fix
Block /xmlrpc.php at Apache/Traefik (Deny all) - the WP filter alone is insufficient
Technical details for your developer
POST system.listMethods -> HTTP 200, 80 methods; pingback.ping presentspeakable property not live despite claimed fix
HighThe voice/AI-readout signal is missing - claimed baseline fix did not deploy.
Recommended fix
Add speakable.cssSelector to BlogPosting via rank_math/json_ld filter; verify with curl|grep
Technical details for your developer
grep speakable on home + 2 articles = 0 hitsSearch + newsletter inputs have no programmatic label (WCAG 1.3.1/4.1.2)
HighScreen-reader users cannot identify the search and email fields.
Recommended fix
Add aria-label or visually-hidden label to both inputs
Technical details for your developer
home search (type=search) + email input have no label/aria-label, only placeholderContent-Security-Policy absent on all public pages
HighNo CSP means XSS injection surface is uncapped (3 plugin vectors).
Recommended fix
Add CSP-Report-Only first, then enforce default-src self
Technical details for your developer
No CSP header on home/article (only frame-ancestors on wp-login)Severe SERP visibility gap - 8 ranked keywords, 1 on page 2, rest pos 31-87
HighThe site barely ranks; high-volume terms sit on page 4-8.
Recommended fix
Authority + on-page depth + internal-link the striking-distance pages
Technical details for your developer
DataForSEO VN: 8 kw, best #12; 'claude code' 33,100/mo at #69AI Overview present on target queries but ongboit not cited (page 4-8)
HighSite is crawlable by AI engines but ranks too low to be cited.
Recommended fix
Reach top-10 + add community/authority signals
Technical details for your developer
ai_overview in SERP for claude code gia re/eval/llm; ongboit 39-87No X/Reddit/YouTube/Quora/Wikipedia/Wikidata - highest-weight AI-citation sources absent
HighThe brand has almost no off-site footprint for AI engines to trust.
Recommended fix
Create Wikidata + X + YouTube; recover 16 earned mentions as backlinks
Technical details for your developer
sameAs=4; no X/Reddit/YouTube/WikidataThin backlink profile (1-2 referring domains on ranked kw); DataForSEO Backlinks API inactive
HighAuthority is the #1 blocker for the page-4-8 rankings.
Recommended fix
Backlink outreach + recover earned mentions (H8)
Technical details for your developer
avg referring_domains 1.0-1.3; backlinks_summary 40204Internal links pointing to broken pages — 10 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
10 URLs affected: ongboit.com/keyword-cannibalization/; ongboit.com/keyword-cannibalization/; ongboit.com/keyword-cannibalization/; ongboit.com/codex-seo/; ongboit.com/codex-cli-la-gi/; ongboit.com/obsidian-markdown-cu-phap/ (+4 more)Broken pages returning 4xx — 9 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
9 URLs affected: ongboit.com/internal-link-la-gi/; ongboit.com/google-search-console-la-gi/; ongboit.com/audit-website-2026/; ongboit.com/codex-cli-roadmap/; ongboit.com/codex-cli-n8n-workflow/; ongboit.com/obsidian-markdown-cu-phap/url.md (+3 more)Medium Priority — Fix within 1 month
12 issuesThese improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
robots.txt declares llms.txt as a Sitemap - Google parses text/plain as XML (GSC errors)
MediumA line added this session can trigger Google Search Console sitemap errors.
Recommended fix
Remove the llms.txt Sitemap line from robots.txt (keep sitemap_index.xml)
Technical details for your developer
robots.txt Sitemap: https://ongboit.com/llms.txt; file is text/plainOrganization missing url, description, foundingDate, contactPoint
MediumThe entity anchor Google uses for Knowledge Graph is incomplete.
Recommended fix
Add url/description/foundingDate/contactPoint to Local SEO
Technical details for your developer
Org block has @id/name/logo/sameAs onlyDSAR / Do-Not-Sell routed only to a personal Gmail; no form / privacy@ alias
MediumData-rights requests land in a personal inbox - response-window risk.
Recommended fix
Add a DSAR form + domain alias
Technical details for your developer
policy points to thenguyen.ai.automation@gmail.com onlyComparison tables: 13 th, 0 scope, 0 caption
MediumTables are hard for screen readers to navigate.
Recommended fix
Add scope=col + caption to comparison tables
Technical details for your developer
4 tables on article, 0 scope/captionNo hreflang vi/x-default on any page
MediumVietnamese-locale signal not explicit.
Recommended fix
Add hreflang vi + x-default via Rank Math
Technical details for your developer
0 hreflang on 4 sampled pagesHomepage H1/title lack the primary keyword cluster
MediumHomepage misses crawl-time keyword reinforcement.
Recommended fix
Add keyword cluster to homepage H1/title
Technical details for your developer
H1 brand-narrative only; no Claude Code/n8nsameAs missing Wikidata, X/Twitter, YouTube
MediumMissing the highest-value entity links for LLM graphs.
Recommended fix
Create Wikidata (free), add X/YouTube to sameAs
Technical details for your developer
sameAs=4 (FB/GitHub/TikTok/LinkedIn)TTFB slow on 288/305 URLs - no CDN on Apache origin
MediumServer is slow to first byte; field LCP is still FAST so impact is moderate.
Recommended fix
Front origin with a CDN (Cloudflare)
Technical details for your developer
crawl slow_ttfb=288; baseline 657msBroken 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/n8n-queue-mode/; ongboit.com/vault-structure-claude-code-para/; ongboit.com/mcp-servers-claude-code/; ongboit.com/dataforseo-mcp-setup/; ongboit.com/dataforseo-la-gi/; ongboit.com/dataforseo-pricing/ (+12 more)Duplicate page titles — 16 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
16 URLs affected: ongboit.com; ongboit.com/; ongboit.com/contact/; ongboit.com/contact/?subject=Subscribe/; ongboit.com/contact/?subject=Setup+%26+Deploy/; ongboit.com/contact/?subject=Claude+Code+Training/ (+10 more)Invalid JSON-LD (parse error) — 1 page🔍 site-crawl
MediumA structured-data block has a syntax error, so Google and AI engines silently drop it.
Recommended fix
Fix the malformed JSON-LD — usually an unescaped quote or raw HTML inside a value.
Technical details for your developer
1 URL affected: ongboit.com/llm-la-gi/Indexable pages missing from the sitemap — 12 pages🔍 site-crawl
MediumIndexable pages absent from the XML sitemap are discovered slower.
Recommended fix
Add them to the sitemap, or noindex if not meant to rank.
Technical details for your developer
12 URLs affected: ongboit.com; ongboit.com/contact/?subject=Subscribe/; ongboit.com/contact/?subject=Setup+%26+Deploy/; ongboit.com/contact/?subject=Claude+Code+Training/; ongboit.com/contact/?subject=n8n+Workflow/; ongboit.com/contact/?subject=SEO+%26+AI+Strategy/ (+6 more)Low Priority — Backlog
18 issuesNice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Slow server response (TTFB) — 286 pages🔍 site-crawl
LowMany URLs are slow to first byte.
Recommended fix
Add caching/CDN to cut TTFB.
Technical details for your developer
286 URLs affected: ongboit.com/category/claude-code/; ongboit.com/category/ai-101/; ongboit.com/category/n8n/; ongboit.com/category/self-hosting/; ongboit.com/contact/; ongboit.com/dich-vu/ (+280 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/codex-cli/; ongboit.com/category/claude-code/ (+273 more)Low text-to-HTML ratio — 25 pages🔍 site-crawl
LowHeavy markup versus little text.
Recommended fix
Trim markup or add substantive content.
Technical details for your developer
25 URLs affected: ongboit.com; ongboit.com/; ongboit.com/about/; ongboit.com/category/seo/; ongboit.com/category/codex-cli/; ongboit.com/category/claude-code/ (+19 more)Near-orphan pages (one internal link in) — 20 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
20 URLs affected: ongboit.com/category/ai-101/page/2/; ongboit.com/category/n8n/page/2/; ongboit.com/contact/?subject=Setup+%26+Deploy/; ongboit.com/contact/?subject=Claude+Code+Training/; ongboit.com/contact/?subject=n8n+Workflow/; ongboit.com/contact/?subject=SEO+%26+AI+Strategy/ (+14 more)Duplicate meta descriptions — 18 pages🔍 site-crawl
LowMultiple pages share one meta description.
Recommended fix
Write a unique description per page.
Technical details for your developer
18 URLs affected: ongboit.com; ongboit.com/; ongboit.com/contact/; ongboit.com/contact/?subject=Subscribe/; ongboit.com/contact/?subject=Setup+%26+Deploy/; ongboit.com/contact/?subject=Claude+Code+Training/ (+12 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-marketing-skills/; ongboit.com/claude-code-design-skill/; 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)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-pricing/; ongboit.com/dataforseo-api-tutorial/ (+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/codex-cli/; ongboit.com/category/claude-code/; ongboit.com/category/ai-101/; ongboit.com/category/n8n/; ongboit.com/category/self-hosting/ (+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/codex-cli/; ongboit.com/category/claude-code/; ongboit.com/category/ai-101/; ongboit.com/category/n8n/; ongboit.com/category/self-hosting/ (+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/ai-101/; ongboit.com/category/n8n/; ongboit.com/category/self-hosting/; ongboit.com/chinh-sach-bao-mat/ (+2 more)Multiple H1 tags — 5 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
5 URLs affected: ongboit.com/system-prompt-la-gi/; ongboit.com/dataforseo-mcp-setup/; ongboit.com/dataforseo-la-gi/; ongboit.com/dataforseo-api-tutorial/; ongboit.com/dataforseo-free-trial/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/chinh-sach-bao-mat/; ongboit.com/dieu-khoan-su-dung/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/Meta desc too long — 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.com/tiet-kiem-token-claude-code/HTTP (non-HTTPS) URL in sitemap — 1 page🔍 site-crawl
LowThe sitemap lists an http:// URL.
Recommended fix
Use the https URL.
Technical details for your developer
1 URL affected: ongboit.com/sitemap.xmlMissing header content security policy — 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.comNot 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.comGeo Deep Dive
100/100Rating: Excellent · Primary source: /geo-llmstxt (88/100)
llms.txt fully remediated from a broken 301→404 state to a well-structured, spec-compliant file at HTTP 200. llms-full.txt is newly present at 748 KB with 25 articles and per-article metadata. Score rises from 62 to 88. Remaining gaps are:
- RSL 1.0 license field — medium priority for AI training trust signals;
- missing ETag/Last-Modified response headers — medium priority for crawl efficiency on the large llms-full.txt;
- thin description snippets on 22 links — low effort, high citability upside
Findings from /geo-llmstxt (8)
P2 llms.txt serves HTTP 200 at root — 301→404 redirect chain fully resolved
P2 llms-full.txt present at 200, 748 KB, 25 concatenated articles
P2 Strong structure: H1 + blockquote tagline + 8 organised sections
P2 Core Guides section leads with quantitative citability hooks
P2 RSL 1.0 license declaration absent
P2 No ETag or Last-Modified HTTP response header on llms.txt or llms-full.txt
P3 22 of 28 links lack quantitative description snippets
P2 llms-full.txt listed as Sitemap: in robots.txt (non-standard)
Accessibility Deep Dive
87/100Rating: Good · Primary source: /geo-accessibility (87/100)
ongboit.com sits at 87/100 (AA, good) - up 1 point from the 86 baseline. Two baseline items verified fixed by grep: the author avatar now has alt text (L6) and the footer legal nav link was darkened to #93c5fd giving 9.9:1 contrast on the dark footer (this session's stated change CONFIRMED).
Strong fundamentals persist: lang="vi", single H1 with clean H1->H2->H3 nesting, 26/26 article images with alt, and image-wrapped links all carry accessible names. The remaining AA gaps are unchanged from baseline: the homepage search and newsletter inputs have no programmatic labels (M17, the dominant gap), the icon-only search button has no accessible name, the four article comparison tables have zero th scope and zero captions (L5), and the email field suppresses its focus outline with no replacement (M19, partial).
All are small-effort template-level fixes; muted body text passes AA only marginally (4.55-4.76:1) and is flagged for a safety-margin darken.
Findings from /geo-accessibility (5)
P1 Search and newsletter inputs lack programmatic labels (WCAG 1.3.1 / 4.1.2 / 3.3.2)
Evidence: https://ongboit.com homepage: <input type="search" name="s" placeholder="Tim bai viet..."> and <input type="email" placeholder="Email cua ban"> have no <label for>, no aria-label, no aria-labelledby. Screen readers announce only the role + placeholder (placeholder is not a reliab
Impact: Restores accessible name for 2 primary site interactions (search, newsletter signup) for SR/voice-control users; removes the largest single AA gap.
P2 Data table header cells missing scope and tables missing caption (WCAG 1.3.1)
Evidence: https://ongboit.com/claude-code-la-gi/ : 4 <table>, 13 <th> cells, 0 carry scope="col"/"row", 0 <caption>. Header-to-data association is not programmatically conveyed.
Impact: Lets SR users understand which header governs each data cell in comparison tables; low reach but cheap fix (template-level).
P2 Search submit button is icon-only with no accessible name (WCAG 4.1.2)
Evidence: https://ongboit.com homepage: <button type="submit" ...>🔍</button> contains only an emoji glyph and no aria-label. SR may announce nothing or the literal emoji name.
Impact: Gives the search trigger a clear name (e.g. aria-label="Tim kiem"); pairs with M17 fix in the same search-form template.
P2 Newsletter email input suppresses focus outline with no replacement (WCAG 2.4.7)
Evidence: https://ongboit.com homepage: <input type="email" style="...outline: none;"> has no onfocus/border swap (unlike the search input which restores its border). Keyboard users get no visible focus state on the email field. Theme :focus-visible covers only .menu-toggle.
Impact: Restores keyboard-visible focus on a form control; partial-credit item from baseline M19.
P3 Muted body text contrast passes AA only marginally (WCAG 1.4.3)
Evidence: #64748b on #f8fafc = 4.55:1 and on #ffffff = 4.76:1 (AA normal-text threshold 4.5:1). Passes but with no headroom; any future bg lightening or smaller weight risks failure. Footer legal link itself is fine (#93c5fd 9.9:1).
Impact: Darken muted token to ~#475569 for safety margin and AAA-leaning readability; low priority since currently compliant.
Brand Deep Dive
30/100Rating: Critical · Primary source: /geo-brand-mentions (30/100)
Off-site brand authority essentially unchanged (28->30): entity graph cleaner (Organization + deduped sameAs) but strategic presence gaps remain - no X/Reddit/YouTube/Quora/Wikidata, 16 earned mentions un-recovered. Brand=28 roadmap: off-site account-building + backlink recovery, not a code task.
Findings from /geo-brand-mentions (2)
P1 No X/Twitter, Reddit, YouTube, Quora, Wikipedia/Wikidata - highest-weight AI-citation sources absent
Evidence: sameAs = 4 (FB/GitHub/TikTok/LinkedIn); no X/Reddit/YouTube/Wikidata
Impact: entity confidence + AI citation
P2 16 earned mentions (n8n.community/Medium/IG/FB) do not backlink - recoverable
Evidence: baseline H8
Impact: authority
Findings from /seo-backlinks (1)
P1 Backlinks API unavailable (DataForSEO subscription inactive 40204) + avg referring domains ~1-2 for ranked kw = thin profile
Evidence: backlinks_summary -> 40204; ranked-kw avg referring_domains 1.0-1.3
Impact: Authority is the #1 lever for page-4-8 rankings
Compliance Deep Dive
84/100Rating: Good · Primary source: /geo-compliance (84/100)
ongboit.com compliance jumped from 51/100 (Poor) at the 2026-05-29 baseline to 84/100 (Good). All seven claimed fixes are curl-verified: Google Consent Mode v2 is live with every storage type denied by default and geo-targeted to 32 EEA/EU regions via Complianz; the bilingual VI/EN privacy policy covers GDPR, CCPA and Vietnam PDPD (Decree 13/2023) with data-controller, legal-basis, SCC, cross-border, breach, retention, DPO and Do-Not-Sell sections; Terms of Use is live; /privacy now correctly 301s to the canonical policy; five security headers are present; and the footer exposes Privacy, Terms, Contact and a manage-cookies revocation control.
The tag surface is reduced to a single consent-gated Google Tag with no third-party trackers observed pre-consent. Two medium gaps remain: there is no Content-Security-Policy header (HSTS also lacks includeSubDomains/preload), and DSAR / CCPA Do-Not-Sell requests are routed only to a personal Gmail inbox rather than a dedicated form or branded privacy alias.
GTM auto-PII disablement is asserted but not externally verifiable via curl.
Sub-component scores
| Component | Score | Rating |
|---|---|---|
| Cookie Consent Banner | 95/100 | Excellent |
| Consent Mode V2 | 95/100 | Excellent |
| Privacy Policy Quality | 88/100 | Good |
| Terms Of Use | 90/100 | Excellent |
| Security Headers | 72/100 | Fair |
| Dsar Mechanism | 60/100 | Fair |
| Third Party Tags | 85/100 | Good |
| Data Subject Rights | 85/100 | Good |
| Footer Legal Links | 100/100 | Excellent |
| Privacy Redirect | 100/100 | Excellent |
Findings from /geo-compliance (8)
P2 Google Consent Mode v2 active with all storage denied by default (EEA geo-targeted)
Evidence: curl https://ongboit.com/ -> gtag('consent','default',{"ad_personalization":"denied","ad_storage":"denied","ad_user_data":"denied","analytics_storage":"denied","functionality_storage":"denied","security_storage":"denied","personalization_storage":"denied","region":[32 EEA/EU ISO
Impact: high
P2 Bilingual privacy policy covers GDPR, CCPA and Vietnam PDPD (Decree 13/2023)
Evidence: curl https://ongboit.com/chinh-sach-bao-mat/ -> 'GDPR' x13, 'CCPA' x7, 'Decree 13' + 'Nghị định 13' + 'Personal Data Protection' (PDPD). Fields present: 'Data controller', 'Standard Contractual' (SCCs x2), 'legal basis'/'Cơ sở pháp lý', 'Data breach'/'vi phạm dữ liệu', 'DPO'/'Dat
Impact: high
P2 /privacy now 301-redirects to canonical policy (was redirecting to a blog post at baseline)
Evidence: curl -sI https://ongboit.com/privacy -> HTTP/1.1 301 Moved Permanently; Location: https://ongboit.com/chinh-sach-bao-mat/. Baseline (2026-05-29) redirected to an unrelated blog post.
Impact: medium
P2 Five security headers present (HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy)
Evidence: curl -sI https://ongboit.com/ -> Strict-Transport-Security: max-age=31536000; X-Frame-Options: SAMEORIGIN; X-Content-Type-Options: nosniff; Referrer-Policy: strict-origin-when-cross-origin; Permissions-Policy: camera=(), microphone=(), geolocation=(), browsing-topics=().
Impact: medium
P2 No Content-Security-Policy header and HSTS lacks includeSubDomains/preload
Evidence: curl -sI https://ongboit.com/ shows no Content-Security-Policy, no Cross-Origin-Opener-Policy / Cross-Origin-Resource-Policy, and no X-XSS-Protection. HSTS = 'max-age=31536000' only (no includeSubDomains, no preload). 5/7 of the standard header set present; CSP is the highest-val
Impact: medium
P2 DSAR / data-subject-rights request routed only to a personal Gmail address
Evidence: curl https://ongboit.com/chinh-sach-bao-mat/ -> rights-exercise contact is mailto:thenguyen.ai.automation@gmail.com (x4); 'thực hiện quyền' present but no dedicated DSAR web form, no privacy@/dpo@ branded alias, no 'Do Not Sell' opt-out form (CCPA expects a request mechanism). Po
Impact: medium
P2 Footer carries all required legal links incl. manage-cookies control
Evidence: curl https://ongboit.com/ footer -> chinh-sach-bao-mat (Privacy), dieu-khoan-su-dung (Terms), contact x6, cmplz-manage-consent x8 (Complianz manage-cookies revocation control). Terms page /dieu-khoan-su-dung/ returns HTTP 200.
Impact: low
P2 Only a single first-party Google Tag fires; no Meta/Hotjar/Clarity trackers detected pre-consent
Evidence: curl https://ongboit.com/ -> only gtag/js?id=GT-K8HP8DDM present; no googletagmanager.com/gtm, facebook.net, hotjar, clarity.ms, or doubleclick references on the homepage. Tag is gated behind the Consent Mode v2 default-denied block, so analytics/ads storage stays denied until op
Impact: medium
🔍 Full-crawl per-URL findings (1 deterministic issues — every page scanned, complements the AI score above)
missing header content security policy — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | CSP |
Platform Deep Dive
60/100Rating: Fair · Primary source: /geo-platform-optimizer (60/100)
AI-platform crawl/ingest foundation is now strong (robots AI-crawlers 97, llms.txt 88, llms-full present) - infrastructure side fixed. But actual citation requires top-10 ranking + community/authority, still weak (page 4-8, no Reddit/X). Strategic, off-site.
Findings from /geo-platform-optimizer (2)
P1 AI Overview shown on target queries but ongboit not cited (page 4-8 < citation threshold)
Evidence: DataForSEO ai_overview for claude code gia re/eval/llm; ongboit rank 39-87
Impact: AIO/ChatGPT/Perplexity citation
P2 Perplexity/ChatGPT topical surfacing absent - community-validation gap
Evidence: baseline M24; no Reddit/community signals
Impact: AI citation
Schema Deep Dive
74/100Rating: Fair · Primary source: /geo-schema (74/100)
Score improved from 62 to 74 (+12 points). All major structural fixes confirmed live: Organization entity (@id #organization) with logo and sameAs 4 platforms, no duplicate Organization block, Author Person with E-E-A-T properties (jobTitle, knowsAbout, sameAs, worksFor), FAQPage on sampled articles, BreadcrumbList, WebSite+SearchAction.
Critical gap: speakable property was claimed as fixed in baseline notes but is NOT present in any live page HTML — zero hits on 3 sampled pages. This is the highest-priority remaining action (10 pts). Secondary gaps: Organization lacks url, description, foundingDate; Person lacks description bio; BlogPosting lacks wordCount; sameAs missing Wikipedia/Wikidata/YouTube.
JSON-LD is server-rendered across all pages — no AI crawler visibility risk.
Findings from /geo-schema (9)
P1 speakable NOT found live — claimed fix is unconfirmed
Evidence: grep for 'speakable' across raw HTML of homepage, /claude-code-la-gi/, and /n8n-pricing/ returns 0 hits. fetch_page.py structured_data also shows no speakable property on BlogPosting or WebPage types. Baseline noted speakable present on snippet #5 — this is not confirmed in today
Impact: Medium-high: speakable is the most direct AI-assistant signal. Its absence means AI voice assistants and AI crawlers cannot identify the most citable passages without inference.
P2 Organization missing url, description, foundingDate, contactPoint
Evidence: Organization @graph block keys: ['@type', '@id', 'name', 'sameAs', 'logo']. url=MISSING, description=MISSING, foundingDate=MISSING, contactPoint=MISSING, address=MISSING, founder=MISSING. These were listed as intended additions (founder was mentioned in baseline comparison notes)
Impact: Medium: url and description are E-E-A-T signals that help AI models build a complete entity graph. Without url, Google cannot confidently resolve the @id anchor to a canonical site.
P2 Organization sameAs missing Wikipedia, Wikidata, YouTube — 4 platforms only
Evidence: Organization sameAs=['https://www.facebook.com/ongboitvuitinh/', 'https://github.com/thenguyenvn90', 'https://www.tiktok.com/@ongbo.it', 'https://www.linkedin.com/in/minh-the-nguyen-6b995960']. Wikipedia, Wikidata, YouTube not present. Baseline noted these as 'strategic, still op
Impact: High for AI entity resolution: Wikipedia and Wikidata are the strongest cross-platform entity signals for LLMs. YouTube is a high-authority platform signal. Adding them would push sameAs score from 10 to 15.
P3 Person sameAs contains duplicate LinkedIn entry (http vs https)
Evidence: Person sameAs includes both 'https://www.linkedin.com/in/minh-the-nguyen-6b995960' and 'https://linkedin.com/in/minh-the-nguyen-6b995960' (missing www prefix). These resolve to the same URL but signal inconsistency.
Impact: Low: not a validation error, but clean sameAs arrays send stronger entity signals. Remove the www-less variant.
P3 Person schema missing description (author bio text)
Evidence: Person block keys: ['@type', '@id', 'name', 'url', 'image', 'sameAs', 'worksFor', 'jobTitle', 'knowsAbout']. description=MISSING. A bio string like 'DevOps Engineer and AI Vibe Coder helping Vietnamese developers automate with Claude Code and n8n' would complete the E-E-A-T perso
Impact: Low-medium: description strengthens author entity for AI citation decisions, especially for 'who wrote this?' queries.
P3 BlogPosting missing wordCount
Evidence: BlogPosting keys on both sampled articles: ['@type', 'headline', 'keywords', 'datePublished', 'dateModified', 'articleSection', 'author', 'publisher', 'description', 'name', '@id', 'isPartOf', 'image', 'inLanguage', 'mainEntityOfPage']. wordCount=MISSING.
Impact: Low: wordCount is a recommended (not required) property. Signals content depth to AI models that use schema to assess comprehensiveness before citation.
P2 FAQPage present — restricted since Aug 2023, but appropriate to retain for AI semantics
Evidence: FAQPage confirmed on /claude-code-la-gi/ (9 questions) and /n8n-pricing/ (7 questions) as separate JSON-LD blocks outside the main @graph. Syntactically valid. mainEntity uses Question/@type and Answer/@type correctly.
Impact: No rich result eligibility for non-authority sites, but schema provides strong Q&A semantic structure for AI crawlers (GPTBot, ClaudeBot, PerplexityBot). Retain. Do NOT remove.
P2 Organization url property absent — Google entity anchor incomplete
Evidence: The Organization @id is 'https://ongboit.com/#organization' which is an internal anchor, not the canonical site URL. Without a url property ('https://ongboit.com/'), Google's Knowledge Graph and AI models cannot cleanly link the Organization entity to the domain.
Impact: Medium: url is a recommended property for Organization and strongly expected by Google's structured data documentation for Knowledge Panel eligibility.
🔍 Full-crawl per-URL findings (11 deterministic issues — every page scanned, complements the AI score above)
schema invalid jsonld — 1 URL
| URL |
|---|
| https://ongboit.com/llm-la-gi/ |
schema incomplete — 10 URLs
| URL | Missing properties |
|---|---|
| https://ongboit.com/category/seo/ | Organization: missing logo |
| https://ongboit.com/category/codex-cli/ | Organization: missing logo |
| https://ongboit.com/category/claude-code/ | Organization: missing logo |
| https://ongboit.com/category/ai-101/ | Organization: missing logo |
| https://ongboit.com/category/n8n/ | Organization: missing logo |
| https://ongboit.com/category/self-hosting/ | Organization: missing logo |
| https://ongboit.com/dich-vu/ | Article: missing image |
| https://ongboit.com/blog/ | Organization: missing logo |
| https://ongboit.com/chinh-sach-bao-mat/ | Article: missing image |
| https://ongboit.com/dieu-khoan-su-dung/ | Article: missing image |
Technical Deep Dive
74/100Rating: Fair · Primary source: /geo-technical (74/100)
Reaudit of https://ongboit.com on 2026-06-16 vs baseline 2026-05-29 (score 78). Technical score: 74/100. The site is a WordPress installation with strong server-side rendering (all content visible in initial HTML, AI crawlers can read everything), good meta tag coverage, clean URL structure, and correct mobile viewport configuration.
The robots.txt is exemplary for AI SEO — 11 AI crawlers explicitly welcomed. The 5 claimed security header fixes are PARTIALLY verified: all 5 headers are now present in live responses (HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy), but HSTS is missing the includeSubDomains directive.
CRITICAL FINDING: the xmlrpc.php 'disabled' claim is FALSE — a live POST with system.listMethods returns HTTP 200 and exposes 80 methods including pingback.ping, wp.newPost, and wp.uploadFile. The GET endpoint returning 405 was misread as disabled; this is standard HTTP behavior for a POST-only endpoint.
Immediate action required: block xmlrpc.php at the Apache level. CSP remains absent on all public pages (intentionally deferred per this session's scope). Score regression vs baseline is attributable to the confirmed-false xmlrpc claim now being weighted as an open P0 rather than a resolved item.
Cross-checked by: seo-page: 74/100
Findings from /geo-technical (8)
P0 xmlrpc.php FULLY FUNCTIONAL — claimed fix is false
Evidence: curl -X POST https://ongboit.com/xmlrpc.php with system.listMethods payload returns HTTP 200 and lists 80 methods including pingback.ping, pingback.extensions.getPingbacks, wp.newPost, wp.editPost, wp.deletePost, wp.uploadFile, wp.deleteFile, wp.getUsers, metaWeblog.newPost, blog
Impact: critical — active attack vector, pingback abuse and credential stuffing risk; also Google flags xmlrpc brute-force as a security signal
P1 Content-Security-Policy (CSP) absent on all public pages
Evidence: curl -sI https://ongboit.com/ — no Content-Security-Policy header in response. Confirmed across 4 separate header fetches. wp-login.php has CSP frame-ancestors 'self' only. Homepage and article pages: no CSP. Risk: XSS attacks can inject arbitrary scripts. Also affects AI crawler
Impact: high — XSS attack surface, browser security warnings in future Chrome versions, negative trust signal
P2 HSTS missing includeSubDomains directive
Evidence: curl -sI https://ongboit.com/ returns: Strict-Transport-Security: max-age=31536000 — no includeSubDomains, no preload. grep 'includeSubDomains' count=0. Best practice: max-age=31536000; includeSubDomains. Without includeSubDomains, subdomains (e.g., www.ongboit.com, any future su
Impact: medium — subdomain downgrade attack vector; also fails HSTS preload list eligibility
P2 Meta description below optimal length (128 chars vs 150-160 target)
Evidence: Extracted from live HTML: <meta name="description" content="Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation."/> — echo -n [...] | wc -c = 128 characters. Google typically displays 150-160 chars; truncation at 12
Impact: low — reduced CTR from search results, Google may rewrite with its own snippet
P2 CLS risk — images missing explicit width/height attributes
Evidence: WebFetch analysis of homepage HTML: 'Multiple images present without explicit width/height attributes — Logo image, Article featured images'. WordPress wp-img-auto-sizes CSS present (WP 6.7 auto-sizes feature) but contain-intrinsic-size fallback (3000px 1500px) is a rough estimat
Impact: medium — CLS is a Core Web Vital and a Google ranking factor; layout shifts harm UX and scores
P3 robots.txt Sitemap directive points to llms.txt (non-standard)
Evidence: robots.txt line: 'Sitemap: https://ongboit.com/llms.txt' — llms.txt is a plain-text AI model context file, not an XML sitemap. The Sitemap: directive in robots.txt is expected to point to XML sitemaps. Search engine crawlers (Googlebot, Bingbot) that parse Sitemap: directives wil
Impact: low — may cause crawl errors in GSC for invalid sitemap; no ranking impact but creates noise
P3 No preload hints for critical above-fold resources
Evidence: curl -sv https://ongboit.com/ head section: preconnect to fonts.googleapis.com and fonts.gstatic.com present (good). dns-prefetch for googletagmanager.com and pagead2.googlesyndication.com present. No <link rel=preload> for hero image, critical CSS, or web fonts. Google Fonts loa
Impact: low-medium — incremental LCP improvement; not a ranking blocker but affects CWV scores
P3 Server version exposed in response header
Evidence: curl -sI https://ongboit.com/ returns: Server: Apache/2.4.66 (Debian) — full version and OS disclosed. Also X-Powered-By absent (good — PHP version not exposed in main headers, though present on xmlrpc.php: X-Powered-By: PHP/8.3.30). Apache version disclosure enables targeted exp
Impact: low — informational; reduces targeted attack surface
Findings from /seo-page (13)
P3 Robots meta tag order anomaly site-wide (3 of 4 pages)
Evidence: Homepage, /n8n-pricing/, /advisor-strategy-claude-code/ all render 'follow, index' instead of standard 'index, follow'. /claude-code-la-gi/ correctly shows 'index, follow'. Rank Math PRO inconsistently applies order depending on post type or template. Google treats both as valid,
Impact: low
P2 No hreflang tags on any page — Vietnamese-language site without locale signals
Evidence: All 4 pages returned zero hreflang attributes. Site is 100% Vietnamese-language content targeting Vietnamese readers. Without hreflang vi and x-default, Google may not correctly associate the site with vi locale in international results. HTML lang='vi' is set at <html> level (obs
Impact: medium
P2 Heading hierarchy skip on /advisor-strategy-claude-code/ — H3 before first H2
Evidence: Heading sequence begins: H1 > H3 (TL;DR) > H2 > H2 ... The TL;DR summary block uses an H3 with no parent H2, violating document outline semantics. WCAG 1.3.1 (Info and Relationships) requires heading levels to reflect document structure. This also degrades crawlability: the TL;DR
Impact: medium
P2 Homepage H1 does not contain primary keyword
Evidence: Homepage H1 is 'Hành Trình Zero → Hero với AI Coding và Automation' — narrative/brand-voice framing with no mention of 'Claude Code', 'AI coding assistant', 'self-hosting', or the primary keyword clusters the site targets. Title tag also omits a topical keyword, relying entirely
Impact: medium
P3 Brand name absent from article title tags (3 blog posts)
Evidence: Homepage title includes '| Ông Bố IT' brand suffix. All 3 blog post titles omit brand: 'Claude Code Là Gì? Giải Thích Đơn Giản + So Sánh 2026' (53 chars), 'n8n Pricing 2026: Cloud $24-$50/Tháng + 3 Pattern Tiết Kiệm' (59 chars), 'Advisor Strategy Claude Code: Dùng Opus Rẻ Hơn 73%
Impact: low
P3 No visible breadcrumb DOM — schema-only BreadcrumbList
Evidence: All 3 article pages have BreadcrumbList in JSON-LD (confirmed by schema_types extraction), but zero breadcrumb-class HTML elements were found in any page DOM. Google's breadcrumb rich result requires consistent JSON-LD + visible HTML breadcrumb for reliable eligibility. Schema-on
Impact: medium
P3 Homepage meta description below optimal length (117 chars)
Evidence: Homepage meta description is 117 characters: 'Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation.' Optimal range for Vietnamese SERP is 140-155 chars (Google typically displays ~155-160 chars in desktop SERP snippe
Impact: low
P2 All 4 pages have 100% image alt coverage — strong baseline
Evidence: Homepage: 12/12 images with non-empty alt. /claude-code-la-gi/: 26/26. /n8n-pricing/: 21/21. /advisor-strategy-claude-code/: 19/19. Zero empty alt attributes and zero missing alt attributes across 78 total images. This is a genuine strength — above-average for WordPress sites in
Impact: none
🔍 Full-crawl per-URL findings (178 deterministic issues — every page scanned, complements the AI score above)
links to broken page — 10 URLs
| URL | Broken target |
|---|---|
| https://ongboit.com/keyword-cannibalization/ | https://ongboit.com/google-search-console-la-gi/ |
| https://ongboit.com/keyword-cannibalization/ | https://ongboit.com/internal-link-la-gi/ |
| https://ongboit.com/keyword-cannibalization/ | https://ongboit.com/audit-website-2026/ |
| https://ongboit.com/codex-seo/ | https://ongboit.com/codex-cli-roadmap/ |
| https://ongboit.com/codex-cli-la-gi/ | https://ongboit.com/codex-cli-n8n-workflow/ |
| 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/wiki-lint-fold-maintenance/ | https://ongboit.com/wiki-lint-fold-maintenance/path/ |
| https://ongboit.com/obsidian-memory-3-layer-architecture/ | https://ongboit.com/obsidian-memory-3-layer-architecture/page-name.md |
4xx error — 9 URLs
broken external link — 18 URLs
| URL | Broken URL |
|---|---|
| https://ongboit.com/n8n-queue-mode/ | https://blog.n8n.io/scaling-n8n/ |
| https://ongboit.com/vault-structure-claude-code-para/ | https://fortelabs.com/blog/the-para-method-for-organizing-information/ |
| https://ongboit.com/mcp-servers-claude-code/ | https://developers.cloudflare.com/mcp/ |
| https://ongboit.com/dataforseo-mcp-setup/ | https://dataforseo.com/about |
| https://ongboit.com/dataforseo-la-gi/ | https://tracxn.com/d/companies/dataforseo/ |
| https://ongboit.com/dataforseo-pricing/ | https://dataforseo.com/about |
| https://ongboit.com/dataforseo-api-tutorial/ | https://dataforseo.com/about |
| https://ongboit.com/dataforseo-serp-api/ | https://dataforseo.com/about |
| https://ongboit.com/dataforseo-review/ | https://docs.dataforseo.com/v3/serp/ |
| https://ongboit.com/dataforseo-vs-ahrefs/ | https://dataforseo.com/about |
| https://ongboit.com/dataforseo-backlinks-api/ | https://dataforseo.com/about |
| https://ongboit.com/claude-code-github/ | https://github.com/avalonreset-pro/claude-github |
| https://ongboit.com/harness-design-long-running-agent/ | https://www.anthropic.com/engineering/harness-design-for-long-running-applicatio |
| https://ongboit.com/claude-managed-agents-dreaming-outcomes/ | https://www.anthropic.com/news/claude-managed-agents |
| https://ongboit.com/claude-for-small-business/ | https://www.anthropic.com/small-business |
| https://ongboit.com/claude-code-audit-technical-seo/ | https://www.amsive.com/insights/seo/ai-overviews-impact-on-organic-search/ |
| https://ongboit.com/claude-code-vps/ | https://www.futuremarketinsights.com/reports/vps-hosting-market |
| https://ongboit.com/dataforseo-free-trial/ | https://tracxn.com/d/companies/dataforseo/ |
duplicate title — 16 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 | 8 pages |
| https://ongboit.com/contact/?subject=Subscribe/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 pages |
| https://ongboit.com/contact/?subject=Setup+%26+Deploy/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 pages |
| https://ongboit.com/contact/?subject=Claude+Code+Training/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 pages |
| https://ongboit.com/contact/?subject=n8n+Workflow/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 pages |
| https://ongboit.com/contact/?subject=SEO+%26+AI+Strategy/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 pages |
| https://ongboit.com/contact/?subject=GEO+AI+Search+Optimization/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 pages |
| https://ongboit.com/contact/?subject=Content+Portfolio+Refresh+Writing/ | Liên Hệ Ông Bố IT, Tư Vấn Claude Code & AI Workflow | 8 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 |
low text html ratio — 25 URLs
one dofollow incoming — 20 URLs
duplicate meta desc — 18 URLs
| URL | Meta description | Dupes |
|---|---|---|
| https://ongboit.com | Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation. | 2 pages |
| https://ongboit.com/ | Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation. | 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. | 8 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. | 8 pages |
| https://ongboit.com/contact/?subject=Setup+%26+Deploy/ | 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. | 8 pages |
| https://ongboit.com/contact/?subject=Claude+Code+Training/ | 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. | 8 pages |
| https://ongboit.com/contact/?subject=n8n+Workflow/ | 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. | 8 pages |
| https://ongboit.com/contact/?subject=SEO+%26+AI+Strategy/ | 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. | 8 pages |
| https://ongboit.com/contact/?subject=GEO+AI+Search+Optimization/ | 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. | 8 pages |
| https://ongboit.com/contact/?subject=Content+Portfolio+Refresh+Writing/ | 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. | 8 pages |
| https://ongboit.com/chinh-sach-bao-mat/ | Cập nhật lần cuối: 16/06/2026 | 2 pages |
| https://ongboit.com/dieu-khoan-su-dung/ | 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
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/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/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/chinh-sach-bao-mat/ | Cập nhật lần cuối: 16/06/2026 | 29c |
| https://ongboit.com/dieu-khoan-su-dung/ | 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/chinh-sach-bao-mat/ | Chính Sách Bảo Mật | 140px |
| https://ongboit.com/dieu-khoan-su-dung/ | Điều Khoản Sử Dụng | 140px |
h1 multiple — 5 URLs
h1 title duplicate — 3 URLs
| URL |
|---|
| https://ongboit.com/dich-vu/ |
| https://ongboit.com/chinh-sach-bao-mat/ |
| https://ongboit.com/dieu-khoan-su-dung/ |
too many links — 2 URLs
| URL | Links |
|---|---|
| https://ongboit.com/claude-code-roadmap/ | 271 |
| https://ongboit.com/claude-code-la-gi/ | 159 |
meta desc too long — 1 URL
| URL | Meta description | Length |
|---|---|---|
| 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 |
Google-Api Deep Dive
48/100Rating: Poor · Primary source: /seo-google (48/100)
SERP visibility weak but improving: 8 ranked keywords (VN) vs baseline 4, best #12. High-volume terms still page 4-8. AI Overview appears on target queries but ongboit below the citation threshold. Strategic authority/backlink gap, not addressed this session.
Findings from /seo-google (2)
P1 Severe SERP visibility gap - 8 ranked keywords, only 1 on page 2 (rest pos 31-87)
Evidence: DataForSEO domain_rank_overview VN count=8, best rank_group=12; 'claude code' (33,100/mo) only #69
Impact: Top-10 for 2-3 mid-volume kw -> 10-20x current 92 ETV
P1 AI Overview present on target SERPs but ongboit not cited (page 4-8 < AIO source threshold)
Evidence: ai_overview in serp_item_types for claude code gia re/eval/llm; ongboit rank 39-87
Impact: AIO citation eligibility
Image Deep Dive
80/100Rating: Good · Primary source: /seo-performance (71/100)
Field Core Web Vitals FAST (CrUX desktop LCP 1.09s / INP 38ms / CLS 0.03). Lab mobile perf 82. Main gap: origin TTFB slow (no CDN, 288/305 URLs) - infra (H10), unchanged. Field CWV FAST caps real-world severity at P2.
Findings from /seo-performance (2)
P2 TTFB slow on 288/305 crawled URLs - no CDN on Apache origin
Evidence: crawl-summary slow_ttfb=288; baseline TTFB 657ms
Impact: LCP headroom + crawl budget; field LCP already FAST so impact moderate
P3 Large HTML on 279 URLs
Evidence: crawl-summary large_html=279
Impact: transfer size
Page-Deep-Dive Deep Dive
74/100Rating: Fair · Primary source: /seo-page (74/100)
ongboit.com demonstrates a strong on-page SEO baseline for a Vietnamese-language WordPress blog: all 4 pages pass canonical self-referencing, have 100% image alt coverage (78/78 images), no noindex anomalies, and the 3 article pages carry deep structured data (BlogPosting + FAQPage + BreadcrumbList + Person).
Meta descriptions are well-crafted and within length targets on article pages. The site has 4 prioritized gaps:
- No hreflang vi/x-default on any page — highest-leverage fix for Vietnamese GEO/AI-search citation surface;
- robots meta order 'follow, index' on 3 pages — Rank Math settings inconsistency, low severity but indicates config drift;
- BreadcrumbList exists only in JSON-LD without visible DOM breadcrumb — reduces reliability for Google rich result eligibility
Homepage H1 lacks keyword relevance, which is a missed topical authority signal for the site's primary topic cluster (Claude Code + AI coding). Overall score: 74/100.
Findings from /seo-page (13)
P3 Robots meta tag order anomaly site-wide (3 of 4 pages)
Evidence: Homepage, /n8n-pricing/, /advisor-strategy-claude-code/ all render 'follow, index' instead of standard 'index, follow'. /claude-code-la-gi/ correctly shows 'index, follow'. Rank Math PRO inconsistently applies order depending on post type or template. Google treats both as valid,
Impact: low
P2 No hreflang tags on any page — Vietnamese-language site without locale signals
Evidence: All 4 pages returned zero hreflang attributes. Site is 100% Vietnamese-language content targeting Vietnamese readers. Without hreflang vi and x-default, Google may not correctly associate the site with vi locale in international results. HTML lang='vi' is set at <html> level (obs
Impact: medium
P2 Heading hierarchy skip on /advisor-strategy-claude-code/ — H3 before first H2
Evidence: Heading sequence begins: H1 > H3 (TL;DR) > H2 > H2 ... The TL;DR summary block uses an H3 with no parent H2, violating document outline semantics. WCAG 1.3.1 (Info and Relationships) requires heading levels to reflect document structure. This also degrades crawlability: the TL;DR
Impact: medium
P2 Homepage H1 does not contain primary keyword
Evidence: Homepage H1 is 'Hành Trình Zero → Hero với AI Coding và Automation' — narrative/brand-voice framing with no mention of 'Claude Code', 'AI coding assistant', 'self-hosting', or the primary keyword clusters the site targets. Title tag also omits a topical keyword, relying entirely
Impact: medium
P3 Brand name absent from article title tags (3 blog posts)
Evidence: Homepage title includes '| Ông Bố IT' brand suffix. All 3 blog post titles omit brand: 'Claude Code Là Gì? Giải Thích Đơn Giản + So Sánh 2026' (53 chars), 'n8n Pricing 2026: Cloud $24-$50/Tháng + 3 Pattern Tiết Kiệm' (59 chars), 'Advisor Strategy Claude Code: Dùng Opus Rẻ Hơn 73%
Impact: low
P3 No visible breadcrumb DOM — schema-only BreadcrumbList
Evidence: All 3 article pages have BreadcrumbList in JSON-LD (confirmed by schema_types extraction), but zero breadcrumb-class HTML elements were found in any page DOM. Google's breadcrumb rich result requires consistent JSON-LD + visible HTML breadcrumb for reliable eligibility. Schema-on
Impact: medium
P3 Homepage meta description below optimal length (117 chars)
Evidence: Homepage meta description is 117 characters: 'Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation.' Optimal range for Vietnamese SERP is 140-155 chars (Google typically displays ~155-160 chars in desktop SERP snippe
Impact: low
P2 All 4 pages have 100% image alt coverage — strong baseline
Evidence: Homepage: 12/12 images with non-empty alt. /claude-code-la-gi/: 26/26. /n8n-pricing/: 21/21. /advisor-strategy-claude-code/: 19/19. Zero empty alt attributes and zero missing alt attributes across 78 total images. This is a genuine strength — above-average for WordPress sites in
Impact: none
Performance Deep Dive
71/100Rating: Fair · Primary source: /seo-performance (71/100)
Field Core Web Vitals FAST (CrUX desktop LCP 1.09s / INP 38ms / CLS 0.03). Lab mobile perf 82. Main gap: origin TTFB slow (no CDN, 288/305 URLs) - infra (H10), unchanged. Field CWV FAST caps real-world severity at P2.
Cross-checked by: geo-technical: 74/100seo-google: 48/100
Findings from /seo-performance (2)
P2 TTFB slow on 288/305 crawled URLs - no CDN on Apache origin
Evidence: crawl-summary slow_ttfb=288; baseline TTFB 657ms
Impact: LCP headroom + crawl budget; field LCP already FAST so impact moderate
P3 Large HTML on 279 URLs
Evidence: crawl-summary large_html=279
Impact: transfer size
Findings from /geo-technical (8)
P0 xmlrpc.php FULLY FUNCTIONAL — claimed fix is false
Evidence: curl -X POST https://ongboit.com/xmlrpc.php with system.listMethods payload returns HTTP 200 and lists 80 methods including pingback.ping, pingback.extensions.getPingbacks, wp.newPost, wp.editPost, wp.deletePost, wp.uploadFile, wp.deleteFile, wp.getUsers, metaWeblog.newPost, blog
Impact: critical — active attack vector, pingback abuse and credential stuffing risk; also Google flags xmlrpc brute-force as a security signal
P1 Content-Security-Policy (CSP) absent on all public pages
Evidence: curl -sI https://ongboit.com/ — no Content-Security-Policy header in response. Confirmed across 4 separate header fetches. wp-login.php has CSP frame-ancestors 'self' only. Homepage and article pages: no CSP. Risk: XSS attacks can inject arbitrary scripts. Also affects AI crawler
Impact: high — XSS attack surface, browser security warnings in future Chrome versions, negative trust signal
P2 HSTS missing includeSubDomains directive
Evidence: curl -sI https://ongboit.com/ returns: Strict-Transport-Security: max-age=31536000 — no includeSubDomains, no preload. grep 'includeSubDomains' count=0. Best practice: max-age=31536000; includeSubDomains. Without includeSubDomains, subdomains (e.g., www.ongboit.com, any future su
Impact: medium — subdomain downgrade attack vector; also fails HSTS preload list eligibility
P2 Meta description below optimal length (128 chars vs 150-160 target)
Evidence: Extracted from live HTML: <meta name="description" content="Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation."/> — echo -n [...] | wc -c = 128 characters. Google typically displays 150-160 chars; truncation at 12
Impact: low — reduced CTR from search results, Google may rewrite with its own snippet
P2 CLS risk — images missing explicit width/height attributes
Evidence: WebFetch analysis of homepage HTML: 'Multiple images present without explicit width/height attributes — Logo image, Article featured images'. WordPress wp-img-auto-sizes CSS present (WP 6.7 auto-sizes feature) but contain-intrinsic-size fallback (3000px 1500px) is a rough estimat
Impact: medium — CLS is a Core Web Vital and a Google ranking factor; layout shifts harm UX and scores
P3 robots.txt Sitemap directive points to llms.txt (non-standard)
Evidence: robots.txt line: 'Sitemap: https://ongboit.com/llms.txt' — llms.txt is a plain-text AI model context file, not an XML sitemap. The Sitemap: directive in robots.txt is expected to point to XML sitemaps. Search engine crawlers (Googlebot, Bingbot) that parse Sitemap: directives wil
Impact: low — may cause crawl errors in GSC for invalid sitemap; no ranking impact but creates noise
P3 No preload hints for critical above-fold resources
Evidence: curl -sv https://ongboit.com/ head section: preconnect to fonts.googleapis.com and fonts.gstatic.com present (good). dns-prefetch for googletagmanager.com and pagead2.googlesyndication.com present. No <link rel=preload> for hero image, critical CSS, or web fonts. Google Fonts loa
Impact: low-medium — incremental LCP improvement; not a ranking blocker but affects CWV scores
P3 Server version exposed in response header
Evidence: curl -sI https://ongboit.com/ returns: Server: Apache/2.4.66 (Debian) — full version and OS disclosed. Also X-Powered-By absent (good — PHP version not exposed in main headers, though present on xmlrpc.php: X-Powered-By: PHP/8.3.30). Apache version disclosure enables targeted exp
Impact: low — informational; reduces targeted attack surface
Findings from /seo-google (2)
P1 Severe SERP visibility gap - 8 ranked keywords, only 1 on page 2 (rest pos 31-87)
Evidence: DataForSEO domain_rank_overview VN count=8, best rank_group=12; 'claude code' (33,100/mo) only #69
Impact: Top-10 for 2-3 mid-volume kw -> 10-20x current 92 ETV
P1 AI Overview present on target SERPs but ongboit not cited (page 4-8 < AIO source threshold)
Evidence: ai_overview in serp_item_types for claude code gia re/eval/llm; ongboit rank 39-87
Impact: AIO citation eligibility
🔍 Full-crawl per-URL findings (567 deterministic issues — every page scanned, complements the AI score above)
slow ttfb — 286 URLs
large html — 279 URLs
not compressed — 1 URL
| URL |
|---|
| https://ongboit.com |
no cache control — 1 URL
| URL |
|---|
| https://ongboit.com |
Sitemap Deep Dive
76/100Rating: Good · Primary source: /seo-sitemap (76/100)
Sitemap architecture healthy (305 URLs, 70 legit noindex tag/category pages, current lastmod). New minor issue: robots.txt 'Sitemap: llms.txt' (added this session) points Googlebot at a plain-text file as if XML - remove to avoid GSC parse errors.
Findings from /seo-sitemap (3)
P2 11 indexable pages not in sitemap
Evidence: crawl-summary indexable_not_in_sitemap=11
Impact: discovery
P2 robots.txt declares llms.txt as Sitemap - Google parses text/plain as XML sitemap -> GSC errors
Evidence: robots.txt 'Sitemap: https://ongboit.com/llms.txt'; llms.txt is text/plain not XML
Impact: avoids GSC sitemap parse errors
P3 1 http URL in sitemap
Evidence: crawl-summary http_url_in_sitemap=1
Impact: minor
🔍 Full-crawl per-URL findings (13 deterministic issues — every page scanned, complements the AI score above)
indexable not in sitemap — 12 URLs
http url in sitemap — 1 URL
| URL |
|---|
| https://ongboit.com/sitemap.xml |
Visual Deep Dive
80/100Rating: Good · Primary source: /seo-visual (80/100)
Above-fold renders cleanly; field CLS ~0.03 (FAST). Footer legal-link contrast fixed this session (9.9:1). Minor: muted body text passes AA only marginally; email input lacks a visible focus indicator.
Findings from /seo-visual (2)
P3 Muted body text #64748b ~4.55-4.76:1 passes AA marginally
Evidence: geo-accessibility contrast math
Impact: readability margin
P2 Email input outline:none with no visible focus replacement
Evidence: geo-accessibility M19 partial
Impact: keyboard-nav visibility
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.
Fig 1: Core Web Vitals — field data — desktop (CrUX/PSI; PSI/CrUX 2026-06-12 snapshot)
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.
Backlinks API access denied (subscription inactive), identical to baseline limitation M23. Indirect DataForSEO signal shows a thin link profile. Authority-building untouched this session - strategic.
Chart 4 — What your search + behavior data says
Auto-derived from GSC (search) + GA4 (behavior) — deterministic, computed straight from the measured numbers (no estimates).
- 🎯 1 striking-distance query at position ≤15 — the highest-ROI quick win. Biggest near-miss:
claude code gia re(pos 12, 880 impr).
Chart 5: AI Crawler Access (11 bots)
robots.txt — 11 AI crawlers explicitly allowed via per-bot robots.txt rules. Status per known AI/LLM crawler:
| Bot | Vendor | Purpose | robots.txt status |
|---|---|---|---|
| GPTBot | OpenAI | training crawl | Allowed |
| OAI-SearchBot | OpenAI | ChatGPT search | Allowed |
| ClaudeBot | Anthropic | Claude crawl | Allowed |
| ClaudeUser | Anthropic | Claude live fetch | Allowed |
| anthropic-ai | Anthropic | training | Allowed |
| PerplexityBot | Perplexity | crawl | Allowed |
| PerplexityUser | Perplexity | live fetch | Allowed |
| Google-Extended | Gemini/AIO | Allowed | |
| Applebot-Extended | Apple | Apple Intelligence | Allowed |
| CCBot | Common Crawl | training | Allowed |
| Bytespider | ByteDance | training | Allowed |
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 |
|---|---|---|---|
| claude code gia re | 12 | 880 | 2 |
| eval | 39 | 210 | 1 |
| dich vu seo audit | 69 | 210 | 1 |
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
- R-H1 · xmlrpc.php not fully blocked - POST still returns 80 methods incl pingback
- R-H2 · Content-Security-Policy absent on all public pages
- R-H3 · speakable property not live despite claimed fix
- R-M1 · robots.txt declares llms.txt as a Sitemap - Google parses text/plain as XML (GSC errors)
- R-M2 · Organization missing url, description, foundingDate, contactPoint
- R-M3 · sameAs missing Wikidata, X/Twitter, YouTube
Expected Score Progression
| Milestone | Projected Score | Delta |
|---|---|---|
| Current baseline | 74/100 | — |
| After Week 1-2 (all P0 fixed) | 74/100 | +0 |
| After Week 6 (P0+P1 fixed) | 92/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
41 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
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-16.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
- Read the report: seo-audit_ongboit.com_2026-06-16.md (Top-3 Priority, findings by severity, per-category deep dives, 90-Day Roadmap).
- Ready-to-apply artifacts are in the fixes/ folder (robots.txt AI policy, llms.txt, schema JSON-LD, meta).
- Site: ongboit.com (WordPress -> apply via WP MCP).
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.
- Keep a simple checklist: [finding] -> done / drafted / handed to developer / skipped + why.
Verification Pass — 10 Gates
10/10Phase 6.5 verification ran before deliverable generation. 10 of 10 active gates passed (0 N/A for current mode).
| Gate | Check | Status | Detail |
|---|---|---|---|
| Gate 1 | Every finding ties to evidence (5 attrs) | ✓ PASS | All 41 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 41 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 10 P1 — distribution healthy |
| Gate 7 | Low-confidence findings flagged inline | ✓ PASS | 3 medium-confidence + 0 low-confidence findings flagged in evidence cards |
| Gate 8 | Reaudit matrix complete (if reaudit mode) | ✓ PASS | Verification matrix populated |
| 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: 74 × 0.45 = 33.30
performance: 71 × 0.35 = 24.85
sitemap: 76 × 0.20 = 15.20
Sum: 73.4
Rounded: 73
GEO + AEO Composite
Brand*0.30 + Schema*0.25 + Platform*0.25 + Geo*0.20
Components:
brand: 30 × 0.30 = 9.00
schema: 74 × 0.25 = 18.50
platform: 60 × 0.25 = 15.00
geo: 100 × 0.20 = 20.00
Sum: 62.5
Rounded: 62
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
Components:
technical: 74 × 0.18 = 13.32
schema: 74 × 0.13 = 9.62
sitemap: 76 × 0.06 = 4.56
performance: 71 × 0.13 = 9.23
geo: 100 × 0.25 = 25.00
platform: 60 × 0.06 = 3.60
brand: 30 × 0.13 = 3.90
image: 80 × 0.06 = 4.80
Sum: 74.0
Rounded: 74
Appendix B — Reproducibility
- Kit version: Claude-Growth v1.2.1
- Audit timestamp: 2026-06-16T06:28:05.600411+00:00
- Audit duration: 35m 48s
- Mode: reaudit
- 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 (71 raw, 15 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 87/100 · 5 finding(s)
| High A11Y-M17-INPUT-LABELS | Search and newsletter inputs lack programmatic labels (WCAG 1.3.1 / 4.1.2 / 3.3.2) https://ongboit.com homepage: <input type="search" name="s" placeholder="Tim bai viet..."> and <input type="email" placeholder="Email cua ban"> have no <label for>, no aria-label, no aria-labelledby. Screen readers announce only the role + placeholder (placeholder is not a reliable accessible name; disappears on input). → Restores accessible name for 2 primary site interactions (search, newsletter signup) for SR/voice-control users; removes the largest single AA gap. |
| Medium A11Y-L5-TABLE-SCOPE | Data table header cells missing scope and tables missing caption (WCAG 1.3.1) https://ongboit.com/claude-code-la-gi/ : 4 <table>, 13 <th> cells, 0 carry scope="col"/"row", 0 <caption>. Header-to-data association is not programmatically conveyed. → Lets SR users understand which header governs each data cell in comparison tables; low reach but cheap fix (template-level). |
| Medium A11Y-SEARCH-BTN-NAME | Search submit button is icon-only with no accessible name (WCAG 4.1.2) https://ongboit.com homepage: <button type="submit" ...>🔍</button> contains only an emoji glyph and no aria-label. SR may announce nothing or the literal emoji name. → Gives the search trigger a clear name (e.g. aria-label="Tim kiem"); pairs with M17 fix in the same search-form template. |
| Medium A11Y-M19-FOCUS-EMAIL | Newsletter email input suppresses focus outline with no replacement (WCAG 2.4.7) https://ongboit.com homepage: <input type="email" style="...outline: none;"> has no onfocus/border swap (unlike the search input which restores its border). Keyboard users get no visible focus state on the email field. Theme :focus-visible covers only .menu-toggle. → Restores keyboard-visible focus on a form control; partial-credit item from baseline M19. |
| Low A11Y-CONTRAST-MUTED-MARGINAL | Muted body text contrast passes AA only marginally (WCAG 1.4.3) #64748b on #f8fafc = 4.55:1 and on #ffffff = 4.76:1 (AA normal-text threshold 4.5:1). Passes but with no headroom; any future bg lightening or smaller weight risks failure. Footer legal link itself is fine (#93c5fd 9.9:1). → Darken muted token to ~#475569 for safety margin and AAA-leaning readability; low priority since currently compliant. |
geo-brand-mentions — score 30/100 · 2 finding(s)
| High BM-1 | No X/Twitter, Reddit, YouTube, Quora, Wikipedia/Wikidata - highest-weight AI-citation sources absent sameAs = 4 (FB/GitHub/TikTok/LinkedIn); no X/Reddit/YouTube/Wikidata → entity confidence + AI citation |
| Medium BM-2 | 16 earned mentions (n8n.community/Medium/IG/FB) do not backlink - recoverable baseline H8 → authority |
geo-compliance — score 84/100 · 8 finding(s)
| info COMP-001 | Google Consent Mode v2 active with all storage denied by default (EEA geo-targeted) curl https://ongboit.com/ -> gtag('consent','default',{"ad_personalization":"denied","ad_storage":"denied","ad_user_data":"denied","analytics_storage":"denied","functionality_storage":"denied","security_storage":"denied","personalization_storage":"denied","region":[32 EEA/EU ISO codes incl AT,BE,DE,FR,GB,IT,...],"wait_for_update":500}). All 7 storage types denied by default; v2 signals ad_user_data + ad_personalization present. Complianz plugin detected (8x cmplz markers, region":"eu", geoip). Google Tag GT-K8HP8DDM loads AFTER consent default block. → high |
| info COMP-002 | Bilingual privacy policy covers GDPR, CCPA and Vietnam PDPD (Decree 13/2023) curl https://ongboit.com/chinh-sach-bao-mat/ -> 'GDPR' x13, 'CCPA' x7, 'Decree 13' + 'Nghị định 13' + 'Personal Data Protection' (PDPD). Fields present: 'Data controller', 'Standard Contractual' (SCCs x2), 'legal basis'/'Cơ sở pháp lý', 'Data breach'/'vi phạm dữ liệu', 'DPO'/'Data Protection Officer', 'retention'/'lưu trữ', 'Do Not Sell'/'không bán' x3. VI/EN bilingual confirmed. → high |
| info COMP-003 | /privacy now 301-redirects to canonical policy (was redirecting to a blog post at baseline) curl -sI https://ongboit.com/privacy -> HTTP/1.1 301 Moved Permanently; Location: https://ongboit.com/chinh-sach-bao-mat/. Baseline (2026-05-29) redirected to an unrelated blog post. → medium |
| info COMP-004 | Five security headers present (HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) curl -sI https://ongboit.com/ -> Strict-Transport-Security: max-age=31536000; X-Frame-Options: SAMEORIGIN; X-Content-Type-Options: nosniff; Referrer-Policy: strict-origin-when-cross-origin; Permissions-Policy: camera=(), microphone=(), geolocation=(), browsing-topics=(). → medium |
| medium COMP-005 | No Content-Security-Policy header and HSTS lacks includeSubDomains/preload curl -sI https://ongboit.com/ shows no Content-Security-Policy, no Cross-Origin-Opener-Policy / Cross-Origin-Resource-Policy, and no X-XSS-Protection. HSTS = 'max-age=31536000' only (no includeSubDomains, no preload). 5/7 of the standard header set present; CSP is the highest-value missing control. → medium |
| medium COMP-006 | DSAR / data-subject-rights request routed only to a personal Gmail address curl https://ongboit.com/chinh-sach-bao-mat/ -> rights-exercise contact is mailto:thenguyen.ai.automation@gmail.com (x4); 'thực hiện quyền' present but no dedicated DSAR web form, no privacy@/dpo@ branded alias, no 'Do Not Sell' opt-out form (CCPA expects a request mechanism). Policy names a DPO but provides only a generic personal inbox. → medium |
| info COMP-007 | Footer carries all required legal links incl. manage-cookies control curl https://ongboit.com/ footer -> chinh-sach-bao-mat (Privacy), dieu-khoan-su-dung (Terms), contact x6, cmplz-manage-consent x8 (Complianz manage-cookies revocation control). Terms page /dieu-khoan-su-dung/ returns HTTP 200. → low |
| info COMP-008 | Only a single first-party Google Tag fires; no Meta/Hotjar/Clarity trackers detected pre-consent curl https://ongboit.com/ -> only gtag/js?id=GT-K8HP8DDM present; no googletagmanager.com/gtm, facebook.net, hotjar, clarity.ms, or doubleclick references on the homepage. Tag is gated behind the Consent Mode v2 default-denied block, so analytics/ads storage stays denied until opt-in. GTM auto-PII collection reported disabled (not externally verifiable via curl). → medium |
geo-crawlers — score 97/100 · 4 finding(s)
| pass CR-01 | All 8 primary AI-search crawlers explicitly allowed |
| pass CR-02 | Training crawlers (anthropic-ai, CCBot, Bytespider) also explicitly allowed |
| info CR-03 | llms.txt listed under Sitemap: directive in robots.txt |
| low CR-04 | cohere-ai, Amazonbot, meta-externalagent not explicitly declared |
geo-llmstxt — score 88/100 · 8 finding(s)
| pass LT-01 | llms.txt serves HTTP 200 at root — 301→404 redirect chain fully resolved |
| pass LT-02 | llms-full.txt present at 200, 748 KB, 25 concatenated articles |
| pass LT-03 | Strong structure: H1 + blockquote tagline + 8 organised sections |
| pass LT-04 | Core Guides section leads with quantitative citability hooks |
| medium LT-05 | RSL 1.0 license declaration absent |
| medium LT-06 | No ETag or Last-Modified HTTP response header on llms.txt or llms-full.txt |
| low LT-07 | 22 of 28 links lack quantitative description snippets |
| info LT-08 | llms-full.txt listed as Sitemap: in robots.txt (non-standard) |
geo-platform-optimizer — score 60/100 · 2 finding(s)
| High PL-1 | AI Overview shown on target queries but ongboit not cited (page 4-8 < citation threshold) DataForSEO ai_overview for claude code gia re/eval/llm; ongboit rank 39-87 → AIO/ChatGPT/Perplexity citation |
| Medium PL-2 | Perplexity/ChatGPT topical surfacing absent - community-validation gap baseline M24; no Reddit/community signals → AI citation |
geo-schema — score 74/100 · 9 finding(s)
| high SCHEMA-01 | speakable NOT found live — claimed fix is unconfirmed grep for 'speakable' across raw HTML of homepage, /claude-code-la-gi/, and /n8n-pricing/ returns 0 hits. fetch_page.py structured_data also shows no speakable property on BlogPosting or WebPage types. Baseline noted speakable present on snippet #5 — this is not confirmed in today's crawl. → Medium-high: speakable is the most direct AI-assistant signal. Its absence means AI voice assistants and AI crawlers cannot identify the most citable passages without inference. |
| medium SCHEMA-02 | Organization missing url, description, foundingDate, contactPoint Organization @graph block keys: ['@type', '@id', 'name', 'sameAs', 'logo']. url=MISSING, description=MISSING, foundingDate=MISSING, contactPoint=MISSING, address=MISSING, founder=MISSING. These were listed as intended additions (founder was mentioned in baseline comparison notes) but are NOT present in current HTML. → Medium: url and description are E-E-A-T signals that help AI models build a complete entity graph. Without url, Google cannot confidently resolve the @id anchor to a canonical site. |
| medium SCHEMA-03 | Organization sameAs missing Wikipedia, Wikidata, YouTube — 4 platforms only Organization sameAs=['https://www.facebook.com/ongboitvuitinh/', 'https://github.com/thenguyenvn90', 'https://www.tiktok.com/@ongbo.it', 'https://www.linkedin.com/in/minh-the-nguyen-6b995960']. Wikipedia, Wikidata, YouTube not present. Baseline noted these as 'strategic, still open' — confirmed open. → High for AI entity resolution: Wikipedia and Wikidata are the strongest cross-platform entity signals for LLMs. YouTube is a high-authority platform signal. Adding them would push sameAs score from 10 to 15. |
| low SCHEMA-04 | Person sameAs contains duplicate LinkedIn entry (http vs https) Person sameAs includes both 'https://www.linkedin.com/in/minh-the-nguyen-6b995960' and 'https://linkedin.com/in/minh-the-nguyen-6b995960' (missing www prefix). These resolve to the same URL but signal inconsistency. → Low: not a validation error, but clean sameAs arrays send stronger entity signals. Remove the www-less variant. |
| low SCHEMA-05 | Person schema missing description (author bio text) Person block keys: ['@type', '@id', 'name', 'url', 'image', 'sameAs', 'worksFor', 'jobTitle', 'knowsAbout']. description=MISSING. A bio string like 'DevOps Engineer and AI Vibe Coder helping Vietnamese developers automate with Claude Code and n8n' would complete the E-E-A-T person fingerprint. → Low-medium: description strengthens author entity for AI citation decisions, especially for 'who wrote this?' queries. |
| low SCHEMA-06 | BlogPosting missing wordCount BlogPosting keys on both sampled articles: ['@type', 'headline', 'keywords', 'datePublished', 'dateModified', 'articleSection', 'author', 'publisher', 'description', 'name', '@id', 'isPartOf', 'image', 'inLanguage', 'mainEntityOfPage']. wordCount=MISSING. → Low: wordCount is a recommended (not required) property. Signals content depth to AI models that use schema to assess comprehensiveness before citation. |
| info SCHEMA-07 | FAQPage present — restricted since Aug 2023, but appropriate to retain for AI semantics FAQPage confirmed on /claude-code-la-gi/ (9 questions) and /n8n-pricing/ (7 questions) as separate JSON-LD blocks outside the main @graph. Syntactically valid. mainEntity uses Question/@type and Answer/@type correctly. → No rich result eligibility for non-authority sites, but schema provides strong Q&A semantic structure for AI crawlers (GPTBot, ClaudeBot, PerplexityBot). Retain. Do NOT remove. |
| medium SCHEMA-08 | Organization url property absent — Google entity anchor incomplete The Organization @id is 'https://ongboit.com/#organization' which is an internal anchor, not the canonical site URL. Without a url property ('https://ongboit.com/'), Google's Knowledge Graph and AI models cannot cleanly link the Organization entity to the domain. → Medium: url is a recommended property for Organization and strongly expected by Google's structured data documentation for Knowledge Panel eligibility. |
| info SCHEMA-09 | JSON-LD is server-rendered — no JavaScript injection risk All JSON-LD blocks are present in raw HTTP response HTML. Site runs WordPress with Apache/2.4.66. No evidence of client-side injection. AI crawlers (GPTBot, ClaudeBot) will see all schema data on first fetch. → Positive signal: no delayed processing risk for Google or AI crawlers. |
geo-technical — score 74/100 · 8 finding(s)
| Critical GT-001 | xmlrpc.php FULLY FUNCTIONAL — claimed fix is false curl -X POST https://ongboit.com/xmlrpc.php with system.listMethods payload returns HTTP 200 and lists 80 methods including pingback.ping, pingback.extensions.getPingbacks, wp.newPost, wp.editPost, wp.deletePost, wp.uploadFile, wp.deleteFile, wp.getUsers, metaWeblog.newPost, blogger.deletePost. The baseline audit noted xmlrpc_enabled=false as a claimed fix. Measured result: FULLY ACTIVE. The GET-to-/xmlrpc.php returns 405 Method Not Allowed (expected — xmlrpc is POST-only by design) but this was misread as disabled. Actual POST attack surface is 100% exposed. This enables: pingback DDoS amplification, credential brute-force via xmlrpc.system.multicall, SSRF via wp.uploadFile. → critical — active attack vector, pingback abuse and credential stuffing risk; also Google flags xmlrpc brute-force as a security signal |
| High GT-002 | Content-Security-Policy (CSP) absent on all public pages curl -sI https://ongboit.com/ — no Content-Security-Policy header in response. Confirmed across 4 separate header fetches. wp-login.php has CSP frame-ancestors 'self' only. Homepage and article pages: no CSP. Risk: XSS attacks can inject arbitrary scripts. Also affects AI crawler trust signals and browser security scoring. → high — XSS attack surface, browser security warnings in future Chrome versions, negative trust signal |
| Medium GT-003 | HSTS missing includeSubDomains directive curl -sI https://ongboit.com/ returns: Strict-Transport-Security: max-age=31536000 — no includeSubDomains, no preload. grep 'includeSubDomains' count=0. Best practice: max-age=31536000; includeSubDomains. Without includeSubDomains, subdomains (e.g., www.ongboit.com, any future subdomain) are vulnerable to downgrade attacks even if the apex domain is protected. → medium — subdomain downgrade attack vector; also fails HSTS preload list eligibility |
| Medium GT-004 | Meta description below optimal length (128 chars vs 150-160 target) Extracted from live HTML: <meta name="description" content="Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation."/> — echo -n [...] | wc -c = 128 characters. Google typically displays 150-160 chars; truncation at 128 means missed opportunity to communicate value. Content is relevant and keyword-present but short. → low — reduced CTR from search results, Google may rewrite with its own snippet |
| Medium GT-005 | CLS risk — images missing explicit width/height attributes WebFetch analysis of homepage HTML: 'Multiple images present without explicit width/height attributes — Logo image, Article featured images'. WordPress wp-img-auto-sizes CSS present (WP 6.7 auto-sizes feature) but contain-intrinsic-size fallback (3000px 1500px) is a rough estimate, not actual dimensions. Without explicit width/height on <img> tags, browser cannot reserve layout space before images load, causing layout shifts. CLS threshold: <0.1 (good), 0.1-0.25 (needs improvement), >0.25 (poor). → medium — CLS is a Core Web Vital and a Google ranking factor; layout shifts harm UX and scores |
| Low GT-006 | robots.txt Sitemap directive points to llms.txt (non-standard) robots.txt line: 'Sitemap: https://ongboit.com/llms.txt' — llms.txt is a plain-text AI model context file, not an XML sitemap. The Sitemap: directive in robots.txt is expected to point to XML sitemaps. Search engine crawlers (Googlebot, Bingbot) that parse Sitemap: directives will attempt to parse llms.txt as XML, which will fail or be silently ignored. The sitemap_index.xml reference is correct and valid. → low — may cause crawl errors in GSC for invalid sitemap; no ranking impact but creates noise |
| Low GT-007 | No preload hints for critical above-fold resources curl -sv https://ongboit.com/ head section: preconnect to fonts.googleapis.com and fonts.gstatic.com present (good). dns-prefetch for googletagmanager.com and pagead2.googlesyndication.com present. No <link rel=preload> for hero image, critical CSS, or web fonts. Google Fonts loaded via preconnect only — no preload for the font files themselves. LCP element (hero image or first visible content) has no fetchpriority=high or explicit preload. → low-medium — incremental LCP improvement; not a ranking blocker but affects CWV scores |
| Low GT-008 | Server version exposed in response header curl -sI https://ongboit.com/ returns: Server: Apache/2.4.66 (Debian) — full version and OS disclosed. Also X-Powered-By absent (good — PHP version not exposed in main headers, though present on xmlrpc.php: X-Powered-By: PHP/8.3.30). Apache version disclosure enables targeted exploit scanning. → low — informational; reduces targeted attack surface |
seo-backlinks — score N/A · 1 finding(s)
| High BL-1 | Backlinks API unavailable (DataForSEO subscription inactive 40204) + avg referring domains ~1-2 for ranked kw = thin profile backlinks_summary -> 40204; ranked-kw avg referring_domains 1.0-1.3 → Authority is the #1 lever for page-4-8 rankings |
seo-google — score 48/100 · 2 finding(s)
| High GG-1 | Severe SERP visibility gap - 8 ranked keywords, only 1 on page 2 (rest pos 31-87) DataForSEO domain_rank_overview VN count=8, best rank_group=12; 'claude code' (33,100/mo) only #69 → Top-10 for 2-3 mid-volume kw -> 10-20x current 92 ETV |
| High GG-2 | AI Overview present on target SERPs but ongboit not cited (page 4-8 < AIO source threshold) ai_overview in serp_item_types for claude code gia re/eval/llm; ongboit rank 39-87 → AIO citation eligibility |
seo-images — score 80/100 · 2 finding(s)
| Low IM-1 | Images missing explicit width/height -> CLS risk seo-page: hero imgs rely on WP auto-sizes, no explicit dims → CLS |
| Low IM-2 | No image sitemap baseline M21; screenshot-heavy tutorials → Google Images discovery |
seo-page — score 74/100 · 13 finding(s)
| low OP-001 | Robots meta tag order anomaly site-wide (3 of 4 pages) Homepage, /n8n-pricing/, /advisor-strategy-claude-code/ all render 'follow, index' instead of standard 'index, follow'. /claude-code-la-gi/ correctly shows 'index, follow'. Rank Math PRO inconsistently applies order depending on post type or template. Google treats both as valid, but the inconsistency indicates a Rank Math global/post-type settings conflict. → low |
| medium OP-002 | No hreflang tags on any page — Vietnamese-language site without locale signals All 4 pages returned zero hreflang attributes. Site is 100% Vietnamese-language content targeting Vietnamese readers. Without hreflang vi and x-default, Google may not correctly associate the site with vi locale in international results. HTML lang='vi' is set at <html> level (observed in homepage), but hreflang is absent in <head>. Particularly impactful for GEO/AI-search citation in Vietnamese-language AI Overview triggers. → medium |
| medium OP-003 | Heading hierarchy skip on /advisor-strategy-claude-code/ — H3 before first H2 Heading sequence begins: H1 > H3 (TL;DR) > H2 > H2 ... The TL;DR summary block uses an H3 with no parent H2, violating document outline semantics. WCAG 1.3.1 (Info and Relationships) requires heading levels to reflect document structure. This also degrades crawlability: the TL;DR section is not enclosed in a logical H2 section, which may reduce its passage-ranking weight. → medium |
| medium OP-004 | Homepage H1 does not contain primary keyword Homepage H1 is 'Hành Trình Zero → Hero với AI Coding và Automation' — narrative/brand-voice framing with no mention of 'Claude Code', 'AI coding assistant', 'self-hosting', or the primary keyword clusters the site targets. Title tag also omits a topical keyword, relying entirely on brand name. For a site with commercial intent around 'Claude Code' and 'n8n', the homepage H1 misses the opportunity to reinforce topical authority to crawlers. → medium |
| low OP-005 | Brand name absent from article title tags (3 blog posts) Homepage title includes '| Ông Bố IT' brand suffix. All 3 blog post titles omit brand: 'Claude Code Là Gì? Giải Thích Đơn Giản + So Sánh 2026' (53 chars), 'n8n Pricing 2026: Cloud $24-$50/Tháng + 3 Pattern Tiết Kiệm' (59 chars), 'Advisor Strategy Claude Code: Dùng Opus Rẻ Hơn 73% (2026)' (57 chars). Brand suffix aids recognition in SERP repeat impressions and builds entity association. All three have room within the 60-char guideline (homepage title is 58 chars including brand). → low |
| low OP-006 | No visible breadcrumb DOM — schema-only BreadcrumbList All 3 article pages have BreadcrumbList in JSON-LD (confirmed by schema_types extraction), but zero breadcrumb-class HTML elements were found in any page DOM. Google's breadcrumb rich result requires consistent JSON-LD + visible HTML breadcrumb for reliable eligibility. Schema-only breadcrumbs have been de-ranked for rich result display in 2024-2025 quality updates. Verified across /claude-code-la-gi/, /n8n-pricing/, /advisor-strategy-claude-code/. → medium |
| low OP-007 | Homepage meta description below optimal length (117 chars) Homepage meta description is 117 characters: 'Mình là Thế, DevOps Engineer. Mình dùng Claude Code và n8n hằng ngày cho vibe coding và SEO + GEO content automation.' Optimal range for Vietnamese SERP is 140-155 chars (Google typically displays ~155-160 chars in desktop SERP snippets). The description is first-person and authentic, but leaves ~30 chars of SERP real estate unused that could reinforce keyword signals or CTA. → low |
| none OP-008 | All 4 pages have 100% image alt coverage — strong baseline Homepage: 12/12 images with non-empty alt. /claude-code-la-gi/: 26/26. /n8n-pricing/: 21/21. /advisor-strategy-claude-code/: 19/19. Zero empty alt attributes and zero missing alt attributes across 78 total images. This is a genuine strength — above-average for WordPress sites in this category. → none |
| none OP-009 | Canonical tags present and correctly self-referencing on all 4 pages Homepage canonical: https://ongboit.com/ (matches URL). /claude-code-la-gi/ canonical: https://ongboit.com/claude-code-la-gi/ (matches). /n8n-pricing/ canonical: https://ongboit.com/n8n-pricing/ (matches). /advisor-strategy-claude-code/ canonical: https://ongboit.com/advisor-strategy-claude-code/ (matches). No duplicate or cross-pointing canonicals detected. → none |
| none OP-010 | Strong structured data implementation on blog posts — BlogPosting + FAQPage + BreadcrumbList + Person All 3 article pages carry: BlogPosting, FAQPage, BreadcrumbList, Person, Organization, WebSite, ImageObject, and Question/Answer schema types across 2 JSON-LD blocks each. Homepage carries Organization + WebSite + SearchAction (SiteLinksSearchBox) — appropriate for homepage page type. This schema depth is above industry average for Vietnamese WordPress blogs. → none |
| none OP-011 | Article pages use datePublished + dateModified in schema and OG meta — freshness signals solid /n8n-pricing/ dateModified: 2026-06-16T13:34:05+07:00 (today — pricing page updated same-day as audit). /claude-code-la-gi/ dateModified: 2026-06-15. /advisor-strategy-claude-code/ dateModified: 2026-06-15. Active maintenance cadence visible to crawlers. article:modified_time and dateModified in JSON-LD are consistent. → none |
| none OP-012 | Word count proxies well above minimums for blog posts — no thin content /claude-code-la-gi/: 6329 words (minimum 1500 for blog post — 4.2x floor). /n8n-pricing/: 4535 words (3x floor). /advisor-strategy-claude-code/: 3895 words (2.6x floor). These are stripped-tag proxy counts including navigation/footer chrome; actual article body word counts will be lower but still comfortably above thin-content thresholds. → none |
| none OP-013 | noindex absent on all 4 pages — all indexable String 'noindex' not found in any of the 4 page HTML responses. All pages are correctly set to index/follow. No accidental noindex from staging migration or plugin conflict detected. → none |
seo-performance — score 71/100 · 2 finding(s)
| Medium PF-1 | TTFB slow on 288/305 crawled URLs - no CDN on Apache origin crawl-summary slow_ttfb=288; baseline TTFB 657ms → LCP headroom + crawl budget; field LCP already FAST so impact moderate |
| Low PF-2 | Large HTML on 279 URLs crawl-summary large_html=279 → transfer size |
seo-sitemap — score 76/100 · 3 finding(s)
| Medium SM-1 | 11 indexable pages not in sitemap crawl-summary indexable_not_in_sitemap=11 → discovery |
| Medium SM-2 | robots.txt declares llms.txt as Sitemap - Google parses text/plain as XML sitemap -> GSC errors robots.txt 'Sitemap: https://ongboit.com/llms.txt'; llms.txt is text/plain not XML → avoids GSC sitemap parse errors |
| Low SM-3 | 1 http URL in sitemap crawl-summary http_url_in_sitemap=1 → minor |
seo-visual — score 80/100 · 2 finding(s)
| Low VIS-1 | Muted body text #64748b ~4.55-4.76:1 passes AA marginally geo-accessibility contrast math → readability margin |
| Medium VIS-2 | Email input outline:none with no visible focus replacement geo-accessibility M19 partial → keyboard-nav visibility |