diff --git a/README.md b/README.md
index 7ecbe7f277..1784c25d8d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
@@ -15,7 +15,7 @@
-
+
## Getting Started
diff --git a/apps/docs/lib/utils.ts b/apps/docs/lib/utils.ts
index 172f3fd29c..bc3e8ab5ad 100644
--- a/apps/docs/lib/utils.ts
+++ b/apps/docs/lib/utils.ts
@@ -9,13 +9,23 @@ export function cn(...inputs: ClassValue[]) {
}
/**
- * Get the full URL for a video asset stored in Vercel Blob
+ * Get the full URL for an asset stored in Vercel Blob or local fallback
+ * - If CDN is configured (NEXT_PUBLIC_BLOB_BASE_URL), uses CDN URL
+ * - Otherwise falls back to local static assets served from root path
+ */
+export function getAssetUrl(filename: string) {
+ const cdnBaseUrl = process.env.NEXT_PUBLIC_BLOB_BASE_URL
+ if (cdnBaseUrl) {
+ return `${cdnBaseUrl}/${filename}`
+ }
+ return `/${filename}`
+}
+
+/**
+ * Get the full URL for a video asset stored in Vercel Blob or local fallback
+ * - If CDN is configured (NEXT_PUBLIC_BLOB_BASE_URL), uses CDN URL
+ * - Otherwise falls back to local static assets served from root path
*/
export function getVideoUrl(filename: string) {
- const baseUrl = process.env.NEXT_PUBLIC_BLOB_BASE_URL
- if (!baseUrl) {
- console.warn('NEXT_PUBLIC_BLOB_BASE_URL not configured, falling back to local path')
- return `/${filename}`
- }
- return `${baseUrl}/${filename}`
+ return getAssetUrl(filename)
}
diff --git a/apps/docs/public/api-deployment.mp4 b/apps/docs/public/api-deployment.mp4
deleted file mode 100644
index a04ec8028e..0000000000
Binary files a/apps/docs/public/api-deployment.mp4 and /dev/null differ
diff --git a/apps/docs/public/api-redeployment.mp4 b/apps/docs/public/api-redeployment.mp4
deleted file mode 100644
index 161e1f5990..0000000000
Binary files a/apps/docs/public/api-redeployment.mp4 and /dev/null differ
diff --git a/apps/docs/public/chat-input.mp4 b/apps/docs/public/chat-input.mp4
deleted file mode 100644
index a89965ea01..0000000000
Binary files a/apps/docs/public/chat-input.mp4 and /dev/null differ
diff --git a/apps/docs/public/configure-schedule.mp4 b/apps/docs/public/configure-schedule.mp4
deleted file mode 100644
index f9b8f4fcae..0000000000
Binary files a/apps/docs/public/configure-schedule.mp4 and /dev/null differ
diff --git a/apps/docs/public/connections-resp-format.mp4 b/apps/docs/public/connections-resp-format.mp4
deleted file mode 100644
index 30fca8c7e3..0000000000
Binary files a/apps/docs/public/connections-resp-format.mp4 and /dev/null differ
diff --git a/apps/docs/public/connections.mp4 b/apps/docs/public/connections.mp4
deleted file mode 100644
index f792a91889..0000000000
Binary files a/apps/docs/public/connections.mp4 and /dev/null differ
diff --git a/apps/docs/public/granular-tool-control.mp4 b/apps/docs/public/granular-tool-control.mp4
deleted file mode 100644
index 881deea3b3..0000000000
Binary files a/apps/docs/public/granular-tool-control.mp4 and /dev/null differ
diff --git a/apps/docs/public/input-format.mp4 b/apps/docs/public/input-format.mp4
deleted file mode 100644
index de9e879adf..0000000000
Binary files a/apps/docs/public/input-format.mp4 and /dev/null differ
diff --git a/apps/docs/public/models.mp4 b/apps/docs/public/models.mp4
deleted file mode 100644
index 060bdb19d1..0000000000
Binary files a/apps/docs/public/models.mp4 and /dev/null differ
diff --git a/apps/docs/public/router-model-dropdown.mp4 b/apps/docs/public/router-model-dropdown.mp4
deleted file mode 100644
index 3b0cc7a924..0000000000
Binary files a/apps/docs/public/router-model-dropdown.mp4 and /dev/null differ
diff --git a/apps/docs/public/static/examples/started/started-2.mp4 b/apps/docs/public/static/examples/started/started-2.mp4
deleted file mode 100644
index 0947b4973f..0000000000
Binary files a/apps/docs/public/static/examples/started/started-2.mp4 and /dev/null differ
diff --git a/apps/docs/public/static/examples/started/started-3.mp4 b/apps/docs/public/static/examples/started/started-3.mp4
deleted file mode 100644
index 8e2456b197..0000000000
Binary files a/apps/docs/public/static/examples/started/started-3.mp4 and /dev/null differ
diff --git a/apps/docs/public/static/examples/started/started-4.mp4 b/apps/docs/public/static/examples/started/started-4.mp4
deleted file mode 100644
index 234824f6a5..0000000000
Binary files a/apps/docs/public/static/examples/started/started-4.mp4 and /dev/null differ
diff --git a/apps/docs/public/static/examples/started/started-5.mp4 b/apps/docs/public/static/examples/started/started-5.mp4
deleted file mode 100644
index b86829731e..0000000000
Binary files a/apps/docs/public/static/examples/started/started-5.mp4 and /dev/null differ
diff --git a/apps/docs/public/static/examples/started/started-6.mp4 b/apps/docs/public/static/examples/started/started-6.mp4
deleted file mode 100644
index 26d726aa63..0000000000
Binary files a/apps/docs/public/static/examples/started/started-6.mp4 and /dev/null differ
diff --git a/apps/docs/public/tool-reordering.mp4 b/apps/docs/public/tool-reordering.mp4
deleted file mode 100644
index eda5be717d..0000000000
Binary files a/apps/docs/public/tool-reordering.mp4 and /dev/null differ
diff --git a/apps/docs/public/tools.mp4 b/apps/docs/public/tools.mp4
deleted file mode 100644
index b7a0c62bfe..0000000000
Binary files a/apps/docs/public/tools.mp4 and /dev/null differ
diff --git a/apps/docs/public/variables-dropdown.mp4 b/apps/docs/public/variables-dropdown.mp4
deleted file mode 100644
index 7c2f104834..0000000000
Binary files a/apps/docs/public/variables-dropdown.mp4 and /dev/null differ
diff --git a/apps/docs/public/variables.mp4 b/apps/docs/public/variables.mp4
deleted file mode 100644
index 437be1d551..0000000000
Binary files a/apps/docs/public/variables.mp4 and /dev/null differ
diff --git a/apps/docs/public/webhooks.mp4 b/apps/docs/public/webhooks.mp4
deleted file mode 100644
index bba15d188f..0000000000
Binary files a/apps/docs/public/webhooks.mp4 and /dev/null differ
diff --git a/apps/sim/app/(landing)/components/sections/blogs.tsx b/apps/sim/app/(landing)/components/sections/blogs.tsx
index 48ffb32d17..214b5c1017 100644
--- a/apps/sim/app/(landing)/components/sections/blogs.tsx
+++ b/apps/sim/app/(landing)/components/sections/blogs.tsx
@@ -1,6 +1,7 @@
'use client'
import { motion } from 'framer-motion'
+import { getAssetUrl } from '@/lib/utils'
import { BlogCard } from '@/app/(landing)/components/blog-card'
function Blogs() {
@@ -50,7 +51,7 @@ function Blogs() {
date={new Date('25 April 2025')}
author='Emir Ayaz'
authorRole='Designer'
- avatar='/static/sim.png'
+ avatar={getAssetUrl('static/sim.png')}
type='Agents'
readTime='6'
/>
@@ -61,7 +62,7 @@ function Blogs() {
date={new Date('25 April 2025')}
author='Emir Ayaz'
authorRole='Designer'
- avatar='/static/sim.png'
+ avatar={getAssetUrl('static/sim.png')}
type='Agents'
readTime='6'
/>
@@ -80,10 +81,10 @@ function Blogs() {
date={new Date('25 April 2025')}
author='Emir Ayaz'
authorRole='Designer'
- avatar='/static/sim.png'
+ avatar={getAssetUrl('static/sim.png')}
type='Agents'
readTime='6'
- image='/static/hero.png'
+ image={getAssetUrl('static/hero.png')}
/>
@@ -110,7 +111,7 @@ function Blogs() {
date={new Date('25 April 2025')}
author='Emir Ayaz'
authorRole='Designer'
- avatar='/static/sim.png'
+ avatar={getAssetUrl('static/sim.png')}
type='Agents'
readTime='6'
/>
@@ -121,7 +122,7 @@ function Blogs() {
date={new Date('25 April 2025')}
author='Emir Ayaz'
authorRole='Designer'
- avatar='/static/sim.png'
+ avatar={getAssetUrl('static/sim.png')}
type='Functions'
readTime='6'
/>
diff --git a/apps/sim/app/(landing)/components/sections/testimonials.tsx b/apps/sim/app/(landing)/components/sections/testimonials.tsx
index 465ce9f7aa..fd4fd325e5 100644
--- a/apps/sim/app/(landing)/components/sections/testimonials.tsx
+++ b/apps/sim/app/(landing)/components/sections/testimonials.tsx
@@ -1,6 +1,7 @@
'use client'
import { motion } from 'framer-motion'
+import { getAssetUrl } from '@/lib/utils'
import useIsMobile from '@/app/(landing)/components/hooks/use-is-mobile'
import { Marquee } from '@/app/(landing)/components/magicui/marquee'
@@ -10,63 +11,63 @@ const X_TESTIMONIALS = [
username: '@GithubProjects',
viewCount: '90.4k',
tweetUrl: 'https://x.com/GithubProjects/status/1906383555707490499',
- profileImage: '/twitter/github-projects.jpg',
+ profileImage: getAssetUrl('twitter/github-projects.jpg'),
},
{
text: 'A very good looking agent workflow builder ๐ฅ and open source!',
username: '@xyflowdev',
viewCount: '3,246',
tweetUrl: 'https://x.com/xyflowdev/status/1909501499719438670',
- profileImage: '/twitter/xyflow.jpg',
+ profileImage: getAssetUrl('twitter/xyflow.jpg'),
},
{
text: "๐จ BREAKING: This startup just dropped the fastest way to build AI agents.\n\nThis Figma-like canvas to build agents will blow your mind.\n\nHere's why this is the best tool for building AI agents:",
username: '@hasantoxr',
viewCount: '515k',
tweetUrl: 'https://x.com/hasantoxr/status/1912909502036525271',
- profileImage: '/twitter/hasan.jpg',
+ profileImage: getAssetUrl('twitter/hasan.jpg'),
},
{
text: 'omfggggg this is the zapier of agent building\n\ni always believed that building agents and using ai should not be limited to technical people. i think this solves just that\n\nthe fact that this is also open source makes me so optimistic about the future of building with ai :)))\n\ncongrats @karabegemir & @typingwala !!!',
username: '@nizzyabi',
viewCount: '6,269',
tweetUrl: 'https://x.com/nizzyabi/status/1907864421227180368',
- profileImage: '/twitter/nizzy.jpg',
+ profileImage: getAssetUrl('twitter/nizzy.jpg'),
},
{
text: "One of the best products I've seen in the space, and the hustle and grind I've seen from @karabegemir and @typingwala is insane. Sim Studio is positioned to build something game-changing, and there's no better team for the job.\n\nCongrats on the launch ๐ ๐ great things ahead!",
username: '@firestorm776',
viewCount: '956',
tweetUrl: 'https://x.com/firestorm776/status/1907896097735061598',
- profileImage: '/twitter/samarth.jpg',
+ profileImage: getAssetUrl('twitter/samarth.jpg'),
},
{
text: 'lfgg got access to @simstudioai via @zerodotemail ๐',
username: '@nizzyabi',
viewCount: '1,585',
tweetUrl: 'https://x.com/nizzyabi/status/1910482357821595944',
- profileImage: '/twitter/nizzy.jpg',
+ profileImage: getAssetUrl('twitter/nizzy.jpg'),
},
{
text: 'Feels like we\'re finally getting a "Photoshop moment" for AI devsโvisual, intuitive, and fast enough to keep up with ideas mid-flow.',
username: '@syamrajk',
viewCount: '2,643',
tweetUrl: 'https://x.com/syamrajk/status/1912911980110946491',
- profileImage: '/twitter/syamrajk.jpg',
+ profileImage: getAssetUrl('twitter/syamrajk.jpg'),
},
{
text: "๐จ BREAKING: This startup just dropped the fastest way to build AI agents.\n\nThis Figma-like canvas to build agents will blow your mind.\n\nHere's why this is the best tool for building AI agents:",
username: '@lazukars',
viewCount: '47.4k',
tweetUrl: 'https://x.com/lazukars/status/1913136390503600575',
- profileImage: '/twitter/lazukars.png',
+ profileImage: getAssetUrl('twitter/lazukars.png'),
},
{
text: 'The use cases are endless. Great work @simstudioai',
username: '@daniel_zkim',
viewCount: '103',
tweetUrl: 'https://x.com/daniel_zkim/status/1907891273664782708',
- profileImage: '/twitter/daniel.jpg',
+ profileImage: getAssetUrl('twitter/daniel.jpg'),
},
]
diff --git a/apps/sim/app/layout.tsx b/apps/sim/app/layout.tsx
index b7a4d0b8bf..1f44ae5341 100644
--- a/apps/sim/app/layout.tsx
+++ b/apps/sim/app/layout.tsx
@@ -4,6 +4,7 @@ import type { Metadata, Viewport } from 'next'
import { PublicEnvScript } from 'next-runtime-env'
import { env, isTruthy } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
+import { getAssetUrl } from '@/lib/utils'
import { TelemetryConsentDialog } from '@/app/telemetry-consent-dialog'
import '@/app/globals.css'
@@ -118,7 +119,7 @@ export const metadata: Metadata = {
siteName: 'Sim Studio',
images: [
{
- url: 'https://simstudio.ai/social/facebook.png',
+ url: getAssetUrl('social/facebook.png'),
width: 1200,
height: 630,
alt: 'Sim Studio',
@@ -130,7 +131,7 @@ export const metadata: Metadata = {
title: 'Sim Studio',
description:
'Build and deploy AI agents using our Figma-like canvas. Build, write evals, and deploy AI agent workflows that automate workflows and streamline your business processes.',
- images: ['https://simstudio.ai/social/twitter.png'],
+ images: [getAssetUrl('social/twitter.png')],
creator: '@simstudioai',
site: '@simstudioai',
},
@@ -231,7 +232,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
{/* Additional image sources */}
-
+
diff --git a/apps/sim/components/emails/footer.tsx b/apps/sim/components/emails/footer.tsx
index b6295913f0..527d14320c 100644
--- a/apps/sim/components/emails/footer.tsx
+++ b/apps/sim/components/emails/footer.tsx
@@ -1,5 +1,6 @@
import { Container, Img, Link, Section, Text } from '@react-email/components'
import { env } from '@/lib/env'
+import { getAssetUrl } from '@/lib/utils'
interface UnsubscribeOptions {
unsubscribeToken?: string
@@ -25,13 +26,13 @@ export const EmailFooter = ({
-
+
|
 |