Skip to content

Website: programmatic SEO and GEO - #107

Merged
tuanphungcz merged 8 commits into
mainfrom
seo-programmatic
Oct 11, 2026
Merged

tuanphungcz merged 8 commits into
mainfrom
seo-programmatic

Conversation

@tuanphungcz

Copy link
Copy Markdown
Collaborator

Programmatic SEO + GEO overhaul of useanimations.com, based on a live-site audit and Search Console data (no /icons/* page had a single impression; no sitemap was ever submitted).

Icon pages (/icons/<id>, 300)

  • Unique title/description/intro per icon, synonyms, interaction-specific FAQ (FAQPage), related icons by keyword overlap, "Other versions" for variant families
  • Usage tabs: React, shadcn/ui, HTML + Lottie (lottie-web), Mobile (React Native, iOS, Android, Flutter), static SVG
  • Per-icon 1200×630 OG cards rendered at build (@resvg/resvg-js), /icons/<id>.md Markdown versions
  • Schema fixed: ImageObject now points to the SVG (was the Lottie JSON); added ItemPage, MediaObject, SoftwareSourceCode, real BreadcrumbList
  • Painted stills for icons whose first frame is empty (loaders, checkmark, arrows)

New hub pages

  • /icons (real index; it served the Home icon page before), /categories + 20 category pages (+ .md; "Other" is noindex), /interactions + 6 interaction pages, /lottie-icons, /shadcn-animated-icons
  • Docs: new "Use without React" section (any Lottie player)

Technical

  • Homepage: keyword H1 under the slogan, micro-animations copy, FAQ, category/interaction link blocks, WebSite/Organization/SoftwareSourceCode schema; HTML 1.01 MB → 570 KB, DOM 7,135 → 4,113
  • canonical-url edge function: single 301 for trailing slashes, .html, /docs, /license*; Markdown negotiation extended to icon/category/licence pages
  • Sitemap index (pages, hubs, icons with image entries), lastmod from git (omitted when unknown)
  • robots.txt allows AI crawlers explicitly, Content-Signal moved to a comment; llms.txt extended, new llms-full.txt
  • /zh expanded to a full translation; consistent HSTS; contrast fixes; .md files noindex
  • Build dates no longer churn (documentation, icons.json); seoLint logs duplicate/over-long titles at build

Notes

  • Build ~20 s (+15 s for OG cards), dist 75 MB
  • If Netlify clones shallow, sitemap lastmod is omitted (consider git fetch --unshallow in the build command)
  • HSTS includeSubDomains; preload applies to all subdomains
  • iOS/Compose/dotLottie snippets not compiled
  • After deploy: submit https://useanimations.com/sitemap.xml in Search Console

Verified with npm run check, a full build, curl smoke tests and headless Chromium screenshots (no console errors on hub/icon pages).

- taxonomy.ts: category and interaction slugs, titles, hand-written intros
  and use cases, indexable flags and lookups
- seo.ts: meaningful keywords, synonyms, variant families, related icons,
  per-icon titles, descriptions, intros, FAQs, variant notes, seoLint and
  shared Organization/WebSite/FAQ JSON-LD nodes
- git.ts: last-modified dates from Git history (empty on shallow clones)
- documentation and icons.json date from Git instead of the build time
- sitemap.xml logs seoLint findings once per build
…adcn

All-icons index at /icons, category and interaction hubs with full icon
grids, FAQ and CollectionPage/ItemList/BreadcrumbList JSON-LD, Markdown
versions of category pages, /lottie-icons and /shadcn-animated-icons
landing pages, a Use without React docs section, and nav/footer links.
- Icon pages use the generated titles, descriptions, intros and FAQs from lib/seo.ts, with
  synonyms, linked interaction and category facts, a real breadcrumb, other versions and
  related icons
- Usage tabs: React, shadcn/ui, HTML + lottie-web (full build for icons with expressions),
  native mobile players and static SVG
- Static SVG previews as <img>, inverted in dark mode
- JSON-LD graph: ItemPage, ImageObject, MediaObject, SoftwareSourceCode, BreadcrumbList, FAQPage
- /og/icons/<id>.png social cards drawn with resvg and Geist at build time
- /icons/<id>.md Markdown version of each icon page
- Layout: image, image alt, og:type and Markdown alternate props
…otiation

- Home: keyword H1 under the slogan, micro animation copy, FAQ with FAQPage JSON-LD, category and interaction link blocks, WebSite/Organization/SoftwareApplication/Dataset schema
- Lighter home page: compact prerendered SVG frames, icon card styles in CSS, demos load their Lottie JSON when visible, content-visibility on icon sections
- Sitemap index with page, hub and icon sitemaps (Git lastmod, image entries)
- Edge functions: one 301 to canonical URLs (trailing slash, .html, aliases); Markdown negotiation for icon, category and licence pages
- HSTS everywhere, noindex for /og and Markdown copies, robots.txt without the unknown directive
- llms.txt hubs, new llms-full.txt and licencing-and-terms.md, expanded /zh
- Contrast: darker subtle grey, high-contrast light code theme; install button name matches its text
…less templated icon pages

- Build a still per icon: the first frame, or the fullest of eight later frames when the first
  draws nothing (checkmark, loading, loading-v2, loading-v4, arrow-up, arrow-down). Static grids,
  related and version lists, the home cards and OG cards use it; reduced-motion home cards keep it.
- Interaction pages passed the Lottie JSON instead of the icon id to InteractionDemo, which then
  fetched /icons/undefined.json.
- Icon FAQ: two or three questions on interaction edge cases, accessibility and colors or an
  alternative interaction, instead of four templated answers repeating facts and code.
- Related icons count synonyms and fall back to same-category icons with the same interaction in
  a per-icon order; the intro leaves out the other names shown as chips.
- Keep the OG self-closing SVG fix, the docs FAQ answer and the /icons rewrite.
@github-actions

Copy link
Copy Markdown

🔎 Website preview

https://pr-107--affectionate-goldberg-13a61e.netlify.app

Updated for commit 0d6d423.

@tuanphungcz
tuanphungcz merged commit 54570f9 into main Oct 11, 2026
7 checks passed
@tuanphungcz
tuanphungcz deleted the seo-programmatic branch October 11, 2026 17:12

This branch was successfully deployed

1 active deployment
preview — 0d6d4236 Deployed Oct 11, 2026 by tuanphungcz via preview #50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant