fix(blog): rename building to blogs with redirect (#1604)
@@ -1,9 +1,6 @@
|
||||
import { Footer, Nav } from '@/app/(landing)/components'
|
||||
|
||||
/**
|
||||
* Layout for the building/blog section with navigation and footer
|
||||
*/
|
||||
export default function BuildingLayout({ children }: { children: React.ReactNode }) {
|
||||
export default function BlogLayout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<>
|
||||
<Nav hideAuthButtons={false} variant='landing' />
|
||||
@@ -2,14 +2,9 @@ import Image from 'next/image'
|
||||
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
|
||||
import { soehne } from '@/app/fonts/soehne/soehne'
|
||||
|
||||
/**
|
||||
* Blog post component comparing OpenAI AgentKit, n8n, and Sim workflow builders for building AI agents.
|
||||
* Layout inspired by Anthropic's engineering blog posts.
|
||||
* Includes structured data (JSON-LD) for enhanced SEO and LLM discoverability.
|
||||
*/
|
||||
export default function OpenAiN8nSim() {
|
||||
const baseUrl = 'https://sim.ai'
|
||||
const articleUrl = `${baseUrl}/building/openai-vs-n8n-vs-sim`
|
||||
const articleUrl = `${baseUrl}/blog/openai-vs-n8n-vs-sim`
|
||||
|
||||
const articleStructuredData = {
|
||||
'@context': 'https://schema.org',
|
||||
@@ -17,7 +12,7 @@ export default function OpenAiN8nSim() {
|
||||
headline: 'OpenAI AgentKit vs n8n vs Sim: AI Agent Workflow Builder Comparison',
|
||||
description:
|
||||
'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.',
|
||||
image: `${baseUrl}/building/openai-vs-n8n-vs-sim/workflow.png`,
|
||||
image: `${baseUrl}/blog/openai-vs-n8n-vs-sim/workflow.png`,
|
||||
datePublished: '2025-10-06T00:00:00.000Z',
|
||||
dateModified: '2025-10-06T00:00:00.000Z',
|
||||
author: {
|
||||
@@ -80,8 +75,8 @@ export default function OpenAiN8nSim() {
|
||||
{
|
||||
'@type': 'ListItem',
|
||||
position: 2,
|
||||
name: 'Building',
|
||||
item: `${baseUrl}/building`,
|
||||
name: 'Blog',
|
||||
item: `${baseUrl}/blog`,
|
||||
},
|
||||
{
|
||||
'@type': 'ListItem',
|
||||
@@ -120,7 +115,7 @@ export default function OpenAiN8nSim() {
|
||||
<div className='h-[180px] w-full flex-shrink-0 sm:h-[200px] md:h-auto md:w-[300px]'>
|
||||
<div className='relative h-full w-full overflow-hidden rounded-lg md:aspect-[5/4]'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/workflow.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/workflow.png'
|
||||
alt='Sim AI agent workflow builder interface'
|
||||
width={300}
|
||||
height={240}
|
||||
@@ -149,7 +144,7 @@ export default function OpenAiN8nSim() {
|
||||
>
|
||||
<Avatar className='size-6'>
|
||||
<AvatarImage
|
||||
src='/building/openai-vs-n8n-vs-sim/emir-karabeg.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/emir-karabeg.png'
|
||||
alt='Emir Karabeg'
|
||||
/>
|
||||
<AvatarFallback>EK</AvatarFallback>
|
||||
@@ -195,7 +190,7 @@ export default function OpenAiN8nSim() {
|
||||
>
|
||||
<Avatar className='size-6'>
|
||||
<AvatarImage
|
||||
src='/building/openai-vs-n8n-vs-sim/emir-karabeg.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/emir-karabeg.png'
|
||||
alt='Emir Karabeg'
|
||||
/>
|
||||
<AvatarFallback>EK</AvatarFallback>
|
||||
@@ -253,7 +248,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/openai.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/openai.png'
|
||||
alt='OpenAI AgentKit workflow interface'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -288,7 +283,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/widgets.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/widgets.png'
|
||||
alt='OpenAI AgentKit custom widgets interface'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -371,7 +366,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/n8n.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/n8n.png'
|
||||
alt='n8n workflow automation interface'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -489,7 +484,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/sim.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/sim.png'
|
||||
alt='Sim visual workflow builder with AI agent blocks'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -515,7 +510,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/copilot.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/copilot.png'
|
||||
alt='Sim AI Copilot assisting with workflow development'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -540,7 +535,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/templates.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/templates.png'
|
||||
alt='Sim workflow templates gallery'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -621,7 +616,7 @@ export default function OpenAiN8nSim() {
|
||||
|
||||
<figure className='my-8 overflow-hidden rounded-lg'>
|
||||
<Image
|
||||
src='/building/openai-vs-n8n-vs-sim/logs.png'
|
||||
src='/blog/openai-vs-n8n-vs-sim/logs.png'
|
||||
alt='Sim execution logs and monitoring dashboard'
|
||||
width={800}
|
||||
height={450}
|
||||
@@ -2,7 +2,7 @@ import type { Metadata } from 'next'
|
||||
import OpenAiN8nSim from './openai-n8n-sim'
|
||||
|
||||
const baseUrl = 'https://sim.ai'
|
||||
const canonicalUrl = `${baseUrl}/building/openai-vs-n8n-vs-sim`
|
||||
const canonicalUrl = `${baseUrl}/blog/openai-vs-n8n-vs-sim`
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'OpenAI AgentKit vs n8n vs Sim: AI Agent Workflow Builder Comparison | Sim',
|
||||
@@ -106,7 +106,7 @@ export const metadata: Metadata = {
|
||||
],
|
||||
images: [
|
||||
{
|
||||
url: `${baseUrl}/building/openai-vs-n8n-vs-sim/workflow.png`,
|
||||
url: `${baseUrl}/blog/openai-vs-n8n-vs-sim/workflow.png`,
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: 'Sim AI agent workflow builder interface comparison',
|
||||
@@ -118,7 +118,7 @@ export const metadata: Metadata = {
|
||||
title: 'OpenAI AgentKit vs n8n vs Sim: AI Agent Workflow Builder Comparison',
|
||||
description:
|
||||
'Compare OpenAI AgentKit, n8n, and Sim for building AI agent workflows. Explore key differences in capabilities, integrations, and which platform fits your production needs.',
|
||||
images: ['/building/openai-vs-n8n-vs-sim/workflow.png'],
|
||||
images: ['/blog/openai-vs-n8n-vs-sim/workflow.png'],
|
||||
creator: '@karabegemir',
|
||||
site: '@simai',
|
||||
},
|
||||
@@ -130,10 +130,6 @@ export const metadata: Metadata = {
|
||||
},
|
||||
}
|
||||
|
||||
/**
|
||||
* Blog post page comparing OpenAI AgentKit, n8n, and Sim workflow builders for AI agents.
|
||||
* Optimized for SEO with structured data, canonical URLs, and comprehensive metadata.
|
||||
*/
|
||||
export default function Page() {
|
||||
return <OpenAiN8nSim />
|
||||
}
|
||||
5
apps/sim/app/(landing)/blog/page.tsx
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from 'next/navigation'
|
||||
|
||||
export default function BlogPage() {
|
||||
redirect('/blog/openai-vs-n8n-vs-sim')
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
import { redirect } from 'next/navigation'
|
||||
|
||||
/**
|
||||
* Redirects /building to the latest blog post
|
||||
*/
|
||||
export default function BuildingPage() {
|
||||
redirect('/building/openai-vs-n8n-vs-sim')
|
||||
}
|
||||
@@ -216,10 +216,10 @@ export default function Footer({ fullWidth = false }: FooterProps) {
|
||||
Enterprise
|
||||
</Link>
|
||||
<Link
|
||||
href='/building'
|
||||
href='/blog'
|
||||
className='text-[14px] text-muted-foreground transition-colors hover:text-foreground'
|
||||
>
|
||||
Building
|
||||
Blog
|
||||
</Link>
|
||||
<Link
|
||||
href='/changelog'
|
||||
|
||||
@@ -40,15 +40,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
// Blog posts and content pages
|
||||
const blogPages = [
|
||||
{
|
||||
url: `${baseUrl}/building/openai-vs-n8n-vs-sim`,
|
||||
lastModified: new Date('2025-10-06'),
|
||||
url: `${baseUrl}/blog/openai-vs-n8n-vs-sim`,
|
||||
lastModified: new Date('2025-10-11'),
|
||||
changeFrequency: 'monthly' as const,
|
||||
priority: 0.9,
|
||||
},
|
||||
]
|
||||
|
||||
// You can add dynamic pages here by fetching from database
|
||||
// const dynamicPages = await fetchDynamicPages()
|
||||
|
||||
return [...staticPages, ...blogPages]
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
|
||||
pathname.startsWith('/verify') ||
|
||||
pathname.startsWith('/changelog') ||
|
||||
pathname.startsWith('/chat') ||
|
||||
pathname.startsWith('/building')
|
||||
pathname.startsWith('/blog')
|
||||
? 'light'
|
||||
: undefined
|
||||
|
||||
|
||||
@@ -209,6 +209,13 @@ const nextConfig: NextConfig = {
|
||||
async redirects() {
|
||||
const redirects = []
|
||||
|
||||
// Redirect /building to /blog (legacy URL support)
|
||||
redirects.push({
|
||||
source: '/building/:path*',
|
||||
destination: '/blog/:path*',
|
||||
permanent: true,
|
||||
})
|
||||
|
||||
// Only enable domain redirects for the hosted version
|
||||
if (isHosted) {
|
||||
redirects.push(
|
||||
|
||||
|
Before Width: | Height: | Size: 487 KiB After Width: | Height: | Size: 487 KiB |
|
Before Width: | Height: | Size: 2.0 MiB After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 234 KiB |
|
Before Width: | Height: | Size: 657 KiB After Width: | Height: | Size: 657 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 301 KiB After Width: | Height: | Size: 301 KiB |
|
Before Width: | Height: | Size: 338 KiB After Width: | Height: | Size: 338 KiB |
|
Before Width: | Height: | Size: 863 KiB After Width: | Height: | Size: 863 KiB |
|
Before Width: | Height: | Size: 325 KiB After Width: | Height: | Size: 325 KiB |