ScribeТипизированная MDX CMS

Примеры

Готовые фрагменты для типичных сценариев scribe-cms.

Установка

Добавьте scribe-cms в любой проект Node 20+.

pnpm add scribe-cms zod better-sqlite3

Конфигурация

Определяйте типы контента с помощью Zod — переводимые, структурные и реляционные поля.

import { z } from "zod";
import { defineConfig, defineContentType, field } from "scribe-cms";

const blogSchema = z.object({
title: field.translatable(z.string().min(1)),
description: field.translatable(z.string().min(50)),
author: field.relation("author"),
});

const authorSchema = z.object({
name: field.structural(z.string().min(1)),
});

export default defineConfig({
  rootDir: ".",
  locales: ["en", "fr"],
  types: [
    defineContentType({
      id: "blog",
      path: "/blog/{slug}",
      schema: blogSchema,
      slugStrategy: "localized",
    }),
    defineContentType({
      id: "author",
      contentDir: "authors",
      schema: authorSchema,
    }),
  ],
});

Файл контента

Один файл .mdx на каждый документ — имя файла служит англоязычным слагом.

---
title: "Привет, мир"
description: "Первая публикация, которая обстоятельно приветствует мир, поскольку схема требует не менее пятидесяти символов."
author: jane
publishedAt: "2026-01-15"
---

Содержимое написано в формате MDX. Поддерживаются как **Markdown**, так и компоненты.

Runtime

Чтение контента с помощью типизированного клиента: выводите списки, извлекайте документы и работайте со связями.

import { createScribe } from "scribe-cms/runtime";
import config from "./scribe.config";

const scribe = createScribe(config);

const posts = scribe.blog.list("fr");
const { document } = scribe.blog.resolve("hello-world", "fr");
const author = scribe.blog.related(document!, "author");

CLI

Проверяйте контент перед сборкой и переводите устаревшие страницы с помощью Gemini.

scribe validate
scribe translate --locale fr
scribe status
Примеры · Scribe