Skip to content

Commit 4dc4073

Browse files
authored
v0.4.7: blog
2 parents 377b84e + d9b7008 commit 4dc4073

File tree

18 files changed

+1015
-46
lines changed

18 files changed

+1015
-46
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Footer, Nav } from '@/app/(landing)/components'
2+
3+
/**
4+
* Layout for the building/blog section with navigation and footer
5+
*/
6+
export default function BuildingLayout({ children }: { children: React.ReactNode }) {
7+
return (
8+
<>
9+
<Nav hideAuthButtons={false} variant='landing' />
10+
<main className='relative'>{children}</main>
11+
<Footer />
12+
</>
13+
)
14+
}

apps/sim/app/(landing)/building/openai-vs-n8n-vs-sim/openai-n8n-sim.tsx

Lines changed: 789 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import type { Metadata } from 'next'
2+
import OpenAiN8nSim from './openai-n8n-sim'
3+
4+
const baseUrl = 'https://sim.ai'
5+
const canonicalUrl = `${baseUrl}/building/openai-vs-n8n-vs-sim`
6+
7+
export const metadata: Metadata = {
8+
title: 'OpenAI AgentKit vs n8n vs Sim: AI Agent Workflow Builder Comparison | Sim',
9+
description:
10+
'Compare OpenAI AgentKit, n8n, and Sim for building AI agent workflows. Explore key differences in capabilities, integrations, collaboration, and which platform best fits your production AI agent needs.',
11+
keywords: [
12+
'AgentKit',
13+
'AI agents',
14+
'AI agent development',
15+
'agents',
16+
'workflow builder',
17+
'visual workflow builder',
18+
'workflows',
19+
'OpenAI AgentKit',
20+
'OpenAI',
21+
'OpenAI Responses API',
22+
'n8n',
23+
'n8n workflow automation',
24+
'AI workflow automation',
25+
'workflow automation platform',
26+
'Sim',
27+
'agent builder comparison',
28+
'RAG agents',
29+
'RAG systems',
30+
'retrieval augmented generation',
31+
'ChatKit',
32+
'agent evaluation',
33+
'prompt optimization',
34+
'multi-agent systems',
35+
'team collaboration workflows',
36+
'production AI agents',
37+
'AI guardrails',
38+
'workflow integrations',
39+
'self-hosted AI agents',
40+
'cloud AI agent platform',
41+
'MCP protocol',
42+
'Model Context Protocol',
43+
'knowledge base integration',
44+
'vector embeddings',
45+
'AI agent canvas',
46+
'agentic workflows',
47+
'AI agent API',
48+
'AI chatbot workflows',
49+
'business process automation',
50+
'AI Copilot',
51+
'workflow copilot',
52+
'AI assistant for workflows',
53+
'vector search',
54+
'semantic search',
55+
'pgvector',
56+
'knowledge base AI',
57+
'document embeddings',
58+
'execution logging',
59+
'workflow monitoring',
60+
'AI agent observability',
61+
'workflow debugging',
62+
'execution traces',
63+
'AI workflow logs',
64+
'intelligent chunking',
65+
'context-aware search',
66+
],
67+
authors: [{ name: 'Emir Karabeg', url: 'https://x.com/karabegemir' }],
68+
creator: 'Emir Karabeg',
69+
publisher: 'Sim',
70+
robots: {
71+
index: true,
72+
follow: true,
73+
googleBot: {
74+
index: true,
75+
follow: true,
76+
'max-video-preview': -1,
77+
'max-image-preview': 'large',
78+
'max-snippet': -1,
79+
},
80+
},
81+
alternates: {
82+
canonical: canonicalUrl,
83+
},
84+
openGraph: {
85+
title: 'OpenAI AgentKit vs n8n vs Sim: AI Agent Workflow Builder Comparison',
86+
description:
87+
'Compare OpenAI AgentKit, n8n, and Sim for building AI agent workflows. Explore key differences in capabilities, integrations, and which platform fits your production needs.',
88+
url: canonicalUrl,
89+
siteName: 'Sim',
90+
locale: 'en_US',
91+
type: 'article',
92+
publishedTime: '2025-10-06T00:00:00.000Z',
93+
modifiedTime: '2025-10-06T00:00:00.000Z',
94+
authors: ['Emir Karabeg'],
95+
section: 'Technology',
96+
tags: [
97+
'AI Agents',
98+
'Workflow Automation',
99+
'OpenAI AgentKit',
100+
'n8n',
101+
'Sim',
102+
'AgentKit',
103+
'AI Development',
104+
'RAG',
105+
'MCP Protocol',
106+
],
107+
images: [
108+
{
109+
url: `${baseUrl}/building/openai-vs-n8n-vs-sim/workflow.png`,
110+
width: 1200,
111+
height: 630,
112+
alt: 'Sim AI agent workflow builder interface comparison',
113+
},
114+
],
115+
},
116+
twitter: {
117+
card: 'summary_large_image',
118+
title: 'OpenAI AgentKit vs n8n vs Sim: AI Agent Workflow Builder Comparison',
119+
description:
120+
'Compare OpenAI AgentKit, n8n, and Sim for building AI agent workflows. Explore key differences in capabilities, integrations, and which platform fits your production needs.',
121+
images: ['/building/openai-vs-n8n-vs-sim/workflow.png'],
122+
creator: '@karabegemir',
123+
site: '@simai',
124+
},
125+
other: {
126+
'article:published_time': '2025-10-06T00:00:00.000Z',
127+
'article:modified_time': '2025-10-06T00:00:00.000Z',
128+
'article:author': 'Emir Karabeg',
129+
'article:section': 'Technology',
130+
},
131+
}
132+
133+
/**
134+
* Blog post page comparing OpenAI AgentKit, n8n, and Sim workflow builders for AI agents.
135+
* Optimized for SEO with structured data, canonical URLs, and comprehensive metadata.
136+
*/
137+
export default function Page() {
138+
return <OpenAiN8nSim />
139+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { redirect } from 'next/navigation'
2+
3+
/**
4+
* Redirects /building to the latest blog post
5+
*/
6+
export default function BuildingPage() {
7+
redirect('/building/openai-vs-n8n-vs-sim')
8+
}

apps/sim/app/(landing)/components/nav/nav.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ interface NavProps {
2020
}
2121

2222
export default function Nav({ hideAuthButtons = false, variant = 'landing' }: NavProps = {}) {
23-
const [githubStars, setGithubStars] = useState('15.4k')
23+
const [githubStars, setGithubStars] = useState('16.3k')
2424
const [isHovered, setIsHovered] = useState(false)
2525
const [isLoginHovered, setIsLoginHovered] = useState(false)
2626
const router = useRouter()

apps/sim/app/layout.tsx

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import { Analytics } from '@vercel/analytics/next'
21
import type { Metadata, Viewport } from 'next'
32
import { PublicEnvScript } from 'next-runtime-env'
43
import { BrandedLayout } from '@/components/branded-layout'
54
import { generateThemeCSS } from '@/lib/branding/inject-theme'
65
import { generateBrandedMetadata, generateStructuredData } from '@/lib/branding/metadata'
7-
import { isHosted } from '@/lib/environment'
86
import { createLogger } from '@/lib/logs/console/logger'
7+
import { PostHogProvider } from '@/lib/posthog/provider'
98
import '@/app/globals.css'
109

1110
import { SessionProvider } from '@/lib/session/session-context'
@@ -55,7 +54,6 @@ export const viewport: Viewport = {
5554
],
5655
}
5756

58-
// Generate dynamic metadata based on brand configuration
5957
export const metadata: Metadata = generateBrandedMetadata()
6058

6159
export default function RootLayout({ children }: { children: React.ReactNode }) {
@@ -91,19 +89,16 @@ export default function RootLayout({ children }: { children: React.ReactNode })
9189
<PublicEnvScript />
9290
</head>
9391
<body suppressHydrationWarning>
94-
<ThemeProvider>
95-
<SessionProvider>
96-
<BrandedLayout>
97-
<ZoomPrevention />
98-
{children}
99-
{isHosted && (
100-
<>
101-
<Analytics />
102-
</>
103-
)}
104-
</BrandedLayout>
105-
</SessionProvider>
106-
</ThemeProvider>
92+
<PostHogProvider>
93+
<ThemeProvider>
94+
<SessionProvider>
95+
<BrandedLayout>
96+
<ZoomPrevention />
97+
{children}
98+
</BrandedLayout>
99+
</SessionProvider>
100+
</ThemeProvider>
101+
</PostHogProvider>
107102
</body>
108103
</html>
109104
)

apps/sim/app/sitemap.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,18 @@ export default function sitemap(): MetadataRoute.Sitemap {
3737
},
3838
]
3939

