Skip to content

feat(timeline): per-year hub redesign + SEO/AEO - #2843

Merged
smakosh merged 3 commits into
mainfrom
feat/timeline-seo-redesign
Jun 27, 2026
Merged

smakosh merged 3 commits into
mainfrom
feat/timeline-seo-redesign

Conversation

@smakosh

@smakosh smakosh commented Jun 27, 2026

Copy link
Copy Markdown
Member

Summary

/timeline drives traffic, so this reworks it from a pretty-but-shallow visualization into a citable, browsable reference dataset for LLM release dates — implementing every SEO and AI-SEO audit finding, and restructuring the page into a hub + per-year architecture.

Why per-year pages

The original page rendered only the newest year in the HTML (years.filter((y) => y === activeYear)), so crawlers and AI engines saw ~1 year of a multi-year dataset and lost dozens of internal links. The fix isn't just "render everything" — at 295 models (2024×47, 2025×166, 2026×74) that's a ~6k-node single document. Instead:

  • /timeline = hub — head-term + AI-citation target. Global stats, a "browse by year" grid linking to each year, a latest-releases preview, FAQ, CTA. JSON-LD ItemList points at the year pages.
  • /timeline/{year} = indexable children — each targets "AI models released in {year}", with the full month-grouped timeline for that year, an interactive table view, a year switcher + prev/next nav, and breadcrumbs back to the hub.

This distributes content across real crawlable URLs (each focused on one intent) instead of one giant page, while keeping every model in SSR HTML.

SEO findings → done

  • 🔴 Full dataset in HTML (no more newest-year-only render).
  • 🟠 Structured dataDataset + ItemList + BreadcrumbList + FAQPage on the hub; scoped Dataset (isPartOf hub) + ItemList + 3-level BreadcrumbList + FAQPage on each year page.
  • 🟠 Semantic hierarchy — real h1h2 (month/section) → h3 (model) headings.
  • 🟠 Machine-readable dates — every date in <time dateTime>, explicit en-US locale (no hydration nondeterminism).
  • 🟡 OG images + canonicals — dedicated hub OG image + dynamic per-year OG image; explicit alternates.canonical on every page.
  • 🟡 Supporting content — intro copy + generated FAQ per page.
  • 🟡 Sitemap/timeline bumped to 0.8 / weekly (lastModified = latest release); /timeline/{year} added (current year weekly, past years monthly).
  • 🟢 a11y — aria-label search, aria-pressed toggles, aria-current nav.

AI-SEO (answer-engine) findings → done

  • Self-contained fact sentences per model ("X was released by OpenAI on … and added to LLM Gateway on …") with inline <time>.
  • FAQPage generated from live data — global on the hub, year-scoped on each year page ("How many LLMs were released in 2025?", "What major models came out in 2025?").
  • Semantic <table> view for maximum extractability.
  • Provider entities named per model (family→label map), not just slugs.
  • Freshness + stat signals in every hero.
  • Site-level /llms.txt added.

Redesign / UX

Archival-release-ledger aesthetic matching the landing page: ambient sky glow, font-display headings, luminous timeline rail with brand family icons, flagship/latest badges, sticky control bar (search · flagship · sort · Timeline/Table), year grid + switcher, FAQ, CTA.

Files

  • lib/timeline-data.ts — shared deterministic builders (models, stats, year summaries, FAQs) used by both server JSON-LD and client UI.
  • app/timeline/page.tsx — hub (server).
  • app/timeline/[year]/page.tsx (new) — per-year page (server) with generateMetadata.
  • components/timeline/timeline-parts.tsx (new) — shared ModelCard/FamilyMark/ModelFact.
  • components/timeline/timeline-list.tsx (new) — interactive single-year list (search/flagship/sort/table).
  • app/timeline/opengraph-image.tsx + app/timeline/[year]/opengraph-image.tsx (new).
  • app/sitemap.ts — timeline + per-year entries.
  • public/llms.txt (new) + .gitignore negation.
  • Removed the old monolithic timeline-client.tsx.

