> For the complete documentation index, see [llms.txt](https://suigar.gitbook.io/suigar-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://suigar.gitbook.io/suigar-docs/seo/optimization-log.md).

# Optimization log

Use this log to preserve decisions, audits, implementation notes, validation, and follow-ups over time.

## Entry Template

```md
## YYYY-MM-DD - Short title

- Scope:
- Channels:
- User/search goal:
- Implementation:
- Validation:
- Impact:
- Follow-ups:
```

## 2026-07-14 - Disabled automatic cross-deployment sitemap gate

* Scope: Restored the production sitemap audit while disabling its automatic CI execution.
* Channels: `technical`, `crawl-indexing`.
* User/search goal: Preserve the full diagnostic for later without letting cross-deployment timing block healthy builds.
* Implementation:
  * Restored the original audit implementation, complete network-mocking tests, workflow steps, hourly workflow, and validation-planner coverage.
  * Gated automatic deploy and scheduled execution behind `ENABLE_LIVE_SITEMAP_AUDIT=true`; manual workflow dispatch remains available without the variable.
  * Retained deterministic sitemap generation, project build-time SEO checks, static sitemap/robots validation, runtime blog verification, and IndexNow submission.
* Validation: Source comparison confirms the audit implementation and tests match their pre-removal versions; only workflow activation conditions differ.
* Impact: CI no longer waits for independently deployed public surfaces to converge, while the original diagnostic remains ready to re-enable.
* Follow-ups: Only enable automatic auditing when cross-deployment convergence is reliable.

## 2026-07-14 - Merge-safe SEO build verification

* Scope: Repaired mainnet blog and SweetHouse SEO verification after the feature-to-main merge.
* Channels: `technical`, `crawl-indexing`.
* User/search goal: Keep source-derived sitemap freshness checks blocking in CI while allowing the blog deployment verifier to run in the slim Node container that does not include Git.
* Implementation:
  * Advanced the declared blog and SweetHouse homepage modification dates to the latest material source date.
  * Kept Git history as the authoritative blog freshness check when available and added a declared-date fallback only when the runtime image has no Git repository or executable.
* Validation: Blog mainnet runtime verification and the SweetHouse mainnet SEO build/check pass with the merged sources.
* Impact: Deployment containers no longer fail because `git` is absent, while normal CI still detects stale sitemap dates from source history.
* Follow-ups: Keep homepage modification constants synchronized whenever material landing-page sources change.

## 2026-07-13 - Deterministic sitemap system and blocking live score

* Scope: Rebuilt sitemap generation, discovery, validation, and deploy assurance for the app, blog, docs, and SweetHouse.
* Channels: `technical`, `crawl-indexing`, `canonical`, `ai-search-geo`.
* User/search goal: Keep the complete public URL inventory accurate without stale timestamps, duplicate ownership, ignored hints, or manual robots drift.
* Implementation:
  * Made the app sitemap source-derived and deterministic, required `lastmod` on child URLs, removed `priority`/`changefreq`, and made tracked generated files fail checks when stale.
  * Mapped every generated docs URL back to its exact `docs/public` Markdown source, enforced Git-derived dates, and switched static-site SEO builds to full-history checkouts.
  * Made the apex sitemap index an exact same-site app/blog/docs inventory with no unverifiable index-level `lastmod`; app/blog/docs robots advertise that index, while SweetHouse advertises its own same-host sitemap.
  * Added shared strict validators, mocked regression tests, exact route classification, and a production audit of every robots file, sitemap, URL response, canonical, title, description, redirect, and indexability state.
  * Added the live `100/100` audit as a blocking post-deploy step in all four mainnet workflows, including retry coverage for cross-pipeline convergence and completed CloudFront invalidation.
  * Added an hourly mainnet audit so runtime and database-driven drift is detected even when no code deployment runs.
  * Removed the optional-output aggregate checker that could read stale build artifacts and replaced manual route-count documentation with executable source-of-truth references.
* Validation:
  * `pnpm run test:seo` passed all twelve positive/negative sitemap-system contracts.
  * Frontend mainnet build, static HTML validation, metadata report, and `check:seo` passed with 28 indexed routes, 21 explicit exclusions, and 0 metadata issues.
  * Blog mainnet build/typecheck/runtime verification passed locally without production DB content; CI still runs the same verifier against its seeded database snapshot.
  * Docs mainnet build passed with 10 source-dated sitemap URLs and 10 rendered HTML/canonical checks.
  * SweetHouse mainnet build and `check:seo` passed with its source-graph freshness check and one rendered canonical URL.
  * Toolchain, workflow, readiness, validation-planner tests, scoped strict validation planning, and diff whitespace checks passed.
  * The live audit correctly failed because production still serves the previous robots contract; production remains ineligible for `100/100` until all four updated surfaces are deployed.
* Impact: New routes and content cannot silently miss classification, generated sources cannot drift unnoticed, and any production ownership/canonical/indexability regression fails the relevant deployment.
* Follow-ups: Deploy app, blog, docs, and SweetHouse mainnet pipelines; keep the apex sitemap index and the same-host SweetHouse sitemap submitted in Search Console; record the first successful live `100/100` result here.

## 2026-07-06 - Game details accordion copy expanded

* Scope: Expanded visible game detail accordion descriptions in the production frontend.
* Channels: `content`, `ai-search-geo`.
* User/search goal: Give each game page more precise, unique, user-readable copy inside the game details accordion without bloating game cards or list views.
* Implementation:
  * Added per-game summary and long description copy for Coinflip, PvP Coinflip, Wheel, Candy Rush, Range, Limbo, Plinko, Soccer, Rock Paper Scissors, and SuiRoyale.
  * Wired `GameDetailsPanel` to use the longer accordion copy while preserving compact `GameConfig.description` text for cards and other dense surfaces.
  * Force-mounted the details accordion content and Description tab so the expanded copy is present in rendered HTML even before a player opens the accordion.
* Validation:
  * `./scripts/with-runtime.sh pnpm --filter @suigar/ui run typecheck` passed.
  * `./scripts/with-runtime.sh pnpm --filter @suigar/ui run check:seo:metadata` passed with 27 routes and 0 issues.
  * `./scripts/with-runtime.sh pnpm --filter @suigar/ui run check:seo` still fails on the pre-existing blog sitemap host guard because the blog sitemap lists legacy `blog.suigar.com` URLs instead of the canonical apex `/blog` path.
* Impact:
  * Game pages now expose clearer visible descriptions around rules, odds, risk profile, and verifiable settlement in the accordion Description tab.
* Follow-ups:
  * Review Search Console query/page data for game routes after deployment to see whether more answer-style sections or internal links are worth adding.

## 2026-05-31 - Public docs source split

* Scope: Split published docs content from internal repository documentation.
* Channels: `technical`, `crawl-indexing`, `content`, `ai-search-geo`.
* User/search goal: Publish only public developer docs for now, keep SDK URLs stable, leave room for MCP docs, and stop internal docs edits from triggering docs-site CI.
* Implementation:
  * Moved SDK docs under `docs/public/sdk/` and added `docs/public/README.md` plus `docs/public/SUMMARY.md` as the public docs source.
  * Repointed GitBook, Docusaurus preparation, and sidebar generation from `docs/` to `docs/public/`.
  * Narrowed docs-site workflow path filters from `docs/**` to `docs/public/**`.
  * Reframed root `docs/README.md` and `docs/SUMMARY.md` as internal repository docs navigation.
* Validation:
  * `pnpm --filter @suigar/docs-ui run typecheck` passed.
  * `NETWORK=mainnet pnpm --filter @suigar/docs-ui run build` passed and generated only the public home page plus SDK pages.
  * `pnpm exec prettier --check` passed for touched docs, docs-site, GitBook, and workflow files.
* Impact:
  * Internal SEO, engineering, migration, and AI maintenance notes can change without publishing or running docs-site CI.
* Follow-ups:
  * Add MCP docs under `docs/public/mcp/` when ready and include them in `docs/public/SUMMARY.md`.

## 2026-05-29 - Connected sitemap discovery

* Scope: Connected the mainnet sitemap discovery graph across Suigar app, blog, docs, and SweetHouse.
* Channels: `technical`, `crawl-indexing`, `internal-links`, `ai-search-geo`.
* User/search goal: Let crawlers discover every public Suigar surface from every mainnet entrypoint while each sitemap keeps only its own canonical URLs.
* Implementation:
  * Updated frontend `robots.txt` generation to advertise `https://suigar.com/sitemap.xml`, `https://suigar.com/blog/sitemap.xml`, `https://suigar.com/docs/sitemap.xml`, and `https://house.suigar.com/sitemap.xml`.
  * Updated blog, docs, and SweetHouse robots routes/generators to advertise the same connected mainnet sitemap set.
  * Extended the shared static-site SEO checker to validate explicit multi-sitemap robots policies.
  * Updated frontend and SweetHouse SEO checks plus deploy workflow assertions for the connected sitemap set.
  * Updated SEO guidance and subproject overlays to document the cross-sitemap discovery policy.
* Validation:
  * `pnpm --filter @suigar/ui run check:seo` passed with 26 indexed routes, 20 excluded routes, 4 robots sitemap directives, and 0 metadata issues.
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
  * `pnpm --filter @suigar/docs-ui run typecheck` passed.
  * `NETWORK=mainnet pnpm --filter @suigar/docs-ui run build` passed; `check-static-site-seo` passed for docs with 13 sitemap URLs and 4 robots sitemap directives.
  * `NETWORK=testnet node frontend/scripts/write-seo-assets.mjs --mode testnet` passed and kept non-mainnet robots blocking without sitemap directives.
  * `NODE_ENV=production NETWORK=mainnet NEXT_PUBLIC_NETWORK=mainnet pnpm --filter @suigar/sweethouse-ui run build` passed, and `pnpm --filter @suigar/sweethouse-ui run check:seo` passed with 4 robots sitemap directives.
  * `pnpm exec prettier --check` passed for touched sitemap/robots/checker/workflow/docs files.
  * `pnpm --filter @suigar/sweethouse-ui run typecheck` still fails on unrelated implicit `any` errors in existing SweetHouse components.
* Impact:
  * Mainnet robots files now connect app, blog, docs, and SweetHouse discovery without putting cross-surface URLs inside the wrong sitemap file.
* Follow-ups:
  * After deploy, resubmit or inspect all four sitemap URLs in Search Console and confirm the robots files are live.

## 2026-05-29 - Docs path migration

* Scope: Moved the canonical docs site from the docs subdomain to `https://suigar.com/docs/`.
* Channels: `technical`, `crawl-indexing`, `canonical`, `internal-links`, `ai-search-geo`.
* User/search goal: Keep docs under the main Suigar domain like `/blog`, while preserving old docs paths through 301 redirects.
* Implementation:
  * Set Docusaurus `baseUrl` to `/docs/` and updated docs robots/sitemap URLs to `https://suigar.com/docs`.
  * Added a docs S3 origin and `/docs` cache behaviors to the frontend CloudFront distribution.
  * Added a docs path rewrite function for frontend `/docs` traffic and a path-preserving legacy docs-subdomain redirect.
  * Updated docs CI/CD to wait for the frontend docs origin, deploy the docs bucket through the frontend distribution, and verify `/docs`, `/docs/assets` CSS, robots, and legacy redirects.
  * Updated public links in frontend, blog, SweetHouse, `llms.txt`, and SEO docs to point at `/docs`.
* Validation:
  * `pnpm --filter @suigar/docs-ui run typecheck` passed.
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
  * `NETWORK=mainnet pnpm --filter @suigar/docs-ui run build` passed and wrote robots/sitemap URLs under `https://suigar.com/docs`.
  * `NETWORK=testnet pnpm --filter @suigar/docs-ui run build` passed and wrote blocking robots plus an empty sitemap for `https://testnet.suigar.com/docs`.
  * `pnpm exec prettier --check` passed for the touched workflow/docs/blog/frontend/SweetHouse/SEO docs files.
  * `tofu fmt -check -diff infrastructure` passed.
  * `git diff --check` passed.
  * Repo grep found no old docs-subdomain public links outside the CI legacy redirect verification variables.
  * `pnpm --filter @suigar/sweethouse-ui run typecheck` still fails on pre-existing implicit `any` errors in unrelated SweetHouse components.
  * `pnpm --filter @suigar/ui run typecheck` still fails on pre-existing unrelated frontend typing errors.
  * `tofu -chdir=infrastructure validate` could not run because the Google provider version is not cached in `.terraform/providers`.
* Impact:
  * Mainnet docs canonical URLs consolidate under the apex host, matching the current `/blog` path strategy.
* Follow-ups:
  * Apply the infrastructure change, deploy docs, then submit `https://suigar.com/docs/sitemap.xml` in Search Console.

## 2026-05-29 - Blog index filler removed

* Scope: Removed the visible SEO/GEO filler blocks from the blog index.
* Channels: `content`, `metadata`, `structured-data`, `ai-search-geo`.
* User/search goal: Let real DB-backed articles carry the blog index content instead of showing generic strategy, table, and Q\&A copy.
* Implementation:
  * Removed the visible intro/byline/date, "What readers get", "Topic map", and "Quick answers" sections from the blog index.
  * Kept a visually hidden H1 for page structure and kept metadata, RSS/Atom auto-discovery, Open Graph/Twitter image metadata, and JSON-LD structured data.
  * Relaxed blog runtime verification so CI no longer requires a visible table or visible `datePublished`/`dateModified` markers on the index.
  * Updated the blog SEO guidance and status notes to prefer real article content over generic index filler.
* Validation:
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
  * `NETWORK=testnet pnpm --filter @suigar/blog-ui run build` passed.
  * `pnpm --filter @suigar/blog-ui run verify:runtime` passed.
  * `pnpm --filter @suigar/blog-ui run prepare:edge-snapshot` and `pnpm --filter @suigar/blog-ui run verify:export` passed.
* Impact:
  * The blog index returns to a cleaner editorial surface while preserving technical discovery signals.
* Follow-ups:
  * Once posts are published, re-run the SEO/GEO audit against the populated blog index.

## 2026-05-29 - Sorank blog publishing webhook

* Scope: Added the backend integration point for Sorank-generated SEO article publishing.
* Channels: `blog-generation`, `automation`, `crawl-indexing`, `technical`.
* User/search goal: Let Sorank send published article payloads directly to Suigar, store them in the blog database, refresh RSS/Atom/sitemap surfaces, and update the public `/blog/` snapshot automatically.
* Implementation:
  * Added `POST /api/blog/webhooks/sorank` on the backend.
  * Verified Sorank requests through `Authorization: Bearer <secret>` with fallback support for existing webhook-secret headers.
  * Ignored `webhook.test` events without creating posts.
  * Mapped `article.published` payloads into the existing `blog_posts` schema, converting Sorank HTML into Portable Text blocks.
  * Added `blog_webhook_deliveries` idempotency tracking keyed by Sorank `delivery_id`.
  * Added optional blog revalidation and optional GitHub workflow dispatch after successful DB writes.
  * Added `workflow_dispatch` support to the blog CI workflow so webhook-triggered snapshot refreshes can rebuild `/blog/`, RSS, Atom, and sitemap from the DB.
* Validation:
  * `pnpm --filter @suigar/api run typecheck` passed.
  * `pnpm --filter @suigar/api test -- sorank` passed.
  * `pnpm --filter @suigar/api run build` passed.
  * YAML parsing passed for `.github/workflows/blog-site.yaml`.
* Impact:
  * Sorank can now publish into the blog database through a dedicated API endpoint instead of the revalidation-only blog route.
* Follow-ups:
  * Store `SORANK_WEBHOOK_SECRET` in SSM for testnet/mainnet.
  * Configure `BLOG_PUBLISH_GITHUB_TOKEN` in SSM if the current edge snapshot deployment remains the live `/blog/` serving layer.

## 2026-05-29 - Blog feed discovery CI alignment

* Scope: Fixed the blog runtime verification failure for RSS/Atom auto-discovery.
* Channels: `technical`, `crawl-indexing`, `metadata`.
* User/search goal: Keep feed auto-discovery present and verifiable on the blog in both mainnet and non-mainnet builds.
* Implementation:
  * Changed blog metadata so RSS and Atom alternate links are emitted on all environments using the environment-specific blog URL.
  * Kept non-mainnet feed content guarded from published posts through the existing feed post source.
  * Updated `verify:runtime` so it checks the expected blog URL for the active `NETWORK` or `NEXT_PUBLIC_NETWORK` instead of hardcoding mainnet.
  * Added a blog `postbuild` step that copies `.next/static` and `public` into the standalone runtime bundle.
  * Extended `verify:runtime` to fail if blog HTML references unprefixed `/_next/static` assets or if referenced CSS/JS assets are missing from the standalone bundle.
  * Added a runtime redirect from duplicated `/blog/blog/*` paths back to the canonical `/blog/*` paths.
  * Extended `verify:runtime` to scan every generated App Router HTML/RSC text file for duplicated `/blog/blog` links and unprefixed `/_next/static` assets, not only the homepage.
  * Extended `verify:runtime` to assert that the `/blog/blog/:path*` canonical redirect exists in the Next routes manifest.
  * Removed the generic `withBlogBasePath` route helper and moved internal tag links to `next/link` route hrefs so generated internal routes cannot carry a pre-prefixed `/blog`.
  * Removed tracked `.next-seo-*` blog build artifacts and ignored future copies so stale static exports cannot be used as deployment input.
  * Added a frontend post-deploy guard that fails if the casino homepage serves `Suigar Blog` HTML or loads `/blog/_next/static` assets.
  * Added an edge snapshot step that packages the verified standalone build into the current S3/CloudFront blog path while the standalone ISR runtime deployment remains separate.
  * Restored blog CI publication to the frontend distribution's `/blog/` origin and made CloudFront invalidation best-effort when the CI role cannot call `GetInvalidation`.
  * Added retrying deployed blog checks for duplicated `/blog/blog` links, `/blog/_next/static` CSS availability, and casino-root isolation.
* Validation:
  * Reproduced the failure with a `NETWORK=testnet` blog build before the fix.
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
  * `NETWORK=testnet pnpm --filter @suigar/blog-ui run build` and `NETWORK=testnet pnpm --filter @suigar/blog-ui run verify:runtime` passed.
  * `NETWORK=mainnet pnpm --filter @suigar/blog-ui run build` and `NETWORK=mainnet pnpm --filter @suigar/blog-ui run verify:runtime` passed.
  * Local standalone runtime returned `200` and `Content-Type: text/css` for the CSS URL referenced by `/blog/`.
  * `pnpm --filter @suigar/blog-ui run prepare:edge-snapshot` and `pnpm --filter @suigar/blog-ui run verify:export` passed.
  * Blog Site CI/CD run `26628864142` passed on `test`, including the deployed `/blog/` edge snapshot verification.
  * Frontend CI/CD run `26628864029` passed on `test`, including the deployed frontend SEO verification.
  * Live `https://testnet.suigar.com/blog/` check found no `/blog/blog` links, found `href="/blog/#posts"` and `href="/blog/#tags"`, and confirmed the referenced `/blog/_next/static/...css` file returns `Content-Type: text/css`.
  * Live `https://testnet.suigar.com/` check found no blog HTML/assets markers and returned the casino title `Suigar - On-chain Casino on Sui`.
* Impact:
  * Testnet CI can validate RSS/Atom discovery without expecting `https://suigar.com`, and mainnet still advertises the canonical production feed URLs.
  * The deployed testnet `/blog/` path now uses the current blog snapshot without duplicated `/blog/blog` links or styling regressions.
* Follow-ups:
  * Keep the standalone ISR runtime rollout tracked separately from this edge snapshot compatibility fix.

## 2026-05-28 - Social outbound nofollow audit

* Scope: Audited official social links across the Suigar app, blog, SweetHouse site, and docs site.
* Channels: `technical`, `off-site`, `crawl-indexing`.
* User/search goal: Ensure crawlers see official Twitter/X, Telegram, and Discord outbound links as non-endorsed external social links.
* Implementation:
  * Added `rel="nofollow noopener noreferrer"` to the blog footer social links.
  * Added social-domain detection for DB-backed blog article links, so article body and promo links to X/Twitter, Telegram, or Discord also render with `nofollow`.
  * Added `rel="nofollow noopener noreferrer"` to the SweetHouse footer social links.
  * Added `rel="nofollow noopener noreferrer"` to Suigar external promo CTAs and the X tweet fallback link.
  * Confirmed existing Suigar social menu, Discord CTAs, and Telegram bot links already use `nofollow`.
  * Confirmed the docs site has no official Twitter/X, Telegram, or Discord anchor links at this time.
* Validation:
  * Ran targeted source greps for official social URLs and outbound social rel attributes.
* Impact:
  * Official social links consistently use `nofollow` where they render as crawlable anchors.
* Follow-ups:
  * Re-check if docs adds a footer or social navigation later.

## 2026-05-28 - Blog index SEO and GEO audit fixes

* Scope: Improved the blog index page using the Sorank SEO/GEO audit feedback for the empty-post state.
* Channels: `technical`, `metadata`, `structured-data`, `content`, `image-seo`, `ai-search-geo`.
* User/search goal: Keep the blog index useful and citable even before published posts are available, while preserving non-mainnet noindex safeguards.
* Implementation:
  * Shortened the blog index title and meta description below common SERP truncation thresholds.
  * Added default Open Graph/Twitter image metadata for social previews.
  * Added a visible editorial intro with the target terms in the H1 and first paragraph.
  * Added author, publication date, and modified date signals through visible markup and page metadata.
  * Added scannable H2 sections, lists, a data table, and Q\&A-style copy to improve AI citability and reduce keyword density.
  * Added WebPage and BreadcrumbList JSON-LD for the blog index.
  * Extended `verify:runtime` so the generated homepage fails if title/description lengths, feed auto-discovery, author, social image, BreadcrumbList, table, or visible date markers regress.
* Validation:
  * `pnpm --filter @suigar/blog-ui exec tsc -p tsconfig.typecheck.json --noEmit --incremental false` passed.
  * `NETWORK=mainnet BLOG_REVALIDATION_SECRET=local-test pnpm --filter @suigar/blog-ui run build` passed with no blog DB configured, validating the empty-post state.
  * `pnpm --filter @suigar/blog-ui run verify:runtime` passed.
  * Built homepage HTML now has a 36-character title, 124-character meta description, 6 H2 sections, about 287 visible words, Open Graph image, Twitter image, BreadcrumbList JSON-LD, and visible `datePublished`/`dateModified` markers.
* Impact:
  * The blog index is no longer a thin "No posts published yet" page when the DB is empty.
* Follow-ups:
  * Re-run the external audit against production after `/blog` is routed to the standalone runtime.

## 2026-05-28 - Blog runtime ISR and DB publishing

* Scope: Moved the blog app from static export assumptions to a Next.js standalone runtime model for DB-backed publishing.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `image-seo`, `off-site`, `automation`.
* User/search goal: Make a newly published DB article appear on its post URL, homepage, sitemap, RSS, and Atom quickly enough for SEO without waiting for a full static rebuild.
* Implementation:
  * Changed the blog build target to `output: 'standalone'` and added 60-second ISR to homepage, post pages, sitemap, RSS, and Atom routes.
  * Enabled `dynamicParams` for post pages so a newly inserted published slug can render on demand.
  * Added a secret-protected `/blog/api/revalidate/` endpoint that revalidates homepage, sitemap, RSS, Atom, and an optional post slug.
  * Added a runtime `/assets/blog/db/*` asset route so DB-backed post images can resolve without waiting for a static asset export.
  * Scoped the blog sitemap to `/blog/` and blog posts only, removing apex and SweetHouse URLs from the blog sitemap.
  * Fixed internal Next links so rendered HTML does not duplicate the base path as `/blog/blog/...`.
  * Added `verify:runtime` to assert the standalone server, ISR routes, feeds, sitemap, DB asset route, revalidation endpoint, and RSS/Atom auto-discovery links exist in the build output.
  * Retired the blog S3 static deploy path in CI; production still needs a standalone runtime deployment wired behind `/blog` before the new freshness model is live.
* Validation:
  * `pnpm --filter @suigar/blog-ui exec tsc -p tsconfig.typecheck.json --noEmit --incremental false` passed.
  * `NETWORK=mainnet BLOG_DATABASE_URL=postgresql://postgres@localhost:5432/suigar_blog_isr_validation BLOG_REVALIDATION_SECRET=local-test pnpm --filter @suigar/blog-ui run build` passed against a temporary local validation database.
  * Local runtime checks confirmed `/blog/rss.xml` and `/blog/atom.xml` include the validation post, `/blog/sitemap.xml` only lists `/blog/` URLs, rendered homepage HTML includes RSS/Atom auto-discovery links and does not contain `/blog/blog`, authorized `/blog/api/revalidate/` returns the expected paths, and unauthorized revalidation returns HTTP 401.
* Impact:
  * The app-level SEO publishing model now supports fast DB publishing and fast feed/sitemap discovery instead of freezing those surfaces at build time.
* Follow-ups:
  * Wire the standalone runtime deployment and `/blog` CloudFront/frontend routing, then restore post-deploy live checks and IndexNow submission from the runtime sitemap.

## 2026-05-28 - Blog RSS and Atom feeds

* Scope: Added RSS 2.0 and Atom feed routes for the blog.
* Channels: `crawl-indexing`, `metadata`, `technical`, `off-site`.
* User/search goal: Let readers, feed clients, and discovery tools subscribe to published blog posts without relying only on the sitemap.
* Implementation:
  * Added `rss.xml` and `atom.xml` route handlers backed by the same published-post source as the blog index and sitemap.
  * Added feed alternate links to blog metadata and footer links to the feed files.
  * Kept non-mainnet feeds from advertising published posts.
  * Updated the shared static deploy action so RSS/Atom XML uses short-lived SEO cache headers and feed-specific XML content types for legacy/static deploy contexts.
* Validation:
  * `pnpm --filter @suigar/blog-ui exec tsc -p tsconfig.typecheck.json --noEmit --incremental false` passed.
  * `NETWORK=mainnet BLOG_DATABASE_URL=postgresql://postgres@localhost:5432/suigar_blog_feed_validation pnpm --filter @suigar/blog-ui run build` passed against a temporary local validation database.
  * `pnpm --filter @suigar/blog-ui run verify:export` passed and confirmed feed files are present in the static export.
* Impact:
  * Mainnet blog posts now have two standard subscription/discovery surfaces at `/blog/rss.xml` and `/blog/atom.xml`.
* Follow-ups:
  * Confirm the live feed URLs after the next mainnet deployment.

## 2026-05-20 - Testnet-only giveaway page

* Scope: Re-enabled the giveaway page for testnet while keeping it hidden and noindexed outside testnet.
* Channels: `crawl-indexing`, `metadata`, `technical`, `core-web-vitals`.
* User/search goal: Let testnet users enter and claim on-chain giveaways without exposing a mainnet-only crawl surface before the feature is production-ready.
* Implementation:
  * Gated giveaway navigation, footer links, bonus cross-links, and sidebar giveaway polling behind the testnet giveaway availability flag.
  * Removed `/giveaway` from mainnet sitemap routes and classified it as an excluded route.
  * Updated the giveaway page to show live on-chain giveaway counts, user entries, claimable rewards, participant totals, reward pool context, and deadline guidance.
* Validation:
  * `node scripts/sitemap-generator.mjs --check` passed with 26 indexed routes, 20 excluded routes, and 46 total routes.
  * `node ../scripts/seo/check-static-site-seo.mjs --root public --site-url https://suigar.com` passed with 26 sitemap URLs.
  * `node scripts/seo-metadata-report.mjs --fail-on-issues` passed with 26 routes and zero metadata issues.
  * `./node_modules/.bin/tsc --noEmit`, focused ESLint, and changed-file format checks passed for the frontend changes.
* Impact:
  * Mainnet crawlers and users no longer see a promoted giveaway route, while testnet keeps a functional page for active drops.
* Follow-ups:
  * Re-run mainnet SEO checks after the local environment can complete the frontend build pipeline.

## 2026-05-18 - Vite 8 performance and score cleanup

* Scope: Migrated frontend Vite usage to Vite 8 defaults and cleaned up build/SEO score issues across the main frontend and `frontend-v3`.
* Channels: `technical`, `core-web-vitals`, `crawl-indexing`, `metadata`, `ai-search-geo`, `accessibility`, `automation`.
* User/search goal: Keep the Vite 8 migration performance-oriented while preserving production indexability, static route metadata, and Lighthouse score hygiene.
* Implementation:
  * Changed the main frontend and `frontend-v3` build targets to Vite's `baseline-widely-available` target instead of fixed historical ES targets.
  * Disabled the modulepreload polyfill for the modern browser baseline and added Vite dev-server warmup entries for the hot startup modules.
  * Removed the obsolete frontend esbuild binary wrapper script path now that the workspace runs directly through Vite 8.
  * Removed the stale optional Rollup native package pin from the root package/catalog metadata.
  * Fixed main frontend build environment precedence so an explicit `NETWORK=mainnet` build cannot be overwritten by ambient local `VITE_NETWORK` values during the Vite build or SEO post-build step.
  * Fixed SEO post-build env merge order so network-specific frontend env files override the base frontend `.env`.
  * Updated `llms.txt` to use explicit markdown links for AI/browser recommendations.
  * Fixed Lighthouse accessibility score issues by keeping Recent Big Wins button accessible names derived from visible text plus hidden action context, and by increasing promo carousel dot hit targets.
* Validation:
  * `node --check frontend/scripts/vite-build.mjs && node --check frontend/scripts/vite-dev.mjs && node --check frontend/scripts/write-seo-assets.mjs` passed.
  * `pnpm --filter @suigar/ui run typecheck` passed.
  * `NETWORK=mainnet pnpm --filter @suigar/ui run build` passed and generated production `index, follow` root HTML plus 27 indexed static route HTML files for `https://suigar.com`.
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 19 excluded routes, 46 total routes, 27 sitemap URLs, one robots sitemap directive, and zero metadata issues.
  * `pnpm --filter @suigar/ui run check:seo:static` passed against `frontend/dist`.
  * `pnpm --filter @suigar/ui-v3 run build` passed on Vite 8.0.13.
  * Production preview DOM checks confirmed `index, follow`, canonical `https://suigar.com/`, mainnet API URLs, markdown links in `/llms.txt`, and 24.5px carousel dot targets under the app's compact base font size.
  * Mobile Lighthouse on local mainnet preview reported Accessibility 100, Best Practices 96, SEO 100, and Agentic Browsing 100.
* Impact:
  * Vite 8 build output now tracks the current Baseline target instead of carrying older ES target assumptions.
  * Production SEO artifacts are less vulnerable to local environment leakage during mainnet builds.
  * Lighthouse no longer flags `llms.txt`, carousel target sizing, or Recent Big Wins label-in-name issues.
* Follow-ups:
  * Re-run Lighthouse/PageSpeed against the deployed production domain, where API/CORS behavior matches real users; local `127.0.0.1` preview still logs expected CORS errors from external API/RPC endpoints.
  * Continue reducing the large wallet/runtime chunk through interaction-only loading and dependency splitting.

## 2026-05-18 - Homepage first-load performance guardrails

* Scope: Reduced mobile homepage first-load pressure without removing the live activity animation, Recent Big Wins autoscroll, promo imagery, or wallet chunk safety.
* Channels: `technical`, `core-web-vitals`, `measurement`, `automation`.
* User/search goal: Improve the poor mobile Lighthouse baseline and stop opening animations from replaying due to avoidable load/runtime churn.
* Implementation:
  * Added a static logo-only `suigar-startup-shell` in `frontend/index.html` with a theme-aware background, no looping animation, and one opacity handoff once the app is ready.
  * Added a `frontend/AGENTS.md` startup-shell contract so future optimization passes keep it static, logo-only, theme-consistent, and non-flashing.
  * Removed the old startup-art approach and kept the generated app stylesheet on the normal render path so the handoff does not create a laggy or inconsistent user experience.
  * Removed the resize-mode optimization path and kept `data-resizing` out of the app; Playwright resize checks now focus on real layout stability.
  * Removed `use-fit-text` from responsive clamp text to eliminate the forced resize/measurement loop found in DevTools traces.
  * Moved wallet runtime providers behind a sibling lazy bridge so wallet/auth chunks load on user intent without remounting the app shell, and kept interdependent wallet/Coinbase runtime chunks grouped to avoid the previous TDZ crash.
  * Kept homepage content immediate: promo carousel, games, Recent Big Wins, and Activity feed render without artificial runtime gates.
  * Kept the activity feed animation contract intact and preserved Recent Big Wins autoscroll as a protected behavior for future optimization passes.
  * Restored promo and feature art sizing so images such as `Fast as Sui` remain visible and unclipped on mobile.
  * Split Motion support from MUI so activity animation support no longer pulls the full MUI runtime into the initial graph.
  * Moved free-bet, VIP, and SUINS repository work behind dynamic imports so those heavier Sui/client paths are not part of the initial graph.
  * Removed the eager Howler import path from the shared slider by lazy-loading slider tick audio on first interaction.
  * Removed eager Howler/win-sound loading from VIP/referral reward hooks and the homepage welcome funnel; those sounds now load only on claim/spin/reveal interactions.
  * Delayed side-menu runtime badges/polling and skipped them on closed logged-out mobile sidebars.
* Validation:
  * Mobile Lighthouse baseline screenshot before this pass showed performance 38, FCP 10.6s, LCP 23.0s, TBT 700ms, Speed Index 12.7s, and CLS 0.014.
  * `pnpm --filter @suigar/ui run typecheck` passed after the first-load changes.
  * `pnpm --dir frontend exec vitest run activity-animations button.test relative-time` passed, preserving the activity motion contract and adjacent behavior.
  * `pnpm --filter @suigar/ui run build` passed and emitted 27 noindex static route HTML files for the local testnet build.
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 19 excluded routes, 46 total routes, 27 sitemap URLs, one robots sitemap directive, and zero metadata issues.
  * Local preview/browser check saw a single `navigate` entry rather than repeated page navigations.
  * Bundle graph check confirmed wallet runtime, Suifrens image runtime, crypto runtime, Sui read runtime, MUI runtime, free-bet repository, VIP repository, and SUINS repository have no initial path; Motion remains initial because activity animations are intentionally preserved.
  * Final local Lighthouse mobile run on `http://localhost:4173/` reported performance 62, FCP 4.9s, LCP 5.0s, TBT 340ms, Speed Index 4.9s, TTI 10.4s, CLS 0.014, total payload 3,013 KiB, unused JS savings 602 KiB, and LCP on the startup logo.
  * Final Playwright mobile run confirmed the startup shell is removed after app mount, one `navigate` entry, Activity visible, Recent Big Wins `moveX` animation running, promo carousel interactive, and `Fast as Sui` art inside the viewport after resize.
  * Sign-in smoke test kept the page nonblank, opened login UI, and preserved one navigation entry; local `127.0.0.1` preview still shows expected CORS errors from testnet/Pyth endpoints.
* Impact:
  * The original LCP/FCP issue is now replaced by a deterministic, brand-consistent static logo shell while the actual app shell boots underneath.
  * Lighthouse improved from the user screenshot baseline of score 38, FCP 10.6s, LCP 23.0s, TBT 700ms, and Speed Index 12.7s to score 62, FCP 4.9s, LCP 5.0s, TBT 340ms, and Speed Index 4.9s without hiding the main homepage experience.
  * MUI, wallet, Suifrens, SUINS, VIP, and free-bet heavy paths are no longer initial graph blockers.
  * Shared game controls no longer pull Howler and bundled sound assets into the initial shell just by being imported.
  * Activity animation and Recent Big Wins autoscroll remain protected behaviors for future optimization passes.
* Follow-ups:
  * Re-run Lighthouse/PageSpeed on deployed production or preview, where API CORS and CDN behavior match users, before raising Core Web Vitals maturity.
  * Decide whether below-fold Suifrens identity art and live weekly/Sui reads can be delayed more aggressively; they still load within the Lighthouse audit window and account for much of the remaining payload/unused JS.
  * Continue reducing repository helper coupling so delayed data chunks do not pull MUI or broad Sui helpers when a smaller read path would be enough.
  * Keep Coinbase/wagmi/viem wallet runtime grouping unchanged unless a dedicated regression test covers the previous TDZ failure.

## 2026-05-18 - Per-host sitemap enforcement for frontend and SweetHouse

* Scope: Split sitemap ownership by canonical host for `suigar.com` and `house.suigar.com`, then added reusable standards validation.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `automation`.
* User/search goal: Ensure every site/subdomain has its own high-quality sitemap and robots policy without cross-host URLs, fake freshness, or non-production competition.
* Implementation:
  * Added `scripts/seo/sitemap-standards.mjs` and `scripts/seo/check-static-site-seo.mjs` to validate sitemap XML and robots policy against host scoping, URL count, file size, duplicate URLs, future/placeholder `lastmod`, valid `changefreq`/`priority`, and sitemap directives.
  * Extended `scripts/seo/check-static-site-seo.mjs` with `--check-html` so static exports can prove every sitemap URL resolves to HTML with one matching canonical, one title, one description, and no `noindex`.
  * Wired the shared validator into `frontend/scripts/sitemap-generator.mjs`, `frontend/scripts/write-seo-assets.mjs`, and `pnpm --filter @suigar/ui run check:seo`.
  * Regenerated `frontend/public/sitemap.xml` so it lists only `https://suigar.com` canonical URLs and removed blog/SweetHouse sitemap directives from `frontend/public/robots.txt`.
  * Added `sweethouse-website/lib/seo.ts` as the SweetHouse route policy source of truth.
  * Changed SweetHouse sitemap output to include only `https://house.suigar.com/` on mainnet and zero URLs on non-mainnet.
  * Changed SweetHouse robots output to advertise only `https://house.suigar.com/sitemap.xml` on mainnet and block non-mainnet without a sitemap directive.
  * Added noindex metadata to the SweetHouse app layout for wallet-connected routes.
  * Added `pnpm run check:seo` to SweetHouse and wired it into `.github/workflows/sweethouse.yaml`; the SweetHouse check now includes rendered static HTML canonical/metadata validation for sitemap URLs.
  * Added `docs/seo/subprojects/sweethouse.md` and updated SEO status/checklist docs.
* Validation:
  * `pnpm --filter @suigar/ui run seo:sitemap` regenerated the frontend sitemap.
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 19 excluded routes, 46 total routes, 27 sitemap URLs, one robots sitemap directive, and zero metadata issues.
  * `NODE_ENV=production NETWORK=mainnet pnpm run build && pnpm run check:seo` passed from `sweethouse-website/` with one `house.suigar.com` sitemap URL, one robots sitemap directive, and one static HTML canonical check.
  * `NODE_ENV=production NETWORK=testnet pnpm run build` plus `node ../scripts/seo/check-static-site-seo.mjs --root out --site-url https://house.testnet.suigar.com --expect-blocked --no-sitemap --allow-empty-sitemap` passed with zero sitemap URLs and zero robots sitemap directives.
* Impact:
  * Frontend and SweetHouse now fail local/CI checks if cross-host sitemap entries or cross-host robots sitemap directives come back.
  * SweetHouse non-mainnet builds cannot accidentally advertise crawlable production competitors.
* Follow-ups:
  * Deploy SweetHouse and submit `https://house.suigar.com/sitemap.xml` in Search Console.
  * Add rendered-head checks for `https://house.suigar.com/` after deployment.
  * Decide whether the blog should move from path-style `https://suigar.com/blog` sitemap policy to a fully separate `https://blog.suigar.com` canonical policy in code if that is the intended production host.

## 2026-05-18 - Frontend SEO enforcement pass

* Scope: Added stronger frontend SEO build/deploy enforcement, repeatable Search Console reporting, and pending server-side redirect coverage for retired frontend routes.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `measurement`, `automation`.
* User/search goal: Make SEO fixes durable in CI and turn Search Console iteration into a repeatable loop instead of manual one-off API calls.
* Implementation:
  * Added generated static route HTML validation so every indexed frontend route must have exactly one expected title, description, canonical, and robots tag.
  * Changed non-mainnet frontend builds to generate the same static route HTML with `noindex,nofollow`, while still blocking robots and omitting sitemaps.
  * Added metadata quality enforcement to `pnpm --filter @suigar/ui run check:seo` for duplicate titles/descriptions and practical snippet-length bounds.
  * Tightened homepage and NFT descriptions to pass metadata quality checks.
  * Moved the frontend deploy workflow to the shared static-site deploy action so nested `*/index.html` files are uploaded as HTML, not immutable assets.
  * Added frontend post-deploy checks for route heads, robots policy, canonical host redirects, and legacy route redirects.
  * Added `scripts/seo/search-console-report.mjs` and root `pnpm run seo:gsc` for repeatable Search Console page/query, CTR opportunity, and URL Inspection reports.
  * Confirmed the repo CloudFront function logic defines exact legacy route redirects: `/lootbox` and `/roadmap` to `/`, `/rewards` to `/bonus`, and `/weekly-contest` to `/weekly-race`.
* Validation:
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 19 excluded routes, 46 total routes, and zero metadata issues.
  * `NETWORK=mainnet pnpm --filter @suigar/ui run build` passed and validated 27/27 static route HTML files.
  * `pnpm --filter @suigar/ui run check:seo:static` passed for the mainnet build output.
  * `NETWORK=testnet pnpm --filter @suigar/ui run build` passed and validated 27/27 noindex static route HTML files.
  * Testnet build output had no `sitemap.xml`, `robots.txt` contained `Disallow: /`, and `/games/index.html` contained `noindex, nofollow`.
  * `node --check` passed for `frontend/scripts/seo-static-html.mjs`, `frontend/scripts/write-seo-assets.mjs`, `frontend/scripts/seo-metadata-report.mjs`, and `scripts/seo/search-console-report.mjs`.
  * YAML parsing passed for `.github/workflows/frontend.yaml` and `.github/actions/deploy-static-site/action.yml`.
  * `tofu -chdir=infrastructure fmt -check -diff main.tf variables.tf google.tf static-sites.tf` passed.
  * `tofu -chdir=infrastructure validate` passed.
  * Live checks on 2026-05-18 confirmed `/lootbox`, `/roadmap`, `/rewards`, and `/weekly-contest` still return HTTP 200 until the pending CloudFront apply runs.
  * Targeted OpenTofu plan/apply for the CloudFront function was blocked by an expired local AWS SSO token.
* Impact:
  * Frontend SPA route SEO is now checked at route inventory, metadata quality, static HTML generation, deploy cache policy, and live post-deploy layers.
  * Non-mainnet frontend route serving stays functional without exposing indexable duplicates.
  * Search Console reporting can now be repeated and saved as an SEO evidence artifact.
* Follow-ups:
  * Refresh AWS SSO and apply the pending CloudFront function rollout, then verify legacy routes return 301 to their canonical targets.
  * Run `pnpm run seo:gsc` after credentials are refreshed and store the next report under `docs/seo/reports/`.
  * Extend duplicate/weak metadata reporting to blog and docs.
  * Add page-specific social preview assets and rendered card audits for high-value pages.

## 2026-05-17 - Search Console connected and live crawl fixes applied

* Scope: Connected the SSM-backed AWS-to-GCP workload identity to Google Search Console, verified ownership, pulled current evidence, and applied the first live crawl/indexing fixes.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `measurement`, `ai-search-geo`.
* User/search goal: Iterate from Search Console evidence instead of assumptions, stop duplicate/non-production URLs from competing with production, and make blog/docs SEO controls deployable.
* Implementation:
  * Enabled `siteverification.googleapis.com` in Terraform alongside the already enabled Search Console API.
  * Added the new Google Site Verification TXT token to Terraform-managed Route53 records and upserted it live for `suigar.com`.
  * Verified `suigar-terraform@suigar.iam.gserviceaccount.com` as owner for the domain property plus apex, blog, docs, testnet, testnet blog, and testnet docs URL-prefix properties.
  * Applied targeted CloudFront updates so `blog.suigar.com` and `blog.testnet.suigar.com` serve the static blog export directly instead of redirecting to `/blog`.
  * Deployed the mainnet blog export, testnet blog export, and docs export with short-cache SEO control files.
  * Added docs-site robots generation and deploy verification so mainnet docs advertises its sitemap and non-mainnet docs block crawling.
  * Filtered internal `docs/seo` pages out of the public docs-site build, confirmed public `/seo/` docs URLs return 404, and kept the docs sitemap focused on product documentation.
  * Added `NEXT_DIST_DIR` support to the blog Next config so SEO builds can run while a local blog dev server owns the default `.next` directory.
  * Added workflow checks for blog/docs root responses, canonicals, and robots policy after deploy.
  * Fixed MDX publishability in `docs/seo/guidelines.md` by replacing raw comparison operators in a table with prose.
* Validation:
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 18 excluded routes, and 45 total routes.
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
  * `NETWORK=mainnet pnpm --filter @suigar/blog-ui run build` passed before mainnet blog deploy.
  * `NETWORK=testnet pnpm --filter @suigar/blog-ui run build` passed before testnet blog deploy.
  * `NETWORK=mainnet pnpm --filter @suigar/docs-ui run build` passed and wrote `docs-site/out/robots.txt`.
  * YAML parsing passed for `.github/workflows/blog-site.yaml`, `.github/workflows/docs-site.yaml`, and `.github/actions/deploy-static-site/action.yml`.
  * Live checks passed: `www.suigar.com` returns 301 to `https://suigar.com/`; `blog.suigar.com/` returns 200 with canonical `https://blog.suigar.com/`; `blog.suigar.com/robots.txt` allows crawl and points at its sitemap; `blog.testnet.suigar.com/robots.txt` disallows all crawl; `blog.testnet.suigar.com/` and `testnet.suigar.com/blog/` render `noindex, nofollow`; the then-current docs host allowed crawl, advertised its sitemap, listed product docs only, and returned 404 for internal SEO docs.
  * Search Console sitemaps submitted: `https://suigar.com/sitemap.xml`, `https://blog.suigar.com/sitemap.xml`, and the then-current docs sitemap; GSC reported zero immediate sitemap errors or warnings.
  * Search Console URL Inspection on 2026-05-17: apex and blog are submitted and indexed; docs is discovered but not indexed; testnet root is excluded by noindex; testnet blog is unknown; `www` is an alternate canonical to apex.
* Impact:
  * Search Console is now usable from the programmatic identity, so future SEO iterations can be evidence-backed.
  * Production blog no longer hides behind a frontend `/blog` redirect, so its canonical host, sitemap, and robots policy are visible directly.
  * Testnet blog now has both direct-subdomain and legacy `/blog` protections against production competition.
  * Docs now has a live robots file and submitted product-doc sitemap, giving Google a clearer crawl path without exposing internal SEO operating notes.
* Follow-ups:
  * Monitor Search Console after the next crawl window for docs indexing and sitemap processed URL counts.
  * Monitor stale `mainnet.suigar.com` URLs for redirect consolidation.
  * Convert the manual GSC export/inspection commands into a repeatable script that updates `docs/seo/status.md`.
  * Add rendered-head audits for the top acquisition pages, blog posts, and docs pages.

## 2026-05-17 - Frontend static route heads deployed

* Scope: Fixed raw HTML metadata for indexed frontend SPA routes and converted stale `mainnet.suigar.com` URLs into canonical redirects.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `measurement`.
* User/search goal: Ensure Googlebot sees route-specific titles, descriptions, and canonicals for acquisition pages instead of receiving homepage metadata for every SPA URL.
* Implementation:
  * Added required static SEO metadata to the frontend sitemap route registry.
  * Added a frontend post-build static HTML writer that creates route-specific `index.html` files for every indexed sitemap route.
  * Updated the frontend CloudFront viewer function to rewrite extensionless app routes to generated static HTML files while preserving asset requests.
  * Added `mainnet.suigar.com` to the frontend CloudFront aliases and Route53, then redirected it path-preserving to `suigar.com`.
  * Uploaded only generated HTML files based on the currently deployed root `index.html`, avoiding deployment of unrelated dirty frontend JS/CSS work.
  * Invalidated frontend CloudFront distribution `E1UEOFEK6D1S3I`.
* Validation:
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 18 excluded routes, and 45 total routes.
  * `NETWORK=mainnet pnpm --filter @suigar/ui run build` passed and wrote 27 static route HTML files.
  * `tofu -chdir=infrastructure validate` passed.
  * Targeted OpenTofu apply completed: one Route53 record added, CloudFront frontend distribution updated, and frontend viewer function updated.
  * Live raw HTML checks passed for `/games`, `/nft`, `/coinflip`, `/range`, and `/pvp-coinflip`; each now returns its own title, description, and canonical URL.
  * `https://mainnet.suigar.com/range` returns HTTP 301 to `https://suigar.com/range`.
  * Search Console sitemap resubmission for `https://suigar.com/sitemap.xml` reported `lastSubmitted` as `2026-05-17T20:44:30.202Z`, 33 submitted URLs, and zero immediate sitemap errors/warnings.
  * Search Console URL Inspection confirmed `/games` and `/nft` are submitted and indexed with Google canonicals matching their own URLs.
* Impact:
  * Indexed SPA routes no longer rely on client-side Helmet updates for crawler-critical metadata.
  * Old `mainnet.suigar.com` impressions now have a path-preserving redirect instead of an unreachable hostname.
* Follow-ups:
  * Add CI assertions that fetch built route HTML and compare title, description, and canonical against the route registry.
  * Monitor Search Console after recrawl for stale `mainnet.suigar.com` decay and frontend page CTR changes.

## 2026-05-18 - Tracked redirect sitemap exclusion

* Scope: Classified the frontend `/redirect` route for sitemap validation after adding the tracked redirect surface.
* Channels: `crawl-indexing`, `technical`.
* User/search goal: Keep internal redirect plumbing out of the production sitemap while preserving strict CI coverage for every concrete frontend route.
* Implementation:
  * Added `/redirect` to `frontend/scripts/sitemap-routes.mjs` excluded routes with an explicit noindex redirect reason.
* Validation:
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 19 excluded routes, and 46 total routes.

## 2026-05-18 - Frontend dependency hygiene and bundle pressure audit

* Scope: Audited frontend dependencies for packages that add heavy runtime chunks, duplicate dependency families, peer constraints, deprecated transitive packages, or SEO/performance risk.
* Channels: `technical`, `core-web-vitals`, `measurement`.
* User/search goal: Reduce avoidable dependency pressure without removing product-specific animation, wallet, deposit, social-login, or visual features.
* Implementation:
  * Removed unused direct frontend dependencies `@gsap/react` and `react-helmet-async`; neither package was imported by source code.
  * Updated TanStack router catalog patch versions to `@tanstack/react-router@1.170.3`, `@tanstack/router-cli@1.167.4`, `@tanstack/router-plugin@1.168.4`, and `@tanstack/router-vite-plugin@1.167.4`.
  * Kept direct `@lifi/sdk` and `@lifi/wallet-management` because the Vite Li.FI shims intentionally alias their package entrypoints.
  * Kept `styled-components` because `@giphy/react-components` declares it as a peer.
* Evidence:
  * `pnpm --filter @suigar/ui why` shows Li.FI is the source of MUI/Emotion and Solana wallet stacks.
  * `pnpm --filter @suigar/ui why` shows wallet/auth packages currently produce multiple `@coinbase/wallet-sdk`, `zod`, `use-sync-external-store`, `wagmi`, and Reown/WalletConnect peer instances.
  * Production build largest JS chunks remain `vendor-wallet-runtime` at about 6.2 MB raw, `vendor-suifrens-image` at about 1.2 MB raw, `vendor-sui-read` at about 712 KB raw, and `vendor-mui-runtime` at about 452 KB raw.
* Validation:
  * `pnpm install` completed and regenerated Prisma client.
  * `pnpm --filter @suigar/ui run typecheck` passed.
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 19 excluded routes, and 46 total routes.
  * `pnpm --filter @suigar/ui run build` passed.
  * `pnpm --filter @suigar/ui run check:bundle-budget` still failed: largest JS chunk `vendor-wallet-runtime` is about 6.35 MB against a 3.5 MB limit, total JS is about 17.17 MB against a 13 MB limit, and CSS warnings remain.
* Follow-ups:
  * P0: keep wallet/Auth/Li.FI runtime lazy and out of the initial route; do not split Coinbase/wagmi/viem/WalletConnect back into TDZ-prone chunks without browser verification.
  * P1: evaluate replacing or narrowing the Li.FI widget path because it is the reason MUI/Emotion/Solana wallet dependencies stay in the graph.
  * P1: evaluate whether chat can lazy-load Giphy and emoji picker only after the picker opens.
  * P2: plan guarded migrations for `wagmi@3` and `@flowx-finance/sdk@2`; both are major upgrades and should be handled with wallet/deposit regression tests.
  * P3: keep TypeScript 6, ESLint 10, and `@types/node` 25 out of opportunistic perf updates until toolchain compatibility is explicitly tested.

## 2026-05-18 - Startup shell logo Lottie support

* Scope: Updated the first-paint startup shell so it can play an approved Suigar logo Lottie while keeping a stable static-logo fallback.
* Channels: `technical`, `core-web-vitals`.
* User/search goal: Replace the purely static startup logo with the new Suigar logo animation without bringing back flashing, route-specific art, or app-shell remount behavior.
* Implementation:
  * Added a canvas layer over the static startup logo in `frontend/index.html`.
  * Added a tiny startup loader that probes `/assets/logo/suigar-logo.lottie`, `/logo/suigar-logo.lottie`, `/assets/logo/suigar-logo.json`, and `/logo/suigar-logo.json`.
  * Loads the dotLottie runtime only after a candidate response is validated as a real `.lottie` zip or Lottie JSON; SPA HTML fallbacks are ignored.
  * Keeps the static logo fallback while the animation loads, when the asset is absent, and for reduced-motion users.
  * Updated `frontend/AGENTS.md` so future optimization passes preserve the approved logo animation support.
* Validation:
  * `pnpm --filter @suigar/ui run typecheck` passed.
  * `pnpm --filter @suigar/ui run check:seo` passed.
  * `pnpm --filter @suigar/ui run build` passed.
  * Preview browser check confirmed one navigation, startup shell removal after app ready, and no dotLottie runtime load when the logo animation asset is absent.
* Follow-ups:
  * Place the production animation at `frontend/public/assets/logo/suigar-logo.lottie` or `frontend/public/logo/suigar-logo.lottie` so the startup shell can pick it up.

## 2026-05-17 - SEO operating system expanded

* Scope: Expanded `docs/seo/` from a baseline frontend checklist into a global SEO operating system.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `structured-data`, `content`, `blog-generation`, `internal-links`, `social-preview`, `image-seo`, `core-web-vitals`, `measurement`, `ai-search-geo`, `off-site`.
* User/search goal: Make SEO optimization durable, holistic, subproject-aware, and progressively automatable by AI without scaling low-quality content.
* Implementation:
  * Added channel definitions, maturity levels, status scorecard, subproject overlays, AI blog generation workflow, and automation roadmap.
  * Added specific blog-site rules for static Next/Sanity publishing, canonical hosts, post requirements, AI generation constraints, and validation.
  * Expanded global guidelines, page checklist, and SEO docs maintenance rules.
* Validation:
  * `rg --files docs/seo` confirmed the expanded SEO docs structure.
  * `rg "SEO optimization|docs/seo/README.md" AGENTS.md docs/README.md docs/SUMMARY.md` confirmed root and docs navigation references.
  * `pnpm --filter @suigar/ui run check:seo` passed with 27 indexed routes, 18 excluded routes, and 45 total routes.
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
* Impact:
  * Future SEO work now has a central operating model, not just isolated frontend route rules.
  * Blog generation now has reusable templates, source/claim ledger, AI critique checklist, anti-patterns, and evolving constraints.
* Follow-ups:
  * Apply the blog generation workflow to the next post and add lessons to the constraint registry.
  * Add rendered-head audits for high-value frontend and blog routes.
  * Add Search Console, analytics, Core Web Vitals, and internal-link evidence to `status.md` when available.

## 2026-05-17 - Search Console access attempted and blog testnet indexing guarded

* Scope: Attempted Google Search Console access through the SSM-backed Google service account and fixed a repo-visible crawl/indexing risk for the blog.
* Channels: `crawl-indexing`, `canonical`, `metadata`, `measurement`, `blog-generation`.
* User/search goal: Start using Search Console data for iterative SEO work and prevent non-production blog URLs from competing with production content.
* Implementation:
  * Confirmed the mainnet SSM path includes `GA_SERVICE_ACCOUNT_KEY` and used it in memory only.
  * Confirmed the service account is `suigar-backend@suigar.iam.gserviceaccount.com` for Google Cloud project `suigar` (`242881611940`).
  * Added `shouldIndexBlog` to `blog-site/src/lib/site-config.ts`.
  * Added root `noindex,nofollow` metadata for non-mainnet blog builds in `blog-site/src/app/layout.tsx`.
  * Changed `blog-site/src/app/robots.ts` so non-mainnet blog builds return `Disallow: /` without a sitemap.
  * Changed `blog-site/src/app/sitemap.ts` so non-mainnet sitemap output contains no URLs.
  * Added an explicit homepage canonical in `blog-site/src/app/page.tsx`.
  * Updated `.github/actions/deploy-static-site/action.yml` so `robots.txt`, `sitemap*.xml`, and `llms.txt` deploy with short-lived SEO cache headers instead of one-year immutable asset caching.
  * Added a post-deploy blog workflow check that fails if the blog subdomain redirects, lacks the expected homepage canonical, or serves the wrong robots policy.
* Validation:
  * Search Console API call failed because `searchconsole.googleapis.com` is disabled for project `suigar`.
  * Attempting to enable the API with the same service account failed with `PERMISSION_DENIED`.
  * `pnpm --filter @suigar/blog-ui run typecheck` passed.
  * `pnpm --filter @suigar/ui run check:seo` passed.
  * `NETWORK=testnet pnpm --filter @suigar/blog-ui run build` passed; static `robots.txt` blocks all crawling, rendered pages include `noindex,nofollow`, homepage/post canonicals use `https://blog.testnet.suigar.com`, and sitemap has zero URL entries.
  * `NETWORK=mainnet pnpm --filter @suigar/blog-ui run build` passed; static `robots.txt`, sitemap, homepage canonical, and post canonicals use `https://blog.suigar.com`.
  * Live CloudFront checks showed `blog.suigar.com` and `blog.testnet.suigar.com` still attach the legacy `*-blog-subdomain-redirect` functions, redirecting to `/blog` on the frontend domain instead of serving the static blog export directly.
  * YAML parsing passed for `.github/workflows/blog-site.yaml` and `.github/actions/deploy-static-site/action.yml`.
* Impact:
  * GSC data cannot be pulled until the Google Cloud API is enabled by an account with permission.
  * Future blog testnet builds now have explicit crawl/indexing protection.
  * Future static-site deploys can refresh SEO control files quickly without waiting on immutable cache headers.
  * Future blog deploys will fail loudly if CloudFront remains in the legacy redirect state.
* Follow-ups:
  * Enable Google Search Console API for project `suigar` (`242881611940`) or provide a service account/project where it is enabled.
  * Grant the service account Search Console access to `sc-domain:suigar.com` and/or URL-prefix properties for `https://suigar.com/`, `https://blog.suigar.com/`, and `https://suigar.com/docs/`.
  * Reconcile the live blog CloudFront distributions with Terraform so `blog.*.suigar.com` serves the `blog-site` S3 export directly instead of redirecting to `/blog`.
  * Deploy `blog-site` after CloudFront drift is corrected so live testnet robots changes from `Allow: /` to `Disallow: /`.
  * Retry Search Console site listing and query/page export after API enablement.

## 2026-05-17 - SEO tracking directory initialized

* Scope: Created the persistent SEO docs area at `docs/seo/`.
* Channels: `technical`, `crawl-indexing`, `canonical`, `metadata`, `structured-data`, `content`, `internal-links`, `social-preview`, `core-web-vitals`.
* User/search goal: Make future SEO optimization repeatable instead of relying on scattered context or memory.
* Implementation:
  * Added the SEO source-of-truth index, durable guidelines, route checklist, route inventory, and this log.
  * Linked the SEO docs from `docs/README.md` and `docs/SUMMARY.md`.
  * Added root `AGENTS.md` guidance so future SEO work starts from `docs/seo/README.md`.
* Current baseline:
  * `PageTitle` emits title, canonical, description, Open Graph, Twitter, optional robots, and JSON-LD metadata.
  * Shared SEO defaults live in `frontend/src/configs/seo.ts`.
  * Shared SEO builders live in `frontend/src/utils/seo.ts`.
  * Sitemap indexability policy lives in `frontend/scripts/sitemap-routes.mjs`.
  * SEO asset generation and non-mainnet blocking live in `frontend/scripts/write-seo-assets.mjs`.
* Validation:
  * `pnpm --filter @suigar/ui run check:seo` passed.
  * Baseline coverage: 27 indexed routes, 18 excluded routes, 45 total routes.
* Follow-ups:
  * Audit rendered metadata for the highest-value pages: `/`, `/games`, game pages, `/bonus`, `/vip`, `/referral`, and `/affiliate`.
  * Review whether page-specific Open Graph images would improve click-through for game and campaign pages.
  * Add Search Console and Core Web Vitals observations when production data is available.
