From 277fdb0643f2de3f4eace443ccfe7fa0d7eec6d9 Mon Sep 17 00:00:00 2001 From: Emir Karabeg Date: Sun, 5 Apr 2026 12:35:00 -0700 Subject: [PATCH 1/4] improvement(landing, blog): SEO and GEO optimization --- .../app/(landing)/blog/[slug]/back-link.tsx | 41 +++-- .../sim/app/(landing)/blog/[slug]/loading.tsx | 65 +++---- apps/sim/app/(landing)/blog/[slug]/page.tsx | 167 ++++++++++-------- .../app/(landing)/blog/authors/[id]/page.tsx | 60 ++++++- apps/sim/app/(landing)/blog/layout.tsx | 13 +- apps/sim/app/(landing)/blog/page.tsx | 94 +++++++--- apps/sim/app/(landing)/blog/rss.xml/route.ts | 8 +- apps/sim/app/(landing)/blog/tags/page.tsx | 30 ++++ .../navbar/components/github-stars.tsx | 2 +- apps/sim/app/sitemap.ts | 4 + apps/sim/lib/blog/faq.tsx | 14 +- apps/sim/lib/blog/registry.ts | 10 +- apps/sim/lib/blog/schema.ts | 2 + apps/sim/lib/blog/seo.ts | 51 +++++- apps/sim/public/llms.txt | 38 ++++ 15 files changed, 424 insertions(+), 175 deletions(-) create mode 100644 apps/sim/public/llms.txt diff --git a/apps/sim/app/(landing)/blog/[slug]/back-link.tsx b/apps/sim/app/(landing)/blog/[slug]/back-link.tsx index d9b6874e682..ecfdbfbee05 100644 --- a/apps/sim/app/(landing)/blog/[slug]/back-link.tsx +++ b/apps/sim/app/(landing)/blog/[slug]/back-link.tsx @@ -1,26 +1,39 @@ 'use client' -import { useState } from 'react' -import { ArrowLeft, ChevronLeft } from 'lucide-react' import Link from 'next/link' export function BackLink() { - const [isHovered, setIsHovered] = useState(false) - return ( setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} + className='group/link inline-flex items-center gap-1.5 font-season text-[var(--landing-text-muted)] text-sm tracking-[0.02em] hover:text-[var(--landing-text)]' > - - {isHovered ? ( - + + + + Back to Blog ) diff --git a/apps/sim/app/(landing)/blog/[slug]/loading.tsx b/apps/sim/app/(landing)/blog/[slug]/loading.tsx index 8d08751229c..4fe3417e5d5 100644 --- a/apps/sim/app/(landing)/blog/[slug]/loading.tsx +++ b/apps/sim/app/(landing)/blog/[slug]/loading.tsx @@ -2,58 +2,51 @@ import { Skeleton } from '@/components/emcn' export default function BlogPostLoading() { return ( -
- {/* Header area */} -
- {/* Back link */} +
+
- +
- {/* Image + title row */}
- {/* Image */}
- +
- {/* Title + author */}
- - + + + +
-
+
+
- - + +
-
- {/* Divider */} - - {/* Date + description */} -
- -
- - -
-
- {/* Article body */} -
-
- - - - - - - - + +
+ +
+
+
+ + + + + + + + +
+ +
) } diff --git a/apps/sim/app/(landing)/blog/[slug]/page.tsx b/apps/sim/app/(landing)/blog/[slug]/page.tsx index 200d3bb0d44..153c050ee57 100644 --- a/apps/sim/app/(landing)/blog/[slug]/page.tsx +++ b/apps/sim/app/(landing)/blog/[slug]/page.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { Avatar, AvatarFallback, AvatarImage } from '@/components/emcn' import { FAQ } from '@/lib/blog/faq' import { getAllPostMeta, getPostBySlug, getRelatedPosts } from '@/lib/blog/registry' -import { buildArticleJsonLd, buildBreadcrumbJsonLd, buildPostMetadata } from '@/lib/blog/seo' +import { buildPostGraphJsonLd, buildPostMetadata } from '@/lib/blog/seo' import { getBaseUrl } from '@/lib/core/utils/urls' import { BackLink } from '@/app/(landing)/blog/[slug]/back-link' import { ShareButton } from '@/app/(landing)/blog/[slug]/share-button' @@ -30,27 +30,27 @@ export default async function Page({ params }: { params: Promise<{ slug: string const { slug } = await params const post = await getPostBySlug(slug) const Article = post.Content - const jsonLd = buildArticleJsonLd(post) - const breadcrumbLd = buildBreadcrumbJsonLd(post) + const graphJsonLd = buildPostGraphJsonLd(post) const related = await getRelatedPosts(slug, 3) return ( -
+