---
content_id: 01KQ7B8NRYG7ZCG2SETP9K42NK
visibility: public
permanent: true
created: 2026-04-27T11:30:18.526Z
modified: 2026-04-27T11:30:18.526Z
tags:
  - cc0
---

# CMSを自作して得た教訓

![](https://wp.baku89.com/wp-content/uploads/2026/04/www-and-garden-1775923377167.png)

Agentic codingの普及で、CMS自作がこれから普通になってくると思う。その一助になればと思って書いた。[[cc0|CC0]]ですので、ご自由にプロンプトにお使いください

[[garden|garden.ooo]]をつくるなかで、学んだこと：

1. **ページ本文やメタデータは全て単一のスキームに統一する**
    - カスタム投稿タイプだとかを作らない。日記、作品、CVといった固定ページなどをなるたけ包摂できる、汎用的なスキームを用意する
3. **タグやカテゴリをただのページとして扱う。分類する専用の概念として別立てしない**
   - 「ページAからBにリンクが貼られていること」を、「ページAはBというカテゴリに属する」と解釈する
   - カテゴリやタグは特殊なリンクの仕方として扱ってみる。本文リンクの代わりに`categories`や`tags`といったメタデータにページURLを入力できるようにする、とか
4. **プレーンテキストで表せる軽量マークアップ言語を単一のソース源とする**
    - Markdownとか。その際、かならずHTMLそのものを触れるようにしておく[^silly-saas]
      - React/JSX圏ならMDX、Vue.js勢ならMDC
    - エディタまでを頑張って開発しなくても済むようになる。[[Obsidian]]のvaultをそのままソースにするのが楽。Obsidianを編集につかえるから
    - あとはLLMとの相性もいい
6. **フォルダ整理をしない**
   - c.f. [[階層性と線形性を信じない]]
8. **Trailing slash（ページ末尾のスラッシュ）の有無を区別できるようにする**
   - `xxx.md` → `example.com/xxx`
   - `xxx/index.md` → `example.com/xxx/`
   - のようにURLをマッピングする。ディレクトリごとに git submodule を分けたいときなどに便利

## 関連

- [[list-of-digital-gardens|Digital Gardens]]

[^silly-saas]: WWWへの理解が浅い経営者の方による反面教師的な放言→ [[「HTMLを書かせるCMSは全然ユーザーファーストじゃない」]]