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.
The 3 Problems Hurting You Most Right Now
llms.txt is a BROKEN redirect chain (301 -> /wp-content/uploads/2026/04/llms.txt -> 404)
curl -sIL https://ongboit.com/llms.txt: 301 (X-Redirect-By: Rank Math) -> /wp-content/uploads/2026/04/llms.txt -> 404 (geo-llmstxt, geo-technical, geo-crawlers, geo-platform, seo-audit). Site has 196 ...
All 6 security response headers absent (0/6: no HSTS/CSP/X-Content-Type-Options/Referrer-Policy/Permissions-Policy/X-XSS-Protection)
curl -sI https://ongboit.com returns none of the 6 (geo-technical, seo-audit, geo-compliance). Server: Apache/2.4.66 (Debian).
Off-page authority gap: page-1 VN long-tail works, but big terms + striking-distance keywords need backlinks; ~zero referring domains
GSC 90d: 737 clicks, avg pos 7.4, 100 queries. Striking distance: 'claude code pricing' pos 11, 'giá claude code pro' pos 8.7. DataForSEO Labs: page-1 competitors avg ~2,940-4,567 referring domains. g...
Quick Wins — Shippable This Week
8.0h total5 fixes shippable this week (effort = S). Estimated overall score lift +5-15 points.
- ☐ H1llms.txt is a BROKEN redirect chain (301 -> /wp-content/uploads/2026/04/llms.txt -> 404) 2h Restores AI-engine discoverability of best content; largest single GEO-readiness
- ☐ H2All 6 security response headers absent (0/6: no HSTS/CSP/X-Content-Type-Options/Referrer-Policy/Permissions-Policy/X-XSS-Protection) 2h Closes a cross-cutting trust + security gap; lifts Technical + GEO trust.
- ☐ M5robots.txt is wide-open by WP default - no explicit AI-crawler policy 2h Locks in AI-crawler access; pairs with the llms.txt fix.
- ☐ L3Indexation healthy (184/196 ~94% served); spot-check the ~12 with zero impressions 1h Confirms no systemic indexation problem; recover any wrongly-excluded URLs.
- ☐ L6Homepage on-page nits: short meta (117 chars), brand-tagline H1, unescaped & in og:title 1h Cleaner homepage SERP/social snippet + topical H1.
Executive Summary
62/100Overall Score: 62/100 (Fair)
Website audit found 20 issues across 14 weighted categories. Technical fundamentals score 73/100 (Fair), while AI search readiness scores 57/100 (Poor).
Issue Distribution
Priority breakdown by severity — 20 findings total
The 3 Biggest Problems
- llms.txt is a BROKEN redirect chain (301 -> /wp-content/uploads/2026/04/llms.txt -> 404) —
curl -sIL https://ongboit.com/llms.txt: 301 (X-Redirect-By: Rank Math) -> /wp-content/uploads/2026/04/llms.txt -> 404 (g... - All 6 security response headers absent (0/6: no HSTS/CSP/X-Content-Type-Options/Referrer-Policy/Permissions-Policy/X-XSS-Protection) —
curl -sI https://ongboit.com returns none of the 6 (geo-technical, seo-audit, geo-compliance). Server: Apache/2.4.66 (De... - Off-page authority gap: page-1 VN long-tail works, but big terms + striking-distance keywords need backlinks; ~zero referring domains —
GSC 90d: 737 clicks, avg pos 7.4, 100 queries. Striking distance: 'claude code pricing' pos 11, 'giá claude code pro' po...
Audit Details:
- URL: https://ongboit.com
- Business Type: Publisher (confidence: medium)
- Market: Vietnam · Vietnamese (vi)
- Pages Analyzed: 8
- Sampled Deep: 8 business-type-prioritized pages
Score Breakdown
Overall Composite
| Category | Score | Weight | Weighted | Rating |
|---|---|---|---|---|
| Brand | 28/100 | 13% | 3.6 | Critical |
| Geo | 55/100 | 25% | 13.8 | Poor |
| Platform | 64/100 | 6% | 3.8 | Fair |
| Schema | 70/100 | 13% | 9.1 | Fair |
| Technical | 78/100 | 18% | 14.0 | Good |
| Image | 82/100 | 6% | 4.9 | Good |
| Performance | 60/100 | 13% | 7.8 | Fair |
| Sitemap | 86/100 | 6% | 5.2 | Good |
| Accessibility* | 88/100 | — | — | Good |
| Compliance* | 62/100 | — | — | Fair |
| Audit* | 78/100 | — | — | Good |
| Google-Api* | 65/100 | — | — | Fair |
| Page-Deep-Dive* | 88/100 | — | — | Good |
| Visual* | 68/100 | — | — | Fair |
| OVERALL | 100% | 62.2 → 62/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 | 57/100 | Poor | Geo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12... |
| Overall Search-Readiness | 62/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 0m 17s across 11 phases. 14 category scores computed.
Total: 0m 17s
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.
geo-accessibility 88/100 —
Strong static-HTML accessibility posture on both homepage and the /tiet-kiem-token-claude-code/ post. lang="vi" correctly set on <html>; single H1 with logical, no-skip heading hierarchy on both pages; 100% image alt coverage (12/12 home, 19/19 post, none empty); full ARIA landmark set (banner, navigation x2 with distinct aria-labels, main, search, contentinfo); skip-to-content link present; seman…
geo-brand-mentions 28/100 —
Off-site brand authority for "Ông Bố IT" / ongboit.com is thin and fragmented. The only meaningful third-party branded footprint is TikTok (two handles, @ongbo.it and @ongboit, with low engagement ~119-217 likes) plus a single organic Threads mention by an unrelated user. There is NO presence under the brand name on Reddit, YouTube (the author's channel exists but is branded "NextGrowth", not "Ông…
geo-compliance 62/100 —
ongboit.com has solid foundations (valid Let's Encrypt TLS 1.2/1.3 cert, a Vietnamese privacy policy at /chinh-sach-bao-mat/ that explicitly cites PDPD / Nghị định 13/2023, and a terms page at /dieu-khoan-su-dung/), but the core PDPD gap is the absence of any cookie consent banner / CMP while Google Analytics 4 (Google Tag GT-K8HP8DDM via Site Kit) loads and fires unconditionally on page load, inc…
geo-crawlers 92/100 —
robots.txt (HTTP 200) is the WordPress default: a single 'User-agent: *' block disallowing only /wp-admin/ (admin-ajax.php allowed) plus the sitemap line. NONE of the 14 audited AI crawlers are explicitly named, so all fall under the wildcard rule and are ALLOWED to crawl all public content.
This is wide-open-by-default — maximally permissive for AI discovery and citations, with zero AI blocks. Do…
geo-llmstxt 18/100 —
https://ongboit.com/llms.txt is NOT served — it 301-redirects (via Rank Math) to https://ongboit.com/wp-content/uploads/2026/04/llms.txt, which returns 404. So a previous llms.txt attempt exists as a dangling Rank Math redirect pointing at a deleted/missing upload, leaving the site with zero usable AI-discovery manifest.
This is a P1 GEO gap: AI engines (ChatGPT, Perplexity, Claude, Gemini) get no…
geo-platform-optimizer 64/100 —
ongboit.com is well-positioned for AI-engine citation on the technical/content axis: robots.txt is wildcard-open (no GPTBot/PerplexityBot/Google-Extended/Bingbot blocks), articles use answer-first question-format H2s with TL;DR and definition-first paragraphs, schema is rich (Person+jobTitle+knowsAbout, BlogPosting+author+dates, BreadcrumbList), and freshness is excellent (dateModified 2026-06-01)…
geo-schema 70/100 —
Rank Math emits a clean server-rendered @graph (Person+WebSite+WebPage+BreadcrumbList+Article/BlogPosting) across home/about/post, with author Person sameAs to 4 platforms (LinkedIn, GitHub, TikTok, Facebook), jobTitle, knowsAbout, and a valid WebSite+SearchAction. Three structural problems cap the score: (1) a second, hand-coded standalone Organization block conflicts with Rank Math's Person #per…
geo-technical 78/100 —
ongboit.com is technically healthy for AI discovery: fully server-rendered WordPress (homepage 39 <p> / 17 headings / real Vietnamese body text; article 93 <p>; no SPA root div, no __NEXT_DATA__), so GPTBot/ClaudeBot live-fetched the full 113KB HTML at HTTP 200. Meta/indexability is clean (title, 150-char meta description, self-referencing canonical, index/follow robots, viewport, lang=vi, 13 OG +…
seo-audit 78/100 —
ongboit.com (WordPress + Kadence + Rank Math, Vietnamese personal-tech publisher) is fundamentally search-ready: 185 indexable posts via clean sitemaps, correct trailing-slash 301 canonicalization, self-referential canonicals, single H1 per page, unique descriptive titles within length limits, well-structured heading hierarchy (article sampled: 1xH1/19xH2/18xH3), and 0 missing image alt on the fla…
seo-backlinks 0/100 —
Direct backlink metrics could NOT be measured this run: the DataForSEO Backlinks API returned 'Access denied - subscription not active' (code 40204) when called from the main thread, so referring domains, total backlinks, and domain rank for ongboit.com are unavailable as measured values (marked N/A, not guessed).
Strong indirect evidence points to a near-zero external backlink profile: (1) the br…
seo-google 65/100 —
REAL Google Search Console data (sc-domain:ongboit.com, last 90 days): 737 clicks, 26,239 impressions, CTR 2.81%, average position 7.4 across 100 distinct queries - and accelerating (387 clicks in the most recent 28 days alone). The site genuinely ranks PAGE 1 for several Vietnamese long-tail terms with real traffic: /tiet-kiem-token-claude-code/ (194 clicks, pos 6.2), /claude-code-gioi-han-su-dun…
seo-images 82/100 —
Real image-SEO audit across the homepage + two top articles (62 images, data 2026-06-02). Image hygiene is strong: 100% alt-text coverage (0 missing), ~98% WebP (61/62), lazy-loading on all below-the-fold images, og:image on every page. The main upgrade opportunities the skill flags: ZERO images use AVIF and ZERO use the <picture> element with format fallback — delivery is WebP-only via plain <img…
seo-page 88/100 —
Deep on-page audit of homepage and top post /tiet-kiem-token-claude-code/. Both pages are strongly optimized: single H1, complete Rank Math meta (canonical, robots index/follow, full Open Graph + Twitter summary_large_image), valid schema (WebPage/Organization/Person on home; BlogPosting + FAQPage + BreadcrumbList on post), 100% image alt coverage, and fresh dateModified (2026-05).
The post is exe…
seo-performance 60/100 —
MEASURED lab Lighthouse (top-traffic article /tiet-kiem-token-claude-code/, desktop simulated): Performance 70/100, LCP 2.77s (slightly over the 2.5s 'good' line), FCP 2.28s, CLS 0.002 (excellent), max-potential-FID 24ms + main-thread work 325ms (interactivity excellent), SEO 100, Best-Practices 100.
The dominant LCP contributor is server-response-time 949ms (lab) / TTFB 384ms (edge curl) - i.e. C…
seo-sitemap 86/100 —
Sitemap architecture is healthy and correctly configured by Rank Math. robots.txt declares the canonical index at https://ongboit.com/sitemap_index.xml, which fans out to three valid sub-sitemaps: post-sitemap.xml (185 URLs), page-sitemap.xml (6 URLs), category-sitemap.xml (5 URLs) = 196 total indexable URLs. lastmod stamps are fresh (post + category sitemaps stamped 2026-06-01, today).
The X-Robo…
seo-visual 68/100 —
ongboit.com homepage renders server-side (H1 + intro paragraph present in raw HTML — not a JS shell). Desktop above-the-fold is clean: H1, sub-copy, primary CTA, and navigation all visible at 1920x1080 without scrolling. Mobile (375x812) renders the H1 and intro copy above the fold, but the primary CTA ('Bat Dau Lo Trinh') sits at top=817px — fractionally below the 812px viewport, so most mobile v…
High Priority — Fix within 1 week
5 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.
Your AI-discovery file is broken and leads to a dead page
HighAI engines (ChatGPT, Perplexity, Claude, Gemini) look for /llms.txt to learn which content to cite. Yours doesn't just 404 - a leftover Rank Math redirect sends it to a deleted upload path, which is worse than absent. Since AI citation is the site's stated goal, this directly hits the core objective and is a same-day fix.
Recommended fix
Delete the dangling Rank Math redirect for /llms.txt; deploy a real bilingual /llms.txt at root (site name + description, sectioned links to the 5 category hubs + key tutorials + /about). Draft in geo-llmstxt finding.
/geo llmstxt --generate
Technical details for your developer
curl -sIL https://ongboit.com/llms.txt: 301 (X-Redirect-By: Rank Math) -> /wp-content/uploads/2026/04/llms.txt -> 404 (geo-llmstxt, geo-technical, geo-crawlers, geo-platform, seo-audit). Site has 196 clean URLs + 5 category hubs ready to map.Your site is missing standard browser security headers
HighSix standard HTTP security headers are completely absent, including HSTS despite working HTTPS. This leaves visitors more exposed to clickjacking, MIME-sniffing, and downgrade attacks, and modern AI/search trust signals reward a hardened posture. Quick server-config fix, no content impact.
Recommended fix
Add via .htaccess/VirtualHost: HSTS (max-age=31536000; includeSubDomains; preload), X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy, and a starter CSP (report-only first). Drop legacy X-XSS-Protection.
Technical details for your developer
curl -sI https://ongboit.com returns none of the 6 (geo-technical, seo-audit, geo-compliance). Server: Apache/2.4.66 (Debian).Two conflicting 'who owns this site' identities in your structured data
HighPages emit a hand-coded Organization entity plus Rank Math's Person publisher, same name 'Ông Bố IT' but different Facebook URL and no @id linkage; Article publisher points to a Person rather than an Organization-with-logo. Search + AI knowledge graphs need one consistent owner; conflicting signals dilute the brand entity exactly when it most needs to establish authority.
Recommended fix
Pick ONE publisher (recommended: single Organization 'Ông Bố IT' with Person as founder/author + logo). Remove the duplicate, align sameAs, fix the Facebook URL, add @id links.
/geo schema --fix-identity
Technical details for your developer
geo-schema: duplicate Organization node conflicts with #person, mismatched Facebook, Article publisher = Person not Organization+logo.Tracking runs before visitors consent - a privacy-law risk
HighGA4 and a subscribe form load on page view with no consent banner and no Google Consent Mode. For Vietnamese visitors this conflicts with Decree 13/2023 (PDPD); EU visitors trigger GDPR. The privacy policy is strong and PDPD-aware, but enforcement at the tag layer is missing.
Recommended fix
Install a CMP (CookieYes/Complianz) wired to Google Consent Mode v2 so GA4 fires only after opt-in.
Technical details for your developer
geo-compliance: homepage loads gtag GT-K8HP8DDM + subscribe form with no CMP/banner, no Consent Mode. Privacy policy /chinh-sach-bao-mat/ exists, cites PDPD. (This run found Google as the only third-party tracker — no TikTok/FB pixel.)Great articles capped by almost no backlinks or brand mentions
HighGSC truth: the site ranks PAGE 1 for several Vietnamese long-tail terms with real traffic (737 clicks / 26,239 impr / 90d, accelerating). The constraint is scaling: commercial terms sit just off page 1 ('claude code pricing' pos 11, 'giá claude code pro' pos 8.7) and the big head term ('claude code' 33K SV) is page 2-8. Content ranks (page score 88); what gates the climb is external authority - almost no backlinks or off-site mentions. Biggest scaling lever, a months-long off-page program.
Recommended fix
Digital-PR + link program: VN dev citations (Viblo/Spiderum/Tinhte), foundational author/brand profiles, HN/Reddit participation, consolidate internal links to /claude-code-la-gi/. Activate a backlinks data source to measure.
Technical details for your developer
GSC 90d: 737 clicks, avg pos 7.4, 100 queries. Striking distance: 'claude code pricing' pos 11, 'giá claude code pro' pos 8.7. DataForSEO Labs: page-1 competitors avg ~2,940-4,567 referring domains. geo-brand-mentions: only TikTok + 1 Threads mention. backlinks_summary 40204 (subscription inactive) so exact RD count N/A.Medium Priority — Fix within 1 month
7 issuesThese improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Your software versions are exposed, making targeted attacks easier
MediumAsset query strings leak WP + plugin/theme versions, handing attackers exact versions to match against known exploits. Low effort to suppress.
Recommended fix
Remove version query strings (functions.php filter or security plugin), hide generator meta, keep WP+plugins updated.
Technical details for your developer
geo-compliance: homepage assets carry ?v= versioned query strings.Mobile pages are slow to show main content (LCP 4.2s); fix is server caching
MediumMeasured both devices: mobile (what Google ranks on) LCP 4.2s = POOR; desktop 2.77s. Stability (CLS ~0) and interactivity (TBT 80ms) are excellent - the only real problem is how long the main content takes to appear, driven by a 949ms server response. Full-page caching is the single highest-impact fix and helps mobile most.
Recommended fix
Enable full-page caching (WP Rocket/LiteSpeed); Cache-Control immutable on versioned assets; fetchpriority+preload the real LCP image; self-host/preload fonts; Kadence Critical CSS.
Technical details for your developer
MOBILE (PSI): LCP 4.2s POOR, CLS 0, TBT 80ms, perf 78. DESKTOP (DataForSEO Lighthouse): LCP 2.77s, CLS 0.002, server-response 949ms, perf 70. CrUX field N/A (below threshold).AI crawlers are allowed by accident, not by design
MediumGood news: all 14 AI bots are allowed (geo-crawlers 92). But access is the WordPress default, not explicit policy - one careless edge/CDN rule could silently block GPTBot/PerplexityBot. An explicit named allow-list documents intent and guards the AI-citation goal.
Recommended fix
Add explicit User-agent allow blocks for major AI crawlers (optionally block Bytespider), keep the Sitemap directive, add the llms.txt reference.
/geo crawlers --robots
Technical details for your developer
geo-crawlers: robots.txt is the 115-byte WP default; 14 AI bots all 'not mentioned = allowed'; no AI policy block.The brand isn't in the knowledge graph AI engines trust
MediumChatGPT + Gemini lean on Wikipedia/Wikidata to decide which brands are real and citable. 'Ông Bố IT' has no Wikidata item and a sameAs list of 4 (LinkedIn/GitHub/TikTok/Facebook) missing Wikidata/X/YouTube. This caps how often AI engines name the brand as a source.
Recommended fix
Create a Wikidata item; expand sameAs to >=6 (Wikidata, X, YouTube, plus existing), reciprocally branded.
Technical details for your developer
geo-schema + geo-brand-mentions + geo-platform: sameAs 4 profiles; no Wikidata/X/YouTube; no Wikipedia/Wikidata entity.Some images can shift layout on load; mobile CTA needs scrolling
MediumSeveral images lack explicit width/height (layout-shift risk as content grows), and on mobile the primary CTA sits just below the fold with an undersized hamburger tap target. Measured CLS is ~0 today, so this is robustness + mobile-UX, not an active defect.
Recommended fix
Add width/height to all images; raise the primary CTA above the mobile fold; enlarge the hamburger tap target to >=48px.
Technical details for your developer
seo-visual (P1 undimensioned images; P2 mobile CTA below fold + undersized hamburger) + seo-images IMG3 (~30% in-article images lack width/height).No markup telling assistants which sentences to read aloud / cite
MediumNo speakable schema, so voice assistants and AI answer engines have no explicit signal for which passages are the concise citable answers. Adding it on definition/answer posts improves AEO.
Recommended fix
Add speakable (cssSelector) to the answer-first intro + key-takeaways blocks on definition/how-to posts.
/geo schema --speakable
Technical details for your developer
geo-schema: no speakable property in any JSON-LD across sampled pages.Owned channels use a different brand + the brand is invisible in local dev communities
MediumThe author's YouTube/GitHub carry 'NextGrowth' not 'Ông Bố IT', so existing authority doesn't accrue to this brand; and there's no presence on the highest-authority Vietnamese dev communities (the sources that earn natural links + feed Perplexity). Both fixable with consolidation + seeding.
Recommended fix
Cross-link/rebrand NextGrowth channels to reference Ông Bố IT; republish 3-5 flagship tutorials on Viblo/Spiderum with canonical credit back.
Technical details for your developer
geo-brand-mentions: YouTube/GitHub branded NextGrowth; zero footprint on Viblo/Spiderum/Tinhte/Reddit under the brand.Low Priority — Backlog
8 issuesNice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Two form inputs need real labels
LowAccessibility is strong (88/100), but the homepage search + newsletter inputs rely on placeholder text instead of labels. Easy fix that also helps AI parse context.
Recommended fix
Add aria-label (or visually-hidden <label>) to the search + newsletter inputs.
Technical details for your developer
geo-accessibility: 2 placeholder-only inputs (search + newsletter), no label/aria-label.A few small homepage on-page tweaks
LowOn-page is strong (seo-page 88; top post 93 exemplary). Homepage has 3 P3 nits: meta description 117 chars (room to ~150), H1 is a brand tagline rather than a keyword/answer phrase, and og:title has an unescaped &.
Recommended fix
Extend homepage meta to ~150 chars; add a topical phrase to the H1; fix og:title encoding.
Technical details for your developer
seo-page: homepage meta 117 chars, H1 tagline, og:title & encoding.Images could be ~20% smaller with AVIF via <picture>
LowImages are good (100% alt, ~98% WebP, lazy-loaded) but delivered as plain <img> WebP - no AVIF and no <picture> element. AVIF-first <picture> delivery (~93.8% support) cuts bytes ~20% and helps mobile LCP. Incremental, not a defect.
Recommended fix
Generate AVIF variants + serve via <picture><source type=image/avif><source type=image/webp><img></picture> (WP plugin or build step).
Technical details for your developer
seo-images (2026-06-02): 0 AVIF, 0 <picture> across 62 images; all WebP via <img>.Blog pagination pages are indexable (small crawl/index bloat)
Low18 paginated archive pages (/blog/page/2/ …) are index,follow, adding low-value pages to the index. Minor; pagination boundary is otherwise correct (page/20 -> 404, no soft-200 trap).
Recommended fix
Set paginated archives to noindex,follow (Rank Math setting) while keeping crawl of linked posts.
Technical details for your developer
seo-audit SEO-04: 18 /blog/page/N/ archives index,follow.No CDN/edge caching in front of the server
LowThe origin Apache server serves HTML directly with no Cache-Control and no CDN. This is the root of the 949ms server response (see M2) and means every request hits origin. Adding a CDN/full-page cache is the highest-leverage perf change.
Recommended fix
Front the site with a CDN (Cloudflare) + full-page caching; add Cache-Control to assets.
Technical details for your developer
geo-technical: no CDN vendor header, no Cache-Control on HTML; TTFB 384ms edge / 949ms lab server-response.A few keywords are one step from page 1
LowGSC shows commercial-intent terms just off page 1 ('claude code pricing' pos 11, 'giá claude code pro' pos 8.7) mapping to /claude-code-gia-bao-nhieu/ (pos 8.5). A focused on-page + internal-link push can land top-5.
Recommended fix
Strengthen /claude-code-gia-bao-nhieu/ on-page for those terms + consolidate internal links + a few links.
Technical details for your developer
GSC striking distance (seo-google GG1): pricing pos 11, 'giá claude code pro' pos 8.7, 'các gói claude code' pos 8.1.Almost all pages indexed; a handful worth a quick check
LowGSC: 184/196 sitemap URLs (~94%) got impressions in 90d; spot-checked top URLs are Submitted-and-indexed. Healthy for a young site. The ~12 zero-impression URLs are likely new/thin - worth a URL-Inspection pass.
Recommended fix
URL-Inspect the ~12 zero-impression URLs; request indexing for any not-indexed; add internal links to thin posts.
Technical details for your developer
seo-google: 184 pages with impressions vs 196 sitemap; URL Inspection PASS on top URLs.Backlink data still unavailable (subscription off)
LowExact backlink/referring-domain counts remain N/A because the DataForSEO Backlinks API is a separate paid product not active on the account (retry confirmed 40204). GSC, lab CWV, image, and indexation are all measured. Activating Backlinks (or Moz/Ahrefs) unlocks Chart 4 + a measured authority score.
Recommended fix
Activate DataForSEO Backlinks subscription, or use GSC Links report / Moz / Ahrefs for a baseline.
Technical details for your developer
backlinks_summary(ongboit.com) -> 40204 'subscription not active' (retried 2026-06-02). All other sources measured.Accessibility Deep Dive
88/100Rating: Good · Primary source: /geo-accessibility (88/100)
Strong static-HTML accessibility posture on both homepage and the /tiet-kiem-token-claude-code/ post. lang="vi" correctly set on <html>; single H1 with logical, no-skip heading hierarchy on both pages; 100% image alt coverage (12/12 home, 19/19 post, none empty); full ARIA landmark set (banner, navigation x2 with distinct aria-labels, main, search, contentinfo); skip-to-content link present; semantic HTML throughout (header/nav/main/footer/article/section, plus figure+figcaption on the post).
Primary gap: form inputs (site search and newsletter email) lack programmatic labels — no <label> and no aria-label, relying on placeholder text only (WCAG 1.3.1 / 4.1.2). Color contrast (~100 inline color: declarations per page) is not measurable from static HTML and needs a rendered-DOM/Lighthouse pass.
✓ What's working (8)
- <html lang="vi"> correctly set on both homepage and blog post — matches Vietnamese target market, aids AI language parsing and screen-reader pronunciation.
- Single H1 on both pages; heading hierarchy has no skipped levels (home: 1-2-3; post: 1-2-3) — clean document outline for AI extraction and screen readers.
- 100% image alt coverage with no empty alts: homepage 12/12, post 19/19; alt text is descriptive (e.g. 'Obsidian là gì local-first note-taking cho dev').
- Complete ARIA landmark set: role=banner, main, contentinfo, search, and two role=navigation regions with distinct aria-labels ('Primary' / 'Primary Mobile').
- Skip-to-content link present on both pages: <a class="skip-link screen-reader-text" href="#main">Skip to content</a>.
- Rich semantic HTML: header/nav/main/footer/article/section throughout, plus figure+figcaption pairs on the post (4 each) — strong structure for both a11y and AI passage parsing.
- Link text is descriptive (e.g. 'so sánh chi tiết Subscription vs API'); no bare 'click here'/'read more' anchors found.
- No positive tabindex misuse (tabindex="1+" count = 0 on both pages) — natural focus order preserved.
Findings from /geo-accessibility (2)
P2 Form inputs lack programmatic labels (placeholder-only)
Evidence: https://ongboit.com/ — site search <input type="search" name="s" placeholder="Tìm bài viết..."> inside <form role="search"> has no <label> and no aria-label; newsletter <input type="email" placeholder="Email của bạn"> has no <label>, no aria-label, no role=search wrapper. grep: 2
Impact: Screen-reader users get no persistent field name once typing begins; placeholder disappears. Search role partially mitigates the search box but email field is unlabeled. Low SEO impact, real assistive-tech impact.
P3 Color contrast not verifiable from static HTML
Evidence: Homepage 101 and post 96 inline `color: #hex` declarations (e.g. figcaption color:#666 on light bg). Foreground/background pairing and WCAG 1.4.3 ratio require rendered DOM; cannot be measured from curl'd HTML. Flagged for Lighthouse/axe pass, NOT scored as a confirmed failure.
Impact: Potential AA contrast issues (e.g. #666 captions) unconfirmed; needs rendered audit to close.
Brand Deep Dive
28/100Rating: Critical · Primary source: /geo-brand-mentions (28/100)
Off-site brand authority for "Ông Bố IT" / ongboit.com is thin and fragmented. The only meaningful third-party branded footprint is TikTok (two handles, @ongbo.it and @ongboit, with low engagement ~119-217 likes) plus a single organic Threads mention by an unrelated user. There is NO presence under the brand name on Reddit, YouTube (the author's channel exists but is branded "NextGrowth", not "Ông Bố IT"), GitHub, Viblo, Spiderum, Tinhte, Wikipedia, or Wikidata.
The brand has no entity-graph anchor (no Wikipedia/Wikidata page), which materially weakens AI-citation eligibility and E-E-A-T. The author's real identity (Nguyễn Minh Thế, DevOps engineer, HCMC) and profiles (GitHub thenguyenvn90, LinkedIn, FB page ongboitvuitinh, YouTube @nextgrowth-ai) are linked from /about but are not branded consistently, so brand equity is split across two identities (Ông Bố IT vs NextGrowth).
✓ What's working (5)
- Brand owns the #1 organic result for both 'Ông Bố IT' and 'ongboit.com' (no name-collision competitor displacing it).
- Active, on-brand TikTok presence with topical videos (Claude Code, WordPress MCP, vibe coding) — a real off-site content channel already exists.
- Real, verifiable author identity (Nguyễn Minh Thế, DevOps engineer, HCMC) with linked GitHub, LinkedIn, Facebook page, and YouTube — strong raw E-E-A-T inputs once consolidated.
- An organic, unsolicited third-party mention exists (Threads @irenejuann), indicating some genuine word-of-mouth.
- Homepage already carries Organization + Person schema, giving a structural hook for entity consolidation.
Findings from /geo-brand-mentions (5)
P2 No Wikipedia or Wikidata entity — brand absent from the knowledge graph AI engines rely on
Evidence: Domain-filtered firecrawl_search (includeDomains: wikipedia.org, wikidata.org) for '"Ông Bố IT" Thế DevOps blog ongboit' returned web: [] (empty). No knowledge-panel-eligible entity exists. AI engines (Perplexity/ChatGPT/Gemini) disproportionately cite entities with a knowledge-g
Impact: Establishing a verifiable entity (even via consistent sameAs + author schema + a Wikidata item once notability thresholds are met) raises AI-citation eligibility and disambiguates the brand for E-E-A-T.
P2 Brand-identity fragmentation: author's YouTube + GitHub carry a different brand (NextGrowth), not 'Ông Bố IT'
Evidence: /about page links to https://www.youtube.com/@nextgrowth-ai (titled 'NextGrowthWithAI') and https://github.com/thenguyenvn90, plus https://nextgrowth.ai/. Brand-name searches for 'Ông Bố IT'/'ongboit' on youtube.com and github.com returned web: [] — the author's owned channels do
Impact: Consolidating naming (cross-brand 'Ông Bố IT (NextGrowth)' on YouTube/GitHub, pinned links both ways) concentrates brand-signal and lets existing channel authority reinforce ongboit.com.
P2 Zero presence in Vietnamese dev communities (Viblo, Spiderum, Tinhte) — the highest-authority local citation sources
Evidence: firecrawl_search includeDomains [viblo.asia, spiderum.com, tinhte.vn, reddit.com] for the brand returned web: []. WebSearch '"ongboit" OR "Ông Bố IT" viblo OR tinhte OR spiderum' surfaced only unrelated Spiderum content; no brand match. Viblo in particular is the primary VN techn
Impact: 3-5 well-cited Viblo/Spiderum cross-posts would create authoritative third-party citation paths and likely lift Vietnamese-language AI-engine citations for Claude Code / n8n topics.
P3 Social proof is shallow — TikTok engagement is low and there are two competing handles
Evidence: firecrawl_search: TikTok @ongbo.it (videos ~119 likes) and a second handle @ongboit (channel '217 Lượt thích' total). Two handles dilute follower consolidation. Only one organic third-party mention found anywhere (Threads @irenejuann referencing 'ongboit.com ... dashboard về SEO
Impact: Consolidate to a single TikTok handle (301-redirect followers/bio-link the secondary), which strengthens the social sameAs signal and avoids splitting audience.
P3 sameAs covers owned profiles but omits TikTok and is not reciprocally branded
Evidence: Phase 3 noted only 4 sameAs platforms (recommend >=5). /about links GitHub, LinkedIn, Facebook (ongboitvuitinh), YouTube, TikTok (@ongbo.it) — but the TikTok-second-handle and the cross-brand mismatch mean sameAs likely does not include all live profiles, and linked profiles do n
Impact: Add TikTok + nextgrowth.ai to Organization/Person sameAs and make every linked profile bio say 'Ông Bố IT' — tightens the sameAs verification loop AI uses to confirm authorship.
Findings from /seo-backlinks (3)
P3 Backlink profile not measurable - DataForSEO Backlinks subscription inactive
Evidence: mcp__dataforseo-mcp__backlinks_summary(target=ongboit.com) -> 'Access denied. Visit Plans and Subscriptions to activate your subscription' (Code 40204). No measured referring-domain/backlink count obtained.
Impact: Activate a DataForSEO Backlinks subscription (or use Moz / Ahrefs / the GSC Links report) to get measured authority data next audit. Blocks precise gap quantification today.
P1 Authority gap is the binding constraint on rankings (inferred from SERP competitor data)
Evidence: DataForSEO ranked_keywords avg_backlinks_info for the SERPs ongboit competes on: 'claude code' competitors avg referring_main_domains ~2,940; 'claude code download' ~4,567. ongboit ranks pos 71-83 on these. Strong content (seo-page score 88) ranking page 7-8 => the limiter is off
Impact: A focused link-building + digital-PR program (guest posts on Viblo/Spiderum, HN/Reddit citations, dev community profiles) is the highest-leverage off-page action to unlock page-1 for the marquee terms.
P2 Likely near-zero referring domains (corroborated, not measured)
Evidence: Cross-agent: geo-brand-mentions found only TikTok handles + 1 Threads mention and zero presence on Reddit/YouTube/GitHub/Viblo/Wikipedia under the brand. Consistent with a fresh domain ranking only is_new keywords.
Impact: Establishes the baseline: almost any quality referring domain is incremental authority. Prioritize 5-10 foundational citations (author bios, dev directories, community profiles) first.
Compliance Deep Dive
62/100Rating: Fair · Primary source: /geo-compliance (62/100)
ongboit.com has solid foundations (valid Let's Encrypt TLS 1.2/1.3 cert, a Vietnamese privacy policy at /chinh-sach-bao-mat/ that explicitly cites PDPD / Nghị định 13/2023, and a terms page at /dieu-khoan-su-dung/), but the core PDPD gap is the absence of any cookie consent banner / CMP while Google Analytics 4 (Google Tag GT-K8HP8DDM via Site Kit) loads and fires unconditionally on page load, including on an email-collecting subscribe form.
Under Decree 13/2023 (effective 1 Jul 2023) data processing requires prior consent; loading analytics + collecting email PII before consent is the primary compliance exposure. Secondary issues: software version disclosure (asset ?ver= strings and a generator meta exposing 'Site Kit by Google 1.179.0').
No third-party tracker beyond Google was found (the 'tiktok' hits were social-profile links, not the TikTok Pixel). Cookie security flags could not be assessed because no Set-Cookie header is issued to anonymous GET requests.
✓ What's working (4)
- Privacy policy live at /chinh-sach-bao-mat/ (HTTP 200) and explicitly references PDPD and 'Nghị định 13', plus 'dữ liệu cá nhân' and cookies — correctly localized to Vietnam's Decree 13/2023.
- Terms of use live at /dieu-khoan-su-dung/ (HTTP 200).
- Valid Let's Encrypt cert (issuer CN=R12), subject CN=ongboit.com, valid 2026-05-19 to 2026-08-17, serving TLS 1.2 (ECDHE-RSA-AES128-GCM-SHA256) and TLS 1.3 (TLS_AES_128_GCM_SHA256).
- Only one third-party analytics vendor present (Google, via Site Kit). No TikTok Pixel, Facebook Pixel, Hotjar, Clarity or other trackers detected — the 'tiktok' references were social-profile links (tiktok.com/@ongbo.it), not a tracking pixel.
Findings from /geo-compliance (4)
P1 No cookie consent banner / CMP while GA4 fires on load (PDPD consent gap)
Evidence: Homepage HTML contains no CMP signature (grep for cookieyes|complianz|cmplz|onetrust|usercentrics|cookiebot|borlabs|moove_gdpr = 0 matches) yet loads https://www.googletagmanager.com/gtag/js?id=GT-K8HP8DDM and calls gtag('config','GT-K8HP8DDM') unconditionally. Vietnam Decree 13/
Impact: Analytics + email PII processed before consent; PDPD non-compliance for the Vietnam market and a GDPR risk for any EU visitors. Highest-priority compliance fix.
P2 Email PII collected via subscribe form with no consent checkbox or CMP gating
Evidence: Homepage has <input type="email" placeholder="Email của bạn"> Subscribe form; /contact/ returns 200. No consent checkbox and no CMP present to gate submission. Source: curl -s https://ongboit.com/ | grep email/form, /contact/ HTTP 200, 2026-06-02.
Impact: Email is personal data under PDPD; collecting it without an explicit consent affirmation weakens lawful-basis posture. Add an unticked consent checkbox linking the privacy policy.
P3 Software version / fingerprint disclosure (asset ?ver= and generator meta)
Evidence: Assets expose ?ver=1.4.5 and ?ver=7.0; <meta name="generator" content="Site Kit by Google 1.179.0">. Reveals exact plugin/component versions, easing targeted exploitation. Source: curl -s https://ongboit.com/ | grep ?ver=/generator, 2026-06-02.
Impact: Low direct privacy impact but aids attacker reconnaissance; remove version query strings and generator meta.
P3 Cookie security flags (Secure/HttpOnly/SameSite) unverifiable — no Set-Cookie issued
Evidence: curl -sIL https://ongboit.com/ returns no Set-Cookie header for anonymous requests (caching/static front page). Secure/HttpOnly/SameSite flags therefore could not be measured; assessment deferred to authenticated/session contexts. Source: curl -sIL, 2026-06-02.
Impact: Not a defect — informational. WP login/session cookies (wordpress_*) should still be re-checked for HttpOnly+Secure in an authenticated session.
🔍 Full-crawl per-URL findings (6 deterministic issues — every page scanned, complements the AI score above)
missing header strict transport security — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | HSTS |
missing header content security policy — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | CSP |
missing header x frame options — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | X-Frame-Options |
missing header x content type options — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | X-Content-Type-Options |
missing header referrer policy — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | Referrer-Policy |
missing header permissions policy — 1 URL
| URL | Missing header |
|---|---|
| https://ongboit.com | Permissions-Policy |
Geo Deep Dive
55/100Rating: Poor · Primary source: /geo-llmstxt (18/100)
https://ongboit.com/llms.txt is NOT served — it 301-redirects (via Rank Math) to https://ongboit.com/wp-content/uploads/2026/04/llms.txt, which returns 404. So a previous llms.txt attempt exists as a dangling Rank Math redirect pointing at a deleted/missing upload, leaving the site with zero usable AI-discovery manifest.
This is a P1 GEO gap: AI engines (ChatGPT, Perplexity, Claude, Gemini) get no curated map of the site's ~140 tutorial/glossary pages. The site itself is exceptionally well-structured for llms.txt — 5 clear categories (claude-code, n8n, self-hosting, ai-101, codex-cli), a clean /about and /blog, definitional 'la-gi' glossary pages, and tutorial clusters — so a high-quality llms.txt can be deployed quickly.
Score 18/100: file absent at canonical path + broken redirect, but strong underlying structure to remediate.
✓ What's working (4)
- Site taxonomy is clean and AI-friendly: 5 well-named category hubs (claude-code, n8n, self-hosting, ai-101, codex-cli) plus /about, /blog, /contact — ideal scaffolding for llms.txt.
- Strong glossary layer of definitional 'la-gi' pages (token-la-gi, claude-code-la-gi, ai-agent-la-gi, context-window-la-gi, etc.) — high-value, citation-friendly content for AI engines.
- sitemap_index.xml is referenced in robots.txt and resolves, and firecrawl_map enumerated ~140 indexed URLs — content inventory is healthy and discoverable, so building llms.txt is low-effort.
- The buyer has already attempted an llms.txt (Rank Math redirect dated 2026/04 exists) — awareness of the standard is present; only the file/redirect needs repair.
Findings from /geo-llmstxt (3)
P1 /llms.txt absent: Rank Math 301 redirects to a 404 upload path (broken AI-discovery manifest)
Evidence: curl -sIL https://ongboit.com/llms.txt → HTTP/1.1 301 Moved Permanently, header 'X-Redirect-By: Rank Math', Location: https://ongboit.com/wp-content/uploads/2026/04/llms.txt; following that target → HTTP/1.1 404 Not Found (curl FINAL_CODE: 404, size 0). Canonical /llms.txt theref
Impact: Deploying a valid /llms.txt (and removing the dead Rank Math redirect) gives AI crawlers a curated map of ~140 pages, improving citation eligibility in ChatGPT/Perplexity/Claude/Gemini for high-intent VN queries (e.g. 'claude code la gi', 'n8n self-host'). Emerging standard; low
P2 Dangling Rank Math redirect rule points /llms.txt at a deleted /wp-content/uploads file
Evidence: Response header 'X-Redirect-By: Rank Math' on the 301 from /llms.txt to /wp-content/uploads/2026/04/llms.txt (404). The redirect was configured in Rank Math (date stamp 2026/04) but the target upload no longer exists. The fix must delete/replace this redirect, otherwise a static
Impact: Removing the stale redirect prevents the new llms.txt from being shadowed by the broken 301; avoids serving a redirect-to-404 to AI agents that probe /llms.txt.
P3 Site structure fully supports a high-quality llms.txt — recommended outline ready to deploy
Evidence: firecrawl_map (sitemap-backed) returned ~140 URLs with clean taxonomy: 5 category hubs (/category/claude-code, /category/n8n, /category/self-hosting, /category/ai-101, /category/codex-cli), core pages (/about, /blog, /contact, /dich-vu), VN legal pages (/dieu-khoan-su-dung, /chin
Impact: A curated llms.txt covering the 5 category hubs + ~20-25 flagship tutorials/glossary pages maximizes AI-engine comprehension with minimal maintenance, giving the buyer a deployable deliverable.
Platform Deep Dive
64/100Rating: Fair · Primary source: /geo-platform-optimizer (64/100)
ongboit.com is well-positioned for AI-engine citation on the technical/content axis: robots.txt is wildcard-open (no GPTBot/PerplexityBot/Google-Extended/Bingbot blocks), articles use answer-first question-format H2s with TL;DR and definition-first paragraphs, schema is rich (Person+jobTitle+knowsAbout, BlogPosting+author+dates, BreadcrumbList), and freshness is excellent (dateModified 2026-06-01).
The drag on platform readiness is off-page: no Wikipedia/Wikidata entity, no Reddit/forum community validation, a broken/missing llms.txt (301 -> 404), no actual FAQPage JSON-LD despite Q&A-format content, and only 4 sameAs profiles. Per-platform scores: Google AIO 72, ChatGPT Web Search 68, Google Gemini 64, Bing Copilot 60, Perplexity 58 (average 64).
✓ What's working (5)
- robots.txt is wildcard-open (User-agent: *, only /wp-admin/ disallowed) -- GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Google-Extended, and Bingbot are ALL allowed. Full crawler-access marks on every platform.
- Answer-first content structure: articles use genuine question-format H2s (e.g. 'GEO la gi va business impact 2026 ra sao?'), a TL;DR block, definition-first opening paragraphs, and inline authoritative outbound citations (llmstxt.org, schema.org, SearchEngineLand).
- Excellent freshness: article dateModified 2026-06-01T21:35:32 (same day as audit); homepage dateModified 2026-05-24 -- strong recency signal for ChatGPT/Perplexity recency bias.
- Rich, valid schema graph: Person with jobTitle + knowsAbout array, BlogPosting with author (Nguyen Minh The) + datePublished + dateModified, BreadcrumbList, WebSite with SearchAction -- parseable entity + article structure for AIO and Gemini.
- Brand owns its name in SERP (position 1) and has an active multi-channel social footprint (Facebook page, TikTok with branded #ongboit hashtag) plus a github.com profile -- baseline entity presence for ChatGPT and Bing/LinkedIn ecosystem.
Findings from /geo-platform-optimizer (8)
P2 Per-platform readiness breakdown (5 engines)
Evidence: Computed from observed signals. Google AIO=72/100 (structure 32/40, authority 18/30, technical 22/30); ChatGPT=68/100 (entity 18/35, content 35/40, crawler 25/25); Gemini=64/100 (ecosystem 18/35, KG 16/30, content 30/35); Bing Copilot=60/100 (index 15/30, content 25/30, ecosystem
Impact: Roadmap: closing entity + community gaps lifts average ~64 -> ~78
P1 llms.txt is broken (301 -> 404), not just missing
Evidence: curl https://ongboit.com/llms.txt returns 301 redirecting to https://ongboit.com/wp-content/uploads/2026/04/llms.txt which returns 404. No working llms.txt served at root. Affects all 5 AI engines that consume the emerging llms.txt convention for content discovery.
Impact: Cross-platform AI discoverability; cleaner crawl guidance for ChatGPT/Perplexity/Gemini
P2 No FAQPage JSON-LD despite Q&A-format content
Evidence: Article /claude-code-audit-geo-ai-search/ has question-format H2s ('GEO la gi va business impact 2026 ra sao?') and the body discusses FAQPage, but the JSON-LD @graph contains only Person, WebSite, ImageObject, BreadcrumbList, WebPage, Person(author), BlogPosting -- no FAQPage ty
Impact: Higher passage-level citation rate on ChatGPT + Perplexity for question queries
P2 No Wikipedia / Wikidata entity for brand (ChatGPT + Gemini KG gap)
Evidence: firecrawl_search for '"ongboit" OR "Ong Bo IT" Claude Code blog' returned only self-owned pages + Facebook + TikTok + one Threads mention. No Wikipedia article, no Wikidata item, no Knowledge-Graph indicator. Wikipedia presence is the strongest entity signal for ChatGPT web searc
Impact: Entity recognition uplift for ChatGPT (18/35 -> ~26) and Gemini KG signals
P2 No Reddit / forum community validation (Perplexity weak spot)
Evidence: Brand-mention search surfaced Facebook, TikTok (#ongboit hashtag), and a third-party Threads post -- but zero Reddit threads, Stack Overflow, or Q&A-forum discussion. Perplexity heavily weights Reddit + forum validation; presence here is social-broadcast only, not community-discu
Impact: Perplexity community score 9/30 -> ~18/30 with seeded authentic discussion
P3 Only 4 sameAs profiles; no YouTube / no Wikidata link
Evidence: Person schema sameAs = [facebook.com/ongboitvuitinh, github.com/thenguyenvn90, tiktok.com/@ongbo.it, linkedin.com/in/minh-the-nguyen-...]. 4 platforms (Phase3 M1 recommends >=5). No YouTube channel (Gemini ecosystem gap) and no sameAs to Wikidata/Crunchbase to anchor the entity f
Impact: Entity disambiguation across ChatGPT + Gemini; small but compounding
P3 No IndexNow signal; Bing Webmaster verification unverifiable
Evidence: No IndexNow key file referenced and no msvalidate.01 meta tag observed in homepage HTML head scan. Bing Webmaster Tools verification status is unverifiable from external analysis. Bingbot itself is allowed (robots wildcard-open), so Copilot can crawl -- but faster index freshness
Impact: Faster Bing index refresh -> fresher Copilot answers
P2 0/6 security headers may dampen cross-platform trust signals
Evidence: Phase3 H1: CSP, HSTS, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy, Permissions-Policy all absent. Not a direct citation blocker, but HTTPS/security hygiene is a soft trust input for AIO source-quality and Copilot enterprise-context ranking. Listed here as a shared d
Impact: Marginal trust uplift across AIO + Copilot
Schema Deep Dive
70/100Rating: Fair · Primary source: /geo-schema (70/100)
Rank Math emits a clean server-rendered @graph (Person+WebSite+WebPage+BreadcrumbList+Article/BlogPosting) across home/about/post, with author Person sameAs to 4 platforms (LinkedIn, GitHub, TikTok, Facebook), jobTitle, knowsAbout, and a valid WebSite+SearchAction. Three structural problems cap the score: (1) a second, hand-coded standalone Organization block conflicts with Rank Math's Person #person identity — both are named 'Ông Bố IT', use a DIFFERENT Facebook URL, carry a thinner sameAs (only TikTok+Facebook), and are never linked by @id, splitting the entity graph AI models build; (2) BlogPosting/Article publisher points to the Person #person, not an Organization-with-logo (weaker Article rich-result signal); (3) speakable is absent on every page. sameAs covers 4 platforms but is missing Wikidata, X/Twitter, and YouTube.
All schema is in raw HTML (no JS-injection / AI-crawler risk). FAQPage on the post is restricted for Google rich results but retains AI Q&A semantic value — keep it.
✓ What's working (6)
- All JSON-LD is server-rendered in the raw HTML (Rank Math) — no JavaScript-injection risk, fully visible to GPTBot/ClaudeBot/PerplexityBot.
- Rank Math @graph is internally consistent and @id-linked: Person <-> WebSite <-> WebPage <-> Article/BlogPosting <-> BreadcrumbList all cross-reference correctly.
- Valid WebSite + SearchAction (potentialAction with target template and query-input) present on every page.
- BlogPosting and About Article carry headline, datePublished, dateModified, description, image, articleSection, inLanguage, mainEntityOfPage, keywords — strong content-context coverage.
- BreadcrumbList present on /about/ and the blog post for navigation context.
- #person node includes jobTitle, knowsAbout (6 topics), worksFor and a 4-platform sameAs — a solid author/entity foundation to consolidate around.
Findings from /geo-schema (6)
P1 Duplicate/conflicting Organization identity splits the entity graph
Evidence: https://ongboit.com/ ships TWO unlinked identity blocks: (a) Rank Math @graph node @id=https://ongboit.com/#person type=Person name='Ông Bố IT' sameAs=[facebook.com/ongboitvuitinh, github.com/thenguyenvn90, tiktok.com/@ongbo.it, linkedin.com/in/minh-the-nguyen-6b995960]; (b) a se
Impact: Removes entity ambiguity so AI engines resolve one canonical 'Ông Bố IT' node instead of two competing ones; consolidates sameAs into a single authoritative entity.
P1 Article/BlogPosting publisher is a Person, not an Organization with logo
Evidence: BlogPosting @id=.../tiet-kiem-token-claude-code/#richSnippet and About Article both set publisher -> {@id: https://ongboit.com/#person} (a Person node). Google Article rich-result guidance expects publisher as an Organization carrying a logo ImageObject. The Organization block th
Impact: Restores valid Article publisher signal (Organization+logo) for rich-result eligibility and clearer publisher entity for AI attribution.
P2 sameAs entity graph missing Wikidata, X/Twitter, YouTube
Evidence: #person sameAs covers 4 platforms (LinkedIn, GitHub, TikTok, Facebook). No Wikidata entity, no X/Twitter, no YouTube channel linked. No Wikipedia (likely N/A for this entity size). Source: home/post JSON-LD #person + author/ongboit138 nodes, 2026-06-02.
Impact: Each additional verified profile strengthens cross-platform entity resolution for AI engines; Wikidata is the highest-value addition if/when an entity exists.
P2 speakable property absent on all pages
Evidence: String 'speakable' not present in JSON-LD on home, /about/, or /tiet-kiem-token-claude-code/ (grep=False, 2026-06-02). No cssSelector/xpath markup signalling voice/AI-readable sections.
Impact: Adds an explicit AI-assistant/voice readability signal pointing engines to the TL;DR and FAQ answers — underused GEO lever for a tutorial-heavy blog.
P3 Author Person uses the site logo as its image (no real headshot)
Evidence: author Person @id=https://ongboit.com/author/ongboit138/ image.url=https://ongboit.com/wp-content/uploads/2026/03/ongboit-logo-transparent-150x150.webp (the brand logo, caption 'Nguyễn Minh Thế'). Author node also omits knowsAbout and worksFor that the homepage #person carries. S
Impact: A genuine author headshot plus knowsAbout/worksFor on the author node improves E-E-A-T and author-entity verification for AI engines.
P3 FAQPage on post — restricted for Google rich results (informational, no fix required)
Evidence: https://ongboit.com/tiet-kiem-token-claude-code/ block 1 type=FAQPage with 7 well-formed Question/acceptedAnswer pairs. Since Aug 2023 Google shows FAQ rich results only for government/health authority sites; this is a non-authority blog so no rich result will render. Schema is v
Impact: Keep as-is: no Google rich-result benefit but retains genuine Q&A semantic value for AI answer engines.
🔍 Full-crawl per-URL findings (281 deterministic issues — every page scanned, complements the AI score above)
schema incomplete — 280 URLs
schema invalid jsonld — 1 URL
| URL |
|---|
| https://ongboit.com/claude-code-sub-agents/ |
Technical Deep Dive
78/100Rating: Good · Primary source: /geo-technical (78/100)
ongboit.com is technically healthy for AI discovery: fully server-rendered WordPress (homepage 39 <p> / 17 headings / real Vietnamese body text; article 93 <p>; no SPA root div, no __NEXT_DATA__), so GPTBot/ClaudeBot live-fetched the full 113KB HTML at HTTP 200. Meta/indexability is clean (title, 150-char meta description, self-referencing canonical, index/follow robots, viewport, lang=vi, 13 OG + 8 Twitter tags) and all JSON-LD parses valid (homepage Person/WebSite/ImageObject/WebPage/Organization; article adds BlogPosting + BreadcrumbList).
HTTPS + HTTP->HTTPS 301 + www->non-www 301 + proper 404 all correct. Three real gaps drag the score: (1) 0/6 security headers (no HSTS/CSP/X-Content-Type-Options/X-Frame-Options/Referrer-Policy/Permissions-Policy); (2) NO caching headers at all (no Cache-Control/ETag/Expires/Last-Modified) and no CDN — origin Apache 2.4.66, TTFB ~330ms; (3) llms.txt is broken (301 -> /wp-content/uploads/2026/04/llms.txt -> 404). robots.txt is WP-default with NO AI-bot directives (neither blocked nor explicitly allowed).
Core Web Vitals: no field data, see seo-performance.
Cross-checked by: seo-audit: 78/100seo-page: 88/100
✓ What's working (8)
- Fully server-side rendered: homepage raw HTML has 39 <p>, 17 h1-h3, 1 <article>, real Vietnamese paragraph text; article /tiet-kiem-token-claude-code/ has 93 <p>. No <div id=root/app/__next>, no __NEXT_DATA__/__NUXT__. AI crawlers see the complete content without executing JS.
- Live AI-bot fetch confirmed: GPTBot UA and ClaudeBot UA each returned HTTP 200 with the full 113,958-byte HTML (curl, 2026-06-02).
- Indexability clean: <meta robots> index,follow,max-image-preview:large; self-referencing canonical on home and article; meta description ~150 chars; <html lang=vi>; viewport width=device-width,initial-scale=1.
- Social/preview complete: 13 Open Graph + 8 Twitter Card meta tags on homepage.
- Structured data valid: both homepage JSON-LD blocks parse cleanly (Person/WebSite/ImageObject/WebPage + Organization); article adds BlogPosting + BreadcrumbList + ListItem. No JSON syntax errors.
- HTTPS + redirect hygiene correct: http->https 301, www->non-www 301 (X-Redirect-By WordPress), trailing-slash canonicalization, genuine 404 for missing URLs, gzip via Vary: Accept-Encoding.
- URL structure clean: lowercase, hyphenated, descriptive Vietnamese slugs, consistent trailing slash, shallow depth (e.g. /tiet-kiem-token-claude-code/), no parameters/session IDs.
- Crawl surface defined: robots.txt 200 references sitemap_index.xml (post 185 + page 6 + category 5 = 196 URLs per Phase 1).
Findings from /geo-technical (5)
P1 0/6 security headers present (no HSTS, CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy)
Evidence: curl -D - https://ongboit.com/ (2026-06-02): response headers contain only Alt-Svc, Content-Type, Date, Link, Server (Apache/2.4.66 Debian), Vary, Transfer-Encoding. None of the 6 security headers returned on any tested URL.
Impact: Trust/safety signal gap; clickjacking + MIME-sniff + downgrade exposure. Low direct ranking effect but a measurable hygiene deficit and easy win. Fix in Apache vhost/.htaccess: add Strict-Transport-Security "max-age=31536000; includeSubDomains; preload", X-Content-Type-Options "n
P2 No HTTP caching headers and no CDN on HTML responses
Evidence: curl -D - https://ongboit.com/ (2026-06-02): no Cache-Control, ETag, Expires, or Last-Modified header on the 200 HTML response. No CDN signals (no CF-*, X-Cache, Via, Age). Origin = Apache/2.4.66 over HTTP/1.1 (Alt-Svc advertises h3 but origin serves 1.1). TTFB measured 0.33-0.34
Impact: Repeat visits and crawler re-fetches are uncached at the edge; every request hits origin PHP. Adds latency risk under load and wastes crawl budget. Put Cloudflare (free) in front for edge caching + HTTP/2/3 + automatic Brotli, and add Cache-Control/ETag for static assets. Improve
P2 llms.txt broken: 301 redirect to uploads path that 404s
Evidence: curl -L https://ongboit.com/llms.txt (2026-06-02): HTTP 301 -> Location https://ongboit.com/wp-content/uploads/2026/04/llms.txt -> HTTP 404 Not Found. Redirect appears Rank-Math-generated.
Impact: The emerging AI-discovery manifest is unreachable, so LLM crawlers that look for /llms.txt get a 404. For a publisher whose explicit goal is AI-engine citations this is a missed signal. Remove the Rank Math redirect and serve a valid llms.txt at the root (200) listing key posts/s
P3 robots.txt has no AI-crawler directives (default WP only)
Evidence: curl https://ongboit.com/robots.txt (2026-06-02): User-agent: * / Disallow: /wp-admin/ / Allow: /wp-admin/admin-ajax.php / Sitemap: https://ongboit.com/sitemap_index.xml. No GPTBot/ClaudeBot/PerplexityBot/Google-Extended/CCBot/etc. rules. Live UA tests show GPTBot and ClaudeBot a
Impact: AI bots are not blocked (good for citation goal) but there is no explicit allow either. Optional: add explicit User-agent allow stanzas for the 11 major AI bots (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot, Perplexity-User, Google-
P3 Minimal resource hints; no preload for hero image or fonts
Evidence: Homepage HTML (2026-06-02): only 2 preconnect hints (fonts.googleapis.com, fonts.gstatic.com), no dns-prefetch, no rel=preload. 6 stylesheets in <head>; 11 scripts (0 defer, 2 async). Hero handled reasonably: 1 fetchpriority=high img, 11/12 imgs have width+height, 8 lazy.
Impact: Render-blocking CSS in head plus Google Fonts without preload/font-display can delay LCP. Add rel=preload for the LCP hero and the primary woff2 font, and ensure font-display:swap. Static-signal only; validate against field data in seo-performance.
Findings from /seo-audit (6)
P1 llms.txt is broken (301 to a 404) — AI-engine discovery file unusable
Evidence: https://ongboit.com/llms.txt returns HTTP 301 -> https://ongboit.com/wp-content/uploads/2026/04/llms.txt which is 404 (curl, 2026-06-02; corroborates Phase 1 signal). Goal includes AI-engine citations, so a dead llms.txt directly undercuts the stated objective.
Impact: AI crawlers (ChatGPT, Perplexity) that honor llms.txt get a 404 instead of a content map; removes an easy AI-citation signal for an AI-coding-topic site.
P2 Zero security/transport headers (0/6) — trust + minor ranking/crawl-trust signal
Evidence: curl -I https://ongboit.com/ shows no Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, or Referrer-Policy (0 matches, 2026-06-02; matches Phase 1 0/6). HTTPS works but no HSTS to enforce it.
Impact: No HSTS leaves a downgrade window; missing X-Content-Type-Options/Referrer-Policy are baseline hygiene reviewers and some trust heuristics expect. Low direct ranking effect, easy win.
P2 robots.txt declares no AI-bot policy — no explicit allow/disallow for GPTBot/PerplexityBot/etc.
Evidence: Phase 1: robots.txt is WP-default (Disallow /wp-admin/ only, Sitemap -> sitemap_index.xml); no AI crawler user-agents addressed. For a site whose goal is AI-engine citations, the absence of explicit allow directives is a missed positioning opportunity (and no control over trainin
Impact: Site cannot signal welcome/blocking intent to AI answer engines; combined with broken llms.txt, AI-discovery surface is weaker than the content quality warrants.
P2 18 paginated blog archive pages are index,follow — thin/near-duplicate index bloat
Evidence: https://ongboit.com/blog/page/2/ ... /page/19/ all return HTTP 200 with meta robots 'follow, index' and self-referential canonicals (curl, 2026-06-02). 185 posts at 10/page = 19 archive pages, each thin listing markup. (Pagination correctly 404s beyond page 19 — no soft-200 overr
Impact: Crawl budget spent on low-value listing pages and potential index dilution; Google generally prefers these consolidated or noindex,follow. Minor for a 185-post site but trivially fixable in Rank Math.
P3 Decorative SVG icons emit generic <title> nodes ('Hours','Toggle Menu') — accessibility/markup noise
Evidence: Raw HTML of /, /blog/, and article pages contains repeated <title>Hours</title>, <title>Toggle Menu</title>, <title>Scroll to top</title> from Kadence inline SVGs (curl, 2026-06-02). Not document-title conflicts (the real <title> is first and correct) but they add meaningless lab
Impact: No ranking penalty; mild a11y/clarity noise. Cosmetic markup hygiene.
P3 Meta robots directive order inconsistent across templates ('follow, index' vs 'index, follow')
Evidence: Homepage/about/blog/category use 'follow, index, ...'; the article /tiet-kiem-token-claude-code/ uses 'index, follow, ...' (curl, 2026-06-02). Functionally equivalent to crawlers but signals two different meta-config paths (theme vs Rank Math per-post), worth normalizing.
Impact: No SEO impact; indicates template/config drift to clean up for consistency.
Findings from /seo-page (3)
P3 Homepage meta description under-utilized at 117 chars
Evidence: https://ongboit.com/ meta description = 117 chars (Rank Math, scraped 2026-06-02); ~155 chars available before SERP truncation, leaving ~38 chars of unused snippet real estate / no keyword reinforcement.
Impact: Minor CTR uplift; fuller, keyword-bearing snippet in Google SERP.
P3 Homepage H1 is a brand tagline, not a query/answer phrase
Evidence: https://ongboit.com/ H1 = 'Hành Trình Zero → Hero với AI Coding và Automation' (scraped 2026-06-02). No primary keyword (Claude Code / AI coding blog) in the on-page H1; weak alignment between H1 and the keyword-rich <title>/og:title.
Impact: Tighter H1↔title keyword alignment can reinforce homepage topical relevance for brand+category queries.
P3 Homepage og:title contains an unescaped HTML entity (&)
Evidence: https://ongboit.com/ og:title = 'Ông Bố IT | Claude Code, AI Coding & Self-hosting Blog' (scraped 2026-06-02). Social/AI cards may render the literal '&' instead of '&'.
Impact: Cosmetic — cleaner social/AI share-card title.
🔍 Full-crawl per-URL findings (533 deterministic issues — every page scanned, complements the AI score above)
h1 title duplicate — 78 URLs
og incomplete — 75 URLs
low text html ratio — 57 URLs
duplicate title — 55 URLs
duplicate meta desc — 55 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/category/seo/ | Kiến thức SEO cho developer | 2 pages |
| https://ongboit.com/category/seo/page/2/ | Kiến thức SEO cho developer | 2 pages |
| https://ongboit.com/category/claude-code/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/15/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/3/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/2/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/13/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/14/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/5/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/4/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/12/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/11/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/7/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/6/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/10/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/9/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| https://ongboit.com/category/claude-code/page/8/ | Hướng dẫn, tips, và projects với Claude Code | 15 pages |
| 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 | 2 pages |
| https://ongboit.com/category/ai-101/page/2/ | Giải thích các khái niệm AI cơ bản cho lập trình viên Việt Nam | 2 pages |
| https://ongboit.com/category/n8n/ | Automation workflows và tutorials với n8n | 2 pages |
| https://ongboit.com/category/n8n/page/2/ | Automation workflows và tutorials với n8n | 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=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=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=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 |
| …and 25 more | ||
low word count — 45 URLs
canonical missing — 31 URLs
meta desc too short — 23 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/self-hosting/ | Hướng dẫn tự host ứng dụng trên VPS: Coolify, Docker, WordPress, và các dịch vụ khác | 84c |
| https://ongboit.com/category/n8n/ | Automation workflows và tutorials với n8n | 41c |
| https://ongboit.com/category/seo/page/2/ | Kiến thức SEO cho developer | 27c |
| https://ongboit.com/category/claude-code/page/15/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/3/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/2/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/ai-101/page/2/ | 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/page/2/ | Automation workflows và tutorials với n8n | 41c |
| 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 |
| https://ongboit.com/category/claude-code/page/13/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/14/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/5/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/4/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/12/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/11/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/7/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/6/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/10/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/9/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
| https://ongboit.com/category/claude-code/page/8/ | Hướng dẫn, tips, và projects với Claude Code | 44c |
meta desc too long — 20 URLs
| URL | Meta description | Length |
|---|---|---|
| https://ongboit.com/claude-code-seo-content/ | 20+ Claude Code SEO skills 2026: AgriciDaniel claude-seo (25 sub-skills), aaron-he-zhu 20 GEO skills, huifer 27 commands, Bhanunamikaze 88 scripts. 7 MCP servers. | 162c |
| https://ongboit.com/claude-code-cho-sinh-vien/ | Claude Code cho sinh viên: Anthropic Education Plan free Pro tier (9 partner unis), Claude Code University $50, Coursera Vanderbilt, Campus Ambassadors. Apprenticeship khác ChatGPT | 181c |
| https://ongboit.com/claude-code-cho-product-manager/ | Claude Code cho PM: 6 MCP integration (Linear, Jira, Notion, Slack, PostHog, Amplitude). PRD-to-prototype same session, auto-generate 8 ticket trong 5-10 phút. Save 5-8h/tuần. | 175c |
| https://ongboit.com/n8n-pricing/ | n8n giá bao nhiêu 2026? Cloud Starter $24, Pro $50, Self-host VPS $5-10. Q2 updates: AI templates trong Pro, 70% chọn Coolify, 3 pattern tiết kiệm chi phí team VN. | 163c |
| https://ongboit.com/llm-la-gi/ | LLM là gì? So sánh 16 model AI tháng 5/2026 (Opus 4.7, GPT-5.4, Grok 4.1), 10 khái niệm cơ bản (token, context window, temperature, prompt caching), giá thực tế VN. | 164c |
| https://ongboit.com/claude-code-prompt-engineering/ | Prompt engineering Claude Code 2026: 9 khái niệm nền tảng (token, context window, temperature, system prompt, CoT, few-shot, caching), 8 template thực tế, 7 anti-pattern. | 170c |
| https://ongboit.com/mcp-la-gi/ | MCP (Model Context Protocol) là chuẩn mở Anthropic 11/2024. Cập nhật 5/2026: Anthropic mua Stainless $300M, design flaw 200K servers, code execution 98.7% token. | 161c |
| https://ongboit.com/claude-code-hooks/ | Claude Code Hooks tự động hóa workflow với 24 hook events, 4 handler types. 7 recipes thực tế: auto-format, block commands, test, notifications. Cấu hình từ A-Z. | 161c |
| https://ongboit.com/dataforseo-la-gi/ | DataForSEO là gì? Pay-as-you-go SEO API từ $0.0006/call. Q2 2026 updates: LLM mentions, ChatGPT scraper, bulk endpoint giảm 40%. Tích hợp Claude Code 3 workflow. | 161c |
| https://ongboit.com/dataforseo-review/ | DataForSEO review sau 6 tháng test thực tế: tiết kiệm 95% so Ahrefs ($12 vs $199), Q2 2026 updates (LLM mentions, ChatGPT scraper, bulk endpoint -40%). Verdict 8.5/10. | 167c |
| https://ongboit.com/claude-code-search-console/ | Claude Code Search Console: 11 skills /gsc-* phân tích Google Search Console từ terminal. Combo với claude-seo v1.9.9 + claude-blog v1.9.1 = SEO stack hoàn chỉnh. | 162c |
| https://ongboit.com/claude-code-skills/ | Claude Code Skills cho phép tạo slash command riêng cho project. Hướng dẫn viết SKILL.md từ A-Z, 5 bundled skills có sẵn, so sánh Skills vs Hooks vs MCP với ví dụ thực tế. | 171c |
| https://ongboit.com/claude-code-plugins/ | Claude Code Plugins 2026: 11 plugin chính thức Anthropic từ Code with Claude London (sales, finance, legal, PM). So sánh với skills, hooks, MCP. 3 lưu ý triển khai team VN. | 172c |
| https://ongboit.com/harness-design-long-running-agent/ | Harness design cho long-running AI agent: 5 component (loop, state, recovery, telemetry, guardrail), pattern Anthropic Engineering Mar 2026 cho production agent chạy giờ tới ngày. | 179c |
| https://ongboit.com/danh-gia-ai-agent-evaluation/ | Đánh giá AI agent qua eval framework: 4 component (task, dataset, metric, judge), 3 phương pháp evaluator, anti-pattern phổ biến. Translate Anthropic Engineering 1/2026. | 169c |
| https://ongboit.com/claude-code-cho-non-coder-vibe-coding/ | Claude Code cho PM, marketer, sales 2026: 9 workflow non-coder, 5 guardrails production, Cowork updates 5/2026. BMAD vs SpecKit decision tree + 4 case study failure. | 165c |
| https://ongboit.com/5-trang-web-tim-claude-skills/ | 5 trang web tìm Claude Skills uy tín 2026: anthropics/skills repo, skillsdirectory.com, mcpmarket.com, GitHub trending, r/ClaudeAI weekly. Discovery roadmap đầy đủ. | 164c |
| https://ongboit.com/karpathy-llm-wiki-obsidian/ | Karpathy LLM Wiki pattern: tweet 16 triệu views về compounding knowledge với markdown vault. Khác RAG, 5 framework triển khai. 3 lưu ý cấu hình + bảo trì cho team VN. | 166c |
| https://ongboit.com/obsidian-memory-3-layer-architecture/ | Obsidian Memory kiến trúc 3 lớp (raw, wiki, CLAUDE.md) theo Karpathy LLM Wiki. 5 cách tích hợp ecosystem (markdown, MCP, sync, plugin) + 3 bài học sau 6 tháng vận hành. | 168c |
| https://ongboit.com/context-window-la-gi/ | Context window là gì 2026: Claude Sonnet 4.6 1M, GPT-4o 128K, Grok 4.1 2M. Tiếng Việt Language Tax 2x. Kết nối context engineering, prompt caching. 3 lưu ý team VN. | 164c |
one dofollow incoming — 18 URLs
broken external link — 15 URLs
| URL | Broken URL |
|---|---|
| https://ongboit.com/claude-code-vs-semrush-ahrefs/ | https://developers.google.com/search/blog/2023/08/changes-to-faq-and-howto-rich- |
| https://ongboit.com/claude-code-audit-blog-portfolio/ | https://blog.google/products/search/google-search-generative-ai-search/ |
| https://ongboit.com/claude-code-audit-website/ | https://blog.google/products/search/google-search-generative-ai-search/ |
| https://ongboit.com/machine-learning-la-gi/ | https://www.kaggle.com/learn |
| https://ongboit.com/llm-la-gi/ | https://fpt.ai/en/solutions/engage/ |
| 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-la-gi/ | https://openai.com/index/mcp-for-chatgpt/ |
| https://ongboit.com/mcp-servers-claude-code/ | https://developers.cloudflare.com/mcp/ |
| https://ongboit.com/dataforseo-la-gi/ | https://tracxn.com/d/companies/dataforseo/ |
| 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/c-compiler-parallel-claudes/ | https://www.anthropic.com/engineering/building-a-c-compiler-with-parallel-claude |
| https://ongboit.com/claude-for-microsoft-365/ | https://www.anthropic.com/microsoft-365 |
| https://ongboit.com/claude-code-vps/ | https://www.itransition.com/ai/statistics |
nofollow external — 12 URLs
links to redirect — 12 URLs
links to broken page — 11 URLs
| URL | Broken target |
|---|---|
| https://ongboit.com/ccpi-tonsofskills-marketplace/ | https://ongboit.com/claude-code-plugin-marketplace-third-party/ |
| https://ongboit.com/claude-code-audit-analytics-conversion/ | https://ongboit.com/claude-growth-kit-viet-blog-claude-code/ |
| https://ongboit.com/claude-code-gioi-han-su-dung/ | https://ongboit.com/claude-deepclaude-qwen-local/ |
| https://ongboit.com/claude-code-plugins/ | https://ongboit.com/claude-code-plugin-marketplace-third-party/ |
| https://ongboit.com/claude-opus-4-7-review/ | https://ongboit.com/claude-deepclaude-qwen-local/ |
| https://ongboit.com/claude-code-cho-non-coder-vibe-coding/ | https://ongboit.com/claude-code-shadow-code-problem/ |
| 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 — 8 URLs
title too short — 7 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/category/seo/page/2/ | SEO - Ông Bố IT | 118px |
| https://ongboit.com/category/ai-101/page/2/ | AI 101 - Ông Bố IT | 128px |
| https://ongboit.com/category/n8n/page/2/ | n8n - Ông Bố IT | 109px |
h1 multiple — 6 URLs
too many links — 2 URLs
| URL | Links |
|---|---|
| https://ongboit.com/claude-code-roadmap/ | 264 |
| https://ongboit.com/claude-code-la-gi/ | 151 |
orphan page — 2 URLs
| URL |
|---|
| https://ongboit.com/dieu-khoan-su-dung/ |
| https://ongboit.com/chinh-sach-bao-mat/ |
page has broken image — 1 URL
| URL | Broken image |
|---|---|
| https://ongboit.com/claude-code-vs-semrush-ahrefs/ | https://ongboit.com/claude-code-vs-semrush-ahrefs/IMG_H2_7_PLACEHOLDER |
Audit Deep Dive
78/100Rating: Good · Primary source: /seo-audit (78/100)
ongboit.com (WordPress + Kadence + Rank Math, Vietnamese personal-tech publisher) is fundamentally search-ready: 185 indexable posts via clean sitemaps, correct trailing-slash 301 canonicalization, self-referential canonicals, single H1 per page, unique descriptive titles within length limits, well-structured heading hierarchy (article sampled: 1xH1/19xH2/18xH3), and 0 missing image alt on the flagship article (20/20).
On-page fundamentals are strong and internal linking is healthy (flagship article = 43 internal links; homepage = 27 unique). Top gaps are technical/AI-discovery hygiene rather than on-page content: broken llms.txt (301 to a 404), zero security headers (0/6), no AI-bot directives in robots.txt, and 18 indexable thin paginated archive pages.
None are bleeding/P0. Score 78/100.
✓ What's working (7)
- Trailing-slash canonicalization is correct: /about, /blog, /tiet-kiem-token-claude-code each 301 to the slash version; all sampled pages carry accurate self-referential canonicals (curl, 2026-06-02).
- Clean XML sitemap inventory: post-sitemap 185 + page-sitemap 6 + category-sitemap 5 URLs, all reachable from sitemap_index.xml.
- On-page fundamentals strong: single H1 per page; unique, descriptive, length-appropriate titles (homepage 58 chars, flagship article 54 chars); every sampled page has a meta description.
- Flagship article heading hierarchy is well-structured (1xH1, 19xH2, 18xH3, no skipped levels) and image hygiene is excellent (20 images, 0 missing alt).
- Healthy internal linking: flagship article links to 43 internal URLs; homepage exposes 27 unique internal links plus category/role hubs — good topical interlinking for a 185-post cluster.
- Pagination boundary is correct — /blog/page/20/ and beyond return 404, no soft-200 crawl-trap.
- All content templates (post, page, category, paginated archive) are index,follow with no accidental noindex on money pages.
Findings from /seo-audit (6)
P1 llms.txt is broken (301 to a 404) — AI-engine discovery file unusable
Evidence: https://ongboit.com/llms.txt returns HTTP 301 -> https://ongboit.com/wp-content/uploads/2026/04/llms.txt which is 404 (curl, 2026-06-02; corroborates Phase 1 signal). Goal includes AI-engine citations, so a dead llms.txt directly undercuts the stated objective.
Impact: AI crawlers (ChatGPT, Perplexity) that honor llms.txt get a 404 instead of a content map; removes an easy AI-citation signal for an AI-coding-topic site.
P2 Zero security/transport headers (0/6) — trust + minor ranking/crawl-trust signal
Evidence: curl -I https://ongboit.com/ shows no Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, or Referrer-Policy (0 matches, 2026-06-02; matches Phase 1 0/6). HTTPS works but no HSTS to enforce it.
Impact: No HSTS leaves a downgrade window; missing X-Content-Type-Options/Referrer-Policy are baseline hygiene reviewers and some trust heuristics expect. Low direct ranking effect, easy win.
P2 robots.txt declares no AI-bot policy — no explicit allow/disallow for GPTBot/PerplexityBot/etc.
Evidence: Phase 1: robots.txt is WP-default (Disallow /wp-admin/ only, Sitemap -> sitemap_index.xml); no AI crawler user-agents addressed. For a site whose goal is AI-engine citations, the absence of explicit allow directives is a missed positioning opportunity (and no control over trainin
Impact: Site cannot signal welcome/blocking intent to AI answer engines; combined with broken llms.txt, AI-discovery surface is weaker than the content quality warrants.
P2 18 paginated blog archive pages are index,follow — thin/near-duplicate index bloat
Evidence: https://ongboit.com/blog/page/2/ ... /page/19/ all return HTTP 200 with meta robots 'follow, index' and self-referential canonicals (curl, 2026-06-02). 185 posts at 10/page = 19 archive pages, each thin listing markup. (Pagination correctly 404s beyond page 19 — no soft-200 overr
Impact: Crawl budget spent on low-value listing pages and potential index dilution; Google generally prefers these consolidated or noindex,follow. Minor for a 185-post site but trivially fixable in Rank Math.
P3 Decorative SVG icons emit generic <title> nodes ('Hours','Toggle Menu') — accessibility/markup noise
Evidence: Raw HTML of /, /blog/, and article pages contains repeated <title>Hours</title>, <title>Toggle Menu</title>, <title>Scroll to top</title> from Kadence inline SVGs (curl, 2026-06-02). Not document-title conflicts (the real <title> is first and correct) but they add meaningless lab
Impact: No ranking penalty; mild a11y/clarity noise. Cosmetic markup hygiene.
P3 Meta robots directive order inconsistent across templates ('follow, index' vs 'index, follow')
Evidence: Homepage/about/blog/category use 'follow, index, ...'; the article /tiet-kiem-token-claude-code/ uses 'index, follow, ...' (curl, 2026-06-02). Functionally equivalent to crawlers but signals two different meta-config paths (theme vs Rank Math per-post), worth normalizing.
Impact: No SEO impact; indicates template/config drift to clean up for consistency.
Google-Api Deep Dive
65/100Rating: Fair · Primary source: /seo-google (65/100)
REAL Google Search Console data (sc-domain:ongboit.com, last 90 days): 737 clicks, 26,239 impressions, CTR 2.81%, average position 7.4 across 100 distinct queries - and accelerating (387 clicks in the most recent 28 days alone). The site genuinely ranks PAGE 1 for several Vietnamese long-tail terms with real traffic: /tiet-kiem-token-claude-code/ (194 clicks, pos 6.2), /claude-code-gioi-han-su-dung/ (143 clicks, pos 5.7), /claude-code-gia-bao-nhieu/ (86 clicks, pos 8.5).
This is a healthy YOUNG performer, not a stuck site. The earlier 'trapped on page 7-8' narrative was a DataForSEO Labs artifact (Labs under-indexes Vietnamese SERPs). CrUX field CWV remains genuinely N/A - the CrUX API key works but ongboit.com has insufficient real-user traffic to be in the CrUX dataset (HTTP 404 'data not found'); lab CWV measured separately (see seo-performance).
✓ What's working (4)
- 737 clicks / 26,239 impressions / 90d with avg position 7.4 - real, measurable organic traction for a young site.
- Accelerating: 387 clicks in the last 28 days (~53% of 90-day clicks in the most recent third of the window).
- Page-1 Vietnamese long-tail rankings with clicks (pos 5.7-6.2 on the two top pages).
- Healthy brand demand (brand query CTR 82.5%, pos 1).
Findings from /seo-google (4)
P1 Striking-distance keywords on page 2 - small push lands page 1 (commercial intent)
Evidence: GSC 90d striking distance (pos 8-30, impr>=8): 'claude code pricing' pos 11.0 (29 impr), 'giá claude code pro' pos 8.7 (33 impr), 'claude code giá rẻ' pos 12.9 (37 impr), 'các gói claude code' pos 8.1 (22 impr). All commercial-intent, all mapping to /claude-code-gia-bao-nhieu/ (c
Impact: Pushing the pricing hub from pos 8.5 to top-5 captures the highest-commercial-intent VN queries; realistic with on-page + internal-link consolidation + a few links.
P2 Traffic concentrated in 3 pages - thin tail beyond the top performers
Evidence: GSC top pages: /tiet-kiem-token-claude-code/ 194 clicks + /claude-code-gioi-han-su-dung/ 143 + /claude-code-gia-bao-nhieu/ 86 = 423 of 737 total clicks (57%) from 3 of 185 posts. Long tail (e.g. /claude-md-la-gi/ 38c, /claude-code-vs-code/ 15c) drops off fast.
Impact: Spreading authority from the 3 winners to cluster siblings (internal links + refresh) raises portfolio-wide traffic; pairs with /blog-audit-pipeline decay/cluster work.
P2 Big English-volume terms ('claude code' 33K SV) still page 2-8 - authority-gated
Evidence: GSC avg position 7.4; DataForSEO Labs: 'claude code' (SV 33,100) ranks pos ~78. GSC shows the VN-intent variants rank far better (page 1) than the broad English head term. The head term is gated by domain authority (see seo-backlinks BL2).
Impact: Head-term page-1 is a long-game authority play, not an on-page fix; the near-term ROI is the striking-distance VN terms (GG1).
P3 Brand query CTR healthy; brand demand exists
Evidence: GSC: 'ongboit' 47 clicks / 57 impr / CTR 82.5% / pos 1. Homepage / pos 2.0 with 80 clicks. Brand is being searched and clicked - a foundation to build entity authority on.
Impact: Positive signal; reinforce with the knowledge-graph + brand-consolidation work (M1/M4).
Image Deep Dive
82/100Rating: Good · Primary source: /seo-performance (60/100)
MEASURED lab Lighthouse (top-traffic article /tiet-kiem-token-claude-code/, desktop simulated): Performance 70/100, LCP 2.77s (slightly over the 2.5s 'good' line), FCP 2.28s, CLS 0.002 (excellent), max-potential-FID 24ms + main-thread work 325ms (interactivity excellent), SEO 100, Best-Practices 100.
The dominant LCP contributor is server-response-time 949ms (lab) / TTFB 384ms (edge curl) - i.e. CACHING, not the front-end. Front-end hygiene is already good (WebP, lazy-load, width/height on images, async scripts, HTTP/3, gzip). The earlier CLS and INP worries are NOT borne out by measurement (CLS 0.002, FID 24ms).
CrUX field data remains N/A (site too small to be in the CrUX dataset - 404), so this lab run is the authoritative CWV source.
✓ What's working (11)
- Gzip compression active: homepage compressed to 23KB from ~200KB+ uncompressed (confirmed via curl)
- HTTP/3 (QUIC) supported: Alt-Svc: h3=':443' in response headers — reduces latency for supported browsers
- All images served in WebP format — modern, efficient format with good compression
- All <img> tags carry explicit width and height attributes — eliminates CLS from image dimension shifts
- 8 below-the-fold images correctly use loading='lazy' — reduces initial page weight
- Google Tag Manager script has async attribute — does not block HTML parsing
- Kadence navigation JS has async attribute — no JS render-blocking from theme scripts
- Speculative prefetch (speculationrules) implemented with conservative eagerness — improves SPA-like navigation for return visitors
Findings from /seo-performance (9)
P1 First post featured image (LCP candidate) missing fetchpriority='high' and preload hint
Evidence: https://ongboit.com/ — <img decoding='async' src='claude-code-goal-command-hero.webp'> rendered first in post grid; no fetchpriority='high', no <link rel='preload'> in <head>. Image file is 250,806 bytes (250KB) at Content-Length from server. Logo has fetchpriority='high' but is
Impact: Estimated 300-600ms LCP improvement (confidence=low/inferred). fetchpriority='high' and a matching preload hint move the image into the browser's high-priority fetch queue, removing the post-CSS discovery delay.
P2 First post image has sizes='(max-width: 2400px) 100vw, 2400px' — browser likely fetches 1024w+ variant for a 180px thumbnail
Evidence: https://ongboit.com/ HTML: <img ... sizes='(max-width: 2400px) 100vw, 2400px'> on a card image rendered at height:180px. srcset includes 300w, 768w, 1024w, 1536w, 2048w, 2400w variants. On a 390px mobile screen the sizes expression resolves to ~390px, so 768w is fetched — still o
Impact: Reduces LCP image transfer weight by ~60-70% on mobile if corrected to sizes matching actual rendered size (approx 350px). Saves ~150-200KB per mobile pageload (confidence=low/inferred).
P2 Five render-blocking stylesheets in <head> with no critical-CSS split or async load
Evidence: https://ongboit.com/ <head> contains: kadence-global.min.css (28KB), kadence-header.min.css, kadence-content.min.css, kadence-footer.min.css, kadence-rankmath.min.css — all media='all', none deferred or inlined as critical. Combined uncompressed estimated ~80-100KB. source: curl
Impact: Eliminating or inlining critical CSS can reduce render-blocking time by 150-400ms depending on RTT (confidence=low/inferred). Kadence Pro has a Critical CSS feature that should be enabled.
P2 Google Fonts loaded as render-blocking stylesheet without font-file preload
Evidence: https://ongboit.com/ <head>: <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open%20Sans:regular,700|Rubik:700,regular,500,600|Heebo:500&display=swap' media='all'> — this is a render-blocking cross-origin request. display=swap is
Impact: Adding <link rel='preload' as='font' crossorigin> for the 2-3 primary font files (Open Sans regular, Rubik 500) reduces FOUT and shaves 100-200ms from font-induced layout shifts (confidence=low/inferred).
P2 No Cache-Control max-age header on any asset — browser cache cannot skip revalidation
Evidence: curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css: headers show only Etag and Last-Modified, no Cache-Control or Expires. curl -sI on LCP image (claude-code-goal-command-hero.webp): same — Content-Length: 250806, no Cache-Control. Repeat visitors mu
Impact: Adding Cache-Control: public, max-age=31536000, immutable to versioned static assets eliminates revalidation RTT for returning visitors, reducing page load time by 200-800ms for cached assets (confidence=low/inferred).
P2 TTFB 384ms — above 200ms ideal; no page-level Cache-Control header observed
Evidence: curl -w '%{time_starttransfer}' https://ongboit.com/: 0.384471s from Frankfurt/EU edge. Apache/2.4.66 on Debian, no CDN caching layer detected in response headers (no X-Cache, no CDN vendor header). Gzip is active (23KB compressed HTML). source: curl timing
Impact: Enabling a full-page caching plugin (e.g. WP Rocket, W3 Total Cache) or CDN-level HTML caching can bring TTFB under 200ms for cached responses. Estimated LCP improvement 200-400ms (confidence=low/inferred).
P3 Google Tag Manager (gtag.js) loaded async — INP risk if event handlers are heavy
Evidence: https://ongboit.com/ HTML: <script src='https://www.googletagmanager.com/gtag/js?id=GT-K8HP8DDM' async> — async is correct for load, but GTM containers can inject third-party scripts that run long tasks on the main thread post-load, raising INP above 200ms. No measured data avail
Impact: Auditing GTM container for long-running tags; using Server-side GTM or Partytown can reduce main-thread blocking. Estimated INP improvement variable (confidence=low/inferred).
P2 MEASURED: LCP 2.77s (marginally over 2.5s 'good'), driven by 949ms server response - caching is the fix
Evidence: DataForSEO on_page_lighthouse (Lighthouse 13.3.0, desktop simulated) on /tiet-kiem-token-claude-code/: largest-contentful-paint 2769ms, first-contentful-paint 2278ms, speed-index 2673ms, server-response-time 949ms, cumulative-layout-shift 0.002, max-potential-fid 24ms, total-byte
Impact: Full-page caching to cut server-response from ~950ms to <200ms would pull LCP from 2.77s into the green (<2.5s, likely ~2.0s). fetchpriority + cache-control add marginal gains. Now confidence=high (measured).
Page-Deep-Dive Deep Dive
88/100Rating: Good · Primary source: /seo-page (88/100)
Deep on-page audit of homepage and top post /tiet-kiem-token-claude-code/. Both pages are strongly optimized: single H1, complete Rank Math meta (canonical, robots index/follow, full Open Graph + Twitter summary_large_image), valid schema (WebPage/Organization/Person on home; BlogPosting + FAQPage + BreadcrumbList on post), 100% image alt coverage, and fresh dateModified (2026-05).
The post is exemplary: keyword-front-loaded 54-char title, 151-char meta with concrete numbers, answer-first intro (leads with '$290 to $82, 98.5% token is re-reading history'), 7,777-word depth, 19 H2/34 H3, FAQ schema, 88 internal + 54 external links. Minor gaps: homepage meta description is short (117 chars, room to ~155); homepage H1 is a brand tagline rather than a keyword/answer phrase; homepage og:title carries an unescaped HTML entity (&).
On-page audit — sampled URLs
| Signal | Homepage | Top post |
|---|---|---|
| Page score | 84/100 | 93/100 |
| URL | https://ongboit.com/ | https://ongboit.com/tiet-kiem-token-claude-code/ |
| Title length | 58 chars | 54 chars |
| Meta length | 117 chars | 151 chars |
| H1 | Hành Trình Zero → Hero với AI Coding và Automation | 15 Mẹo Tiết Kiệm Token Claude Code Hiệu Quả Nhất (2026) |
| Headings | 1 H1, 7 H2, 9 H3 — clean hierarchy, no skips | 1 H1, 19 H2, 34 H3 — deep, well-nested topical coverage incl. dedicated FAQ block |
| Word count | 779 | 7777 |
| Internal links | 72 | 88 |
| External links | 3 | 54 |
| Image alt coverage | 100% | 100% |
| Schema types | Person, ImageObject, Organization, WebSite, SearchAction, WebPage | BreadcrumbList, WebPage, Person, BlogPosting, FAQPage (7 Question/Answer), ImageObject, Organization, WebSite |
| Answer-first | Partial — homepage H1 is a brand/journey tagline; intro identifies author but does not lead with an extractable definitional answer (acceptable for a homepage h | Yes — intro leads with a direct, extractable answer ('15 tips cut token cost 50-87%; bill $290 → $82; 98.5% of tokens is re-reading old history; cites Nate Herk |
| Last modified | 2026-05-24 | 2026-05-25 |
Composite 88 weighted toward the indexable content asset (post) and homepage hub.
✓ What's working (6)
- Both pages: exactly one H1, valid canonical (self-referencing), robots index,follow — no on-page indexation blockers.
- Both pages: complete Open Graph + Twitter summary_large_image cards with sized images and alt.
- Both pages: 100% image alt coverage (home 12/12, post 52/52).
- Top post is best-practice: keyword-front-loaded title (54 chars) + specific 151-char meta + answer-first intro + 7,777-word depth + 19 H2/34 H3 + BlogPosting & FAQPage & BreadcrumbList schema.
- Top post external linking is authoritative and topically relevant (docs.anthropic.com, platform.claude.com) — strong outbound trust signals for AI citation.
- Freshness signals current on both: dateModified 2026-05-24 (home) and 2026-05-25 (post).
Findings from /seo-page (3)
P3 Homepage meta description under-utilized at 117 chars
Evidence: https://ongboit.com/ meta description = 117 chars (Rank Math, scraped 2026-06-02); ~155 chars available before SERP truncation, leaving ~38 chars of unused snippet real estate / no keyword reinforcement.
Impact: Minor CTR uplift; fuller, keyword-bearing snippet in Google SERP.
P3 Homepage H1 is a brand tagline, not a query/answer phrase
Evidence: https://ongboit.com/ H1 = 'Hành Trình Zero → Hero với AI Coding và Automation' (scraped 2026-06-02). No primary keyword (Claude Code / AI coding blog) in the on-page H1; weak alignment between H1 and the keyword-rich <title>/og:title.
Impact: Tighter H1↔title keyword alignment can reinforce homepage topical relevance for brand+category queries.
P3 Homepage og:title contains an unescaped HTML entity (&)
Evidence: https://ongboit.com/ og:title = 'Ông Bố IT | Claude Code, AI Coding & Self-hosting Blog' (scraped 2026-06-02). Social/AI cards may render the literal '&' instead of '&'.
Impact: Cosmetic — cleaner social/AI share-card title.
Performance Deep Dive
60/100Rating: Fair · Primary source: /seo-performance (60/100)
MEASURED lab Lighthouse (top-traffic article /tiet-kiem-token-claude-code/, desktop simulated): Performance 70/100, LCP 2.77s (slightly over the 2.5s 'good' line), FCP 2.28s, CLS 0.002 (excellent), max-potential-FID 24ms + main-thread work 325ms (interactivity excellent), SEO 100, Best-Practices 100.
The dominant LCP contributor is server-response-time 949ms (lab) / TTFB 384ms (edge curl) - i.e. CACHING, not the front-end. Front-end hygiene is already good (WebP, lazy-load, width/height on images, async scripts, HTTP/3, gzip). The earlier CLS and INP worries are NOT borne out by measurement (CLS 0.002, FID 24ms).
CrUX field data remains N/A (site too small to be in the CrUX dataset - 404), so this lab run is the authoritative CWV source.
Cross-checked by: geo-technical: 78/100seo-google: 65/100
Performance levers — lab (mobile vs desktop)
| Metric | Mobile (PSI) | Desktop (Lighthouse) |
|---|---|---|
| Performance score | 78 | 70 |
| LCP | 4.2s · POOR (>4s) | 2.77s |
| CLS | 0 | 0.002 |
| TBT / FID | 80ms TBT | 24ms FID |
| FCP | 3.5s | 2.28s |
#1 lever: server response time (TTFB) 949ms — the dominant contributor to LCP on both form factors. Page weight 728 KB.
Lighthouse: SEO 100 · Best Practices 100 · Accessibility 96
Mobile not separately measured (DataForSEO defaulted to desktop formFactor); mobile LCP likely higher. CrUX field N/A (404 - site below CrUX traffic threshold).
✓ What's working (11)
- Gzip compression active: homepage compressed to 23KB from ~200KB+ uncompressed (confirmed via curl)
- HTTP/3 (QUIC) supported: Alt-Svc: h3=':443' in response headers — reduces latency for supported browsers
- All images served in WebP format — modern, efficient format with good compression
- All <img> tags carry explicit width and height attributes — eliminates CLS from image dimension shifts
- 8 below-the-fold images correctly use loading='lazy' — reduces initial page weight
- Google Tag Manager script has async attribute — does not block HTML parsing
- Kadence navigation JS has async attribute — no JS render-blocking from theme scripts
- Speculative prefetch (speculationrules) implemented with conservative eagerness — improves SPA-like navigation for return visitors
Findings from /seo-performance (9)
P1 First post featured image (LCP candidate) missing fetchpriority='high' and preload hint
Evidence: https://ongboit.com/ — <img decoding='async' src='claude-code-goal-command-hero.webp'> rendered first in post grid; no fetchpriority='high', no <link rel='preload'> in <head>. Image file is 250,806 bytes (250KB) at Content-Length from server. Logo has fetchpriority='high' but is
Impact: Estimated 300-600ms LCP improvement (confidence=low/inferred). fetchpriority='high' and a matching preload hint move the image into the browser's high-priority fetch queue, removing the post-CSS discovery delay.
P2 First post image has sizes='(max-width: 2400px) 100vw, 2400px' — browser likely fetches 1024w+ variant for a 180px thumbnail
Evidence: https://ongboit.com/ HTML: <img ... sizes='(max-width: 2400px) 100vw, 2400px'> on a card image rendered at height:180px. srcset includes 300w, 768w, 1024w, 1536w, 2048w, 2400w variants. On a 390px mobile screen the sizes expression resolves to ~390px, so 768w is fetched — still o
Impact: Reduces LCP image transfer weight by ~60-70% on mobile if corrected to sizes matching actual rendered size (approx 350px). Saves ~150-200KB per mobile pageload (confidence=low/inferred).
P2 Five render-blocking stylesheets in <head> with no critical-CSS split or async load
Evidence: https://ongboit.com/ <head> contains: kadence-global.min.css (28KB), kadence-header.min.css, kadence-content.min.css, kadence-footer.min.css, kadence-rankmath.min.css — all media='all', none deferred or inlined as critical. Combined uncompressed estimated ~80-100KB. source: curl
Impact: Eliminating or inlining critical CSS can reduce render-blocking time by 150-400ms depending on RTT (confidence=low/inferred). Kadence Pro has a Critical CSS feature that should be enabled.
P2 Google Fonts loaded as render-blocking stylesheet without font-file preload
Evidence: https://ongboit.com/ <head>: <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open%20Sans:regular,700|Rubik:700,regular,500,600|Heebo:500&display=swap' media='all'> — this is a render-blocking cross-origin request. display=swap is
Impact: Adding <link rel='preload' as='font' crossorigin> for the 2-3 primary font files (Open Sans regular, Rubik 500) reduces FOUT and shaves 100-200ms from font-induced layout shifts (confidence=low/inferred).
P2 No Cache-Control max-age header on any asset — browser cache cannot skip revalidation
Evidence: curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css: headers show only Etag and Last-Modified, no Cache-Control or Expires. curl -sI on LCP image (claude-code-goal-command-hero.webp): same — Content-Length: 250806, no Cache-Control. Repeat visitors mu
Impact: Adding Cache-Control: public, max-age=31536000, immutable to versioned static assets eliminates revalidation RTT for returning visitors, reducing page load time by 200-800ms for cached assets (confidence=low/inferred).
P2 TTFB 384ms — above 200ms ideal; no page-level Cache-Control header observed
Evidence: curl -w '%{time_starttransfer}' https://ongboit.com/: 0.384471s from Frankfurt/EU edge. Apache/2.4.66 on Debian, no CDN caching layer detected in response headers (no X-Cache, no CDN vendor header). Gzip is active (23KB compressed HTML). source: curl timing
Impact: Enabling a full-page caching plugin (e.g. WP Rocket, W3 Total Cache) or CDN-level HTML caching can bring TTFB under 200ms for cached responses. Estimated LCP improvement 200-400ms (confidence=low/inferred).
P3 Google Tag Manager (gtag.js) loaded async — INP risk if event handlers are heavy
Evidence: https://ongboit.com/ HTML: <script src='https://www.googletagmanager.com/gtag/js?id=GT-K8HP8DDM' async> — async is correct for load, but GTM containers can inject third-party scripts that run long tasks on the main thread post-load, raising INP above 200ms. No measured data avail
Impact: Auditing GTM container for long-running tags; using Server-side GTM or Partytown can reduce main-thread blocking. Estimated INP improvement variable (confidence=low/inferred).
P2 MEASURED: LCP 2.77s (marginally over 2.5s 'good'), driven by 949ms server response - caching is the fix
Evidence: DataForSEO on_page_lighthouse (Lighthouse 13.3.0, desktop simulated) on /tiet-kiem-token-claude-code/: largest-contentful-paint 2769ms, first-contentful-paint 2278ms, speed-index 2673ms, server-response-time 949ms, cumulative-layout-shift 0.002, max-potential-fid 24ms, total-byte
Impact: Full-page caching to cut server-response from ~950ms to <200ms would pull LCP from 2.77s into the green (<2.5s, likely ~2.0s). fetchpriority + cache-control add marginal gains. Now confidence=high (measured).
Findings from /geo-technical (5)
P1 0/6 security headers present (no HSTS, CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy)
Evidence: curl -D - https://ongboit.com/ (2026-06-02): response headers contain only Alt-Svc, Content-Type, Date, Link, Server (Apache/2.4.66 Debian), Vary, Transfer-Encoding. None of the 6 security headers returned on any tested URL.
Impact: Trust/safety signal gap; clickjacking + MIME-sniff + downgrade exposure. Low direct ranking effect but a measurable hygiene deficit and easy win. Fix in Apache vhost/.htaccess: add Strict-Transport-Security "max-age=31536000; includeSubDomains; preload", X-Content-Type-Options "n
P2 No HTTP caching headers and no CDN on HTML responses
Evidence: curl -D - https://ongboit.com/ (2026-06-02): no Cache-Control, ETag, Expires, or Last-Modified header on the 200 HTML response. No CDN signals (no CF-*, X-Cache, Via, Age). Origin = Apache/2.4.66 over HTTP/1.1 (Alt-Svc advertises h3 but origin serves 1.1). TTFB measured 0.33-0.34
Impact: Repeat visits and crawler re-fetches are uncached at the edge; every request hits origin PHP. Adds latency risk under load and wastes crawl budget. Put Cloudflare (free) in front for edge caching + HTTP/2/3 + automatic Brotli, and add Cache-Control/ETag for static assets. Improve
P2 llms.txt broken: 301 redirect to uploads path that 404s
Evidence: curl -L https://ongboit.com/llms.txt (2026-06-02): HTTP 301 -> Location https://ongboit.com/wp-content/uploads/2026/04/llms.txt -> HTTP 404 Not Found. Redirect appears Rank-Math-generated.
Impact: The emerging AI-discovery manifest is unreachable, so LLM crawlers that look for /llms.txt get a 404. For a publisher whose explicit goal is AI-engine citations this is a missed signal. Remove the Rank Math redirect and serve a valid llms.txt at the root (200) listing key posts/s
P3 robots.txt has no AI-crawler directives (default WP only)
Evidence: curl https://ongboit.com/robots.txt (2026-06-02): User-agent: * / Disallow: /wp-admin/ / Allow: /wp-admin/admin-ajax.php / Sitemap: https://ongboit.com/sitemap_index.xml. No GPTBot/ClaudeBot/PerplexityBot/Google-Extended/CCBot/etc. rules. Live UA tests show GPTBot and ClaudeBot a
Impact: AI bots are not blocked (good for citation goal) but there is no explicit allow either. Optional: add explicit User-agent allow stanzas for the 11 major AI bots (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot, Perplexity-User, Google-
P3 Minimal resource hints; no preload for hero image or fonts
Evidence: Homepage HTML (2026-06-02): only 2 preconnect hints (fonts.googleapis.com, fonts.gstatic.com), no dns-prefetch, no rel=preload. 6 stylesheets in <head>; 11 scripts (0 defer, 2 async). Hero handled reasonably: 1 fetchpriority=high img, 11/12 imgs have width+height, 8 lazy.
Impact: Render-blocking CSS in head plus Google Fonts without preload/font-display can delay LCP. Add rel=preload for the LCP hero and the primary woff2 font, and ensure font-display:swap. Static-signal only; validate against field data in seo-performance.
Findings from /seo-google (4)
P1 Striking-distance keywords on page 2 - small push lands page 1 (commercial intent)
Evidence: GSC 90d striking distance (pos 8-30, impr>=8): 'claude code pricing' pos 11.0 (29 impr), 'giá claude code pro' pos 8.7 (33 impr), 'claude code giá rẻ' pos 12.9 (37 impr), 'các gói claude code' pos 8.1 (22 impr). All commercial-intent, all mapping to /claude-code-gia-bao-nhieu/ (c
Impact: Pushing the pricing hub from pos 8.5 to top-5 captures the highest-commercial-intent VN queries; realistic with on-page + internal-link consolidation + a few links.
P2 Traffic concentrated in 3 pages - thin tail beyond the top performers
Evidence: GSC top pages: /tiet-kiem-token-claude-code/ 194 clicks + /claude-code-gioi-han-su-dung/ 143 + /claude-code-gia-bao-nhieu/ 86 = 423 of 737 total clicks (57%) from 3 of 185 posts. Long tail (e.g. /claude-md-la-gi/ 38c, /claude-code-vs-code/ 15c) drops off fast.
Impact: Spreading authority from the 3 winners to cluster siblings (internal links + refresh) raises portfolio-wide traffic; pairs with /blog-audit-pipeline decay/cluster work.
P2 Big English-volume terms ('claude code' 33K SV) still page 2-8 - authority-gated
Evidence: GSC avg position 7.4; DataForSEO Labs: 'claude code' (SV 33,100) ranks pos ~78. GSC shows the VN-intent variants rank far better (page 1) than the broad English head term. The head term is gated by domain authority (see seo-backlinks BL2).
Impact: Head-term page-1 is a long-game authority play, not an on-page fix; the near-term ROI is the striking-distance VN terms (GG1).
P3 Brand query CTR healthy; brand demand exists
Evidence: GSC: 'ongboit' 47 clicks / 57 impr / CTR 82.5% / pos 1. Homepage / pos 2.0 with 80 clicks. Brand is being searched and clicked - a foundation to build entity authority on.
Impact: Positive signal; reinforce with the knowledge-graph + brand-consolidation work (M1/M4).
🔍 Full-crawl per-URL findings (465 deterministic issues — every page scanned, complements the AI score above)
large html — 258 URLs
slow ttfb — 205 URLs
not compressed — 1 URL
| URL |
|---|
| https://ongboit.com |
no cache control — 1 URL
| URL |
|---|
| https://ongboit.com |
Sitemap Deep Dive
86/100Rating: Good · Primary source: /seo-sitemap (86/100)
Sitemap architecture is healthy and correctly configured by Rank Math. robots.txt declares the canonical index at https://ongboit.com/sitemap_index.xml, which fans out to three valid sub-sitemaps: post-sitemap.xml (185 URLs), page-sitemap.xml (6 URLs), category-sitemap.xml (5 URLs) = 196 total indexable URLs. lastmod stamps are fresh (post + category sitemaps stamped 2026-06-01, today).
The X-Robots-Tag: noindex header seen in Phase 1 applies only to the sitemap XML document itself (standard Rank Math behavior) - a sampled listed post returns HTTP 200 with NO noindex, confirming indexable content. No orphan or noindex contamination found.
✓ What's working (5)
- robots.txt cleanly declares the sitemap index - correct discovery path.
- 196 URLs across 3 logically separated sub-sitemaps (post/page/category) - clean architecture.
- Fresh lastmod (2026-06-01) shows active publishing and correct change signaling.
- WordPress default robots.txt only disallows /wp-admin/ (with admin-ajax allowed) - no accidental content blocking.
- Shallow, flat architecture (185 posts under clean category hubs) keeps crawl depth low.
Findings from /seo-sitemap (3)
P3 Phase 1 'sitemap.xml noindex' flag is benign - sampled content pages are index,follow
Evidence: curl https://ongboit.com/sitemap_index.xml = 200, valid sitemapindex with 3 children. The X-Robots-Tag: noindex header is on the sitemap document response only. Verified: first URL in post-sitemap.xml returns HTTP 200 with no X-Robots-Tag noindex. This is correct Rank Math behavi
Impact: No action required - documented so it is not misread as an indexation bug in future audits.
P3 Bare /sitemap.xml does not serve the index (only /sitemap_index.xml does)
Evidence: curl https://ongboit.com/sitemap.xml returned empty in Phase 1; the working entry point is /sitemap_index.xml, which robots.txt correctly references. Some third-party tools probe /sitemap.xml by default.
Impact: Optional: add a /sitemap.xml -> /sitemap_index.xml alias/redirect for tool compatibility. Google uses the robots.txt declaration so indexing is unaffected.
P3 No image, news, or video sitemaps for a media-rich tutorial blog
Evidence: sitemap_index.xml lists only post/page/category sub-sitemaps. Articles are image-heavy (screenshots, diagrams per seo-page/visual agents) but images are not surfaced via an image sitemap.
Impact: An image sitemap could improve Google Images discovery for tutorial screenshots - minor incremental discovery channel.
🔍 Full-crawl per-URL findings (47 deterministic issues — every page scanned, complements the AI score above)
indexable not in sitemap — 46 URLs
http url in sitemap — 1 URL
| URL |
|---|
| https://ongboit.com/sitemap.xml |
Visual Deep Dive
68/100Rating: Fair · Primary source: /seo-visual (68/100)
ongboit.com homepage renders server-side (H1 + intro paragraph present in raw HTML — not a JS shell). Desktop above-the-fold is clean: H1, sub-copy, primary CTA, and navigation all visible at 1920x1080 without scrolling. Mobile (375x812) renders the H1 and intro copy above the fold, but the primary CTA ('Bat Dau Lo Trinh') sits at top=817px — fractionally below the 812px viewport, so most mobile visitors see it only after a tiny scroll.
The main CLS risk is structural: 30 of 41 images lack explicit width/height attributes, creating layout-shift exposure on every page load. The hamburger menu button is undersized at 37x31px (minimum 48x48px recommended). Viewport meta is correct. No horizontal scroll. No lazy-loading on above-fold images (good).
Logo has fetchpriority=high (good). No iframes without dimensions (no ad-driven CLS). Content is fully accessible without JavaScript.
✓ What's working (8)
- H1 and intro paragraph are server-rendered — not a JS shell — curl of raw HTML confirms H1 'Hanh Trinh Zero → Hero voi AI Coding va Automation' present in response body (body_length=113,167, 2026-06-02)
- Viewport meta tag correctly configured — meta name='viewport' content='width=device-width, initial-scale=1, minimum-scale=1' — confirmed in both DOM analysis and raw HTML (2026-06-0
- Logo image has fetchpriority=high set correctly — DOM: img src='ongboit-logo-transparent.webp' fetchpriority='high', width='1024', height='1024'. LCP candidate is properly hinted for early f
- No lazy-loading on above-fold images — DOM check: lazyAboveFoldImages=[] — zero above-fold images have loading='lazy'. No LCP-blocking lazy load pattern detected (2026-06-02).
- No horizontal scroll on mobile — DOM: body.scrollWidth=375 === window.innerWidth=375 at 375x812 viewport. No overflow-x issue (2026-06-02).
- Mobile navigation collapses to hamburger menu — nav links not exposed raw — Screenshot mobile.png (2026-06-02): hamburger icon (≡) visible in top-right corner. 8 nav items (Codex CLI, AI 101, n8n, About, Blog, Claude
- No iframes without dimensions — zero iframe-driven CLS risk — DOM: iframesWithoutDimensions=0. No ad slots or embeds contributing to CLS via unsized iframes (2026-06-02).
- Desktop above-the-fold is complete: H1, sub-copy, dual CTA, search, category filters all visible — Screenshot desktop.png (1920x1080, 2026-06-02): H1 fully rendered, 'Bat Dau Lo Trinh' orange CTA button and 'Cau chuyen cua minh' secondary
Findings from /seo-visual (5)
P1 30/41 images lack explicit width + height attributes — high CLS risk
Evidence: DOM analysis at https://ongboit.com/ (375x812 and 1920x1080 viewports, Playwright, 2026-06-02): totalImages=41, undimensionedImages=30 (73%). Emoji SVGs from s.w.org (15+ instances) have no dimensions; post thumbnail images and content images also missing. CLS score likely above
Impact: Eliminating CLS by adding width/height to all img tags (or using Kadence/WordPress image size settings) can recover Core Web Vital CLS pass and improve ranking eligibility for Top Stories / rich results.
P2 Primary mobile CTA ('Bat Dau Lo Trinh') is below the fold by ~5px on 375x812
Evidence: DOM getBoundingClientRect() at 375x812 viewport: CTA top=817px, viewport innerHeight=812px. Button is 124x46px. Screenshot (screenshots/mobile.png, 2026-06-02) confirms the button is visible in the screenshot due to rendering timing, but computed position places it below fold. Co
Impact: Moving CTA above 812px fold improves immediate conversion signal and reduces bounce for mobile users arriving from SERP. Small CSS tweak to reduce hero padding.
P2 Mobile hamburger button tap target is 37x31px — below 48x48px minimum
Evidence: DOM measurement at 375x812 viewport (Playwright, 2026-06-02): BUTTON 'Open menu' w=37, h=31. Google recommends minimum 48x48px touch targets. 25 additional interactive links measured at h=46px (borderline). Hamburger failure is the most critical as it blocks all navigation on mob
Impact: Fixing hamburger to 48x48px min eliminates a Lighthouse accessibility failure and improves mobile UX for the majority of Vietnamese mobile-first users.
P3 31 text elements render below 16px on mobile — potential readability flag
Evidence: DOM computed style scan at 375x812 (Playwright, 2026-06-02): 31 p/li/td elements with computed fontSize < 16px. Specific font sizes not individually enumerated, but count is non-trivial. Google Mobile-Friendly test warns on text too small to read.
Impact: Increasing base font to 16px minimum improves readability for Vietnamese mobile users and avoids mobile usability issues in GSC.
P3 No noscript fallback — content depends on JS execution for full interactivity
Evidence: DOM query 'noscript' returns 0 elements (Playwright DOM analysis, 2026-06-02). However, H1, intro paragraph, CTA, and nav ARE present in raw server-rendered HTML (curl confirms body_length=113,167, h1_content_preview='Hanh Trinh Zero → Hero voi AI Coding va Automation'). Risk is
Impact: Low priority given server-rendered core content. Adding a noscript fallback for the search widget would be a minor improvement for accessibility completeness.
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 — lab data — mobile (Lighthouse/PSI; CrUX field N/A; INP=lab TBT proxy)
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.
Direct backlink metrics could NOT be measured this run: the DataForSEO Backlinks API returned 'Access denied - subscription not active' (code 40204) when called from the main thread, so referring domains, total backlinks, and domain rank for ongboit.com are unavailable as measured values (marked N/A, not guessed). Strong indirect evidence points to a near-zero external backlink profile: (1) the brand-mentions agent found almost no off-site footprint (only TikTok handles + 1 Threads mention), (2)
Chart 4: Google Search Console Performance (90 days)
↑ Accelerating: 387 of 737 90-day clicks landed in the last 28 days.
Impressions over time (90 days) · peak 1,696
Top pages by clicks
Striking distance — high-impression queries near page 1 (position ≤ 15, push them up)
mua claude code giá rẻ | pos 10.0 | 288 impr |
claude giá bao nhiêu | pos 12.2 | 42 impr |
claude code giá rẻ | pos 12.9 | 37 impr |
claude max bao nhiêu tiền | pos 11.9 | 36 impr |
giá claude code pro | pos 8.7 | 33 impr |
claude code pricing | pos 10.8 | 33 impr |
claude pro pricing 2026 | pos 9.1 | 26 impr |
giá claude code | pos 11.8 | 25 impr |
claude code 20$ | pos 8.5 | 23 impr |
claude code giá | pos 9.7 | 18 impr |
giá claude max | pos 13.9 | 17 impr |
claude max giá bao nhiêu | pos 11.4 | 16 impr |
Indexation: 184 / 196 sitemap URLs active (94% coverage).
Chart 4b: GA4 Organic — Traffic, Conversions & Audience (2026-03-06 → 2026-06-03)
Organic sessions over time · peak 81
Top organic pages by conversions (SEO-ROI)
Top organic content (engagement)
| Page | Views | Sessions | Engaged | Avg time |
|---|---|---|---|---|
(not set) | 0 | 349 | 2.9% | 0m 20s |
/tiet-kiem-token-claude-code | 381 | 277 | 53.4% | 3m 42s |
/claude-code-gioi-han-su-dung | 285 | 214 | 58.9% | 3m 30s |
/claude-code-gia-bao-nhieu | 226 | 192 | 57.3% | 3m 15s |
/claude-md-la-gi | 268 | 149 | 46.3% | 4m 19s |
/claude-code-vs-code | 149 | 120 | 70.0% | 5m 20s |
/ | 564 | 107 | 87.9% | 10m 0s |
/cai-dat-claude-code | 34 | 32 | 71.9% | 5m 37s |
/claude-code-memory-context | 35 | 30 | 63.3% | 70m 49s |
/claude-code-roadmap | 45 | 23 | 60.9% | 8m 34s |
All-channel session mix
Device: desktop 1,751 · mobile 244 · tablet 3
Top geo: Vietnam 1,788 · Japan 71 · United States 27 · United Kingdom 26 · Singapore 24
New vs returning: new 1,215 · returning 552
On-site searches: RAG, ai workflow
Top events (organic engagement)
page_viewuser_engagementsession_startfirst_visitscrollclickgenerate_leadform_startform_submitview_search_resultsChart 4c: Core Web Vitals & PageSpeed (Lab — Mobile + Desktop)
Lab (Lighthouse) · https://ongboit.com
Top opportunities (fix to speed up)
- Reduce unused JavaScript — save 40ms
- Improve image delivery — save 460 KiB
- Use efficient cache lifetimes — save 608 KiB
- Render-blocking requests — save 610 ms
Diagnostics
- Avoids enormous network payloads — Total size was 612 KiB
- Minimizes main-thread work — 0.8 s
- JavaScript execution time — 0.3 s
- Avoid large layout shifts
- Avoid long main-thread tasks — 3 long tasks found
Chart 5: AI Crawler Access (14 bots)
robots.txt — no explicit AI policy — bots allowed via "User-agent: *". Status per known AI/LLM crawler:
| Bot | Vendor | Purpose | robots.txt status |
|---|---|---|---|
| GPTBot | OpenAI | training crawl | Not-mentioned (=allowed via *) |
| ChatGPT-User | OpenAI | live user-prompted fetch | Not-mentioned (=allowed via *) |
| OAI-SearchBot | OpenAI | ChatGPT Search index | Not-mentioned (=allowed via *) |
| ClaudeBot | Anthropic | training crawl | Not-mentioned (=allowed via *) |
| Claude-Web | Anthropic | live fetch (legacy) | Not-mentioned (=allowed via *) |
| anthropic-ai | Anthropic | crawl (legacy UA) | Not-mentioned (=allowed via *) |
| PerplexityBot | Perplexity | search index | Not-mentioned (=allowed via *) |
| Perplexity-User | Perplexity | live user-prompted fetch | Not-mentioned (=allowed via *) |
| Google-Extended | Gemini/Vertex training & grounding | Not-mentioned (=allowed via *) | |
| CCBot | Common Crawl | open corpus (feeds many LLMs) | Not-mentioned (=allowed via *) |
| Bytespider | ByteDance | training crawl | Not-mentioned (=allowed via *) |
| Amazonbot | Amazon | Alexa/AI crawl | Not-mentioned (=allowed via *) |
| Applebot-Extended | Apple | Apple Intelligence training | Not-mentioned (=allowed via *) |
| meta-externalagent | Meta | Llama/AI training crawl | Not-mentioned (=allowed via *) |
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 20x price | 8 | 9 | 0 |
| file claude.md là gì | 8.1 | 9 | 1 |
| giới hạn của claude free | 8.1 | 8 | 1 |
| claude giới hạn | 8.3 | 10 | 0 |
| claude code 20$ | 8.5 | 23 | 0 |
| giá claude code pro | 8.7 | 33 | 1 |
| claude reset | 8.8 | 8 | 0 |
| claude blog | 9 | 12 | 0 |
| claude pro pricing 2026 | 9.1 | 26 | 0 |
| so sánh codex vs claude code | 9.4 | 8 | 0 |
| claude code giá | 9.7 | 18 | 0 |
| claude max pricing 2026 | 9.7 | 10 | 0 |
The Priority Breakdown figure is in the Executive Summary. All charts use Okabe-Ito color-blind safe palette.
90-Day Roadmap
Visual phased plan. Each block clickable in full HTML; here shown as Gantt-style timeline.
What ships each window
- H3 · Great articles capped by almost no backlinks or brand mentions
- H4 · Tracking runs before visitors consent - a privacy-law risk
- H1 · Your AI-discovery file is broken and leads to a dead page
- M2 · Mobile pages are slow to show main content (LCP 4.2s); fix is server caching
- M1 · The brand isn't in the knowledge graph AI engines trust
- M4 · Owned channels use a different brand + the brand is invisible in local dev communities
Expected Score Progression
| Milestone | Projected Score | Delta |
|---|---|---|
| Current baseline | 62/100 | — |
| After Week 1-2 (all P0 fixed) | 62/100 | +0 |
| After Week 6 (P0+P1 fixed) | 80/100 | +18 (cumulative +18) |
| After Week 12 (P0+P1+P2 fixed) | 92/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
20 fixes
Pipeline generates fix artifacts into audits/[client]/[date]/fixes/.
Generate-only mode — review + apply manually via WP MCP / direct upload.
/geo llmstxt --generate
/geo crawlers --robots
manual-guide
/geo schema --fix-identity
manual-guide
/geo schema --speakable
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
Ready-to-paste artifacts
Produced by this audit — copy directly into the named file, review, then deploy.
robots.txt — explicit AI-crawler policy (geo-crawlers)
Add an explicit citation-friendly AI block to robots.txt to make the open stance intentional and durable, e.g. group the welcomed bots and allow them site-wide while keeping /wp-admin/ disallowed:
User-agent: GPTBot
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: ClaudeBot
User-agent: Claude-Web
User-agent: anthropic-ai
User-agent: PerplexityBot
User-agent: Perplexity-User
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: meta-externalagent
User-agent: Amazonbot
User-agent: CCBot
Allow: /
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Optionally block low-value training crawlers that don't feed a citation surface (Bytespider) to save crawl budget: 'User-agent: Bytespider' + 'Disallow: /'.
Fix and publish llms.txt (handoff to geo-llmstxt) so the open crawl policy is paired with curated content guidance.
Since robots.txt is WP/Rank Math-managed and virtual, set these rules via Rank Math > General Settings > Edit robots.txt (or a static robots.txt) so they survive plugin updates.llms.txt — ready-to-deploy draft (geo-llmstxt LLMS-3)
firecrawl_map (sitemap-backed) returned ~140 URLs with clean taxonomy: 5 category hubs (/category/claude-code, /category/n8n, /category/self-hosting, /category/ai-101, /category/codex-cli), core pages (/about, /blog, /contact, /dich-vu), VN legal pages (/dieu-khoan-su-dung, /chinh-sach-bao-mat), glossary 'la-gi' pages (token-la-gi, claude-code-la-gi, ai-agent-la-gi, codex-cli-la-gi, machine-learning-la-gi, ...), and dense tutorial clusters (claude-code-*, n8n-*, obsidian-*, dataforseo-*). RECOMMENDED llms.txt OUTLINE (deploy at site root /llms.txt):
# Ông Bố IT (ongboit.com)
> Blog cá nhân về công nghệ của 'Thế', một DevOps Engineer. Hướng dẫn thực chiến (tutorials) bằng tiếng Việt về Claude Code, AI coding / vibe coding, n8n automation, Obsidian, self-hosting, và tự động hóa content/marketing. // English: Vietnamese-language personal tech blog by 'Thế', a DevOps Engineer — hands-on tutorials on Claude Code, AI coding, n8n automation, Obsidian, self-hosting, and content/marketing automation.
## About
- [Giới thiệu / About](https://ongboit.com/about): Tác giả Thế (DevOps Engineer) và sứ mệnh của blog.
- [Dịch vụ / Services](https://ongboit.com/dich-vu)
- [Liên hệ / Contact](https://ongboit.com/contact)
## Claude Code
- [Claude Code là gì](https://ongboit.com/claude-code-la-gi): Bài giải thích nền tảng.
- [Cài đặt Claude Code](https://ongboit.com/cai-dat-claude-code)
- [CLAUDE.md là gì](https://ongboit.com/claude-md-la-gi)
- [Claude Code Sub-agents](https://ongboit.com/claude-code-sub-agents)
- [Claude Code Hooks](https://ongboit.com/claude-code-hooks)
- [Slash Commands](https://ongboit.com/claude-code-slash-commands)
- [So sánh Claude Code vs Cursor vs Copilot](https://ongboit.com/so-sanh-claude-code-cursor-copilot)
- (Category hub: https://ongboit.com/category/claude-code)
## n8n Automation
- [n8n Self-host](https://ongboit.com/n8n-self-host)
- [n8n + Claude Code](https://ongboit.com/n8n-claude-code)
- [n8n AI Agent](https://ongboit.com/n8n-ai-agent)
- [n8n Queue Mode](https://ongboit.com/n8n-queue-mode)
- (Category hub: https://ongboit.com/category/n8n)
## Self-hosting
- [WordPress trên Coolify](https://ongboit.com/wordpress-coolify)
- [n8n trên Coolify](https://ongboit.com/n8n-coolify)
- (Category hub: https://ongboit.com/category/self-hosting)
## AI 101 (Glossary / Khái niệm)
- [Token là gì](https://ongboit.com/token-la-gi)
- [AI Agent là gì](https://ongboit.com/ai-agent-la-gi)
- [Context Window là gì](https://ongboit.com/context-window-la-gi)
- [Prompt Caching là gì](https://ongboit.com/prompt-caching-la-gi)
- [AI Hallucination là gì](https://ongboit.com/ai-hallucination-la-gi)
- (Category hub: https://ongboit.com/category/ai-101)
## Codex CLI
- [Codex CLI là gì](https://ongboit.com/codex-cli-la-gi)
- [Claude Code vs Codex](https://ongboit.com/claude-code-vs-codex)
- (Category hub: https://ongboit.com/category/codex-cli)
## Obsidian
- [Obsidian + Claude Code](https://ongboit.com/obsidian-claude-code)
- [Obsidian Markdown cú pháp](https://ongboit.com/obsidian-markdown-cu-phap)
## Optional
- [Blog (all posts)](https://ongboit.com/blog)
- [Sitemap index](https://ongboit.com/sitemap_index.xml)
Note: keep llms.txt to the highest-value canonical pages (curate, do not dump all 140 URLs); use category hubs to represent the long tail. Optionally also publish llms-full.txt with expanded descriptions per the llmstxt.org spec.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-02.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. Task: APPLY a site SEO + GEO audit. CONTEXT - Read the report: seo-audit_ongboit.com_2026-06-02.md (Top-3 Priority, findings by severity, per-category deep dives, 90-Day Roadmap, Score Predictor). - Ready-to-paste artifacts are in the fixes/ folder + the report's "Ready-to-paste artifacts" block (robots.txt AI policy, llms.txt draft, schema JSON-LD, meta). - Site: ongboit.com (WordPress -> apply via WP MCP). WORKFLOW 1. Read the report. Summarize the Top 3 Fixes + the AUTO-SAFE items. Change nothing yet. 2. Propose a plan: ship AUTO-SAFE artifacts first (robots.txt, llms.txt, headers), then AUTO-REVIEW (schema/meta) after I review each, then MANUAL guides. Wait for my OK. 3. When applying each fix: - Site files (robots.txt, llms.txt, .htaccess) -> show the diff, I deploy. - WP content/schema/meta -> edit in WP, create a REVISION/DRAFT, never publish directly. 4. After each fix, VERIFY with the exact signal the finding measured (curl/grep: header present, bot allowed, schema present, llms.txt 200...) -> report pass/fail with evidence. RULES - Don't fabricate or weaken a fix to make it "pass". Evidence-only. - NEVER publish directly -> always draft/revision for my review. - Keep a checklist: [finding id] -> applied / drafted / skipped + why.
Verification Pass — 10 Gates
9/9Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).
| Gate | Check | Status | Detail |
|---|---|---|---|
| Gate 1 | Every finding ties to evidence (5 attrs) | ✓ PASS | All 20 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 20 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 5 P1 — distribution healthy |
| Gate 7 | Low-confidence findings flagged inline | ✓ PASS | 1 medium-confidence + 0 low-confidence findings flagged in evidence cards |
| Gate 8 | Reaudit matrix complete (if reaudit mode) | — N/A | N/A — first audit mode |
| Gate 9 | Quick wins separated from roadmap | ✓ PASS | Quick Wins section distinct from 90-Day Roadmap |
| Gate 10 | Composite scores match category breakdown | ✓ PASS | All 3 composites reverse-compute correctly (±0.5 tolerance) |
Appendix
Appendix A — Score Calculation Methodology
Technical + CWV Composite
Technical*0.45 + Performance*0.35 + Sitemap*0.20
Components:
technical: 78 × 0.45 = 35.10
performance: 60 × 0.35 = 21.00
sitemap: 86 × 0.20 = 17.20
Sum: 73.3
Rounded: 73
GEO + AEO Composite
Geo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12
Components:
geo: 55 × 0.45 = 24.75
schema: 70 × 0.30 = 21.00
platform: 64 × 0.12 = 8.00
brand: 28 × 0.12 = 3.50
Sum: 57.2
Rounded: 57
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: 78 × 0.18 = 14.04
schema: 70 × 0.13 = 9.10
sitemap: 86 × 0.06 = 5.16
performance: 60 × 0.13 = 7.80
geo: 55 × 0.25 = 13.75
platform: 64 × 0.06 = 3.84
brand: 28 × 0.13 = 3.64
image: 82 × 0.06 = 4.92
Sum: 62.2
Rounded: 62
Appendix B — Reproducibility
- Kit version: Claude-Growth v1.0.18
- Audit timestamp: 2026-06-03T16:00:30.842856+00:00
- Audit duration: 0m 17s
- Mode: first
- Tier detected: T1 (capability detection)
- Coverage at this tier: ~95-100% — first-party GSC truth + external SERP/backlink data + (optional) field CWV.
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 (72 raw, 16 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 88/100 · 2 finding(s)
| Medium a11y-form-labels | Form inputs lack programmatic labels (placeholder-only) https://ongboit.com/ — site search <input type="search" name="s" placeholder="Tìm bài viết..."> inside <form role="search"> has no <label> and no aria-label; newsletter <input type="email" placeholder="Email của bạn"> has no <label>, no aria-label, no role=search wrapper. grep: 2 visible inputs, 0 <label> tags on homepage. Placeholder is not an accessible name (WCAG 1.3.1, 4.1.2). → Screen-reader users get no persistent field name once typing begins; placeholder disappears. Search role partially mitigates the search box but email field is unlabeled. Low SEO impact, real assistive-tech impact. |
| Low a11y-contrast-unmeasured | Color contrast not verifiable from static HTML Homepage 101 and post 96 inline `color: #hex` declarations (e.g. figcaption color:#666 on light bg). Foreground/background pairing and WCAG 1.4.3 ratio require rendered DOM; cannot be measured from curl'd HTML. Flagged for Lighthouse/axe pass, NOT scored as a confirmed failure. → Potential AA contrast issues (e.g. #666 captions) unconfirmed; needs rendered audit to close. |
geo-brand-mentions — score 28/100 · 5 finding(s)
| Medium BM1 | No Wikipedia or Wikidata entity — brand absent from the knowledge graph AI engines rely on Domain-filtered firecrawl_search (includeDomains: wikipedia.org, wikidata.org) for '"Ông Bố IT" Thế DevOps blog ongboit' returned web: [] (empty). No knowledge-panel-eligible entity exists. AI engines (Perplexity/ChatGPT/Gemini) disproportionately cite entities with a knowledge-graph anchor. → Establishing a verifiable entity (even via consistent sameAs + author schema + a Wikidata item once notability thresholds are met) raises AI-citation eligibility and disambiguates the brand for E-E-A-T. |
| Medium BM2 | Brand-identity fragmentation: author's YouTube + GitHub carry a different brand (NextGrowth), not 'Ông Bố IT' /about page links to https://www.youtube.com/@nextgrowth-ai (titled 'NextGrowthWithAI') and https://github.com/thenguyenvn90, plus https://nextgrowth.ai/. Brand-name searches for 'Ông Bố IT'/'ongboit' on youtube.com and github.com returned web: [] — the author's owned channels do not rank or surface under the ongboit brand, splitting authority across two identities. → Consolidating naming (cross-brand 'Ông Bố IT (NextGrowth)' on YouTube/GitHub, pinned links both ways) concentrates brand-signal and lets existing channel authority reinforce ongboit.com. |
| Medium BM3 | Zero presence in Vietnamese dev communities (Viblo, Spiderum, Tinhte) — the highest-authority local citation sources firecrawl_search includeDomains [viblo.asia, spiderum.com, tinhte.vn, reddit.com] for the brand returned web: []. WebSearch '"ongboit" OR "Ông Bố IT" viblo OR tinhte OR spiderum' surfaced only unrelated Spiderum content; no brand match. Viblo in particular is the primary VN technical-credibility platform and a frequent AI-citation source for Vietnamese dev queries. → 3-5 well-cited Viblo/Spiderum cross-posts would create authoritative third-party citation paths and likely lift Vietnamese-language AI-engine citations for Claude Code / n8n topics. |
| Low BM4 | Social proof is shallow — TikTok engagement is low and there are two competing handles firecrawl_search: TikTok @ongbo.it (videos ~119 likes) and a second handle @ongboit (channel '217 Lượt thích' total). Two handles dilute follower consolidation. Only one organic third-party mention found anywhere (Threads @irenejuann referencing 'ongboit.com ... dashboard về SEO content'). → Consolidate to a single TikTok handle (301-redirect followers/bio-link the secondary), which strengthens the social sameAs signal and avoids splitting audience. |
| Low BM5 | sameAs covers owned profiles but omits TikTok and is not reciprocally branded Phase 3 noted only 4 sameAs platforms (recommend >=5). /about links GitHub, LinkedIn, Facebook (ongboitvuitinh), YouTube, TikTok (@ongbo.it) — but the TikTok-second-handle and the cross-brand mismatch mean sameAs likely does not include all live profiles, and linked profiles do not consistently name 'Ông Bố IT' in their own bios. → Add TikTok + nextgrowth.ai to Organization/Person sameAs and make every linked profile bio say 'Ông Bố IT' — tightens the sameAs verification loop AI uses to confirm authorship. |
geo-compliance — score 62/100 · 4 finding(s)
| High GC-01 | No cookie consent banner / CMP while GA4 fires on load (PDPD consent gap) Homepage HTML contains no CMP signature (grep for cookieyes|complianz|cmplz|onetrust|usercentrics|cookiebot|borlabs|moove_gdpr = 0 matches) yet loads https://www.googletagmanager.com/gtag/js?id=GT-K8HP8DDM and calls gtag('config','GT-K8HP8DDM') unconditionally. Vietnam Decree 13/2023 (PDPD, eff. 2023-07-01) requires prior consent for personal-data processing. Source: curl -s https://ongboit.com/ | grep gtag/CMP, 2026-06-02. → Analytics + email PII processed before consent; PDPD non-compliance for the Vietnam market and a GDPR risk for any EU visitors. Highest-priority compliance fix. |
| Medium GC-02 | Email PII collected via subscribe form with no consent checkbox or CMP gating Homepage has <input type="email" placeholder="Email của bạn"> Subscribe form; /contact/ returns 200. No consent checkbox and no CMP present to gate submission. Source: curl -s https://ongboit.com/ | grep email/form, /contact/ HTTP 200, 2026-06-02. → Email is personal data under PDPD; collecting it without an explicit consent affirmation weakens lawful-basis posture. Add an unticked consent checkbox linking the privacy policy. |
| Low GC-03 | Software version / fingerprint disclosure (asset ?ver= and generator meta) Assets expose ?ver=1.4.5 and ?ver=7.0; <meta name="generator" content="Site Kit by Google 1.179.0">. Reveals exact plugin/component versions, easing targeted exploitation. Source: curl -s https://ongboit.com/ | grep ?ver=/generator, 2026-06-02. → Low direct privacy impact but aids attacker reconnaissance; remove version query strings and generator meta. |
| Low GC-04 | Cookie security flags (Secure/HttpOnly/SameSite) unverifiable — no Set-Cookie issued curl -sIL https://ongboit.com/ returns no Set-Cookie header for anonymous requests (caching/static front page). Secure/HttpOnly/SameSite flags therefore could not be measured; assessment deferred to authenticated/session contexts. Source: curl -sIL, 2026-06-02. → Not a defect — informational. WP login/session cookies (wordpress_*) should still be re-checked for HttpOnly+Secure in an authenticated session. |
geo-crawlers — score 92/100 · 3 finding(s)
| Low geo-crawlers-01 | No explicit AI-crawler policy — site relies on implicit '*' allow (wide-open by default) https://ongboit.com/robots.txt (HTTP 200) contains only 'User-agent: *' with Disallow /wp-admin/. None of GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, Applebot-Extended, meta-externalagent, etc. are named. Source: curl 2026-06-02. → All 14 AI bots are technically allowed, so access is fine today. But the citation-friendly stance is implicit, not declared — a future plugin/theme/security change could silently flip it, and there is no positive signal to bots that crawling+citation is welcomed. |
| Low geo-crawlers-02 | Bytespider allowed by default — low citation value, consumes crawl budget Bytespider (ByteDance) is Not-mentioned in https://ongboit.com/robots.txt and thus allowed via '*'. Bytespider is an aggressive training crawler with no public-facing citation surface that benefits a Vietnamese tech blog. Source: robots.txt 2026-06-02. → Optional: blocking Bytespider trims wasteful crawl load on a small Apache/WordPress host without sacrificing any AI-citation channel. Pure crawl-hygiene call; not required for the citation goal. |
| Medium geo-crawlers-03 | llms.txt broken (301 → 404) removes a complementary AI-guidance signal Per Phase 1: https://ongboit.com/llms.txt returns 301 (Rank Math) → /wp-content/uploads/2026/04/llms.txt → 404. robots.txt allows AI bots but offers no llms.txt curation. Source: _SHARED_CONTEXT.md / Phase 1. → With crawlers wide-open, a working llms.txt would let the site steer AI engines to its best content (top token-saving / Claude Code guides) and reinforce a citation-friendly posture. Currently that channel is dead. (Detailed fix owned by geo-llmstxt agent.) |
geo-llmstxt — score 18/100 · 3 finding(s)
| High LLMS-1 | /llms.txt absent: Rank Math 301 redirects to a 404 upload path (broken AI-discovery manifest) curl -sIL https://ongboit.com/llms.txt → HTTP/1.1 301 Moved Permanently, header 'X-Redirect-By: Rank Math', Location: https://ongboit.com/wp-content/uploads/2026/04/llms.txt; following that target → HTTP/1.1 404 Not Found (curl FINAL_CODE: 404, size 0). Canonical /llms.txt therefore yields no content. Confirms Phase3 H5. → Deploying a valid /llms.txt (and removing the dead Rank Math redirect) gives AI crawlers a curated map of ~140 pages, improving citation eligibility in ChatGPT/Perplexity/Claude/Gemini for high-intent VN queries (e.g. 'claude code la gi', 'n8n self-host'). Emerging standard; low cost, asymmetric GEO upside. |
| Medium LLMS-2 | Dangling Rank Math redirect rule points /llms.txt at a deleted /wp-content/uploads file Response header 'X-Redirect-By: Rank Math' on the 301 from /llms.txt to /wp-content/uploads/2026/04/llms.txt (404). The redirect was configured in Rank Math (date stamp 2026/04) but the target upload no longer exists. The fix must delete/replace this redirect, otherwise a static /llms.txt placed at root may still be intercepted by the 301. → Removing the stale redirect prevents the new llms.txt from being shadowed by the broken 301; avoids serving a redirect-to-404 to AI agents that probe /llms.txt. |
| Low LLMS-3 | Site structure fully supports a high-quality llms.txt — recommended outline ready to deploy firecrawl_map (sitemap-backed) returned ~140 URLs with clean taxonomy: 5 category hubs (/category/claude-code, /category/n8n, /category/self-hosting, /category/ai-101, /category/codex-cli), core pages (/about, /blog, /contact, /dich-vu), VN legal pages (/dieu-khoan-su-dung, /chinh-sach-bao-mat), glossary 'la-gi' pages (token-la-gi, claude-code-la-gi, ai-agent-la-gi, codex-cli-la-gi, machine-learning-la-gi, ...), and dense tutorial clusters (claude-code-*, n8n-*, obsidian-*, dataforseo-*). RECOMMENDED llms.txt OUTLINE (deploy at site root /llms.txt):
# Ông Bố IT (ongboit.com)
> Blog cá nhân về công nghệ của 'Thế', một DevOps Engineer. Hướng dẫn thực chiến (tutorials) bằng tiếng Việt về Claude Code, AI coding / vibe coding, n8n automation, Obsidian, self-hosting, và tự động hóa content/marketing. // English: Vietnamese-language personal tech blog by 'Thế', a DevOps Engineer — hands-on tutorials on Claude Code, AI coding, n8n automation, Obsidian, self-hosting, and content/marketing automation.
## About
- [Giới thiệu / About](https://ongboit.com/about): Tác giả Thế (DevOps Engineer) và sứ mệnh của blog.
- [Dịch vụ / Services](https://ongboit.com/dich-vu)
- [Liên hệ / Contact](https://ongboit.com/contact)
## Claude Code
- [Claude Code là gì](https://ongboit.com/claude-code-la-gi): Bài giải thích nền tảng.
- [Cài đặt Claude Code](https://ongboit.com/cai-dat-claude-code)
- [CLAUDE.md là gì](https://ongboit.com/claude-md-la-gi)
- [Claude Code Sub-agents](https://ongboit.com/claude-code-sub-agents)
- [Claude Code Hooks](https://ongboit.com/claude-code-hooks)
- [Slash Commands](https://ongboit.com/claude-code-slash-commands)
- [So sánh Claude Code vs Cursor vs Copilot](https://ongboit.com/so-sanh-claude-code-cursor-copilot)
- (Category hub: https://ongboit.com/category/claude-code)
## n8n Automation
- [n8n Self-host](https://ongboit.com/n8n-self-host)
- [n8n + Claude Code](https://ongboit.com/n8n-claude-code)
- [n8n AI Agent](https://ongboit.com/n8n-ai-agent)
- [n8n Queue Mode](https://ongboit.com/n8n-queue-mode)
- (Category hub: https://ongboit.com/category/n8n)
## Self-hosting
- [WordPress trên Coolify](https://ongboit.com/wordpress-coolify)
- [n8n trên Coolify](https://ongboit.com/n8n-coolify)
- (Category hub: https://ongboit.com/category/self-hosting)
## AI 101 (Glossary / Khái niệm)
- [Token là gì](https://ongboit.com/token-la-gi)
- [AI Agent là gì](https://ongboit.com/ai-agent-la-gi)
- [Context Window là gì](https://ongboit.com/context-window-la-gi)
- [Prompt Caching là gì](https://ongboit.com/prompt-caching-la-gi)
- [AI Hallucination là gì](https://ongboit.com/ai-hallucination-la-gi)
- (Category hub: https://ongboit.com/category/ai-101)
## Codex CLI
- [Codex CLI là gì](https://ongboit.com/codex-cli-la-gi)
- [Claude Code vs Codex](https://ongboit.com/claude-code-vs-codex)
- (Category hub: https://ongboit.com/category/codex-cli)
## Obsidian
- [Obsidian + Claude Code](https://ongboit.com/obsidian-claude-code)
- [Obsidian Markdown cú pháp](https://ongboit.com/obsidian-markdown-cu-phap)
## Optional
- [Blog (all posts)](https://ongboit.com/blog)
- [Sitemap index](https://ongboit.com/sitemap_index.xml)
Note: keep llms.txt to the highest-value canonical pages (curate, do not dump all 140 URLs); use category hubs to represent the long tail. Optionally also publish llms-full.txt with expanded descriptions per the llmstxt.org spec. → A curated llms.txt covering the 5 category hubs + ~20-25 flagship tutorials/glossary pages maximizes AI-engine comprehension with minimal maintenance, giving the buyer a deployable deliverable. |
geo-platform-optimizer — score 64/100 · 8 finding(s)
| Medium GPO-PLATFORM-SCORES | Per-platform readiness breakdown (5 engines) Computed from observed signals. Google AIO=72/100 (structure 32/40, authority 18/30, technical 22/30); ChatGPT=68/100 (entity 18/35, content 35/40, crawler 25/25); Gemini=64/100 (ecosystem 18/35, KG 16/30, content 30/35); Bing Copilot=60/100 (index 15/30, content 25/30, ecosystem 12/20, technical 8/20); Perplexity=58/100 (community 9/30, directness 25/30, freshness 18/20, access 18/20). Source: curl HTML+schema scan of / and /claude-code-audit-geo-ai-search/, robots.txt, firecrawl_search brand-mention scan. → Roadmap: closing entity + community gaps lifts average ~64 -> ~78 |
| High GPO-LLMSTXT-BROKEN | llms.txt is broken (301 -> 404), not just missing curl https://ongboit.com/llms.txt returns 301 redirecting to https://ongboit.com/wp-content/uploads/2026/04/llms.txt which returns 404. No working llms.txt served at root. Affects all 5 AI engines that consume the emerging llms.txt convention for content discovery. → Cross-platform AI discoverability; cleaner crawl guidance for ChatGPT/Perplexity/Gemini |
| Medium GPO-NO-FAQPAGE-SCHEMA | No FAQPage JSON-LD despite Q&A-format content Article /claude-code-audit-geo-ai-search/ has question-format H2s ('GEO la gi va business impact 2026 ra sao?') and the body discusses FAQPage, but the JSON-LD @graph contains only Person, WebSite, ImageObject, BreadcrumbList, WebPage, Person(author), BlogPosting -- no FAQPage type. 'FAQPage' appears only as body text, not structured data. ChatGPT and Perplexity cite FAQPage mainEntity/acceptedAnswer pairs heavily. → Higher passage-level citation rate on ChatGPT + Perplexity for question queries |
| Medium GPO-NO-WIKIPEDIA-ENTITY | No Wikipedia / Wikidata entity for brand (ChatGPT + Gemini KG gap) firecrawl_search for '"ongboit" OR "Ong Bo IT" Claude Code blog' returned only self-owned pages + Facebook + TikTok + one Threads mention. No Wikipedia article, no Wikidata item, no Knowledge-Graph indicator. Wikipedia presence is the strongest entity signal for ChatGPT web search and feeds Google's Knowledge Graph (Gemini). → Entity recognition uplift for ChatGPT (18/35 -> ~26) and Gemini KG signals |
| Medium GPO-NO-COMMUNITY-VALIDATION | No Reddit / forum community validation (Perplexity weak spot) Brand-mention search surfaced Facebook, TikTok (#ongboit hashtag), and a third-party Threads post -- but zero Reddit threads, Stack Overflow, or Q&A-forum discussion. Perplexity heavily weights Reddit + forum validation; presence here is social-broadcast only, not community-discussed. (Vietnamese-niche caveat: r/vietnam, r/ClaudeAI, voz.vn forums are the realistic venues.) → Perplexity community score 9/30 -> ~18/30 with seeded authentic discussion |
| Low GPO-SAMEAS-4-ONLY | Only 4 sameAs profiles; no YouTube / no Wikidata link Person schema sameAs = [facebook.com/ongboitvuitinh, github.com/thenguyenvn90, tiktok.com/@ongbo.it, linkedin.com/in/minh-the-nguyen-...]. 4 platforms (Phase3 M1 recommends >=5). No YouTube channel (Gemini ecosystem gap) and no sameAs to Wikidata/Crunchbase to anchor the entity for ChatGPT/Gemini. → Entity disambiguation across ChatGPT + Gemini; small but compounding |
| Low GPO-NO-INDEXNOW-NO-BING-VERIFY | No IndexNow signal; Bing Webmaster verification unverifiable No IndexNow key file referenced and no msvalidate.01 meta tag observed in homepage HTML head scan. Bing Webmaster Tools verification status is unverifiable from external analysis. Bingbot itself is allowed (robots wildcard-open), so Copilot can crawl -- but faster index freshness via IndexNow is unused. Bing index score held at 15/30. → Faster Bing index refresh -> fresher Copilot answers |
| Medium GPO-SECURITY-HEADERS-TRUST | 0/6 security headers may dampen cross-platform trust signals Phase3 H1: CSP, HSTS, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy, Permissions-Policy all absent. Not a direct citation blocker, but HTTPS/security hygiene is a soft trust input for AIO source-quality and Copilot enterprise-context ranking. Listed here as a shared dependency, not double-counted as P1 (owned by technical agent). → Marginal trust uplift across AIO + Copilot |
geo-schema — score 70/100 · 6 finding(s)
| High geo-schema-01 | Duplicate/conflicting Organization identity splits the entity graph https://ongboit.com/ ships TWO unlinked identity blocks: (a) Rank Math @graph node @id=https://ongboit.com/#person type=Person name='Ông Bố IT' sameAs=[facebook.com/ongboitvuitinh, github.com/thenguyenvn90, tiktok.com/@ongbo.it, linkedin.com/in/minh-the-nguyen-6b995960]; (b) a separate hand-coded type=Organization name='Ông Bố IT' (no @id) sameAs=[tiktok.com/@ongbo.it, facebook.com/ongboit]. Same brand name declared as both Person and Organization, conflicting Facebook URLs (facebook.com/ongboit vs facebook.com/ongboitvuitinh), no @id linkage. Source: raw HTML JSON-LD, 2026-06-02. → Removes entity ambiguity so AI engines resolve one canonical 'Ông Bố IT' node instead of two competing ones; consolidates sameAs into a single authoritative entity. |
| High geo-schema-02 | Article/BlogPosting publisher is a Person, not an Organization with logo BlogPosting @id=.../tiet-kiem-token-claude-code/#richSnippet and About Article both set publisher -> {@id: https://ongboit.com/#person} (a Person node). Google Article rich-result guidance expects publisher as an Organization carrying a logo ImageObject. The Organization block that does exist on the homepage is orphaned (no @id) and never referenced by any Article. Source: raw HTML JSON-LD, 2026-06-02. → Restores valid Article publisher signal (Organization+logo) for rich-result eligibility and clearer publisher entity for AI attribution. |
| Medium geo-schema-03 | sameAs entity graph missing Wikidata, X/Twitter, YouTube #person sameAs covers 4 platforms (LinkedIn, GitHub, TikTok, Facebook). No Wikidata entity, no X/Twitter, no YouTube channel linked. No Wikipedia (likely N/A for this entity size). Source: home/post JSON-LD #person + author/ongboit138 nodes, 2026-06-02. → Each additional verified profile strengthens cross-platform entity resolution for AI engines; Wikidata is the highest-value addition if/when an entity exists. |
| Medium geo-schema-04 | speakable property absent on all pages String 'speakable' not present in JSON-LD on home, /about/, or /tiet-kiem-token-claude-code/ (grep=False, 2026-06-02). No cssSelector/xpath markup signalling voice/AI-readable sections. → Adds an explicit AI-assistant/voice readability signal pointing engines to the TL;DR and FAQ answers — underused GEO lever for a tutorial-heavy blog. |
| Low geo-schema-05 | Author Person uses the site logo as its image (no real headshot) author Person @id=https://ongboit.com/author/ongboit138/ image.url=https://ongboit.com/wp-content/uploads/2026/03/ongboit-logo-transparent-150x150.webp (the brand logo, caption 'Nguyễn Minh Thế'). Author node also omits knowsAbout and worksFor that the homepage #person carries. Source: post JSON-LD author node, 2026-06-02. → A genuine author headshot plus knowsAbout/worksFor on the author node improves E-E-A-T and author-entity verification for AI engines. |
| Low geo-schema-06 | FAQPage on post — restricted for Google rich results (informational, no fix required) https://ongboit.com/tiet-kiem-token-claude-code/ block 1 type=FAQPage with 7 well-formed Question/acceptedAnswer pairs. Since Aug 2023 Google shows FAQ rich results only for government/health authority sites; this is a non-authority blog so no rich result will render. Schema is valid and not harmful. Source: post JSON-LD, 2026-06-02. → Keep as-is: no Google rich-result benefit but retains genuine Q&A semantic value for AI answer engines. |
geo-technical — score 78/100 · 5 finding(s)
| High GT-01 | 0/6 security headers present (no HSTS, CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy) curl -D - https://ongboit.com/ (2026-06-02): response headers contain only Alt-Svc, Content-Type, Date, Link, Server (Apache/2.4.66 Debian), Vary, Transfer-Encoding. None of the 6 security headers returned on any tested URL. → Trust/safety signal gap; clickjacking + MIME-sniff + downgrade exposure. Low direct ranking effect but a measurable hygiene deficit and easy win. Fix in Apache vhost/.htaccess: add Strict-Transport-Security "max-age=31536000; includeSubDomains; preload", X-Content-Type-Options "nosniff", X-Frame-Options "SAMEORIGIN", Referrer-Policy "strict-origin-when-cross-origin", Permissions-Policy "geolocation=(), microphone=(), camera=()", and a baseline Content-Security-Policy. |
| Medium GT-02 | No HTTP caching headers and no CDN on HTML responses curl -D - https://ongboit.com/ (2026-06-02): no Cache-Control, ETag, Expires, or Last-Modified header on the 200 HTML response. No CDN signals (no CF-*, X-Cache, Via, Age). Origin = Apache/2.4.66 over HTTP/1.1 (Alt-Svc advertises h3 but origin serves 1.1). TTFB measured 0.33-0.34s (curl time_starttransfer, 2 runs). → Repeat visits and crawler re-fetches are uncached at the edge; every request hits origin PHP. Adds latency risk under load and wastes crawl budget. Put Cloudflare (free) in front for edge caching + HTTP/2/3 + automatic Brotli, and add Cache-Control/ETag for static assets. Improves TTFB and LCP headroom. |
| Medium GT-03 | llms.txt broken: 301 redirect to uploads path that 404s curl -L https://ongboit.com/llms.txt (2026-06-02): HTTP 301 -> Location https://ongboit.com/wp-content/uploads/2026/04/llms.txt -> HTTP 404 Not Found. Redirect appears Rank-Math-generated. → The emerging AI-discovery manifest is unreachable, so LLM crawlers that look for /llms.txt get a 404. For a publisher whose explicit goal is AI-engine citations this is a missed signal. Remove the Rank Math redirect and serve a valid llms.txt at the root (200) listing key posts/sitemaps. |
| Low GT-04 | robots.txt has no AI-crawler directives (default WP only) curl https://ongboit.com/robots.txt (2026-06-02): User-agent: * / Disallow: /wp-admin/ / Allow: /wp-admin/admin-ajax.php / Sitemap: https://ongboit.com/sitemap_index.xml. No GPTBot/ClaudeBot/PerplexityBot/Google-Extended/CCBot/etc. rules. Live UA tests show GPTBot and ClaudeBot already receive HTTP 200 + full 113958-byte HTML. → AI bots are not blocked (good for citation goal) but there is no explicit allow either. Optional: add explicit User-agent allow stanzas for the 11 major AI bots (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, Claude-SearchBot, PerplexityBot, Perplexity-User, Google-Extended, CCBot, Bytespider) to make intent unambiguous. No blocking action needed. |
| Low GT-05 | Minimal resource hints; no preload for hero image or fonts Homepage HTML (2026-06-02): only 2 preconnect hints (fonts.googleapis.com, fonts.gstatic.com), no dns-prefetch, no rel=preload. 6 stylesheets in <head>; 11 scripts (0 defer, 2 async). Hero handled reasonably: 1 fetchpriority=high img, 11/12 imgs have width+height, 8 lazy. → Render-blocking CSS in head plus Google Fonts without preload/font-display can delay LCP. Add rel=preload for the LCP hero and the primary woff2 font, and ensure font-display:swap. Static-signal only; validate against field data in seo-performance. |
seo-audit — score 78/100 · 6 finding(s)
| High SEO-01 | llms.txt is broken (301 to a 404) — AI-engine discovery file unusable https://ongboit.com/llms.txt returns HTTP 301 -> https://ongboit.com/wp-content/uploads/2026/04/llms.txt which is 404 (curl, 2026-06-02; corroborates Phase 1 signal). Goal includes AI-engine citations, so a dead llms.txt directly undercuts the stated objective. → AI crawlers (ChatGPT, Perplexity) that honor llms.txt get a 404 instead of a content map; removes an easy AI-citation signal for an AI-coding-topic site. |
| Medium SEO-02 | Zero security/transport headers (0/6) — trust + minor ranking/crawl-trust signal curl -I https://ongboit.com/ shows no Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, or Referrer-Policy (0 matches, 2026-06-02; matches Phase 1 0/6). HTTPS works but no HSTS to enforce it. → No HSTS leaves a downgrade window; missing X-Content-Type-Options/Referrer-Policy are baseline hygiene reviewers and some trust heuristics expect. Low direct ranking effect, easy win. |
| Medium SEO-03 | robots.txt declares no AI-bot policy — no explicit allow/disallow for GPTBot/PerplexityBot/etc. Phase 1: robots.txt is WP-default (Disallow /wp-admin/ only, Sitemap -> sitemap_index.xml); no AI crawler user-agents addressed. For a site whose goal is AI-engine citations, the absence of explicit allow directives is a missed positioning opportunity (and no control over training/answer bots). → Site cannot signal welcome/blocking intent to AI answer engines; combined with broken llms.txt, AI-discovery surface is weaker than the content quality warrants. |
| Medium SEO-04 | 18 paginated blog archive pages are index,follow — thin/near-duplicate index bloat https://ongboit.com/blog/page/2/ ... /page/19/ all return HTTP 200 with meta robots 'follow, index' and self-referential canonicals (curl, 2026-06-02). 185 posts at 10/page = 19 archive pages, each thin listing markup. (Pagination correctly 404s beyond page 19 — no soft-200 overrun.) → Crawl budget spent on low-value listing pages and potential index dilution; Google generally prefers these consolidated or noindex,follow. Minor for a 185-post site but trivially fixable in Rank Math. |
| Low SEO-05 | Decorative SVG icons emit generic <title> nodes ('Hours','Toggle Menu') — accessibility/markup noise Raw HTML of /, /blog/, and article pages contains repeated <title>Hours</title>, <title>Toggle Menu</title>, <title>Scroll to top</title> from Kadence inline SVGs (curl, 2026-06-02). Not document-title conflicts (the real <title> is first and correct) but they add meaningless labels for assistive tech and bot parsers. → No ranking penalty; mild a11y/clarity noise. Cosmetic markup hygiene. |
| Low SEO-06 | Meta robots directive order inconsistent across templates ('follow, index' vs 'index, follow') Homepage/about/blog/category use 'follow, index, ...'; the article /tiet-kiem-token-claude-code/ uses 'index, follow, ...' (curl, 2026-06-02). Functionally equivalent to crawlers but signals two different meta-config paths (theme vs Rank Math per-post), worth normalizing. → No SEO impact; indicates template/config drift to clean up for consistency. |
seo-backlinks — score N/A · 3 finding(s)
| Low BL1 | Backlink profile not measurable - DataForSEO Backlinks subscription inactive mcp__dataforseo-mcp__backlinks_summary(target=ongboit.com) -> 'Access denied. Visit Plans and Subscriptions to activate your subscription' (Code 40204). No measured referring-domain/backlink count obtained. → Activate a DataForSEO Backlinks subscription (or use Moz / Ahrefs / the GSC Links report) to get measured authority data next audit. Blocks precise gap quantification today. |
| High BL2 | Authority gap is the binding constraint on rankings (inferred from SERP competitor data) DataForSEO ranked_keywords avg_backlinks_info for the SERPs ongboit competes on: 'claude code' competitors avg referring_main_domains ~2,940; 'claude code download' ~4,567. ongboit ranks pos 71-83 on these. Strong content (seo-page score 88) ranking page 7-8 => the limiter is off-page authority, not on-page. → A focused link-building + digital-PR program (guest posts on Viblo/Spiderum, HN/Reddit citations, dev community profiles) is the highest-leverage off-page action to unlock page-1 for the marquee terms. |
| Medium BL3 | Likely near-zero referring domains (corroborated, not measured) Cross-agent: geo-brand-mentions found only TikTok handles + 1 Threads mention and zero presence on Reddit/YouTube/GitHub/Viblo/Wikipedia under the brand. Consistent with a fresh domain ranking only is_new keywords. → Establishes the baseline: almost any quality referring domain is incremental authority. Prioritize 5-10 foundational citations (author bios, dev directories, community profiles) first. |
seo-google — score 65/100 · 4 finding(s)
| High GG1 | Striking-distance keywords on page 2 - small push lands page 1 (commercial intent) GSC 90d striking distance (pos 8-30, impr>=8): 'claude code pricing' pos 11.0 (29 impr), 'giá claude code pro' pos 8.7 (33 impr), 'claude code giá rẻ' pos 12.9 (37 impr), 'các gói claude code' pos 8.1 (22 impr). All commercial-intent, all mapping to /claude-code-gia-bao-nhieu/ (currently pos 8.5, 86 clicks). → Pushing the pricing hub from pos 8.5 to top-5 captures the highest-commercial-intent VN queries; realistic with on-page + internal-link consolidation + a few links. |
| Medium GG2 | Traffic concentrated in 3 pages - thin tail beyond the top performers GSC top pages: /tiet-kiem-token-claude-code/ 194 clicks + /claude-code-gioi-han-su-dung/ 143 + /claude-code-gia-bao-nhieu/ 86 = 423 of 737 total clicks (57%) from 3 of 185 posts. Long tail (e.g. /claude-md-la-gi/ 38c, /claude-code-vs-code/ 15c) drops off fast. → Spreading authority from the 3 winners to cluster siblings (internal links + refresh) raises portfolio-wide traffic; pairs with /blog-audit-pipeline decay/cluster work. |
| Medium GG3 | Big English-volume terms ('claude code' 33K SV) still page 2-8 - authority-gated GSC avg position 7.4; DataForSEO Labs: 'claude code' (SV 33,100) ranks pos ~78. GSC shows the VN-intent variants rank far better (page 1) than the broad English head term. The head term is gated by domain authority (see seo-backlinks BL2). → Head-term page-1 is a long-game authority play, not an on-page fix; the near-term ROI is the striking-distance VN terms (GG1). |
| Low GG4 | Brand query CTR healthy; brand demand exists GSC: 'ongboit' 47 clicks / 57 impr / CTR 82.5% / pos 1. Homepage / pos 2.0 with 80 clicks. Brand is being searched and clicked - a foundation to build entity authority on. → Positive signal; reinforce with the knowledge-graph + brand-consolidation work (M1/M4). |
seo-images — score 82/100 · 3 finding(s)
| Low IMG1 | No AVIF + no <picture> element — WebP-only delivery via plain <img>, missing modern format fallback curl 3 pages (2026-06-02): 0 AVIF references, 0 <picture> elements across 62 images; all served as WebP via <img src=...webp>. The seo-images standard recommends <picture><source type=image/avif><source type=image/webp><img></picture>. → AVIF-first <picture> delivery cuts image bytes ~20% vs WebP (helps mobile LCP 4.2s). Optional given WebP is already good; an incremental perf win, not a defect. |
| Low IMG2 | fetchpriority='high' is on the logo, not the LCP image All 3 sampled pages: the single fetchpriority='high' img is the header logo (~50px), not the hero/first-post LCP candidate. Cross-ref seo-performance + seo-visual. Contributes to mobile LCP 4.2s. → Move fetchpriority='high' + preload to the real LCP image; helps mobile LCP. |
| Low IMG3 | ~30% of in-article images lack explicit width/height Pricing article 17/31 with width+height; token article 16/19; homepage 11/12. Missing-dimension images are a latent CLS risk (measured CLS is ~0, so currently negligible). → Add width/height to all images for CLS robustness as content grows; low urgency. |
seo-page — score 88/100 · 3 finding(s)
| Low page-home-meta-short | Homepage meta description under-utilized at 117 chars https://ongboit.com/ meta description = 117 chars (Rank Math, scraped 2026-06-02); ~155 chars available before SERP truncation, leaving ~38 chars of unused snippet real estate / no keyword reinforcement. → Minor CTR uplift; fuller, keyword-bearing snippet in Google SERP. |
| Low page-home-h1-not-answerfirst | Homepage H1 is a brand tagline, not a query/answer phrase https://ongboit.com/ H1 = 'Hành Trình Zero → Hero với AI Coding và Automation' (scraped 2026-06-02). No primary keyword (Claude Code / AI coding blog) in the on-page H1; weak alignment between H1 and the keyword-rich <title>/og:title. → Tighter H1↔title keyword alignment can reinforce homepage topical relevance for brand+category queries. |
| Low page-home-ogtitle-entity | Homepage og:title contains an unescaped HTML entity (&) https://ongboit.com/ og:title = 'Ông Bố IT | Claude Code, AI Coding & Self-hosting Blog' (scraped 2026-06-02). Social/AI cards may render the literal '&' instead of '&'. → Cosmetic — cleaner social/AI share-card title. |
seo-performance — score 60/100 · 9 finding(s)
| High perf-lcp-no-fetchpriority | First post featured image (LCP candidate) missing fetchpriority='high' and preload hint https://ongboit.com/ — <img decoding='async' src='claude-code-goal-command-hero.webp'> rendered first in post grid; no fetchpriority='high', no <link rel='preload'> in <head>. Image file is 250,806 bytes (250KB) at Content-Length from server. Logo has fetchpriority='high' but is not the likely LCP element (it is 50px wide in header). source: curl HTML + curl -sI on image → Estimated 300-600ms LCP improvement (confidence=low/inferred). fetchpriority='high' and a matching preload hint move the image into the browser's high-priority fetch queue, removing the post-CSS discovery delay. |
| Medium perf-lcp-sizes-oversized | First post image has sizes='(max-width: 2400px) 100vw, 2400px' — browser likely fetches 1024w+ variant for a 180px thumbnail https://ongboit.com/ HTML: <img ... sizes='(max-width: 2400px) 100vw, 2400px'> on a card image rendered at height:180px. srcset includes 300w, 768w, 1024w, 1536w, 2048w, 2400w variants. On a 390px mobile screen the sizes expression resolves to ~390px, so 768w is fetched — still oversized for a 180px thumbnail. source: curl HTML analysis → Reduces LCP image transfer weight by ~60-70% on mobile if corrected to sizes matching actual rendered size (approx 350px). Saves ~150-200KB per mobile pageload (confidence=low/inferred). |
| Medium perf-css-render-blocking | Five render-blocking stylesheets in <head> with no critical-CSS split or async load https://ongboit.com/ <head> contains: kadence-global.min.css (28KB), kadence-header.min.css, kadence-content.min.css, kadence-footer.min.css, kadence-rankmath.min.css — all media='all', none deferred or inlined as critical. Combined uncompressed estimated ~80-100KB. source: curl HTML grep stylesheet → Eliminating or inlining critical CSS can reduce render-blocking time by 150-400ms depending on RTT (confidence=low/inferred). Kadence Pro has a Critical CSS feature that should be enabled. |
| Medium perf-google-fonts-no-preload | Google Fonts loaded as render-blocking stylesheet without font-file preload https://ongboit.com/ <head>: <link rel='stylesheet' id='kadence-fonts-gfonts-css' href='https://fonts.googleapis.com/css?family=Open%20Sans:regular,700|Rubik:700,regular,500,600|Heebo:500&display=swap' media='all'> — this is a render-blocking cross-origin request. display=swap is set in the URL param (correct for FOUT avoidance) but the actual font file URLs are not preloaded. preconnect to fonts.googleapis.com and fonts.gstatic.com are present. source: curl HTML → Adding <link rel='preload' as='font' crossorigin> for the 2-3 primary font files (Open Sans regular, Rubik 500) reduces FOUT and shaves 100-200ms from font-induced layout shifts (confidence=low/inferred). |
| Medium perf-no-cache-control | No Cache-Control max-age header on any asset — browser cache cannot skip revalidation curl -sI https://ongboit.com/wp-content/themes/kadence/assets/css/global.min.css: headers show only Etag and Last-Modified, no Cache-Control or Expires. curl -sI on LCP image (claude-code-goal-command-hero.webp): same — Content-Length: 250806, no Cache-Control. Repeat visitors must send conditional GET (If-None-Match) for every asset on every visit. source: curl -sI on two assets → Adding Cache-Control: public, max-age=31536000, immutable to versioned static assets eliminates revalidation RTT for returning visitors, reducing page load time by 200-800ms for cached assets (confidence=low/inferred). |
| Medium perf-ttfb-elevated | TTFB 384ms — above 200ms ideal; no page-level Cache-Control header observed curl -w '%{time_starttransfer}' https://ongboit.com/: 0.384471s from Frankfurt/EU edge. Apache/2.4.66 on Debian, no CDN caching layer detected in response headers (no X-Cache, no CDN vendor header). Gzip is active (23KB compressed HTML). source: curl timing → Enabling a full-page caching plugin (e.g. WP Rocket, W3 Total Cache) or CDN-level HTML caching can bring TTFB under 200ms for cached responses. Estimated LCP improvement 200-400ms (confidence=low/inferred). |
| Low perf-inp-risk-gtm | Google Tag Manager (gtag.js) loaded async — INP risk if event handlers are heavy https://ongboit.com/ HTML: <script src='https://www.googletagmanager.com/gtag/js?id=GT-K8HP8DDM' async> — async is correct for load, but GTM containers can inject third-party scripts that run long tasks on the main thread post-load, raising INP above 200ms. No measured data available. source: curl HTML → Auditing GTM container for long-running tags; using Server-side GTM or Partytown can reduce main-thread blocking. Estimated INP improvement variable (confidence=low/inferred). |
| Medium perf-lcp-measured | MEASURED: LCP 2.77s (marginally over 2.5s 'good'), driven by 949ms server response - caching is the fix DataForSEO on_page_lighthouse (Lighthouse 13.3.0, desktop simulated) on /tiet-kiem-token-claude-code/: largest-contentful-paint 2769ms, first-contentful-paint 2278ms, speed-index 2673ms, server-response-time 949ms, cumulative-layout-shift 0.002, max-potential-fid 24ms, total-byte-weight 728KB, performance score 0.70. Server response (949ms) is ~34% of LCP - the single biggest lever. → Full-page caching to cut server-response from ~950ms to <200ms would pull LCP from 2.77s into the green (<2.5s, likely ~2.0s). fetchpriority + cache-control add marginal gains. Now confidence=high (measured). |
| Low perf-cls-inp-good-measured | MEASURED: CLS 0.002 and INP-proxy excellent - no action needed (corrects earlier inferred CLS/INP risk) Lighthouse: cumulative-layout-shift 0.002 (threshold 0.1 = 50x headroom), max-potential-FID 24ms, bootup-time 10ms, main-thread work 325ms. Best-Practices 100, SEO 100, Accessibility 96. → Confirms the earlier seo-visual CLS worry (Buy-Me-A-Coffee image) is cosmetic - real CLS is negligible. Still worth adding width/height for robustness, but not a CWV risk. |
seo-sitemap — score 86/100 · 3 finding(s)
| Low SM1 | Phase 1 'sitemap.xml noindex' flag is benign - sampled content pages are index,follow curl https://ongboit.com/sitemap_index.xml = 200, valid sitemapindex with 3 children. The X-Robots-Tag: noindex header is on the sitemap document response only. Verified: first URL in post-sitemap.xml returns HTTP 200 with no X-Robots-Tag noindex. This is correct Rank Math behavior, not a defect. → No action required - documented so it is not misread as an indexation bug in future audits. |
| Low SM2 | Bare /sitemap.xml does not serve the index (only /sitemap_index.xml does) curl https://ongboit.com/sitemap.xml returned empty in Phase 1; the working entry point is /sitemap_index.xml, which robots.txt correctly references. Some third-party tools probe /sitemap.xml by default. → Optional: add a /sitemap.xml -> /sitemap_index.xml alias/redirect for tool compatibility. Google uses the robots.txt declaration so indexing is unaffected. |
| Low SM3 | No image, news, or video sitemaps for a media-rich tutorial blog sitemap_index.xml lists only post/page/category sub-sitemaps. Articles are image-heavy (screenshots, diagrams per seo-page/visual agents) but images are not surfaced via an image sitemap. → An image sitemap could improve Google Images discovery for tutorial screenshots - minor incremental discovery channel. |
seo-visual — score 68/100 · 5 finding(s)
| High VIS-01 | 30/41 images lack explicit width + height attributes — high CLS risk DOM analysis at https://ongboit.com/ (375x812 and 1920x1080 viewports, Playwright, 2026-06-02): totalImages=41, undimensionedImages=30 (73%). Emoji SVGs from s.w.org (15+ instances) have no dimensions; post thumbnail images and content images also missing. CLS score likely above 0.1 threshold for Google Core Web Vitals. → Eliminating CLS by adding width/height to all img tags (or using Kadence/WordPress image size settings) can recover Core Web Vital CLS pass and improve ranking eligibility for Top Stories / rich results. |
| Medium VIS-02 | Primary mobile CTA ('Bat Dau Lo Trinh') is below the fold by ~5px on 375x812 DOM getBoundingClientRect() at 375x812 viewport: CTA top=817px, viewport innerHeight=812px. Button is 124x46px. Screenshot (screenshots/mobile.png, 2026-06-02) confirms the button is visible in the screenshot due to rendering timing, but computed position places it below fold. Conversion impact: first-impression CTA requires a scroll. → Moving CTA above 812px fold improves immediate conversion signal and reduces bounce for mobile users arriving from SERP. Small CSS tweak to reduce hero padding. |
| Medium VIS-03 | Mobile hamburger button tap target is 37x31px — below 48x48px minimum DOM measurement at 375x812 viewport (Playwright, 2026-06-02): BUTTON 'Open menu' w=37, h=31. Google recommends minimum 48x48px touch targets. 25 additional interactive links measured at h=46px (borderline). Hamburger failure is the most critical as it blocks all navigation on mobile. → Fixing hamburger to 48x48px min eliminates a Lighthouse accessibility failure and improves mobile UX for the majority of Vietnamese mobile-first users. |
| Low VIS-04 | 31 text elements render below 16px on mobile — potential readability flag DOM computed style scan at 375x812 (Playwright, 2026-06-02): 31 p/li/td elements with computed fontSize < 16px. Specific font sizes not individually enumerated, but count is non-trivial. Google Mobile-Friendly test warns on text too small to read. → Increasing base font to 16px minimum improves readability for Vietnamese mobile users and avoids mobile usability issues in GSC. |
| Low VIS-05 | No noscript fallback — content depends on JS execution for full interactivity DOM query 'noscript' returns 0 elements (Playwright DOM analysis, 2026-06-02). However, H1, intro paragraph, CTA, and nav ARE present in raw server-rendered HTML (curl confirms body_length=113,167, h1_content_preview='Hanh Trinh Zero → Hero voi AI Coding va Automation'). Risk is limited to JS-enhanced components (search widget, dynamic category tabs) — core content is not at risk. → Low priority given server-rendered core content. Adding a noscript fallback for the search widget would be a minor improvement for accessibility completeness. |