<start.fieldName>. For example, a `customerId` field shows up as <start.customerId> in downstream blocks and templates.
- **Chat-only fields** — When the workflow runs from the chat side panel or a deployed chat experience, Sim also provides <start.input> (latest user message), <start.conversationId> (active session id), and <start.files> (chat attachments).
@@ -33,11 +33,11 @@ Keep Input Format fields scoped to the names you expect to reference later—tho
## Configure the Input Format
-Use the Input Format sub-block to define the schema that applies across execution modes:
+Use the Input Format sub-block to define the schema that applies across run modes:
1. Add a field for each value you want to collect.
2. Choose a type (`string`, `number`, `boolean`, `object`, `array`, or `files`). File fields accept uploads from chat and API callers.
-3. Provide default values when you want the manual run modal to populate test data automatically. These defaults are ignored for deployed executions.
+3. Provide default values when you want the manual run modal to populate test data automatically. These defaults are ignored for deployed runs.
4. Reorder fields to control how they appear in the editor form.
Reference structured values downstream with expressions such as <start.customerId> depending on the block you connect.
@@ -53,7 +53,7 @@ Reference structured values downstream with expressions such as <start.
tools or storage steps.
- Deploying to API turns the Input Format into a JSON contract for clients. Each field becomes part of the request body, and Sim coerces primitive types on ingestion. File fields expect objects that reference uploaded files; use the execution file upload endpoint before invoking the workflow.
+ Deploying to API turns the Input Format into a JSON contract for clients. Each field becomes part of the request body, and Sim coerces primitive types on ingestion. File fields expect objects that reference uploaded files; use the file upload endpoint before invoking the workflow.
API callers can include additional optional properties. They are preserved
inside <start.fieldName> outputs so you can experiment
diff --git a/apps/docs/content/docs/en/triggers/webhook.mdx b/apps/docs/content/docs/en/triggers/webhook.mdx
index d897db7681b..33d3a6dd952 100644
--- a/apps/docs/content/docs/en/triggers/webhook.mdx
+++ b/apps/docs/content/docs/en/triggers/webhook.mdx
@@ -8,7 +8,7 @@ import { Image } from '@/components/ui/image'
import { Video } from '@/components/ui/video'
import { FAQ } from '@/components/ui/faq'
-Webhooks allow external services to trigger workflow execution by sending HTTP requests to your workflow. Sim supports two approaches for webhook-based triggers.
+Webhooks allow external services to trigger workflow runs by sending HTTP requests to your workflow. Sim supports two approaches for webhook-based triggers.
## Generic Webhook Trigger
@@ -30,7 +30,7 @@ The Generic Webhook block creates a flexible endpoint that can receive any paylo
2. **Configure Payload** - Set up the expected payload structure (optional)
3. **Get Webhook URL** - Copy the automatically generated unique endpoint
4. **External Integration** - Configure your external service to send POST requests to this URL
-5. **Workflow Execution** - Every request to the webhook URL triggers the workflow
+5. **Workflow Run** - Every request to the webhook URL triggers the workflow
### Features
@@ -38,7 +38,7 @@ The Generic Webhook block creates a flexible endpoint that can receive any paylo
- **Automatic Parsing**: Webhook data is automatically parsed and available to subsequent blocks
- **Authentication**: Optional bearer token or custom header authentication
- **Rate Limiting**: Built-in protection against abuse
-- **Deduplication**: Prevents duplicate executions from repeated requests
+- **Deduplication**: Prevents duplicate runs from repeated requests
The Generic Webhook trigger fires every time the webhook URL receives a request, making it perfect for real-time integrations.
@@ -58,7 +58,7 @@ Alternatively, you can use specific service blocks (like Slack, GitHub, etc.) in
2. **Enable Trigger Mode** - Toggle "Use as Trigger" in the block settings
3. **Configure Service** - Set up authentication and event filters specific to that service
4. **Webhook Registration** - The service automatically registers the webhook with the external platform
-5. **Event-Based Execution** - Workflow triggers only for specific events from that service
+5. **Event-Based Runs** - Workflow triggers only for specific events from that service
### When to Use Each Approach
@@ -120,7 +120,7 @@ Alternatively, you can use specific service blocks (like Slack, GitHub, etc.) in
### Testing Webhooks
1. Use tools like Postman or curl to test your webhook endpoints
-2. Check workflow execution logs for debugging
+2. Check workflow run logs for debugging
3. Verify payload structure matches your expectations
4. Test authentication and error scenarios
@@ -153,8 +153,8 @@ Always validate and sanitize incoming webhook data before processing it in your
{ question: "What HTTP methods does the Generic Webhook endpoint accept?", answer: "The webhook endpoint handles POST requests for triggering workflows. GET requests are only used for provider-specific verification challenges (such as Microsoft Graph or WhatsApp verification). Other methods return a 405 Method Not Allowed response." },
{ question: "How do I authenticate webhook requests?", answer: "Enable the Require Authentication toggle in the webhook configuration, then set an Authentication Token. Callers can send the token as a Bearer token in the Authorization header, or you can specify a custom header name (e.g., X-Secret-Key) and the token will be matched against that header instead." },
{ question: "Can I define the expected payload structure for a webhook?", answer: "Yes. The Generic Webhook block includes an Input Format field where you can define the expected JSON schema. This is optional but helps document the expected structure. You can also use type \"file[]\" for file upload fields." },
- { question: "Does the webhook have deduplication built in?", answer: "Yes. The webhook processing pipeline includes idempotency checks to prevent duplicate executions from repeated requests with the same payload." },
+ { question: "Does the webhook have deduplication built in?", answer: "Yes. The webhook processing pipeline includes idempotency checks to prevent duplicate runs from repeated requests with the same payload." },
{ question: "What data from the webhook request is available in my workflow?", answer: "All request data including headers, body, and query parameters is parsed and made available to subsequent blocks. Common fields like event, id, and data are automatically extracted from the payload when present." },
- { question: "Do I need to deploy my workflow for the webhook URL to work?", answer: "Yes. The webhook endpoint checks that the associated workflow is deployed before triggering execution. If the workflow is not deployed, the webhook returns a not-found response." },
- { question: "Does the webhook auto-disable after repeated failures?", answer: "No. Unlike polling-based triggers (RSS, Gmail, IMAP), push-based generic webhooks do not auto-disable after consecutive failures. Each incoming request is processed independently. If your workflow consistently fails, check the execution logs for error details." },
+ { question: "Do I need to deploy my workflow for the webhook URL to work?", answer: "Yes. The webhook endpoint checks that the associated workflow is deployed before triggering a run. If the workflow is not deployed, the webhook returns a not-found response." },
+ { question: "Does the webhook auto-disable after repeated failures?", answer: "No. Unlike polling-based triggers (RSS, Gmail, IMAP), push-based generic webhooks do not auto-disable after consecutive failures. Each incoming request is processed independently. If your workflow consistently fails, check the run logs for error details." },
]} />
diff --git a/apps/sim/app/(landing)/blog/authors/[id]/page.tsx b/apps/sim/app/(landing)/blog/authors/[id]/page.tsx
index 3362e3ee917..bbbc8a55913 100644
--- a/apps/sim/app/(landing)/blog/authors/[id]/page.tsx
+++ b/apps/sim/app/(landing)/blog/authors/[id]/page.tsx
@@ -2,6 +2,7 @@ import type { Metadata } from 'next'
import Image from 'next/image'
import Link from 'next/link'
import { getAllPostMeta } from '@/lib/blog/registry'
+import { SITE_URL } from '@/lib/core/utils/urls'
export const revalidate = 3600
@@ -17,11 +18,11 @@ export async function generateMetadata({
return {
title: `${name} — Sim Blog`,
description: `Read articles by ${name} on the Sim blog.`,
- alternates: { canonical: `https://sim.ai/blog/authors/${id}` },
+ alternates: { canonical: `${SITE_URL}/blog/authors/${id}` },
openGraph: {
title: `${name} — Sim Blog`,
description: `Read articles by ${name} on the Sim blog.`,
- url: `https://sim.ai/blog/authors/${id}`,
+ url: `${SITE_URL}/blog/authors/${id}`,
siteName: 'Sim',
type: 'profile',
...(author?.avatarUrl
@@ -55,25 +56,25 @@ export default async function AuthorPage({ params }: { params: Promise<{ id: str
{
'@type': 'Person',
name: author.name,
- url: `https://sim.ai/blog/authors/${author.id}`,
+ url: `${SITE_URL}/blog/authors/${author.id}`,
sameAs: author.url ? [author.url] : [],
image: author.avatarUrl,
worksFor: {
'@type': 'Organization',
name: 'Sim',
- url: 'https://sim.ai',
+ url: SITE_URL,
},
},
{
'@type': 'BreadcrumbList',
itemListElement: [
- { '@type': 'ListItem', position: 1, name: 'Home', item: 'https://sim.ai' },
- { '@type': 'ListItem', position: 2, name: 'Blog', item: 'https://sim.ai/blog' },
+ { '@type': 'ListItem', position: 1, name: 'Home', item: SITE_URL },
+ { '@type': 'ListItem', position: 2, name: 'Blog', item: `${SITE_URL}/blog` },
{
'@type': 'ListItem',
position: 3,
name: author.name,
- item: `https://sim.ai/blog/authors/${author.id}`,
+ item: `${SITE_URL}/blog/authors/${author.id}`,
},
],
},
diff --git a/apps/sim/app/(landing)/blog/layout.tsx b/apps/sim/app/(landing)/blog/layout.tsx
index 512f41a32ee..96b81a7dca5 100644
--- a/apps/sim/app/(landing)/blog/layout.tsx
+++ b/apps/sim/app/(landing)/blog/layout.tsx
@@ -1,4 +1,5 @@
import { getNavBlogPosts } from '@/lib/blog/registry'
+import { SITE_URL } from '@/lib/core/utils/urls'
import Footer from '@/app/(landing)/components/footer/footer'
import Navbar from '@/app/(landing)/components/navbar/navbar'
@@ -8,10 +9,10 @@ export default async function StudioLayout({ children }: { children: React.React
'@context': 'https://schema.org',
'@type': 'Organization',
name: 'Sim',
- url: 'https://sim.ai',
+ url: SITE_URL,
description:
'Sim is the open-source AI workspace where teams build, deploy, and manage AI agents.',
- logo: 'https://sim.ai/logo/primary/small.png',
+ logo: `${SITE_URL}/logo/primary/small.png`,
sameAs: [
'https://x.com/simdotai',
'https://github.com/simstudioai/sim',
@@ -23,7 +24,7 @@ export default async function StudioLayout({ children }: { children: React.React
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'Sim',
- url: 'https://sim.ai',
+ url: SITE_URL,
}
return (
diff --git a/apps/sim/app/(landing)/blog/page.tsx b/apps/sim/app/(landing)/blog/page.tsx
index a7339cc76ad..f12f73ed253 100644
--- a/apps/sim/app/(landing)/blog/page.tsx
+++ b/apps/sim/app/(landing)/blog/page.tsx
@@ -4,6 +4,7 @@ import Link from 'next/link'
import { Badge } from '@/components/emcn'
import { getAllPostMeta } from '@/lib/blog/registry'
import { buildCollectionPageJsonLd } from '@/lib/blog/seo'
+import { SITE_URL } from '@/lib/core/utils/urls'
export async function generateMetadata({
searchParams,
@@ -26,7 +27,7 @@ export async function generateMetadata({
if (tag) canonicalParams.set('tag', tag)
if (pageNum > 1) canonicalParams.set('page', String(pageNum))
const qs = canonicalParams.toString()
- const canonical = `https://sim.ai/blog${qs ? `?${qs}` : ''}`
+ const canonical = `${SITE_URL}/blog${qs ? `?${qs}` : ''}`
return {
title,
@@ -41,7 +42,7 @@ export async function generateMetadata({
type: 'website',
images: [
{
- url: 'https://sim.ai/logo/primary/medium.png',
+ url: `${SITE_URL}/logo/primary/medium.png`,
width: 1200,
height: 630,
alt: 'Sim Blog',
diff --git a/apps/sim/app/(landing)/blog/rss.xml/route.ts b/apps/sim/app/(landing)/blog/rss.xml/route.ts
index fdabfce7ebc..6460e032216 100644
--- a/apps/sim/app/(landing)/blog/rss.xml/route.ts
+++ b/apps/sim/app/(landing)/blog/rss.xml/route.ts
@@ -1,12 +1,13 @@
import { NextResponse } from 'next/server'
import { getAllPostMeta } from '@/lib/blog/registry'
+import { SITE_URL } from '@/lib/core/utils/urls'
export const revalidate = 3600
export async function GET() {
const posts = await getAllPostMeta()
const items = posts.slice(0, 50)
- const site = 'https://sim.ai'
+ const site = SITE_URL
const lastBuildDate =
items.length > 0 ? new Date(items[0].date).toUTCString() : new Date().toUTCString()
diff --git a/apps/sim/app/(landing)/blog/sitemap-images.xml/route.ts b/apps/sim/app/(landing)/blog/sitemap-images.xml/route.ts
index 7fa302f299d..c40833c02c2 100644
--- a/apps/sim/app/(landing)/blog/sitemap-images.xml/route.ts
+++ b/apps/sim/app/(landing)/blog/sitemap-images.xml/route.ts
@@ -1,11 +1,12 @@
import { NextResponse } from 'next/server'
import { getAllPostMeta } from '@/lib/blog/registry'
+import { SITE_URL } from '@/lib/core/utils/urls'
export const revalidate = 3600
export async function GET() {
const posts = await getAllPostMeta()
- const base = 'https://sim.ai'
+ const base = SITE_URL
const xml = `
${posts
diff --git a/apps/sim/app/(landing)/blog/tags/page.tsx b/apps/sim/app/(landing)/blog/tags/page.tsx
index 1b5ccceea30..b18cff5a46d 100644
--- a/apps/sim/app/(landing)/blog/tags/page.tsx
+++ b/apps/sim/app/(landing)/blog/tags/page.tsx
@@ -1,15 +1,16 @@
import type { Metadata } from 'next'
import Link from 'next/link'
import { getAllTags } from '@/lib/blog/registry'
+import { SITE_URL } from '@/lib/core/utils/urls'
export const metadata: Metadata = {
title: 'Tags',
description: 'Browse Sim blog posts by topic — AI agents, workflows, integrations, and more.',
- alternates: { canonical: 'https://sim.ai/blog/tags' },
+ alternates: { canonical: `${SITE_URL}/blog/tags` },
openGraph: {
title: 'Blog Tags | Sim',
description: 'Browse Sim blog posts by topic — AI agents, workflows, integrations, and more.',
- url: 'https://sim.ai/blog/tags',
+ url: `${SITE_URL}/blog/tags`,
siteName: 'Sim',
locale: 'en_US',
type: 'website',
@@ -26,9 +27,9 @@ const breadcrumbJsonLd = {
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: [
- { '@type': 'ListItem', position: 1, name: 'Home', item: 'https://sim.ai' },
- { '@type': 'ListItem', position: 2, name: 'Blog', item: 'https://sim.ai/blog' },
- { '@type': 'ListItem', position: 3, name: 'Tags', item: 'https://sim.ai/blog/tags' },
+ { '@type': 'ListItem', position: 1, name: 'Home', item: SITE_URL },
+ { '@type': 'ListItem', position: 2, name: 'Blog', item: `${SITE_URL}/blog` },
+ { '@type': 'ListItem', position: 3, name: 'Tags', item: `${SITE_URL}/blog/tags` },
],
}
diff --git a/apps/sim/app/(landing)/components/structured-data.tsx b/apps/sim/app/(landing)/components/structured-data.tsx
index b03c4fb45e9..5a55b1c1c5d 100644
--- a/apps/sim/app/(landing)/components/structured-data.tsx
+++ b/apps/sim/app/(landing)/components/structured-data.tsx
@@ -1,3 +1,5 @@
+import { SITE_URL } from '@/lib/core/utils/urls'
+
/**
* JSON-LD structured data for the landing page.
*
@@ -23,22 +25,22 @@ export default function StructuredData() {
'@graph': [
{
'@type': 'Organization',
- '@id': 'https://sim.ai/#organization',
+ '@id': `${SITE_URL}/#organization`,
name: 'Sim',
alternateName: 'Sim Studio',
description:
'Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Connect 1,000+ integrations and every major LLM to create agents that automate real work.',
- url: 'https://sim.ai',
+ url: SITE_URL,
logo: {
'@type': 'ImageObject',
- '@id': 'https://sim.ai/#logo',
- url: 'https://sim.ai/logo/b%26w/text/b%26w.svg',
- contentUrl: 'https://sim.ai/logo/b%26w/text/b%26w.svg',
+ '@id': `${SITE_URL}/#logo`,
+ url: `${SITE_URL}/logo/b%26w/text/b%26w.svg`,
+ contentUrl: `${SITE_URL}/logo/b%26w/text/b%26w.svg`,
width: 49.78314,
height: 24.276,
caption: 'Sim Logo',
},
- image: { '@id': 'https://sim.ai/#logo' },
+ image: { '@id': `${SITE_URL}/#logo` },
sameAs: [
'https://x.com/simdotai',
'https://github.com/simstudioai/sim',
@@ -53,44 +55,42 @@ export default function StructuredData() {
},
{
'@type': 'WebSite',
- '@id': 'https://sim.ai/#website',
- url: 'https://sim.ai',
+ '@id': `${SITE_URL}/#website`,
+ url: SITE_URL,
name: 'Sim — The AI Workspace | Build, Deploy & Manage AI Agents',
description:
'Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Connect 1,000+ integrations and every major LLM. Join 100,000+ builders.',
- publisher: { '@id': 'https://sim.ai/#organization' },
+ publisher: { '@id': `${SITE_URL}/#organization` },
inLanguage: 'en-US',
},
{
'@type': 'WebPage',
- '@id': 'https://sim.ai/#webpage',
- url: 'https://sim.ai',
+ '@id': `${SITE_URL}/#webpage`,
+ url: SITE_URL,
name: 'Sim — The AI Workspace | Build, Deploy & Manage AI Agents',
- isPartOf: { '@id': 'https://sim.ai/#website' },
- about: { '@id': 'https://sim.ai/#software' },
+ isPartOf: { '@id': `${SITE_URL}/#website` },
+ about: { '@id': `${SITE_URL}/#software` },
datePublished: '2024-01-01T00:00:00+00:00',
dateModified: new Date().toISOString(),
description:
'Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Connect 1,000+ integrations and every major LLM to create agents that automate real work.',
- breadcrumb: { '@id': 'https://sim.ai/#breadcrumb' },
+ breadcrumb: { '@id': `${SITE_URL}/#breadcrumb` },
inLanguage: 'en-US',
speakable: {
'@type': 'SpeakableSpecification',
cssSelector: ['#hero-heading', '[id="hero"] p'],
},
- potentialAction: [{ '@type': 'ReadAction', target: ['https://sim.ai'] }],
+ potentialAction: [{ '@type': 'ReadAction', target: [SITE_URL] }],
},
{
'@type': 'BreadcrumbList',
- '@id': 'https://sim.ai/#breadcrumb',
- itemListElement: [
- { '@type': 'ListItem', position: 1, name: 'Home', item: 'https://sim.ai' },
- ],
+ '@id': `${SITE_URL}/#breadcrumb`,
+ itemListElement: [{ '@type': 'ListItem', position: 1, name: 'Home', item: SITE_URL }],
},
{
'@type': 'WebApplication',
- '@id': 'https://sim.ai/#software',
- url: 'https://sim.ai',
+ '@id': `${SITE_URL}/#software`,
+ url: SITE_URL,
name: 'Sim — The AI Workspace',
description:
'Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Connect 1,000+ integrations and every major LLM to create agents that automate real work — visually, conversationally, or with code. Trusted by over 100,000 builders. SOC2 compliant.',
@@ -98,7 +98,7 @@ export default function StructuredData() {
applicationSubCategory: 'AI Workspace',
operatingSystem: 'Web',
browserRequirements: 'Requires a modern browser with JavaScript enabled',
- installUrl: 'https://sim.ai/signup',
+ installUrl: `${SITE_URL}/signup`,
offers: [
{
'@type': 'Offer',
@@ -175,16 +175,16 @@ export default function StructuredData() {
},
{
'@type': 'SoftwareSourceCode',
- '@id': 'https://sim.ai/#source',
+ '@id': `${SITE_URL}/#source`,
codeRepository: 'https://github.com/simstudioai/sim',
programmingLanguage: ['TypeScript', 'Python'],
runtimePlatform: 'Node.js',
license: 'https://opensource.org/licenses/Apache-2.0',
- isPartOf: { '@id': 'https://sim.ai/#software' },
+ isPartOf: { '@id': `${SITE_URL}/#software` },
},
{
'@type': 'FAQPage',
- '@id': 'https://sim.ai/#faq',
+ '@id': `${SITE_URL}/#faq`,
mainEntity: [
{
'@type': 'Question',
diff --git a/apps/sim/app/(landing)/integrations/[slug]/page.tsx b/apps/sim/app/(landing)/integrations/[slug]/page.tsx
index e93bf9c73fe..d48ea6f4054 100644
--- a/apps/sim/app/(landing)/integrations/[slug]/page.tsx
+++ b/apps/sim/app/(landing)/integrations/[slug]/page.tsx
@@ -2,7 +2,7 @@ import type { Metadata } from 'next'
import Image from 'next/image'
import Link from 'next/link'
import { notFound } from 'next/navigation'
-import { getBaseUrl } from '@/lib/core/utils/urls'
+import { SITE_URL } from '@/lib/core/utils/urls'
import { IntegrationCtaButton } from '@/app/(landing)/integrations/[slug]/components/integration-cta-button'
import { IntegrationFAQ } from '@/app/(landing)/integrations/[slug]/components/integration-faq'
import { TemplateCardButton } from '@/app/(landing)/integrations/[slug]/components/template-card-button'
@@ -14,7 +14,7 @@ import { TEMPLATES } from '@/app/workspace/[workspaceId]/home/components/templat
const allIntegrations = integrations as Integration[]
const INTEGRATION_COUNT = allIntegrations.length
-const baseUrl = getBaseUrl()
+const baseUrl = SITE_URL
/** Fast O(1) lookups — avoids repeated linear scans inside render loops. */
const bySlug = new Map(allIntegrations.map((i) => [i.slug, i]))
diff --git a/apps/sim/app/(landing)/integrations/layout.tsx b/apps/sim/app/(landing)/integrations/layout.tsx
index 23614abe122..231771091c7 100644
--- a/apps/sim/app/(landing)/integrations/layout.tsx
+++ b/apps/sim/app/(landing)/integrations/layout.tsx
@@ -1,11 +1,11 @@
import { getNavBlogPosts } from '@/lib/blog/registry'
-import { getBaseUrl } from '@/lib/core/utils/urls'
+import { SITE_URL } from '@/lib/core/utils/urls'
import Footer from '@/app/(landing)/components/footer/footer'
import Navbar from '@/app/(landing)/components/navbar/navbar'
export default async function IntegrationsLayout({ children }: { children: React.ReactNode }) {
const blogPosts = await getNavBlogPosts()
- const url = getBaseUrl()
+ const url = SITE_URL
const orgJsonLd = {
'@context': 'https://schema.org',
'@type': 'Organization',
diff --git a/apps/sim/app/(landing)/integrations/page.tsx b/apps/sim/app/(landing)/integrations/page.tsx
index 60927489eeb..3340ba7f271 100644
--- a/apps/sim/app/(landing)/integrations/page.tsx
+++ b/apps/sim/app/(landing)/integrations/page.tsx
@@ -1,6 +1,6 @@
import type { Metadata } from 'next'
import { Badge } from '@/components/emcn'
-import { getBaseUrl } from '@/lib/core/utils/urls'
+import { SITE_URL } from '@/lib/core/utils/urls'
import { IntegrationCard } from './components/integration-card'
import { IntegrationGrid } from './components/integration-grid'
import { RequestIntegrationModal } from './components/request-integration-modal'
@@ -18,7 +18,7 @@ const INTEGRATION_COUNT = allIntegrations.length
*/
const TOP_NAMES = [...new Set(POPULAR_WORKFLOWS.flatMap((p) => [p.from, p.to]))].slice(0, 6)
-const baseUrl = getBaseUrl()
+const baseUrl = SITE_URL
/** Curated featured integrations — high-recognition services shown as cards. */
const FEATURED_SLUGS = ['slack', 'notion', 'github', 'gmail'] as const
diff --git a/apps/sim/app/(landing)/layout.tsx b/apps/sim/app/(landing)/layout.tsx
index bb6ee982754..3b10895f16e 100644
--- a/apps/sim/app/(landing)/layout.tsx
+++ b/apps/sim/app/(landing)/layout.tsx
@@ -1,9 +1,10 @@
import type { Metadata } from 'next'
+import { SITE_URL } from '@/lib/core/utils/urls'
import { martianMono } from '@/app/_styles/fonts/martian-mono/martian-mono'
import { season } from '@/app/_styles/fonts/season/season'
export const metadata: Metadata = {
- metadataBase: new URL('https://sim.ai'),
+ metadataBase: new URL(SITE_URL),
manifest: '/manifest.webmanifest',
icons: {
icon: [{ url: '/icon.svg', type: 'image/svg+xml', sizes: 'any' }],
diff --git a/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx b/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx
index 7334c689cbb..c8ab7d8c423 100644
--- a/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx
+++ b/apps/sim/app/(landing)/models/[provider]/[model]/page.tsx
@@ -1,7 +1,7 @@
import type { Metadata } from 'next'
import Link from 'next/link'
import { notFound } from 'next/navigation'
-import { getBaseUrl } from '@/lib/core/utils/urls'
+import { SITE_URL } from '@/lib/core/utils/urls'
import { LandingFAQ } from '@/app/(landing)/components/landing-faq'
import { FeaturedModelCard, ProviderIcon } from '@/app/(landing)/models/components/model-primitives'
import {
@@ -18,7 +18,7 @@ import {
getRelatedModels,
} from '@/app/(landing)/models/utils'
-const baseUrl = getBaseUrl()
+const baseUrl = SITE_URL
export async function generateStaticParams() {
return ALL_CATALOG_MODELS.map((model) => ({
@@ -221,7 +221,7 @@ export default async function ModelPage({