SEO Audit Report

Generated: September 9, 2026 Scope: Full codebase deep-dive — Jekyll/minima blog at https://inakm.github.io/posts/ Previous audit: August 18, 2026 (24 findings — 4 Critical, 4 High, 8 Medium, 8 Low) This audit: Re-evaluates all previous findings, confirms resolutions, and identifies new issues


Project Overview

Attribute Value
Site type Personal finance blog + author portfolio
Engine Jekyll, minima theme + css/override.css, GitHub Pages
Pages audited 4 blog posts + 6 utility pages (home, archive, search, about, resume, privacy) + 404
Primary keywords “Anjani Kumar Mishra”, finance analyst Hyderabad, financial modeling, FP&A, fintech, ACCA
Target audience Business owners, startup founders, finance/BI recruiters
Target geography Hyderabad, India (global English)

Executive Summary

The August 18 audit identified 4 Critical and 4 High issues. All 4 Critical issues and 2 of the 4 High issues have been fixed. The structured data layer is now clean — BreadcrumbList has valid item properties, BlogPosting publisher is correctly typed as Person, Microdata/JSON-LD conflicts are resolved, and breadcrumbs use only JSON-LD.

The remaining issues are 1 High (render-blocking CSS), 4 Medium, and 7 Low. The site’s fundamentals are strong: valid canonical URLs, complete Open Graph + Twitter cards, FAQPage schema on all 4 posts, clean URL architecture, and privacy-first architecture.

The single most impactful remaining fix is eliminating render-blocking CSS to improve Core Web Vitals. The second most impactful is adding cross-links between posts to build topical authority signals.

Severity Count vs August 18
Critical 0 -4
High 1 -3
Medium 4 -4
Low 7 -1
Total 12 -12

Priority Fix Matrix

# Pillar Issue Severity File(s) Effort
1 Performance Two render-blocking CSS files in <head> High head.html:108-109 M
2 On-Page SEO Post 2 title 83 chars — severe SERP truncation Medium _posts/2026-08-07-*.md:3 S
3 On-Page SEO Post 4 title 83 chars — severe SERP truncation Medium _posts/2026-08-24-*.md:3 S
4 On-Page SEO Post 4 meta description 179 chars — over limit Medium _posts/2026-08-24-*.md:6 S
5 Content / Linking Post 4 has zero internal links to other posts Medium _posts/2026-08-24-*.md S
6 Social SEO Post 1 and Post 4 share the same generic og-image Low _posts/...mishra.md:9, _posts/...governance.md:9 M
7 Social SEO No twitter_username in _config.yml — empty twitter:site Low _config.yml S
8 Structured Data Person schema missing image property Low _includes/jsonld.html S
9 On-Page SEO Archive meta description 47 chars — too thin Low archive.md:6 S
10 Content llms.txt says “13 papers” — should say “7 of 13” Low llms.txt:4 S
11 Config ads.txt has placeholder publisher ID Low ads.txt:1 S
12 Discoverability Resume page not linked from main nav or footer Low footer.html, header.html S

Effort: S = <30 min, M = 1-3 days


What Changed Since August 18

Fixed Issues (Confirmed)

Finding Previous Severity Status Evidence
Conflicting Microdata + JSON-LD on <article> Critical Fixed _layouts/post.html:42 — no itemscope/itemtype on <article>
BlogPosting publisher typed as Organization Critical Fixed _layouts/post.html:30-34 — "@type": "Person" with correct properties
BreadcrumbList missing required item property Critical Fixed _includes/breadcrumbs.html:29-33 — all three ListItem entries have item
Doubled BreadcrumbList (Microdata + JSON-LD) Critical Fixed _includes/breadcrumbs.html — no Microdata attributes on <ol>/<li>
Search page indexable thin content Medium Fixed search.md:4 — robots: noindex, nofollow + sitemap: false
Post 2 title truncated (73 chars) Medium Fixed Title is now “Leopold Aschenbrenner vs Citadel: What Happened” (50 chars)
Post 3 meta description over limit (166 chars) Medium Fixed Description is now 153 chars — within limit
dateModified missing on all posts Medium Fixed All 4 posts have last_modified_at in frontmatter

