[PULSE-45] Integrations page overhaul — 75 guides, SEO, search & filters #13
Reference in New Issue
Block a user
No description provided.
Delete Branch "staging"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Work Item
PULSE-45
Summary
/keyboard shortcut), category filter chips, popular integrations row, count badge, and result count to the overview pageChanges
lib/integrations.tsx— New centralized data store:Integrationinterface, 75 entries with official SVG paths, brand colors,officialUrl,seoDescription,relatedIds, and helper functions (getIntegration,getGroupedIntegrations)lib/integration-guides.tsx— New file:getGuideContent(slug)returning JSX guide content for all 75 integrations with CodeBlock snippets, external plugin/doc links, and internal cross-linksapp/integrations/[slug]/page.tsx— New dynamic route replacing 16 static directories;generateStaticParamsfor SSG,generateMetadatafor unique SEO per page,HowToJSON-LD structured datacomponents/IntegrationGuide.tsx— New server component: shared guide layout with hero, prose content area, "Related Integrations" cross-linking section, and back/CTA navigationcomponents/CodeBlock.tsx— New server component: VS-Code-style code snippet rendererapp/integrations/page.tsx— Rewrote overview page:/keyboard shortcut and clear buttonh-fullto Link elements)[slug]dynamic routeTest Plan
[ ] Navigate to /integrations — verify count badge, popular row, category chips, and all 75 cards render
[ ] Search for "react" — verify filtered results and result count message
[ ] Search for "xyznonexistent" — verify "Missing something?" card appears
[ ] Click a category chip (e.g. "CMS") — verify only CMS integrations shown, chip highlighted
[ ] Press "/" on keyboard — verify search input receives focus
[ ] Open an integration guide (e.g. /integrations/nextjs) — verify logo, guide content, external links, related integrations section
[ ] Inspect page source of a guide page — verify meta title, description, OG tags, canonical URL, and JSON-LD HowTo script
[ ] Check last row of integration cards — verify all cards have consistent height
[ ] Verify all 75 slugs resolve (no 404s) by checking generateStaticParams output or spot-checking several
Greptile Overview
Greptile Summary
app/integrations/[slug]page that statically generates all guides and emits per-page SEO + HowTo JSON-LD.lib/integrations.tsx) and a large JSX guide-content registry (lib/integration-guides.tsx) to support ~75 integrations./integrationsinto a searchable, filterable overview with category chips, a pinned Popular row, result counts, and consistent card heights.IntegrationGuide,CodeBlock) used by the new guide pages.public/.Confidence Score: 2/5
app/integrations/[slug]/page.tsxincorrectly treatsparamsas a Promise and awaits it, which will break routing at runtime. Additionally,public/sw 2.jsappears to be a generated Workbox service worker artifact with build-specific precache revisions; committing it will go stale and can cause incorrect caching after subsequent builds.Important Files Changed
paramsis incorrectly typed as a Promise and awaited, which will break runtime routing.[slug]route.[slug]guide.[slug]guide.[slug]guide.Sequence Diagram
13 files reviewed, 2 comments
Edit Code Review Agent Settings | Greptile
@@ -0,0 +25,4 @@export async function generateMetadata({ params }: PageProps): Promise<Metadata> {const { slug } = await paramsconst integration = getIntegration(slug)if (!integration) return {}Incorrect params typing
In the App Router,
paramsis a plain object, not aPromise. Typing it asparams: Promise<{ slug: string }>and thenawait paramswill break at runtime when Next passes{ slug: '...' }. UpdatePagePropstoparams: { slug: string }and remove theawaitusages in bothgenerateMetadataand the page component.Prompt To Fix With AI
@@ -0,0 +1 @@if(!self.define){let e,s={};const a=(a,n)=>(a=new URL(a+".js",n).href,s[a]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()}).then(()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e}));self.define=(n,c)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let t={};const r=e=>a(e,i),d={module:{uri:i},exports:t,require:r};s[i]=Promise.all(n.map(e=>d[e]||r(e))).then(e=>(c(...e),t))}}define(["./workbox-f1770938"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/Icon Padding left & right 192x192.png",revision:"a9bae788a2253361a0e295deadbcc083"},{url:"/Icon Padding left & right 512x512.png",revision:"d2efb02d7b9a0a627387d334201e6ea7"},{url:"/_next/static/chunks/0e5ce63c-0d9b48ee367f70a2.js",revision:"0d9b48ee367f70a2"},{url:"/_next/static/chunks/164f4fb6-67211e558fa5de32.js",revision:"67211e558fa5de32"},{url:"/_next/static/chunks/1795-59339c2cb7f5fe6c.js",revision:"59339c2cb7f5fe6c"},{url:"/_next/static/chunks/1992.d220c685821eae19.js",revision:"d220c685821eae19"},{url:"/_next/static/chunks/201a89a4-3d566664e60259ff.js",revision:"3d566664e60259ff"},{url:"/_next/static/chunks/2170a4aa-a1f2fd30878a3e91.js",revision:"a1f2fd30878a3e91"},{url:"/_next/static/chunks/2f0b94e8-ce53c98b232310fc.js",revision:"ce53c98b232310fc"},{url:"/_next/static/chunks/30a37ab2-30992cf05be9404a.js",revision:"30992cf05be9404a"},{url:"/_next/static/chunks/4573-3b13da9808e514ac.js",revision:"3b13da9808e514ac"},{url:"/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js",revision:"e5d7c65570c947b7"},{url:"/_next/static/chunks/5902.6a7448e0dec4f9e1.js",revision:"6a7448e0dec4f9e1"},{url:"/_next/static/chunks/5909-cf645368838a6b20.js",revision:"cf645368838a6b20"},{url:"/_next/static/chunks/7620-7f79d135fa03ba32.js",revision:"7f79d135fa03ba32"},{url:"/_next/static/chunks/795d4814-4c5954750245c540.js",revision:"4c5954750245c540"},{url:"/_next/static/chunks/8500-98e13bcce54aa7a0.js",revision:"98e13bcce54aa7a0"},{url:"/_next/static/chunks/8928-835918834d3b3798.js",revision:"835918834d3b3798"},{url:"/_next/static/chunks/8e1d74a4-407f656e5bcc2171.js",revision:"407f656e5bcc2171"},{url:"/_next/static/chunks/ad2866b8.6c51983a1eb56136.js",revision:"6c51983a1eb56136"},{url:"/_next/static/chunks/app/_global-error/page-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/app/_not-found/page-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/app/about/page-961134dbb15bfcbf.js",revision:"961134dbb15bfcbf"},{url:"/_next/static/chunks/app/api/auth/refresh/route-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/app/auth/callback/page-e02d5207bc967b15.js",revision:"e02d5207bc967b15"},{url:"/_next/static/chunks/app/faq/page-fac70f1a93ec3606.js",revision:"fac70f1a93ec3606"},{url:"/_next/static/chunks/app/installation/page-f2243076dd49d3d4.js",revision:"f2243076dd49d3d4"},{url:"/_next/static/chunks/app/integrations/nextjs/page-ba7437bf718723f9.js",revision:"ba7437bf718723f9"},{url:"/_next/static/chunks/app/integrations/page-cef8333acda65483.js",revision:"cef8333acda65483"},{url:"/_next/static/chunks/app/integrations/react/page-410fd66b109e333c.js",revision:"410fd66b109e333c"},{url:"/_next/static/chunks/app/integrations/vue/page-d815efd4c9a39306.js",revision:"d815efd4c9a39306"},{url:"/_next/static/chunks/app/integrations/wordpress/page-f03e2378c00b904a.js",revision:"f03e2378c00b904a"},{url:"/_next/static/chunks/app/layout-ce4924adc7c42dcc.js",revision:"ce4924adc7c42dcc"},{url:"/_next/static/chunks/app/login/page-96640fc203cae231.js",revision:"96640fc203cae231"},{url:"/_next/static/chunks/app/not-found-833b37ab1663c8a1.js",revision:"833b37ab1663c8a1"},{url:"/_next/static/chunks/app/onboarding/page-091dd498ed5d5805.js",revision:"091dd498ed5d5805"},{url:"/_next/static/chunks/app/org-settings/page-c3e177ad6171617e.js",revision:"c3e177ad6171617e"},{url:"/_next/static/chunks/app/page-1d0749d506de7405.js",revision:"1d0749d506de7405"},{url:"/_next/static/chunks/app/pricing/page-ff5fab384b0203d3.js",revision:"ff5fab384b0203d3"},{url:"/_next/static/chunks/app/settings/page-890f2c485c894bb2.js",revision:"890f2c485c894bb2"},{url:"/_next/static/chunks/app/share/%5Bid%5D/page-88df4e94e7b55109.js",revision:"88df4e94e7b55109"},{url:"/_next/static/chunks/app/signup/page-b17cb3afb210ddbb.js",revision:"b17cb3afb210ddbb"},{url:"/_next/static/chunks/app/sites/%5Bid%5D/page-616162d6a1d6e47c.js",revision:"616162d6a1d6e47c"},{url:"/_next/static/chunks/app/sites/%5Bid%5D/realtime/page-2a2d04563947fa67.js",revision:"2a2d04563947fa67"},{url:"/_next/static/chunks/app/sites/%5Bid%5D/settings/page-b0fd17efb70e114b.js",revision:"b0fd17efb70e114b"},{url:"/_next/static/chunks/app/sites/new/page-c8dddbd443e2a8ac.js",revision:"c8dddbd443e2a8ac"},{url:"/_next/static/chunks/bc98253f.1c4ca5773Built artifact committed
public/sw 2.jslooks like a generated Workbox service worker bundle containing hashed/_next/static/...entries and build-specific revisions. Committing this will go stale on the next build and can cause clients to cache incorrect assets. This file should be generated during the build/deploy process (or removed from source control) rather than checked in.Prompt To Fix With AI