SvelteKit
SveltekitSvelteKit
Generate a unique OG image for every page, or any on-demand graphic, from a single Imejis template. The pattern below uses a SvelteKit server endpoint as a thin proxy: your API key stays on the server, and the browser (and social crawlers) only ever see your own URL.
Set two environment variables first: IMEJIS_API_KEY (from your dashboard) and IMEJIS_DESIGN_ID (any design's ID).
IMEJIS_API_KEY=your_api_key
IMEJIS_DESIGN_ID=your_design_id1 a server endpoint that renders the image1. A server endpoint that renders the image
This endpoint takes a title query param, POSTs it to Imejis as a component.property override, and returns the finished image. Reading the key from $env/static/private guarantees it never reaches the client.
import { IMEJIS_API_KEY, IMEJIS_DESIGN_ID } from "$env/static/private"
import type { RequestHandler } from "./$types"
export const GET: RequestHandler = async ({ url }) => {
const title = url.searchParams.get("title") ?? "Untitled"
const res = await fetch(`https://render.imejis.io/v1/${IMEJIS_DESIGN_ID}`, {
method: "POST",
headers: {
"dma-api-key": IMEJIS_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ "headline.text": title }),
})
return new Response(res.body, {
headers: {
"Content-Type": "image/jpeg",
// Renders are deterministic, so cache aggressively at the edge/CDN.
"Cache-Control": "public, immutable, no-transform, max-age=31536000",
},
})
}2 point your metadata at it2. Point your metadata at it
Reference the endpoint from a page's <svelte:head>, passing each page's real data. Social platforms fetch /og?title=… from your own domain, no key exposed.
<script lang="ts">
export let data
const ogImage = `https://your-site.com/og?title=${encodeURIComponent(
data.title
)}`
</script>
<svelte:head>
<title>{data.title}</title>
<meta property="og:image" content={ogImage} />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content={ogImage} />
</svelte:head>Override any field. Each dynamic component exposes keys like headline.text, title.color, or image.image. Send only the ones you want to change. A design's overridable fields are listed in its Share / API panel.