Testing

  • turbo run build --filter=ui passes; routes registered: /timeline, /timeline/[year], both OG images.
  • pnpm format clean; lint-staged passed on commit.
  • Not visually verified against live data — the local stack needs a destructive pnpm setup DB reset and the prod internal API requires auth. Happy to spin it up for a screenshot pass.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added a fully rendered LLM release timeline with year browsing, timeline/table modes, search, sorting, and a flagship-only filter, plus model detail links.
    • Expanded timeline SEO with schema-based FAQ/items, richer page sections, dynamic canonical metadata, and shareable OpenGraph images (overall + per-year).
  • Bug Fixes
    • Improved sitemap freshness by deriving timeline last-modified and year coverage from actual release dates.
    • Ensured the public llms.txt asset is served correctly (no longer proxied).

Implements all SEO and AI-SEO audit findings for /timeline and
reworks the page into a citable reference dataset.

SEO/AEO:
- Render the full multi-year dataset in HTML (was newest year only)
- Add Dataset, ItemList, BreadcrumbList and FAQPage JSON-LD
- Semantic headings (h2 year / h3 month / h4 model) + <time> dates
- Name the provider entity per model; add a generated FAQ block
- Dedicated OG image route + explicit canonical
- Bump sitemap to priority 0.8 / weekly, lastModified = latest release
- Add site-level public/llms.txt

UX/design:
- New hero with live stat + freshness signals
- Sticky control bar (search, flagship, sort, timeline/table views)
- Year quick-nav with scroll-spy; luminous timeline rail + cards
- Semantic table view, CTA section, a11y labels

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The PR expands the timeline feature with shared timeline data helpers, new /timeline and /timeline/[year] server pages, reusable timeline UI components, Open Graph image routes, sitemap updates, and a public llms.txt asset.

Changes

Timeline feature expansion

Layer / File(s) Summary
Shared timeline utilities
apps/ui/src/lib/timeline-data.ts, apps/ui/src/lib/json-ld.ts
Defines timeline types and helpers for model normalization, stats, date formatting, FAQ generation, year summaries, year filtering, recent-model selection, and JSON-LD serialization.
Timeline UI components
apps/ui/src/components/timeline/timeline-parts.tsx, apps/ui/src/components/timeline/timeline-list.tsx, apps/ui/src/components/timeline/timeline-client.tsx
Adds reusable timeline parts, the searchable timeline list, and the rewritten timeline client with grouping, filtering, view toggles, and supporting sections.
Main timeline page
apps/ui/src/app/timeline/page.tsx
Replaces the /timeline render path with server-side data derivation, schema.org JSON-LD output, updated metadata, hero stats, year navigation, latest releases, FAQ, CTA, and footer.
Year timeline route
apps/ui/src/app/timeline/[year]/page.tsx
Adds the /timeline/[year] route with metadata generation, year validation, year-specific schema data, navigation, timeline rendering, FAQ content, CTA, and footer.
Year Open Graph image
apps/ui/src/app/timeline/[year]/opengraph-image.tsx
Adds the /timeline/[year] Open Graph image route with fixed metadata and a rendered year-specific release count.
Sitemap and public asset updates
apps/ui/src/app/sitemap.ts, apps/ui/public/llms.txt, .gitignore, apps/ui/next.config.ts
Updates sitemap timing for the timeline route, adds year-specific timeline sitemap entries, publishes apps/ui/public/llms.txt, and removes the rewrite for that static asset.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • theopenco/llmgateway#2205: Overlaps on apps/ui/src/app/timeline/page.tsx by changing the page metadata and social preview fields.

Suggested reviewers

  • steebchen
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 34.62% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: a timeline hub redesign with per-year pages and SEO/AEO improvements.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/timeline-seo-redesign

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (3)
apps/ui/src/app/timeline/opengraph-image.tsx (1)

51-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the JSX section comments.

These labels do not add context beyond what the markup already shows, and they violate the repo rule for TSX files. As per coding guidelines, **/*.{ts,tsx,js,jsx}: No unnecessary code comments.

Also applies to: 94-94, 127-127

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/ui/src/app/timeline/opengraph-image.tsx` at line 51, Remove the
unnecessary JSX section comments in the TSX component, including the commented
labels around the markup in the opengraph image file. Update the
`OpenGraphImage` JSX so the structure is self-explanatory without inline section
markers like the header/body/footer labels, and ensure no other redundant code
comments remain in this component.

Source: Coding guidelines

apps/ui/src/components/timeline/timeline-client.tsx (1)

217-217: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Decorative JSX section comments conflict with the repo's "no unnecessary code comments" rule.

Comments such as {/* Ambient backdrop glow */}, {/* Hero */}, {/* Sticky control bar */}, {/* Year quick-nav */}, {/* Body */}, {/* FAQ */}, and {/* CTA */} are purely structural labels the semantic markup already conveys; consider dropping them.

