Das Git-basierte CMS für mehrsprachige MDX-Websites
Die englischen Inhalte liegen als MDX-Dateien in deinem Repository. KI-Übersetzungen werden in einer SQLite-Datenbank daneben gespeichert. Zod validiert beides, und eine typisierte Laufzeitumgebung liest beim Build-Prozess alles aus. Kein CMS-Server, keine Netzwerkabfragen zur Laufzeit.
pnpm add scribe-cms zod better-sqlite3So funktioniert's
- 1
Schema definieren
Inhaltstypen sind Zod-Schemas. Du legst fest, welche Felder übersetzt werden, welche englisch bleiben und wie Dokumente aufeinander verweisen.
// 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
Inhalte schreiben
Pro Dokument eine MDX-Datei, die direkt in dein Repo committet wird. Der Dateiname ist der englische Slug, das Frontmatter wird gegen das Schema validiert.
--- 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
Änderungen übersetzen
Übersetzbare Inhalte erhalten einen Hashwert. So werden nur fehlende oder veraltete Seiten an Gemini gesendet, und zwar über die Batch-API zum halben Token-Preis. Der Prompt ist auf Transkreation optimiert, damit die Texte klingen, als wären sie in der Zielsprache verfasst. Die Ausgabe wird als MDX geparst, bevor sie gespeichert wird. Bei einer schlechten Antwort schlägt der Durchlauf fehl, nicht aber deine Website.
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
Typisiert auslesen
Die Laufzeitumgebung leitet die Dokumenttypen aus deiner Konfiguration ab. Listen, Lookups, Relationen, hreflang-Alternativen und Sitemap-Einträge kommen alle vollständig typisiert zurück.
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!);
Das steckt drin
Inkrementelle Übersetzung
Übersetzungen sind an einen Hash ihrer englischen Quelle geknüpft. Ändere einen Absatz und nur dieses Dokument wird neu übersetzt. Ein Probelauf zeigt dir vorher die Kosten.
Liest sich wie von Muttersprachlern getextet
Der Prompt ist auf Transkreation ausgelegt: Die Stimme eines Native Copywriters, der Redewendungen kreativ nachbildet, anstatt Wort für Wort zu übersetzen.
Vor dem Speichern validiert
Jede Übersetzung wird als MDX geparst und erneut gegen dein Zod-Schema geprüft, bevor sie gespeichert wird. Modellfehler lassen den Befehl fehlschlagen, nicht die Produktion.
Durchgängig typisiert
Zod-Schemas, abgeleitete Dokumenttypen, kein Codegen. Relationen kommen dereferenziert und vollständig typisiert zurück.
Inline-Tokens
Links, Assets und nicht zu übersetzende Strings sind direkt in den Fließtext eingebettet. Änderst du ein Token, wird es sofort in allen Sprachen aktualisiert, ohne Neuübersetzung.
Integriertes SEO
hreflang-Alternativen, Sitemaps mit x-default, Canonicals, noindex, JSON-Weiterleitungsregeln und Fallback-Ketten für verschiedene Sprachen.
Alles in Git
MDX-Dateien und ein committeter SQLite-Speicher. Snapshots halten fest, auf welcher Basis jede Übersetzung erstellt wurde, während scribe history den zeitlichen Verlauf anzeigt.
Kein Server
Alles wird zur Build-Zeit von der Festplatte gelesen. Das funktioniert mit Next.js, Astro oder jedem beliebigen Node-Stack. Ein lokales Studio ergänzt das Ganze um Browsing, Suche und einen schnellen Überblick über die Abdeckung.
Konsequent AI-first
Agenten lesen und bearbeiten MDX mit denselben Werkzeugen, die sie auch für Code nutzen. Jede Änderung ist ein Diff, das du überprüfen kannst. Keine API zwischen dem Modell und dem Text.
Built in the open
scribe-cms steht unter der MIT-Lizenz und wird auf GitHub entwickelt. Diese Website läuft selbst damit. Jede Seite hier besteht aus scribe-Content mit einer committeten SQLite-Datenbank, die zehn Sprachen unterstützt. Schau dir den Quellcode an, eröffne ein Issue oder sende einen Pull Request.