fixPR-reviewOGa11y
Codex Review Fix: OG Font Changed to TTF, Nested Anchor Eliminated from Cards
Addressed 2 automated Codex review findings on PR #149. ①Fixed OG route (/og/blog/[slug]) passing woff2 to Satori — @vercel/og does not support WOFF2, risking 500 errors when the font fetch succeeds. Rewrote to loadGoogleFontTTF() which calls the Google Fonts CSS API v1 with a legacy User-Agent to extract a TTF URL (standard @vercel/og pattern). ②Fixed nested anchor in BlogGrid.tsx: FeaturedCard and PostCard wrapped entire cards in <Link> while TagLink (itself a <Link>) was rendered inside. Removed TagLink component and replaced in-card tags with <span>. Tag navigation is still available via BlogTagCloud. Build and type-check both pass clean.
「PR #149 Codex review fixes — OG font TTF migration, nested anchor elimination in blog cards」
⏱ 15 min
* Estimated from git history
SEOAIOBlogSitemapOGP
SEO/AIO Full Audit: Dynamic OG, Tag/Category Archives, robots/sitemap Optimization, Share Buttons
A comprehensive site audit PR to address extremely low traffic (137PV/11users in 28 days). Identified 13 structural SEO/AIO problems and resolved: ①Dynamic OG images (/og/blog/[slug]) via next/og to improve SNS share CTR. ②Tag archives (/blog/tags/[tag]) and category archives (/blog/categories/[cat]) for long-tail SEO. ③Pagination (/blog/page/[n], 20/page) to reduce page size. ④robots.ts explicitly allows 16 AI crawlers for citation opportunities. ⑤metadata.robots adds max-image-preview:large for Google Discover. ⑥sitemap.lastmod stabilized with BUILD_TIME constant; removed contradictory /en/blog hreflang. ⑦Replaced ConditionalGA setInterval polling with CustomEvent-driven approach. ⑧Added blog share buttons (X/LINE/Hatena/Copy). ⑨Added tag cloud to blog index. ⑩Exposed RSS/llms.txt/llms-full.txt in footer.
「Implement all SEO/AIO/UX improvements from site audit plan in one batch (Tasks A–M scope)」
⏱ 90 min💬 120 turns
UXCVR404I18n
UX: 404 Page Reworked as Rescue CTA (3 Latest Posts + LINE CTA)
Upgraded the 404 page from bare 'back home / read blog' links into a rescue surface that retains lost visitors. Refactored not-found.tsx into an async server component, pulled the 3 latest posts via getAllPosts().slice(0, 3) as cards, then appended a 'Want to automate with AI?' CTA block (LINE free consult + services list). Reused the card UI from the recent BlogRelatedPosts work (.blog-related-grid / .blog-related-card) for implementation speed and visual consistency. Added new i18n strings to both ja/en (notFound.suggestionsHeading etc.). Swapped useTranslations for getTranslations. Unlike the blog CTA which is ja-only, 404 is rendered for both locales so the en copy is provided too.
「Transform 404 page into a rescue CTA surface with 3 latest posts + LINE CTA」
⏱ 20 min
* Estimated from git history
CVRBlogCoconalaMonetization
CVR: Added Category-Specific Service CTA Block to Blog Posts
The single existing Coconala CTA couldn't channel readers into the most relevant service for each article's category. Added BlogCategoryServices.tsx which renders 3 category-matched Coconala services as a card grid under each post, based on the article's frontmatter category (AI / Automation / Web / Side-Business / Behind-the-Scenes). Service mapping: AI→Claude Code Dev / AI Article Generator / Info Dissemination; Automation→Consulting / Web Automation / Dev; Web→Dev / Info / Consulting; Side-Business→Article Generator / Info / Consulting; Behind→Dev / Article Generator / Consulting. Each click fires GA4 event blog_category_service_click with service_id/category/slug for measurement. Ja locale only since /en is noindex. Production build verified.
「Auto-display 3 category-matched Coconala services per article to lift blog-sourced CVR」
⏱ 25 min
* Estimated from git history
UXBlogInternal LinksSEO
UX: Replaced Blog Related-Post Links with Card Grid
Replaced the blog's end-of-article 'Related Posts' section, previously a bare bullet list of links, with a card grid. Introduced BlogRelatedPosts.tsx which renders each suggestion as a card with a category badge, publish date, title, 2-line description preview, and a 'Read more' affordance, laid out with auto-fit minmax(220px, 1fr). Hover lifts the card and swaps the border to accent; prefers-reduced-motion is respected. Existing getAutoRelatedPosts scoring (category +2, tag +1) is unchanged. Across 57 articles this thickens the internal link graph to improve dwell time and give Googlebot more paths to discover not-yet-indexed posts.
「Upgrade blog related-post section to a card UI to lift internal-link CTR and dwell time」
⏱ 20 min
* Estimated from git history