Skip to content

improvement(landing): SSR-friendly URL-state filters + cleanup pass + polish#5298

Merged
waleedlatif1 merged 6 commits into
stagingfrom
review/landing-ship
Jun 30, 2026
Merged

improvement(landing): SSR-friendly URL-state filters + cleanup pass + polish#5298
waleedlatif1 merged 6 commits into
stagingfrom
review/landing-ship

Conversation

@waleedlatif1

Copy link
Copy Markdown
Collaborator

Summary

Post-merge cleanup and polish for the landing surface (follows #5181). Quality-only where it touches existing behavior; the one functional change (URL-state filters) is implemented the SSR-friendly way so SEO and shareability both improve.

Code-quality cleanup (behavior-identical)

  • Collapse 29 square h-N w-N pairs to the size-* shorthand across models / integrations / blog / FAQ / landing-preview.
  • landing-preview: drop a redundant animationKeyRef (use a functional setState) and a dead write-only isDesktopRef.
  • model-directory: hoist a static useMemo to a module constant.
  • auth-modal: drop a useMemo over the cheap getBrandConfig().
  • changelog: replace useState+fetch pagination with a co-located useInfiniteQuery hook. The first page stays SSR-seeded via initialData (no SEO loss); search/abort unaffected.

URL-state filters via nuqs (SSR-friendly)

  • Integrations grid and models directory: search + category/provider filters now live in the URL (useQueryStates), with a co-located search-params.ts as the single source of truth and server-side createSearchParamsCache.parse in the page so filtered views render server-side — crawlable and shareable, no Suspense content-drop. Mirrors the existing /blog SSR pattern. Search URL writes are debounced; in-memory filtering stays instant.
  • Pricing: the billing-period toggle moves to ?billing=annual (shareable, server-rendered, no toggle flash).
  • These three pages become dynamically rendered (server-rendered on demand) — the deliberate tradeoff for SEO-indexable filter URLs, matching /blog. They render from in-memory constants, so the render is cheap.

Polish

  • Integration CTA: replace the green sim tile with the neutral black-on-light sim mark (asset referenced only by that CTA).
  • Release-timeline dot hover: drop scale-150 + brightness-75 for an understated opacity-fill + slight scale, matching the comparison chart's hover language.
  • GitHub stars fallback floor 28800 → 28900 to track the current count.

Testing

  • bunx tsc --noEmit — clean
  • biome check — clean
  • next build — 712/712 pages generated, 0 errors; /integrations, /models, /models/[provider], /pricing confirmed dynamic (server-rendered on demand)
  • Existing landing tests pass

Type of Change

  • Improvement

…memos, changelog useInfiniteQuery

- emcn: collapse 29 square h-N w-N pairs to size-* across models/integrations/blog/faq/landing-preview
- landing-preview: remove redundant animationKeyRef (functional setState) + dead isDesktopRef
- model-directory: hoist static provider options to a module const
- auth-modal: drop useMemo over the cheap getBrandConfig() call
- changelog: replace useState+fetch pagination with a co-located useInfiniteQuery hook (first page stays SSR-seeded via initialData)
…back bump

- integrations grid, models directory: search + category/provider filters now
  live in the URL (nuqs useQueryStates), server-parsed via createSearchParamsCache
  so filtered views render server-side (crawlable, shareable) — mirrors the blog
  index SSR pattern. Search URL writes debounced; in-memory filtering stays instant.
- pricing: billing-period toggle moves to ?billing=annual (shareable, no flash).
- co-located search-params.ts per page as the single source of truth (server + client).
- stars: bump fallback floor 28800 -> 28900 to track the current count.
Replace brandbook/logo/small.png — referenced only by the 'Start automating
{service} today' CTA on integration pages — with the black-on-light sim mark so
the tile reads as a neutral brand mark beside the partner icon instead of a green
block.
Drop the scale-150 + brightness-75 hover (a 50% size jump plus a muddy darken)
for an understated opacity-fill (0.85 -> 1) with a slight scale-110, matching the
comparison chart's opacity-driven hover language.
@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Skipped Skipped Jun 30, 2026 10:06pm

Request Review

@cursor

cursor Bot commented Jun 30, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Changes are confined to public landing UI and marketing routes; the main behavioral shift is intentional dynamic SSR for filter URLs, with no auth, billing backend, or data-layer changes in this diff.

Overview
Landing catalog and pricing filters now live in the URL via nuqs, with co-located search-params.ts modules and server createSearchParamsCache.parse on /integrations, /models, and /pricing so shareable ?q=, ?category=/?provider=, and ?billing=annual links render the filtered view on first paint (search writes debounced; those routes become dynamically rendered for SEO).

Alongside that, a behavior-neutral cleanup pass: square h-N w-N icon sizing becomes size-* across landing surfaces, plus small React tidy-ups (auth-modal drops useMemo on getBrandConfig(), landing-preview uses functional setAnimationKey and drops unused refs, model-directory hoists provider options to a module constant).

Polish: model release-timeline dot hover is subtler (opacity + slight scale), GitHub star fallback floor bumps to 28900, and integration bottom CTA uses the neutral Sim mark asset.

Reviewed by Cursor Bugbot for commit 5370824. Configure here.

@greptile-apps

greptile-apps Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR updates the landing pages with URL-backed filters and cleanup.

  • Adds URL-state search and filters for integrations and models.
  • Adds URL-state billing selection for pricing.
  • Parses landing page query params on the server for dynamic rendering.
  • Cleans up landing preview state and icon sizing classes.
  • Updates landing polish items such as the logo asset, timeline hover style, and GitHub stars fallback.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
apps/sim/app/(landing)/integrations/(shell)/page.tsx Adds server-side query parsing for the integrations catalog route.
apps/sim/app/(landing)/integrations/components/integration-grid.tsx Moves integration search and category filters into URL-backed state.
apps/sim/app/(landing)/models/(shell)/page.tsx Adds server-side query parsing for the models directory route.
apps/sim/app/(landing)/models/components/model-directory.tsx Moves model search and provider filters into URL-backed state.
apps/sim/app/(landing)/pricing/page.tsx Adds server-side query parsing for pricing billing state.
apps/sim/app/(landing)/pricing/components/pricing-plans/pricing-plans.tsx Moves the billing-period toggle into URL-backed state.
apps/sim/app/(landing)/components/landing-preview/landing-preview.tsx Removes unused refs and uses functional state updates for animation keys.

Reviews (3): Last reviewed commit: "revert(landing): keep the original chang..." | Re-trigger Greptile

Comment thread apps/sim/app/(landing)/integrations/(shell)/page.tsx Outdated
…op inline comments

- changelog: getNextPageParam no longer treats an empty server-seeded page 1 as
  end-of-feed, so a failed/empty initial GitHub fetch still surfaces 'Show more'
  (addresses Cursor Bugbot).
- replace the inline comments added in this branch with TSDoc on the search-param
  caches (documents the dynamic-render → SSR-filtered behavior), per the
  codebase's TSDoc-only convention.
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile review

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

…teQuery)

The React Query conversion of an SSR-seeded, cross-origin, infrequently-changing
paginated list introduced caching edge cases (empty-seed load-more, singleton
cache serving stale page 1 on client-side nav) without real benefit. Restore the
original useState(initialEntries)+fetch timeline, which is simpler, correct, and
already review-clean from #5181.
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile review

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 5370824. Configure here.

@waleedlatif1 waleedlatif1 merged commit 32b6a42 into staging Jun 30, 2026
17 checks passed
@waleedlatif1 waleedlatif1 deleted the review/landing-ship branch June 30, 2026 22:14
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