運用するものが増えない
エディターはサイトの横に置くだけの静的なディレクトリです。話し相手は GitHub だけ。デプロイするバックエンドも、当てるパッチも、払う料金も、見張る対象もありません。
オープンソース · MIT
記事は GitHub リポジトリの中の Markdown ファイルです。Simple Git CMS は静的なページ 1 枚で、書く人のブラウザーから GitHub API 経由でそれを読み書きします。自分のサーバーも、データベースも要りません。
デモはブラウザーの中にリポジトリをでっち上げます。ログイン不要、どこにも送信しません。
エディターはサイトの横に置くだけの静的なディレクトリです。話し相手は GitHub だけ。デプロイするバックエンドも、当てるパッチも、払う料金も、見張る対象もありません。
push できる人が編集できます。ユーザー表も、同期するロールも、権限を剥がす 2 つ目の場所もなし。誰が何を変えたかは、もともと git の履歴にあります。
記事と画像は 1 つのコミットとして入るので、今ある CI がそのままビルドしてデプロイします。公開したあとは、上のバーがその GitHub Actions の実行を追いかけます。
下書きの保存には [skip ci] が付くので、ビルドは走りません。開いている間に他の人が同じ記事を変えていた場合は、どちらかを失わせる代わりに、相手の版と自分の版を並べて選ばせます。
既存の記事を開いて保存し直しても、ファイルは 1 バイトも変わりません。余計な HTML も、勝手な整形もなし。
貼る、落とす、まとめて選ぶ。ブラウザーで webp に圧縮してから、切り抜き・回転・キャプション・横並び・差し替え。
記事はあなたのサイト自身が描画します。デスクトップ幅と電話幅、まだ保存していない変更や画像も含めて。
タイトル・日付・タグ・要約。下書き保存、公開、下書きに戻す、削除——どれも普通のコミットです。
保存の前に、ファイルが裏で動いていないか確かめます。動いていたら、相手の版か自分の版かを選べます。
GitHub App の全画面リダイレクトなので電話でも通ります。トークンは自動で更新。細粒度アクセストークンを貼る手もあります。
English、简体中文、日本語をその場で切り替え。4 つ目を足すのは文字列ファイル 1 枚です。
ログイン中継は依存ゼロの 1 ファイル。Cloudflare Workers、Deno Deploy、Vercel、Netlify、Bun、自前の Node サーバー。
4 ステップ。一番時間がかかるのは設定ファイルを書くところです。
サイトの静的ディレクトリのどこかへ。URL は /editor/ になります。更新も同じ 2 コマンドで、config.json とロゴはそのまま残ります。
npm install
npm run build
node scripts/install.mjs ../my-site/public/editor
エディターの 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" }
}
1 ファイルと GitHub App 1 つ。ドキュメントは Cloudflare Workers ですが、fetch がある環境ならどこでも。
GitHub アカウント、リポジトリの書き込み権限、そのリポジトリに入れた App。権限の仕組みはこれだけです。
エディターが知らない frontmatter はそのまま残すので、すでにあるサイトの記事も編集できます。新しい記事のファイル名は、作った「分」です。
---
title: "A title"
date: 2026-10-21T03:00:00.000Z
tags: ["tag one", "tag two"]
draft: true
---
The body, in Markdown.

後で気づくほうが困るので、README にも書いてあります。
localStorage に置きます。バックエンドのないエディターでは普通の割り切りです。自分が管理するドメインから配信してください。