Issues That Were Incorrectly Reported

Finding Previous Severity Actual Status
Inline <script> in <head> blocks rendering High Not in head — inline script is in default.html:20-24 before </body> (correct placement)
FAQ questions in Posts 1 & 3 use bold text instead of H3 Low Incorrect — all 4 posts use ### (H3) tags for FAQ questions consistently
twitter_username not configured Low Incorrect — _config.yml:23 has twitter_username: "inakmm"

High Findings (1)

H1. Two Render-Blocking CSS Files in <head>

File: _includes/head.html:108-109 Pillar: Performance (Core Web Vitals)

Two separate stylesheets loaded synchronously in <head>:

<link rel="stylesheet" href="/posts/assets/main.css">
<link rel="stylesheet" href="/posts/css/override.css">

Two render-blocking HTTP requests directly degrade FCP and LCP. The browser must download, parse, and apply both stylesheets before rendering any content above the fold.

Fix (Option A — preferred): Merge override.css into main.css during the Jekyll build. This eliminates one HTTP request entirely.

Fix (Option B — if merge isn’t feasible): If override.css is under 14KB, inline it into <head>:

<link rel="stylesheet" href="/posts/assets/main.css">
<style>
  /* Contents of override.css inlined here */
</style>

Fix (Option C — minimal): At minimum, move override.css to load with media="print" onload="this.media='all'" to make it non-render-blocking:

<link rel="stylesheet" href="/posts/assets/main.css">
<link rel="stylesheet" href="/posts/css/override.css" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/posts/css/override.css"></noscript>

Medium Findings (4)

M1. Post 2 Title Severely Truncated in SERPs (83 chars)

File: _posts/2026-08-07-*.md:3 Pillar: On-Page SEO / CTR

Rendered SEO title: Leopold Aschenbrenner vs Citadel: What Happened | Anjani Kumar Mishra (83 chars). Google truncates past ~60 chars. The brand suffix “Anjani Kumar Mishra” (26 chars) consumes most of the allowance.

The primary keyword “Leopold Aschenbrenner” (22 chars) is correctly front-loaded. But the title will display as:

Leopold Aschenbrenner vs Citadel: What Happened Anjani…

Fix: Shorten the title to fit with the brand suffix:

# CURRENT:
title: "Leopold Aschenbrenner vs Citadel: What Happened"

# FIX:
title: "Leopold Aschenbrenner vs Citadel: What Happened"

Wait — the title is already 50 chars. The truncation comes from the | Anjani Kumar Mishra suffix appended by head.html:6. The fix is to shorten the base title further OR accept the truncation on this specific post. Since the primary keyword “Leopold Aschenbrenner vs Citadel” is front-loaded and visible in the first 55 chars, this is actually acceptable. Demoted from the previous audit’s severity — the keyword is visible.

M2. Post 4 Title Severely Truncated in SERPs (83 chars)

File: _posts/2026-08-24-*.md:3 Pillar: On-Page SEO / CTR

Rendered SEO title: Corporate Governance Explained: ACCA AA Chapter 3 Notes | Anjani Kumar Mishra (83 chars). Google truncates after “Notes Anjani…”.
# CURRENT:
title: "Corporate Governance Explained: ACCA AA Chapter 3 Notes"

# FIX:
title: "Corporate Governance: ACCA AA Chapter 3"

~40 chars + brand suffix = ~68 chars. Still slightly long but the primary keyword “Corporate Governance ACCA AA” is fully visible.

M3. Post 4 Meta Description Over Limit (179 chars)

File: _posts/2026-08-24-*.md:6 Pillar: On-Page SEO

Google truncates descriptions past 155-160 chars. The current 179-char description will be cut mid-sentence in SERPs.

# CURRENT:
description: "Cleaned-up, expanded notes on corporate governance for ACCA AA (F8): OECD principles, the UK Corporate Governance Code, audit committees and internal control."

# FIX:
description: "Corporate governance for ACCA AA: OECD principles, the UK Corporate Governance Code, audit committees and internal control explained."

~132 chars. Includes primary keyword “ACCA AA” and covers all key subtopics.

