@@ -86,10 +86,7 @@ const AUTH_STEP: Record<AuthType, (name: string) => string> = {
8686 none : ( ) => 'No authentication is needed — the block works as soon as you drop it in.' ,
8787}
8888
89- /**
90- * Human-readable catalog refresh date, shown on the page and emitted as
91- * `dateModified` so search and answer engines can see content freshness.
92- */
89+ /** Human-readable catalog refresh date for the visible last-updated line. */
9390const UPDATED_AT_DISPLAY = new Date ( `${ INTEGRATIONS_UPDATED_AT } T00:00:00Z` ) . toLocaleDateString (
9491 'en-US' ,
9592 { year : 'numeric' , month : 'long' , day : 'numeric' , timeZone : 'UTC' }
@@ -134,10 +131,7 @@ function mentionifyPromptForNames(prompt: string, names: readonly string[]): str
134131 return prompt . replace ( regex , ( match ) => `@${ match } ` )
135132}
136133
137- /**
138- * Lowercases only the first character so acronyms inside tool names survive
139- * ("Get PR Details" → "get PR Details").
140- */
134+ /** Lowercases only the first character so acronyms in tool names survive. */
141135function lowercaseFirst ( value : string ) : string {
142136 return value . charAt ( 0 ) . toLowerCase ( ) + value . slice ( 1 )
143137}
@@ -149,26 +143,15 @@ function toProseList(items: string[]): string {
149143 return `${ items . slice ( 0 , - 1 ) . join ( ', ' ) } , and ${ items [ items . length - 1 ] } `
150144}
151145
152- /**
153- * "a" vs "an" for a service name. Vowel-letter heuristic, except U-names,
154- * which almost always read as "you" ("a Unipile block").
155- */
146+ /** "a" vs "an" for a service name; U-names read as "you", so they take "a". */
156147function articleFor ( name : string ) : string {
157148 return / ^ [ a e i o ] / i. test ( name ) ? 'an' : 'a'
158149}
159150
160151/**
161- * Generates the per-integration FAQ from catalog metadata.
162- *
163- * Authoring constraints (SEO/GEO):
164- * - Every answer opens with a direct, self-contained answer and carries
165- * integration-specific facts (tool counts and names, trigger events, auth
166- * mode, related integrations), so no two pages share an identical answer.
167- * - Catalog-generic questions (pricing, agent tool use) live once on the
168- * /integrations index FAQ instead of repeating across every page —
169- * duplicated Q&A across many pages is a scaled-content anti-pattern.
170- * - The full Q&A text is server-rendered by `LandingFAQ` and mirrored 1:1
171- * into the page's FAQPage JSON-LD.
152+ * Generates the per-integration FAQ. Answers lead with a direct answer and
153+ * carry integration-specific facts; catalog-generic questions live once on
154+ * the /integrations index FAQ instead of repeating across every page.
172155 */
173156function buildFAQs ( integration : Integration , relatedNames : string [ ] ) : FAQItem [ ] {
174157 const { name, description, operations, triggers, authType } = integration
@@ -294,9 +277,8 @@ export async function generateMetadata({
294277 'AI agent integrations' ,
295278 'AI agent builder' ,
296279 ] ,
297- // og:image / twitter:image come from the sibling `opengraph-image.tsx`
298- // file convention — Next serves it at a hash-suffixed URL, so hardcoding
299- // the URL here would 404. File-based metadata is injected automatically.
280+ // og:image/twitter:image come from the sibling opengraph-image.tsx —
281+ // Next serves it at a hash-suffixed URL, so hardcoding it here 404s.
300282 openGraph : {
301283 title : `${ name } Integration | Sim AI Workspace` ,
302284 description : `Connect ${ name } to ${ INTEGRATION_COUNT - 1 } + tools using AI agents. ${ sentenceWithTerminalPunctuation ( truncate ( description , 100 ) ) } ` ,
@@ -454,7 +436,6 @@ export default async function IntegrationPage({ params }: { params: Promise<{ sl
454436 { description }
455437 </ p >
456438
457- { /* Atomic product summary for AI citation (see .claude/rules/landing-seo-geo.md) */ }
458439 < p className = 'sr-only' >
459440 { name } is a { categoryLabel } integration for Sim, the AI workspace where teams build and
460441 deploy AI agents. Sim's { name } integration provides{ ' ' }
0 commit comments