40+
// Blog posts and content pages
41+
const blogPages = [
42+
{
43+
url: `${baseUrl}/building/openai-vs-n8n-vs-sim`,
44+
lastModified: new Date('2025-10-06'),
45+
changeFrequency: 'monthly' as const,
46+
priority: 0.9,
47+
},
48+
]
49+
4050
// You can add dynamic pages here by fetching from database
4151
// const dynamicPages = await fetchDynamicPages()
4252

43-
return [...staticPages]
53+
return [...staticPages, ...blogPages]
4454
}

apps/sim/instrumentation-client.ts

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,7 @@
55
* It respects the user's telemetry preferences stored in localStorage.
66
*
77
*/
8-
import posthog from 'posthog-js'
9-
import { env, getEnv, isTruthy } from './lib/env'
10-
11-
// Initialize PostHog only if explicitly enabled
12-
if (isTruthy(getEnv('NEXT_PUBLIC_POSTHOG_ENABLED')) && getEnv('NEXT_PUBLIC_POSTHOG_KEY')) {
13-
posthog.init(getEnv('NEXT_PUBLIC_POSTHOG_KEY')!, {
14-
api_host: '/ingest',
15-
ui_host: 'https://us.posthog.com',
16-
person_profiles: 'identified_only',
17-
capture_pageview: true,
18-
capture_pageleave: true,
19-
capture_performance: true,
20-
session_recording: {
21-
maskAllInputs: false,
22-
maskInputOptions: {
23-
password: true,
24-
email: false,
25-
},
26-
recordCrossOriginIframes: false,
27-
recordHeaders: true,
28-
recordBody: true,
29-
},
30-
autocapture: true,
31-
capture_dead_clicks: true,
32-
persistence: 'localStorage+cookie',
33-
enable_heatmaps: true,
34-
})
35-
}
8+
import { env } from './lib/env'
369