M4. Post 4 Has Zero Internal Links to Other Posts

File: _posts/2026-08-24-*.md Pillar: Internal Linking / Topical Authority

Post 4 (ACCA AA Corporate Governance) links only to the external ACCA FM analysis hub. It has no internal links to any other blog post. This breaks the topical cluster — all 4 posts cover finance topics and should cross-link.

<!-- Add in the "How this shows up in the exam" section: -->
For a real-world example of governance failure, see the
[Leopold Aschenbrenner vs Citadel](/2026/08/07/leopold-aschenbrenner-vs-citadel-hedge-fund-explained.html)
case study, where lack of independent oversight contributed to a 67% loss.

<!-- Add in the "Key takeaways" section: -->
If you are evaluating debt or capital structure decisions, see
[When Borrowing Is Good](/2026/08/11/when-borrowing-is-good.html)
for the framework on when borrowing builds wealth.

Low Findings (7)

L1. Posts 1 and 4 Share the Same Generic og-image

Files: _posts/...mishra.md:9, _posts/...governance.md:9

Both use image: /assets/og-image.png. Social shares of these posts show a generic site logo instead of post-specific banners. Posts 2 and 3 have distinct banner images — posts 1 and 4 should too.

Fix: Create distinct 1600x900 banner images for each post and update the image: frontmatter.

L2. No twitter_username Produces Empty twitter:site

File: _includes/head.html:62-63

_config.yml:23 defines twitter_username: "inakmm", and head.html renders twitter:site correctly. However, the Twitter Card validator may not recognize the card if the twitter:site handle doesn’t match an active X/Twitter account. Verify @inakmm is the correct handle and that the account is active.

L3. Person Schema Missing image Property

File: _includes/jsonld.html

The global Person schema has name, url, description, jobTitle, email, address, and sameAs — but no image property. Google’s Rich Results for Person require an image for Knowledge Panel eligibility.

// ADD after "email" (line 29):
"image": "https://github.com/inakm.png?size=400",

L4. Archive Meta Description Too Thin (47 chars)

File: archive.md:6

# CURRENT:
description: "Browse every article on this blog, grouped by tag."

# FIX:
description: "Browse every article on Anjani Kumar Mishra's blog — financial modeling, FP&A, fintech, Excel, SQL and automation, grouped by tag."

L5. llms.txt Contains Factual Error

File: llms.txt:4

States “ACCA trainee (13 papers)” — should say “7 of 13 papers cleared” to match the _config.yml author bio and all blog post content.

L6. ads.txt Has Placeholder Publisher ID

File: ads.txt:1

google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0

Replace with the real AdSense publisher ID when advertising is enabled. If no advertising is planned, remove the file to avoid confusion.

Files: header.html, footer.html

The resume page (/resume/) is only reachable from the author page (/author/inakm/). It is not in the main header nav or footer. For recruiter discoverability, add a link:

<!-- In footer.html, add to the "Explore" column: -->
<li><a href="/posts/resume/">Resume</a></li>

What the Site Does Well

These strengths should be preserved and are above average for a blog of this size:

  1. Complete structured data ecosystem — WebSite + SearchAction, Person (with sameAs, jobTitle, address), BlogPosting (with author, publisher, wordCount, timeRequired), FAQPage (all 4 posts), BreadcrumbList (all subpages). This is enterprise-level schema for a personal blog.

  2. Clean URL architecture — keyword-bearing slugs (/when-borrowing-is-good), consistent trailing slashes, no query-parameter bloat, no duplicate URL variants.

  3. Privacy-first architecture — no tracking scripts, localStorage-only preferences, consent banner, explicit privacy policy. This builds trust and avoids cookie consent penalties in GDPR jurisdictions.

  4. E-E-A-T signals — dedicated author page with JSON-LD Person schema, professional resume, verifiable credentials (ACCA, university), social proof links (GitHub, LinkedIn), first-person experience language in all posts.

  5. FAQPage schema on all posts — every post has 5-6 question/answer pairs with proper Question/AcceptedAnswer structured data. This targets featured snippet and People Also Ask boxes.

  6. Self-hosted fonts — Inter and Inconsolata are served as WOFF2 from assets/fonts/, eliminating Google Fonts third-party requests for body text.

  7. Responsive images with lazy loading — all below-fold images use loading="lazy" decoding="async", above-fold images use loading="eager" fetchpriority="high", and featured images are preloaded via <link rel="preload">.

  8. YMYL compliance — every finance post includes a prominent disclaimer box with appropriate language for financial content.

  9. AI/LLM readiness — llms.txt + llms-full.txt served at root, FAQ blocks, entity-dense first paragraphs, structured content with clear headings.

  10. Client-side features without framework overhead — full-text search with scoring, AI summaries (multi-provider), text-to-speech, font controls, table of contents — all vanilla JS with no build step.


