Build content-driven products on Brandfine
A multi-tenant headless CMS with localized content, structured navigations, and instant cache invalidation via webhooks. Everything you need to wire up a marketing site, a SaaS dashboard, or a content portal.
What is Brandfine?
A headless CMS that treats your frontend as a first-class consumer. Structured content, typed APIs, and an SDK that handles the boring parts (auth, caching, locale resolution).
Multi-tenant by design
Every team has isolated workspaces. API keys, content, and webhooks are scoped — no cross-tenant leakage.
Localized content
First-class locales. Translation groups link sibling posts; the SDK resolves the right one per request.
Webhook-driven SWR
Server-side caches refresh the moment editors publish. Stale-while-revalidate keeps requests fast.
Pick your path
Same data, three integration shapes. Use the SDK if you're on Node-flavored TypeScript, drop to REST anywhere else, or install the plugin if your site runs on WordPress.
TypeScript SDK
RecommendedTyped client + server-side caches + locale resolvers + a one-line webhook handler. Works on Astro, Next, Remix, Bun, Workers.
npm i @brandfine/clientRead the SDK guide→REST API
Plain HTTP under /external/*. Bring your own client, your own caching layer, your own language. API-key auth, JSON in and out.
curl -H 'X-Api-Key: …' …Read the API reference→WordPress plugin
WordPressDrop Brandfine onto any WordPress site for booking widgets, centralized forms, and privacy-friendly analytics. No code — just a shortcode or Gutenberg block.
[brandfine_appointments]WordPress quick start→From zero to fetching content
Three steps. Create a workspace API key in the dashboard, install the SDK, fetch your first post. The SDK ships with stale-while-revalidate caches, so production reads are served from memory.
Full getting-started guide →import { createBrandfineClient } from '@brandfine/client'
export const bf = createBrandfineClient({
baseUrl: process.env.BRANDFINE_API_URL!,
apiKey: process.env.BRANDFINE_API_KEY!,
})
const posts = await bf.posts.list({
type: 'blog',
locale: 'en',
})Using ChatGPT, Claude, or Cursor?
We ship llms.txt files so AI tools can ingest these docs without scraping styled HTML. Drop the URL below into your prompt — the model picks up the entire reference in one shot.