fix(blog): rename building to blogs with redirect (#1604)

This commit is contained in:
Waleed
2025-10-11 11:42:47 -07:00
committed by waleed
parent e697e50d4e
commit ab63978ce8
18 changed files with 35 additions and 46 deletions

View File

@@ -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' />

View File

@@ -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}

View File

@@ -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 />
}

View File

@@ -0,0 +1,5 @@
import { redirect } from 'next/navigation'
export default function BlogPage() {
redirect('/blog/openai-vs-n8n-vs-sim')
}

View File

@@ -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')
}

View File

@@ -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'

View File

@@ -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]
}

View File

@@ -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

View File

@@ -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(

View File

Before

Width:  |  Height:  |  Size: 487 KiB

After

Width:  |  Height:  |  Size: 487 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 234 KiB

View File

Before

Width:  |  Height:  |  Size: 657 KiB

After

Width:  |  Height:  |  Size: 657 KiB

View File

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 148 KiB

View File

Before

Width:  |  Height:  |  Size: 301 KiB

After

Width:  |  Height:  |  Size: 301 KiB

View File

Before

Width:  |  Height:  |  Size: 338 KiB

After

Width:  |  Height:  |  Size: 338 KiB

View File

Before

Width:  |  Height:  |  Size: 863 KiB

After

Width:  |  Height:  |  Size: 863 KiB

View File

Before

Width:  |  Height:  |  Size: 325 KiB

After

Width:  |  Height:  |  Size: 325 KiB