As per coding guidelines: "No unnecessary code comments".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/ui/src/components/timeline/timeline-client.tsx` at line 217, Remove the
purely decorative JSX section comments in timeline-client.tsx that label
structural blocks (such as the ambient backdrop glow, Hero, Sticky control bar,
Year quick-nav, Body, FAQ, and CTA) since the surrounding markup already makes
the structure clear. Update the JSX in the timeline rendering component to keep
only comments that add non-obvious implementation value, and delete these labels
wherever they appear in the component.

Source: Coding guidelines

apps/ui/public/llms.txt (1)

1-18: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the /llms.txt rewrite or move it to beforeFiles. apps/ui/public/llms.txt already wins over the simple rewrites() array here, so this rule is never used. If the intent is to proxy the docs URL, it needs to run earlier; otherwise it’s dead config.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/ui/public/llms.txt` around lines 1 - 18, The rewrite for the docs path
is currently unreachable because the static public llms.txt file already takes
precedence over the normal rewrites() rules. Remove the unused /llms.txt rewrite
from the Next.js config, or move that routing logic into beforeFiles if the
intent is to proxy the docs URL. Check the relevant rewrite entry and the
llms.txt public asset together so only one source of truth remains.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/ui/src/app/timeline/page.tsx`:
- Around line 123-141: The JSON-LD <script> blocks in timeline/page.tsx are
serializing API-derived values with JSON.stringify inside
dangerouslySetInnerHTML, which still allows script-breaking payloads like
</script>. Update the schema rendering path for datasetSchema, itemListSchema,
breadcrumbSchema, and faqSchema to use a JSON-LD escaping/sanitizing helper
before injection, and keep the logic centralized so all schema objects are
safely encoded consistently.

In `@apps/ui/src/components/timeline/timeline-client.tsx`:
- Around line 520-528: The “Latest” badge check in timeline-client.tsx is
matching null releasedAt values against stats.latestReleasedAt, which causes
every undated model to be marked latest when no release date exists. Update the
conditional around the Latest Badge in the timeline rendering logic to
explicitly guard against a null stats.latestReleasedAt before comparing, so only
models with a real release date can be marked as Latest.

In `@apps/ui/src/lib/timeline-data.ts`:
- Around line 146-153: Filter inactive models before building the provider count
in buildTimelineModels(). The current providerIds aggregation loops over raw, so
totalProviders can include providers that only have inactive models; change this
logic to use the same active-model filtering already applied elsewhere in
buildTimelineModels() before collecting providerId values. Keep the existing
providerId checks and llmgateway exclusion, but ensure the count is derived only
from active entries so the hero stats, FAQ copy, and JSON-LD stay consistent.

---

Nitpick comments:
In `@apps/ui/public/llms.txt`:
- Around line 1-18: The rewrite for the docs path is currently unreachable
because the static public llms.txt file already takes precedence over the normal
rewrites() rules. Remove the unused /llms.txt rewrite from the Next.js config,
or move that routing logic into beforeFiles if the intent is to proxy the docs
URL. Check the relevant rewrite entry and the llms.txt public asset together so
only one source of truth remains.

In `@apps/ui/src/app/timeline/opengraph-image.tsx`:
- Line 51: Remove the unnecessary JSX section comments in the TSX component,
including the commented labels around the markup in the opengraph image file.
Update the `OpenGraphImage` JSX so the structure is self-explanatory without
inline section markers like the header/body/footer labels, and ensure no other
redundant code comments remain in this component.

In `@apps/ui/src/components/timeline/timeline-client.tsx`:
- Line 217: Remove the purely decorative JSX section comments in
timeline-client.tsx that label structural blocks (such as the ambient backdrop
glow, Hero, Sticky control bar, Year quick-nav, Body, FAQ, and CTA) since the
surrounding markup already makes the structure clear. Update the JSX in the
timeline rendering component to keep only comments that add non-obvious
implementation value, and delete these labels wherever they appear in the
component.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 94623a8a-6267-4842-b028-ea83d90403a8

📥 Commits

Reviewing files that changed from the base of the PR and between 32f8617 and 158f77b.

📒 Files selected for processing (7)
  • .gitignore
  • apps/ui/public/llms.txt
  • apps/ui/src/app/sitemap.ts
  • apps/ui/src/app/timeline/opengraph-image.tsx
  • apps/ui/src/app/timeline/page.tsx
  • apps/ui/src/components/timeline/timeline-client.tsx
  • apps/ui/src/lib/timeline-data.ts

Comment thread apps/ui/src/app/timeline/page.tsx Outdated
Comment thread apps/ui/src/components/timeline/timeline-client.tsx Outdated
Comment thread apps/ui/src/lib/timeline-data.ts
Split the single all-years page into a /timeline hub plus indexable
/timeline/{year} children, so each year ranks for "AI models released
in {year}" and the hub distributes crawl across real URLs (avoids one
~6k-node document at 295 models).

- /timeline hub: global stats, "browse by year" grid, latest-releases
  preview, FAQ, CTA; ItemList links to each year page
- /timeline/[year]: scoped hero + stats, interactive month timeline +
  table, year switcher, prev/next nav, scoped Dataset/ItemList/
  BreadcrumbList/FAQPage JSON-LD, per-year OG image, canonical
- Sitemap emits /timeline/{year} (current year weekly, others monthly)
- Extract reusable ModelCard/parts + TimelineList; drop old monolith

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@smakosh smakosh changed the title feat(timeline): redesign + SEO/AEO overhaul feat(timeline): per-year hub redesign + SEO/AEO Jun 27, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/ui/src/app/sitemap.ts`:
- Around line 39-52: The /timeline/{year} sitemap entries are using buildDate
for lastModified, so historical year pages appear changed on every deploy.
Update the timelineYears-building logic in sitemap.ts to also track the latest
valid releasedAt per year while iterating modelDefinitions, then use that
per-year date when generating the year-page sitemap entries instead of
buildDate. Refer to timelineYears and the /timeline/{year} sitemap entry
generation to keep the fix localized.

