Paragraphs
For headless and Jamstack teams

The translation backend Next.js, Astro, and Nuxt have been waiting for.

Your CMS doesn't translate. Your framework's i18n doesn't know about your CMS. Paragraphs lives in the gap, feeding both.

The headless problem

The middle layer is where translation broke.

Modern headless stacks are excellent at locale routing (next-intl, Astro i18n, @nuxtjs/i18n) and at delivering content (Sanity, headless WP, Payload). Where they fall down is the bit in the middle: how does CMS-sourced content become a locale-correct message that a framework runtime can read? That's the gap we live in.

What we do for headless teams

Three primitives.

Graph → SDK

TypeScript SDK reads the graph by project + locale. Use it from any server runtime.

SDK → framework adapter

@paragraphs/next, /astro, /nuxt. Each exports the idioms its framework community already knows.

Adapter → native i18n

Output written in the format your framework's i18n library expects. next-intl gets messages/. Astro gets content collections.

Code, three ways

Same graph, three frameworks.

Next.js — postbuild ts
import { syncToNextIntl } from "@paragraphs/next";

await syncToNextIntl({
  apiKey: process.env.PARAGRAPHS_API_KEY!,
  projectId: process.env.PARAGRAPHS_PROJECT_ID!,
  outputDir: "./messages",
  locales: ["en", "es", "fr"],
});
Astro — integration ts
import paragraphs from "@paragraphs/astro";

export default defineConfig({
  integrations: [
    paragraphs({
      locales: ["en", "es", "fr"],
      mode: "at-build",
    }),
  ],
});
Nuxt — module ts
export default defineNuxtConfig({
  modules: ["@paragraphs/nuxt"],
  paragraphs: {
    apiKey: process.env.PARAGRAPHS_API_KEY,
    projectId: process.env.PARAGRAPHS_PROJECT_ID,
    locales: ["en", "es", "fr"],
  },
});
Webhooks

On-demand revalidation, no rebuild.

Paragraphs emits webhooks on translation events: translation.created, translation.approved, translation.rejected. Wire them to your framework's revalidation API to keep static pages fresh in seconds, not minutes.

Start free in 30 seconds.

No credit card. 100,000 words on the free tier. Self-serve onboarding.