Static Blog Got 0 Google Impressions for 6 Weeks — 5 GSC Fixes
New Hugo blog indexed but zero Search Console impressions. Fix sitemap 404, wrong canonical, accidental noindex, and trailing slash traps.
98 hands-on guides with complete code examples.
New Hugo blog indexed but zero Search Console impressions. Fix sitemap 404, wrong canonical, accidental noindex, and trailing slash traps.
Real debugging story: Next.js 15 app worked locally, preview returned 500, production was fine. The env var scoping mistakes Vercel docs don't emphasize.
US/UK/CA traffic from 22% to 41% in 5 months. English rewriting, hreflang, and topic selection for high-CPC niches.
2.5s delayed AdSense load preserved 94% fill rate. LCP improved 1.8s. Config for Hugo, Astro, and vanilla static.
Astro builds locally but fails on Cloudflare with 'Could not resolve node:buffer'. Enable nodejs_compat and configure the Cloudflare adapter — step-by-step fix.
58% ad block rate on my React tutorial blog. Anti-adblock message + affiliate fallback recovered 22% of lost revenue.
Connected Cloudflare domain to free Pages hosting. DNS-only setup, www redirect, and avoiding registrar upsells.
AdSense on Hugo/Vercel — uBlock hid more than ads. Filenames, third-party domains, and lazy-load patterns that look like malware.
Heatmap-tested ad layout for Hugo blogs: sticky sidebar + 2 in-article + footer. $5.10 blended RPM without CLS penalty.
301 redirects from old URLs, trailing slash normalization, and when to use redirects vs getStaticPaths.
Remove Starlight/Vercel analytics injection, run Plausible instead, and find the script that kept loading after I thought I removed it.
Native banner + push combo on Astro blog. $2.80 combined RPM on Tier 2 geo. Full integration without React hydration.
Loan calculator across 3 pages — shared Svelte island, prerendered shells, URL state via query params.
Same Hugo blog on three platforms. Compare build time, bandwidth, SSL, redirects — and which host I pick for ad-monetized blogs.
Remark plugin + astro:assets pipeline so every  in MDX becomes responsive WebP at build time.
Invalid traffic flags, click patterns, and content policies that got my friend's site limited. Recovery playbook included.
Deployed new Tailwind build, site looked broken. Netlify CDN cache, browser cache, and atomic deploy rollback explained.
Build-time social cards via transformPageData and static OG images per route.
Fixed sidebar ad slot, responsive breakpoints, and passing AdSense review on a static Astro blog.
SPA or VitePress at username.github.io/repo/ — assets 404, client routing broken. Set base path and fix GitHub Actions deploy.
Add Adsterra popunder to static Hugo/VitePress sites with frequency caps, mobile exclusion, and SSR-safe placement. +$1.40 RPM data.
Astro PUBLIC_ vars work in dev but undefined during CF Pages build. Set production vs preview env and avoid wrangler.toml pitfalls.
Images and fonts 404 after Astro static build on Vercel/Netlify. Fix base URL, asset imports, and public folder paths.
When dark-mode CSS hides ad containers or ad blockers strip theme variables — diagnose and fix both.
netlify.toml, build settings, environment variables, and fixing the 'Page not found' on refresh bug.
Insert AdSense in static markdown posts via shortcodes and reserved div slots. Keeps CLS at 0.01 with 3 ad units per page.
Performance audit on image-heavy tutorial blog. Lazy loading, responsive srcset, and moving off unoptimized PNGs cut LCP 74%.
LCP, INP, CLS fixes specific to VitePress default theme — measurable before/after.
In-article placement, sidebar sticky, and auto-ads off. Real CTR lift without template fork.
Self-hosted search index at build time. No Algolia bill, no API keys, works on static hosting.
WordPress migration broke old URLs. vercel.json regex redirects preserved 94% of inbound links per Google Search Console.
47 orphan pages fixed. Topic hub template in Hugo. Organic sessions +31% in 90 days on 180-post blog.
Deferred ad scripts, route-aware loading, and policy-safe placement on doc sites.
Lazy-load banner and native ad units with shortcodes. Pass Core Web Vitals with async injection.
Shiki highlighting at build time, one-click copy, and fixing the 'Cannot use set:html with user input' scare.
Lighthouse wanted longer cache TTL. vercel.json headers cut repeat-load time 60% and fixed stale HTML after deploys.
client:load vs client:visible, islands architecture in practice, and removing every unnecessary hydration point.
Cache, exclude files, parallel CI, and Shiki optimizations — 8 min build down to 2m40s.
Custom domain shows valid DNS but SSL never issues on Vercel. Fix CAA records, Cloudflare proxy, and apex ALIAS configuration.
HUGO_BASEURL, HUGO_VERSION, production flags, and injecting analytics IDs without committing secrets.
A/B tested meta templates in Hugo frontmatter. GSC CTR rose from 2.1% to 3.4% in 60 days without ranking changes.
Static site builds locally but fails on Vercel. Fix Node version mismatch, missing build env vars, and wrong output directory with one vercel.json.
Affiliate links, Adsterra fallback, and newsletter CTA — what actually earned money at 800 visits/month.
Pure static HTML output — what runs at build vs browser, and avoiding window is not defined.
Deploy fingerprinted assets, submodules, and custom domains with GitHub Actions. Fix MIME and path errors.
_redirects, _routes.json, and the adapter-static fallback file that Cloudflare actually respects.
Static blog hit 180GB in 3 days on Vercel Hobby. Real bandwidth math, what triggers overages, and CDN fixes that kept the site online.
CLS 0.31 → 0.03 with reserved zones, sticky footer slot, and popunder config that doesn't inject top banners.
SvelteKit static export needed a launch countdown with timezone display and localStorage dismiss — 95 lines, embed via iframe or snippet.
Vite imagetools, responsive srcset at build time, and fixing the 'image not found in production' bug.
Connect docs to yourdomain.com with TLS, redirects, and correct base config.
When old posts, images, or CSS linger after deploy — hugo --gc, resource cache, and CDN purge checklist.
Lazy-load ad scripts after LCP, slot placement in +layout.svelte, and the CSP headers that broke my first attempt.
Travel blog needed km/mi, °C/°F, kg/lb in one static URL. Tabbed converter with shared engine and localStorage last category.
Blocked thin tag pages and ad test routes without hurting AdSense crawlers. Includes copy-paste templates per host.
VitePress links and assets 404 on GitHub Pages project site. Configure base, assetsDir, and clean URLs for subdirectory hosting.
Git-connected build, custom domain, cache headers, and preview branches. Faster than Vercel for static Hugo.
Team shared passwords in Slack. Built a generator using crypto.getRandomValues with zxcvbn-style strength scoring — no npm.
JSON-to-YAML converter as a prerendered page with csr:true. No API routes, works on GitHub Pages.
VitePress docs build crashes with 'heap out of memory' on Vercel. Set NODE_OPTIONS, trim Shiki themes, and exclude large assets — config that worked on 520 pages.
Real estate landing page needed monthly payment + amortization without embedding a third-party iframe. Pure math, printable table.
Inline script in app.html blocks FOUC, localStorage sync, and system preference fallback — battle-tested pattern.
Vercel Hugo deploy fails with exit 127 or unstyled pages? Set HUGO_VERSION, init git submodules, fix baseURL and output directory.
Unified sitemap checklist: lastmod, priority, image entries, and split sitemaps for 500+ posts.
Client wanted a no-backend BMI + Navy body fat widget for AdSense traffic. Full form math, input validation, and metric/imperial toggle.
SvelteKit adapter-static deploys but internal links 404 on Vercel. Fix trailingSlash, prerender, and vercel.json rewrites.
Sticky right-rail TOC on wide screens using outline markers and custom CSS.
Cut 140 KB of dead CSS from PaperMod without ejecting the theme. Hugo Pipes + PurgeCSS in CI.
Load blog posts and tool configs from JSON files at build time using import.meta.glob. Includes TypeScript types and hot reload.
Debugging webhook logs across UTC and local. Converter plus localStorage favorites for the five API environments I juggle daily.
Three approaches tested: build-time PNG generation, Vercel OG edge, and Cloudflare Workers. Social CTR up 23%.
HR workflow needed plain text from PDFs on a locked-down laptop. pdf.js in a static page — page-by-page extraction with progress bar.
rollup-plugin-visualizer findings, dynamic imports for heavy libs, and removing hydration on pages that don't need it.
Turn off aggressive link prefetch on large doc sites where it hurts mobile data and server logs.
Ship a helpful 404 with search, recent posts, and correct HTTP status on static hosts that default to soft-404.
Freelance landing page needed hex ↔ rgb ↔ hsl with live preview. One input field, three outputs, clipboard copy — 75 lines of JS.
Complete SvelteKit static export — adapter-static config, prerender routes, trailing slashes, and Vercel deployment that works.
Purged 142KB CSS and 89KB JS from a VitePress docs site. CLS went from 0.19 to 0.02. Step-by-step with coverage tools.
Lazy images, WebP in public/, and Vite asset handling for screenshot-heavy docs.
Configure languages, translation links, and hreflang without subdomain chaos. Battle-tested for 3 locales on Vercel.
Event flyer needed WiFi QR codes. Embedded a 4KB QR library via CDN with offline fallback table — full vanilla page.
Blog contributors uploaded 8MB phone photos. Canvas-based compressor cut uploads 85% with quality slider and max-width — no server.
Override CSS for copy button hover, icon, and copied feedback state.
Ship client-side search on Cloudflare Pages free tier. 800 posts, sub-50ms queries, no SaaS bill.
Cut image payload 78% on a 120-post Hugo blog. Checklist covers build-time conversion, srcset, and alt text patterns that rank.
Debugging UTM links for a static newsletter. Built encode/decode with component vs full URI modes and a live query-string parser.
Replace default hero with branded layout using layout: home and custom Vue components.
Needed Base64 for a static site's inline SVG fallback. Built encode/decode with file picker, UTF-8 safety, and the atob Unicode crash fix.
Remove theme JavaScript you don't need. Cut TBT from 340ms to 40ms on a PaperMod blog with zero feature loss.
Intersection Observer + reserved ad slots kept LCP at 1.0s on my Hugo blog. Copy-paste snippet for delayed AdSense load after first paint.
Meta description counter for a static blog editor. Grapheme-aware counting fixed the emoji length mismatch that cost me a rejected guest post.
Filesystem-driven sidebar with glob — stop hand-editing config when adding pages.
Use Hugo Pipes to serve WebP with lazy loading — no JavaScript, no Cloudinary. Real config for posts with 20+ images.
Freelance API integration needed batch field renames. Built a 90-line case converter that handles edge cases like HTTPHeader and iOS-style acronyms.
Enable default local search with custom result ranking and mixed-language content support.
Hit Lighthouse 100 and CrUX green on static frameworks while keeping ad slots. LCP under 1.2s, CLS near zero — configs for all three stacks.
Override shortcodes in layouts/shortcodes/ instead of forking PaperMod. Callout, tip, and warning blocks that survive theme updates.
Built a browser JSON formatter after every online tool choked on a minified API dump. Full vanilla JS, syntax validation, and the parse errors that actually matter.