In `@apps/ui/src/app/timeline/`[year]/opengraph-image.tsx:
- Around line 12-13: The shared alt text for the dynamic `/timeline/[year]` OG
image is year-specific and becomes inaccurate for archived years. Update the
exported `alt` in the `opengraph-image` module to use year-neutral wording,
keeping it generic for all values of `[year]` while preserving the same `alt`
export used by the image generation.

In `@apps/ui/src/app/timeline/`[year]/page.tsx:
- Around line 150-168: Escape the JSON-LD before injecting it in the timeline
page: the current use of JSON.stringify in the script tags inside the
timeline/[year]/page.tsx component can leave script-breaking content unescaped.
Update the schema rendering path in the component that emits itemListSchema,
datasetSchema, breadcrumbSchema, and faqSchema to use a dedicated safe JSON-LD
serializer, and reuse the same helper in timeline/page.tsx so both pages
serialize schemas consistently.

In `@apps/ui/src/app/timeline/page.tsx`:
- Around line 281-293: The copy in the timeline page’s “Latest releases” section
is inconsistent with the `recentModels()` sorting logic, which orders items by
`releasedAt` rather than onboarding time. Update the section text in `page.tsx`
to describe recent releases instead of recent additions, or change
`recentModels()` in `timeline-data.ts` to sort by `addedAt` if the intent is to
show newest onboarded models. Use the `recentModels()` helper and the “Latest
releases” block in `page.tsx` as the key places to update.

In `@apps/ui/src/lib/timeline-data.ts`:
- Around line 299-325: `getYearSummaries` is truncating `summary.providers` to a
preview list, but the UI and FAQ still treat `summary.providers.length` as the
true provider total. Add a separate provider count field in
`TimelineYearSummary` and populate it in `getYearSummaries` using the full
`yearModels` provider set, while keeping `providers` limited to the preview.
Update the consumers in `timeline/[year]/page.tsx` and any other
`summary.providers.length` usage to read the new count field instead of the
preview array length.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 30e6b4a9-bc08-44dd-bc20-c242e5e27b4e

📥 Commits

Reviewing files that changed from the base of the PR and between 158f77b and 1324326.

📒 Files selected for processing (8)
  • apps/ui/src/app/sitemap.ts
  • apps/ui/src/app/timeline/[year]/opengraph-image.tsx
  • apps/ui/src/app/timeline/[year]/page.tsx
  • apps/ui/src/app/timeline/page.tsx
  • apps/ui/src/components/timeline/timeline-client.tsx
  • apps/ui/src/components/timeline/timeline-list.tsx
  • apps/ui/src/components/timeline/timeline-parts.tsx
  • apps/ui/src/lib/timeline-data.ts
