Scribe

多言語MDXサイトのためのGitベースCMS

英語のコンテンツはリポジトリ内のMDXファイルで管理。AIによる翻訳はSQLiteファイルに保存され、両者はZodでバリデーションされます。ビルド時に型付きのランタイムですべてを読み込むため、CMSサーバーやリクエスト時のネットワーク通信は不要です。

pnpm add scribe-cms zod better-sqlite3

仕組み

  1. 1

    スキーマの定義

    コンテンツタイプはZodスキーマで定義します。翻訳対象のフィールド、英語のみのフィールド、ドキュメント間の参照方法などを設定します。

    // 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. 2

    コンテンツの作成

    1つのドキュメントにつき1つのMDXファイルを作成し、リポジトリにコミットします。ファイル名が英語のスラッグとなり、フロントマターはスキーマに基づいて検証されます。

    ---
    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. 3

    差分のみを翻訳

    翻訳対象のコンテンツはハッシュ化され、不足分や古いページだけがGeminiに送信されます。Batch APIを利用するためトークンコストは半額。トランスクリエーションに特化したプロンプトで、ネイティブが書いたような自然な文章に仕上がります。出力はMDXとして解析されてから保存されるため、AIのミスでサイトが壊れることはありません。

    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. 4

    型安全な読み込み

    ランタイムが設定からドキュメントの型を推論します。リスト、検索、リレーション、hreflangの代替URL、サイトマップの各要素が、すべて型付きで取得できます。

    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!);

主な機能

インクリメンタルな翻訳

翻訳は英語の元データのハッシュに紐付けられます。1段落だけ編集した場合はそのドキュメントのみが再翻訳され、実行前にドライランでコストを確認できます。

ネイティブのような自然な文章

プロンプトはトランスクリエーションに特化して構築されています。直訳ではなく、現地の表現に合わせて再構成するため、自然なコピーライティングが実現します。

保存前のバリデーション

すべての翻訳は保存前にMDXとして解析され、Zodスキーマに照らして再チェックされます。AIの出力ミスがあってもコマンドが失敗するだけで、本番環境には影響しません。

エンドツーエンドの型付け

Zodスキーマと推論されたドキュメント型を利用し、コード生成は不要。リレーションは自動的に解決され、完全な型付きデータとして取得できます。

インライントークン

リンク、アセット、翻訳不要な文字列を文章中に直接埋め込めます。トークンを編集するだけで、再翻訳することなくすべての言語に即座に反映されます。

SEO対策を標準搭載

hreflangの代替URL、x-defaultを含むサイトマップ、カノニカルタグ、noindex、JSONによるリダイレクトルール、ロケールのフォールバックチェーンに対応しています。

すべてをGitで管理

MDXファイルと1つのSQLiteデータベースをコミットするだけ。スナップショットで翻訳元の状態を記録し、scribe historyで変更履歴を確認できます。

サーバー不要

すべてビルド時にディスクから読み込まれるため、Next.js、Astroなど任意のNode環境で動作します。ローカルの管理画面では、閲覧、検索、翻訳の網羅率をひと目で確認できます。

AIファーストの設計

エージェントはコード編集と同じツールを使ってMDXを読み書きし、すべての変更はDiffとしてレビュー可能。AIモデルとコンテンツの間に不要なAPIは介在しません。

オープンな開発

scribe-cmsはMITライセンスで公開され、GitHub上で開発されています。このサイト自体もscribeで構築されており、すべてのページが10言語対応のSQLiteストアとしてコミットされています。ソースコードを読んだり、Issueを立てたり、プルリクエストを送ったりして、ぜひ参加してください。

多言語MDXサイトのためのGitベースCMS