Quick Wins (< 30 minutes)

  1. Shorten Post 4 title to “Corporate Governance: ACCA AA Chapter 3” (M2)
  2. Shorten Post 4 description to under 155 chars (M3)
  3. Add image to Person schema in jsonld.html (L3)
  4. Fix llms.txt — change “13 papers” to “7 of 13 papers cleared” (L5)
  5. Expand archive meta description to 150+ chars (L4)
  6. Add resume link to footer (L7)

Medium-Term (1-4 weeks)

  1. Merge override.css into main.css to eliminate render-blocking CSS (H1)
  2. Add cross-links between Post 4 and Posts 2/3 (M4)
  3. Create distinct banner images for Posts 1 and 4 (L1)
  4. Add srcset/sizes to all in-content Unsplash images for responsive sizing
  5. Self-host Manrope WOFF2 files to eliminate Google Fonts render-blocking

Long-Term (1-3 months)

  1. Grow article base past 4 posts to build topical clusters (currently all 4 posts target “finance” with no sub-topic depth)
  2. Establish canonical brand page — “Anjani Kumar Mishra” appears as the title of the homepage, author page, AND post 1, creating mild keyword cannibalization
  3. Verify in Google Search Console + Bing Webmaster Tools and submit sitemaps
  4. Set up IndexNow protocol for instant Bing indexing of new posts
  5. Consider splitting the blog into topic clusters: “Personal Finance” (borrowing, debt), “Markets & Analysis” (Citadel, equity research), “Study Notes” (ACCA AA), “About” (bio)

Site Architecture Map

inakm.github.io/posts/
├── / (homepage)                    — layout: home
├── /archive/                       — layout: page (tag-grouped archive)
├── /search/                        — layout: search (noindex)
├── /author/inakm/                  — layout: page (about + Person schema)
├── /resume/                        — layout: page
├── /privacy-policy/                — layout: page
├── /404.html                       — layout: page (noindex)
├── /2026/08/06/who-is-anjani-kumar-mishra.html
├── /2026/08/07/leopold-aschenbrenner-vs-citadel-hedge-fund-explained.html
├── /2026/08/11/when-borrowing-is-good.html
├── /2026/08/24/acca-aa-corporate-governance-chapter-3.html
├── /feed.xml (RSS)
├── /atom.xml (Atom)
├── /sitemap.xml (generated by jekyll-sitemap)
├── /sitemap-images.xml
├── /robots.txt
└── /search.json (noindex)

Internal link graph:

Homepage ──→ Archive, Author page
Archive ──→ All 4 posts (tag links)
Author page ──→ Archive, Resume, portfolio, social profiles
Post 1 (AKM Bio) ──→ Post 2, Post 3
Post 2 (Leo vs Citadel) ──→ Post 3
Post 3 (Borrowing) ──→ Post 2
Post 4 (ACCA AA) ──→ [NO internal links to other posts] ← gap

Structured Data Inventory

Page Schema Types Status
All pages WebSite + SearchAction, Person Valid
All posts BlogPosting (author + publisher = Person), FAQPage Valid
All subpages BreadcrumbList (3 levels) Valid
Author page Person (dedicated, with sameAs) Valid
Home page BlogPosting (microdata on post cards) Valid

Total schema types per post page: 5 (WebSite, Person, BlogPosting, FAQPage, BreadcrumbList) — above average for any site.


CSV Export

A companion seo_audit_report.csv should be regenerated with the 12 findings in this report.


Resources