3710
if (typeof window !== 'undefined') {
3811
const TELEMETRY_STATUS_KEY = 'simstudio-telemetry-status'

apps/sim/lib/posthog/provider.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'use client'
2+
3+
import { useEffect } from 'react'
4+
import posthog from 'posthog-js'
5+
import { PostHogProvider as PHProvider } from 'posthog-js/react'
6+
import { getEnv, isTruthy } from '../env'
7+
8+
export function PostHogProvider({ children }: { children: React.ReactNode }) {
9+
useEffect(() => {
10+
const posthogEnabled = getEnv('NEXT_PUBLIC_POSTHOG_ENABLED')
11+
const posthogKey = getEnv('NEXT_PUBLIC_POSTHOG_KEY')
12+
13+
if (isTruthy(posthogEnabled) && posthogKey && !posthog.__loaded) {
14+
posthog.init(posthogKey, {
15+
api_host: '/ingest',
16+
ui_host: 'https://us.posthog.com',
17+
defaults: '2025-05-24',
18+
person_profiles: 'identified_only',
19+
capture_pageview: true,
20+
capture_pageleave: true,
21+
capture_performance: true,
22+
session_recording: {
23+
maskAllInputs: false,
24+
maskInputOptions: {
25+
password: true,
26+
email: false,
27+
},
28+
recordCrossOriginIframes: false,
29+
recordHeaders: true,
30+
recordBody: true,
31+
},
32+
autocapture: true,
33+
capture_dead_clicks: true,
34+
persistence: 'localStorage+cookie',
35+
enable_heatmaps: true,
36+
})
37+
}
38+
}, [])
39+
40+
return <PHProvider client={posthog}>{children}</PHProvider>
41+
}
487 KB
Loading

0 commit comments

Comments
 (0)