@blanketseo/blog-manager
v0.1.3
Published
BlanketSEO blog integration package for Next.js
Readme
@blanketseo/blog-manager
Typed BlanketSEO blog integration package for Next.js App Router.
Install
pnpm add @blanketseo/blog-managerEnvironment variables
BLANKETSEO_API_URLBLANKETSEO_API_KEYBLANKETSEO_SITE_ID(required public UUID, not a numeric/internal ID)BLANKETSEO_WEBHOOK_SECRET
Basic usage
import { createBlanketSEOClient } from '@blanketseo/blog-manager'
const client = createBlanketSEOClient({
baseUrl: process.env.BLANKETSEO_API_URL,
apiKey: process.env.BLANKETSEO_API_KEY,
siteId: process.env.BLANKETSEO_SITE_ID! // public UUID
})
const posts = await client.posts.list({
fetchOptions: { next: { revalidate: 300 } }
})Public API auth contract
Authorization: Bearer <api key>must belong to the same workspace assiteId.x-blanketseo-project-idis optional during deprecation and ignored for UUID routes.- Workspace scoping is enforced by API key hash + resolved
siteId.
Next.js helpers
import { generateBlogMetadata, generateBlogStaticParams } from '@blanketseo/blog-manager/next'Webhook usage
import {
verifyBlanketSEOWebhookSignature,
getRevalidationTargetsFromWebhook
} from '@blanketseo/blog-manager/next'
const isValid = verifyBlanketSEOWebhookSignature({ secret, body, signature })
if (!isValid) return new Response('Invalid signature', { status: 401 })
const { paths } = getRevalidationTargetsFromWebhook(JSON.parse(body))React renderer theming
BlogRenderer now supports a theme prop for design-token style customization while preserving default visuals if omitted.
import { BlogRenderer, type BlogRendererTheme } from '@blanketseo/blog-manager/react'
const theme: BlogRendererTheme = {
fontFamilyBody: 'Inter, system-ui, sans-serif',
fontFamilyHeadings: 'Manrope, Inter, sans-serif',
headingColor: '#0f172a',
bodyColor: '#1f2937',
h1Size: 'clamp(2.2rem, 4vw, 3rem)',
h2Size: 'clamp(1.7rem, 3vw, 2.2rem)',
h3Size: 'clamp(1.35rem, 2.4vw, 1.75rem)',
linkColor: '#2563eb',
blockquoteBorderColor: '#64748b',
tableBorderColor: '#cbd5e1'
}
<BlogRenderer post={post} theme={theme} />Targeted className overrides
Use tocClassName and contentClassName for scoped CSS overrides.
<BlogRenderer
post={post}
tocClassName="blog-post__toc"
contentClassName="blog-post__content"
/>