💤 Files with no reviewable changes (1)
  • apps/ui/src/components/timeline/timeline-client.tsx

Comment thread apps/ui/src/app/sitemap.ts Outdated
Comment thread apps/ui/src/app/timeline/[year]/opengraph-image.tsx Outdated
Comment thread apps/ui/src/app/timeline/[year]/page.tsx Outdated
Comment thread apps/ui/src/app/timeline/page.tsx Outdated
Comment thread apps/ui/src/lib/timeline-data.ts
- Escape JSON-LD before injection via a shared serializeJsonLd helper
  (hub + year pages), preventing </script> breakout
- Count providers from active models only in buildTimelineStats
- Add TimelineYearSummary.providerCount so year hero/FAQ show the true
  provider total instead of the capped preview length
- Sitemap: per-year /timeline/{year} lastModified now uses each year's
  latest release date, not buildDate
- Fix "Latest releases" hub copy to say released (matches recentModels)
- Make the per-year OG image alt year-neutral
- Remove the dead /llms.txt rewrite shadowed by public/llms.txt
- Drop decorative JSX section comments

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/ui/src/app/timeline/[year]/page.tsx (1)

31-60: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep generateMetadata() in sync with the route’s year-existence check.

generateMetadata() only rejects non-4-digit params, so /timeline/9999 still gets a canonical URL and year-specific OG/Twitter metadata here even though the page 404s once the years.includes(year) check fails on Line 74. Reuse the availability check here too, or fall back to generic/noindex metadata for unavailable years.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/ui/src/app/timeline/`[year]/page.tsx around lines 31 - 60, The
generateMetadata function is out of sync with the page’s year validation, so
unavailable years like 9999 still get year-specific metadata. Update
generateMetadata in the YearPageProps/YearPage route to use the same
year-existence check as the page render logic (the years.includes(year) path)
before setting canonical, openGraph, and twitter metadata. If the year is not
available, return generic metadata for Model Timeline or a noindex-style
fallback instead of year-specific URLs and titles.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/ui/next.config.ts`:
- Around line 120-121: Remove the redundant explanatory comment in
next.config.ts near the rewrite/static asset handling for llms.txt. Keep the
existing behavior in place, but delete the comment since the public/llms.txt
asset and the missing rewrite already make the intent clear; use the surrounding
rewrite configuration in next.config.ts to locate it.

---

Outside diff comments:
In `@apps/ui/src/app/timeline/`[year]/page.tsx:
- Around line 31-60: The generateMetadata function is out of sync with the
page’s year validation, so unavailable years like 9999 still get year-specific
metadata. Update generateMetadata in the YearPageProps/YearPage route to use the
same year-existence check as the page render logic (the years.includes(year)
path) before setting canonical, openGraph, and twitter metadata. If the year is
not available, return generic metadata for Model Timeline or a noindex-style
fallback instead of year-specific URLs and titles.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5f9f3161-d68f-4ab2-a1a3-da3bfa288266

📥 Commits

Reviewing files that changed from the base of the PR and between 1324326 and 45c26fc.

📒 Files selected for processing (9)
  • apps/ui/next.config.ts
  • apps/ui/src/app/sitemap.ts
  • apps/ui/src/app/timeline/[year]/opengraph-image.tsx
  • apps/ui/src/app/timeline/[year]/page.tsx
  • apps/ui/src/app/timeline/opengraph-image.tsx
  • apps/ui/src/app/timeline/page.tsx
  • apps/ui/src/components/timeline/timeline-list.tsx
  • apps/ui/src/lib/json-ld.ts
  • apps/ui/src/lib/timeline-data.ts
💤 Files with no reviewable changes (2)
  • apps/ui/src/app/timeline/opengraph-image.tsx
  • apps/ui/src/components/timeline/timeline-list.tsx
✅ Files skipped from review due to trivial changes (1)
  • apps/ui/src/lib/json-ld.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/ui/src/lib/timeline-data.ts
  • apps/ui/src/app/sitemap.ts

Comment thread apps/ui/next.config.ts
@smakosh
smakosh added this pull request to the merge queue Jun 27, 2026
Merged via the queue into main with commit 5b5e37c Jun 27, 2026
12 checks passed
@smakosh
smakosh deleted the feat/timeline-seo-redesign branch June 27, 2026 21:57
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