Dynamic OG Images for Svelte

Add beautiful, dynamic social share images to your SvelteKit application with server-side rendering support.

Get API Key → Full Docs

SvelteKit Integration

SvelteKit's server-side rendering makes it perfect for dynamic OG images. Use the load function to generate image URLs.

Create a Utility

src/lib/og-image.ts
export function getOGImageUrl(params: {
  title: string;
  subtitle?: string;
  theme?: 'dark' | 'light';
}): string {
  const url = new URL('https://ogimageapi.io/api/generate');
  
  url.searchParams.set('title', params.title);
  if (params.subtitle) url.searchParams.set('subtitle', params.subtitle);
  url.searchParams.set('theme', params.theme || 'dark');
  
  return url.toString();
}

Blog Post Page

src/routes/blog/[slug]/+page.server.ts
import { getOGImageUrl } from '$lib/og-image';
import type { PageServerLoad } from './$types';

export const load: PageServerLoad = async ({ params }) => {
  const post = await getPost(params.slug);
  
  const ogImage = getOGImageUrl({
    title: post.title,
    subtitle: `By ${post.author}`,
    theme: 'dark'
  });
  
  return {
    post,
    meta: {
      title: post.title,
      description: post.excerpt,
      ogImage
    }
  };
};
src/routes/blog/[slug]/+page.svelte
<script lang="ts">
  import { page } from '$app/stores';
  export let data;
</script>

<svelte:head>
  <title>{data.meta.title}</title>
  <meta name="description" content={data.meta.description} />
  
  <!-- Open Graph -->
  <meta property="og:title" content={data.meta.title} />
  <meta property="og:description" content={data.meta.description} />
  <meta property="og:image" content={data.meta.ogImage} />
  <meta property="og:image:width" content="1200" />
  <meta property="og:image:height" content="630" />
  <meta property="og:type" content="article" />
  
  <!-- Twitter -->
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content={data.meta.title} />
  <meta name="twitter:description" content={data.meta.description} />
  <meta name="twitter:image" content={data.meta.ogImage} />
</svelte:head>

<article>
  <h1>{data.post.title}</h1>
  <!-- content -->
</article>

Reusable SEO Component

src/lib/components/SEO.svelte
<script lang="ts">
  import { getOGImageUrl } from '$lib/og-image';
  
  export let title: string;
  export let description: string;
  export let author: string = '';
  export let theme: 'dark' | 'light' = 'dark';
  
  $: ogImage = getOGImageUrl({
    title,
    subtitle: author,
    theme
  });
</script>

<svelte:head>
  <title>{title}</title>
  <meta name="description" content={description} />
  <meta property="og:title" content={title} />
  <meta property="og:description" content={description} />
  <meta property="og:image" content={ogImage} />
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:image" content={ogImage} />
</svelte:head>

Use it in any page:

<script>
  import SEO from '$lib/components/SEO.svelte';
</script>

<SEO 
  title="My Blog Post"
  description="A great article about Svelte"
  author="Jane Developer"
/>

Ready for Svelte OG Images?

Get started with 25 free images per month.

Get Your API Key →