Il CMS basato su git per siti multilingua in MDX
I contenuti in inglese risiedono in file MDX nel tuo repository. Le traduzioni IA sono in un database SQLite accanto a loro. Zod valida entrambi, mentre un runtime tipizzato legge tutto in fase di compilazione. Nessun server CMS, nessuna richiesta di rete a runtime.
pnpm add scribe-cms zod better-sqlite3Come funziona
- 1
Definisci uno schema
I tipi di contenuto sono schemi Zod. Indica quali campi vanno tradotti, quali restano solo in inglese e come i documenti si relazionano tra loro.
// scribe.config.ts defineContentType({ id: "blog", path: "/blog/{slug}", slugStrategy: "localized", schema: z.object({ title: field.translatable(z.string().min(1)), description: field.translatable(z.string().min(50)), author: field.relation("author"), heroImage: field.structural(z.string().optional()), }), }); - 2
Scrivi i contenuti
Un file MDX per ogni documento, committato nel repository. Il nome del file fa da slug in inglese; il frontmatter viene validato in base allo schema.
--- title: "Hello, world" description: "A first post that says hello to the world." author: jane publishedAt: "2026-01-15" --- The body is MDX. **Markdown** and <Components /> both work. - 3
Traduci le modifiche
I contenuti da tradurre hanno un hash: solo le pagine nuove o aggiornate vengono inviate a Gemini (tramite Batch API, dimezzando il costo dei token). Il prompt è calibrato per la transcreation, per farti ottenere testi che sembrano scritti da un madrelingua. L'output viene parsato come MDX prima di essere salvato; un errore del modello fa fallire lo script, non il sito.
export GEMINI_API_KEY=... npx scribe translate --locale fr de --dry-run # show the worklist npx scribe translate --locale fr de # translate, validate, store git add .scribe/store.sqlite # translations live in git - 4
Leggi tutto, già tipizzato
Il runtime deduce i tipi di documento direttamente dalla tua configurazione. Elenchi, query, relazioni, hreflang e sitemap: tutto ti viene restituito già tipizzato.
const scribe = createScribe(config); const posts = scribe.blog.list("fr"); // BlogDoc[] const { document } = scribe.blog.resolve(slug, "fr"); // EN fallback built in const author = scribe.blog.related(document!, "author"); // AuthorDoc const hreflang = scribe.blog.alternates(document!);
Cosa include
Traduzioni incrementali
Ogni traduzione è legata all'hash della sua fonte inglese. Modifichi un paragrafo? Viene tradotto solo quel documento (un dry run ti anticipa il costo).
Sembra scritto da un madrelingua
Il prompt è strutturato per la transcreation: riproduce lo stile di un copywriter e adatta le espressioni, invece di tradurre parola per parola.
Validato prima del salvataggio
Ogni traduzione viene elaborata come MDX e verificata nuovamente con il tuo schema Zod prima di salvarla. Se il modello sbaglia, si blocca il comando e la produzione è salva.
Tipizzazione end-to-end
Schemi Zod e tipi dedotti dai documenti, senza alcuna generazione di codice. Le relazioni vengono risolte e tipizzate automaticamente.
Token in linea
Link, asset e stringhe non traducibili sono incorporati direttamente nel testo. Modifichi un token e tutte le lingue si aggiornano all'istante, senza dover ritradurre.
SEO nativa
Tag hreflang, sitemap con x-default, canonical, noindex, regole di redirect in JSON e catene di fallback per la localizzazione.
Tutto sotto git
File MDX e un singolo database SQLite da includere nel repository. Gli snapshot tengono traccia della fonte di ogni traduzione; scribe history ti mostra tutta l'evoluzione.
Nessun server
Tutto viene letto dal disco in fase di build; ideale per Next.js, Astro o qualsiasi stack Node. Un'interfaccia locale ti permette di esplorare, cercare e controllare lo stato dei contenuti.
Nato per l'IA
Gli agenti IA leggono e modificano l'MDX con gli stessi strumenti che usano per il codice, e ogni modifica diventa una diff da revisionare. Non ci sono API di mezzo tra il modello e i tuoi testi.
Sviluppato alla luce del sole
scribe-cms ha licenza MIT e lo sviluppo avviene su GitHub. Anche questo sito lo usa! Ogni singola pagina è creata con scribe, basata su un database SQLite salvato nel repo per gestire ben dieci lingue. Dai un'occhiata al codice sorgente, apri una issue o invia una pull request.