Simple Git CMS

オープンソース · MIT

書く人が使うエディター。
バックエンドは今あるリポジトリ。

記事は GitHub リポジトリの中の Markdown ファイルです。Simple Git CMS は静的なページ 1 枚で、書く人のブラウザーから GitHub API 経由でそれを読み書きします。自分のサーバーも、データベースも要りません。

ブラウザーで試す GitHub で見る サイトへの入れ方

デモはブラウザーの中にリポジトリをでっち上げます。ログイン不要、どこにも送信しません。

  • Astro や Hugo などに
  • 保存 1 回 = コミット 1 つ
  • English · 简体中文 · 日本語
キャプション付き画像のある記事を編集している Simple Git CMS エディター

手間が 3 つ消えます

01

運用するものが増えない

エディターはサイトの横に置くだけの静的なディレクトリです。話し相手は GitHub だけ。デプロイするバックエンドも、当てるパッチも、払う料金も、見張る対象もありません。

02

権限はリポジトリの権限そのまま

push できる人が編集できます。ユーザー表も、同期するロールも、権限を剥がす 2 つ目の場所もなし。誰が何を変えたかは、もともと git の履歴にあります。

03

公開はコミット 1 つ

記事と画像は 1 つのコミットとして入るので、今ある CI がそのままビルドしてデプロイします。公開したあとは、上のバーがその GitHub Actions の実行を追いかけます。

保存を押すと何が起きるか

エディター サイト上の静的なページ
1 コミット: article.md + 画像
GitHub API ブラウザーから、本人のトークンで
push で
GitHub Actions 今あるビルド
デプロイ
あなたのサイト Astro、Hugo、なんでも

下書きの保存には [skip ci] が付くので、ビルドは走りません。開いている間に他の人が同じ記事を変えていた場合は、どちらかを失わせる代わりに、相手の版と自分の版を並べて選ばせます。

できること

WYSIWYG なのに、きれいな Markdown

既存の記事を開いて保存し直しても、ファイルは 1 バイトも変わりません。余計な HTML も、勝手な整形もなし。

画像のために別のアプリを開かない

貼る、落とす、まとめて選ぶ。ブラウザーで webp に圧縮してから、切り抜き・回転・キャプション・横並び・差し替え。

自分のレイアウトでプレビュー

記事はあなたのサイト自身が描画します。デスクトップ幅と電話幅、まだ保存していない変更や画像も含めて。

下書き、公開、下書きに戻す

タイトル・日付・タグ・要約。下書き保存、公開、下書きに戻す、削除——どれも普通のコミットです。

衝突は見て見ぬふりをしない

保存の前に、ファイルが裏で動いていないか確かめます。動いていたら、相手の版か自分の版かを選べます。

GitHub アカウントでログイン

GitHub App の全画面リダイレクトなので電話でも通ります。トークンは自動で更新。細粒度アクセストークンを貼る手もあります。

インターフェースは 3 言語

English、简体中文、日本語をその場で切り替え。4 つ目を足すのは文字列ファイル 1 枚です。

ログイン中継はどこでも動く

ログイン中継は依存ゼロの 1 ファイル。Cloudflare Workers、Deno Deploy、Vercel、Netlify、Bun、自前の Node サーバー。

サイトへの入れ方

4 ステップ。一番時間がかかるのは設定ファイルを書くところです。

  1. 1

    エディターをビルドして入れる

    サイトの静的ディレクトリのどこかへ。URL は /editor/ になります。更新も同じ 2 コマンドで、config.json とロゴはそのまま残ります。

    npm install
    npm run build
    node scripts/install.mjs ../my-site/public/editor
  2. 2

    config.json を書く

    エディターの index.html の隣に。コンテンツの場所、画像の置き場所、インターフェースの名乗り方。

    {
      "repo": "owner/repo",
      "branch": "main",
      "siteUrl": "https://example.com",
      "timeZone": "Asia/Tokyo",
      "auth": { "base": "https://cms-auth.example.com" },
      "collection": {
        "dir": "src/content/news",
        "url": "/news/{id}/"
      },
      "media": { "dir": "public/uploads", "url": "/uploads" }
    }
  3. 3

    ログイン中継をデプロイ

    1 ファイルと GitHub App 1 つ。ドキュメントは Cloudflare Workers ですが、fetch がある環境ならどこでも。

  4. 4

    書く人を追加する

    GitHub アカウント、リポジトリの書き込み権限、そのリポジトリに入れた App。権限の仕組みはこれだけです。

書き出されるファイル

エディターが知らない frontmatter はそのまま残すので、すでにあるサイトの記事も編集できます。新しい記事のファイル名は、作った「分」です。

---
title: "A title"
date: 2026-10-21T03:00:00.000Z
tags: ["tag one", "tag two"]
draft: true
---

The body, in Markdown.
![](/uploads/20261021/abc.webp "An image caption")

向かない場合

後で気づくほうが困るので、README にも書いてあります。

  • 書く人に GitHub アカウントが必要です。なしで入れたいなら、自前のログインサービスを持つことになります。
  • 1 サイトに 1 コレクション、項目は上のとおり。
  • プレビューはブラウザーで Markdown を変換するため、サイト側だけに足した Markdown プラグインは反映されません。
  • GitHub トークンは localStorage に置きます。バックエンドのないエディターでは普通の割り切りです。自分が管理するドメインから配信してください。

全部を読む →

コードを見てみる

README 3 本、ネットワークを使わないテスト、そして午後いっぱいで読み切れる 2,000 行ほど。

AZQ1994/simple-git-cms