この CMS の全体像
このサイトは 「GitHub Issues / Discussions を原稿にする CMS(コンテンツ管理システム)」です。無料・自動・GitHub 内で完結します。
4つの役割
| 役割 | コンポーネント | やること |
|---|---|---|
| ① 原稿 | GitHub Issues / Discussions | 記事を書く場所(CMS の入力画面の代わり) |
| ② 変換 | GitHub Actions + Node.js | 公開ラベルの記事を API で取得し .qmd を生成 |
| ③ 生成 | Quarto | 一覧・個別ページ・検索を静的生成 |
| ④ 公開 | GitHub Pages | 生成結果を無料でホスティング |
データの流れ
1. 記事を書く(Issue / Discussion)
2. status:published ラベルを付ける
3. GitHub Actions が自動で起動
├─ Node.js が GitHub API から記事本文を取得
├─ frontmatter を Quarto 用に変換して posts/{slug}/index.qmd を作成
└─ quarto render で _site/ を生成
4. _site/ が GitHub Pages にデプロイ
なぜ「Issue を書く」だけでブログになるのか
Issue / Discussion には次の便利な機能があります。
- ラベルで公開/非公開を制御できる
- 編集履歴が残る(GitHub 上で全文の差分が見られる)
- コメントで読者とやり取りできる
- 通知や GitHub App 連携が使える
つまり「専用の管理画面」を作らなくても、GitHub が管理画面の役割を果たしてくれます。
変換処理のポイント
GitHub の Issue 本文は次のように書きます(これが記事の「原稿」です)。
---
slug: my-first-post
title: My First Post
publishedAt: 2026-08-02
tags: [quarto, cms]
category: blog
---
# 本文
ここに Markdown で書く。この frontmatter は Node.js スクリプトが読み取り、Quarto 用のフィールド(date / categories / description)に変換して .qmd を生成します。
このサイトを動かすファイル
| ファイル | 役割 |
|---|---|
scripts/build-from-both.mjs |
Issue + Discussion を取得して .qmd 生成 |
scripts/lib/common.mjs |
変換ロジックの本体 |
.github/workflows/build.yml |
ビルド + デプロイの自動化 |
_quarto.yml |
Quarto のサイト設定 |
まとめ
- 「原稿 = Issue」「変換 = Actions」「生成 = Quarto」「公開 = Pages」
- 専用サーバー不要・無料・GitHub 内で完結
- 記事の公開は「ラベルを付けるだけ」という手軽さが最大の利点