---
title: 設計思想
date: 2026-02-24T09:34:07.441Z
updated: 2026-04-01T01:40:44.690Z
tags:
  - garden
url: https://baku89.com/ja/garden/design-principles
---

# 設計思想

## 階層性と線形性を信じない

garden.ooo には Custom Post Type がない。`work`、`event`、`member` のような投稿タイプも、カテゴリによる木構造上の分類もない。

そうした設計はその瞬間の見立てにすぎなくて、「`work` でもあり `event` でもある」ようなコンテンツが現れた瞬間に破綻する。Wordpress で`author`（著者）」というタクソノミーに著者プロフィール分を足したくなったらどうにもならないので。

コンテンツ同士の連関は「AがBに属する」のような集合論的な包含関係ではなく、「AがBを指し示す」というリンクによってのみ決まる。ページとタグの区別もしない。対象そのものの性質ではなく、対象間のリンクによって構造が浮かび上がってくる。

**実装上の帰結:**

- すべてのページは同一のスキーマで保存される
- 分類は tag link と body link で表現する（→ [information-architecture.md](./information-architecture)）
- レイアウトの差異（`page` / `grid` / `table`）は表示上のもので、データ構造には影響しない

## [ローカル・ファースト](/Local-First_Software)

ローカルのテキストファイルが SSOT（Single Source of Truth）。クラウドはそのミラー。

アカウントすら作らずに使い始められる。データはまずブラウザの IndexedDB に入り、ディレクトリを選べばローカルの `.md` とも自動同期される。サーバーとの同期は、Web公開やモバイル同期が必要になって初めて選択する機能。

**実装上の帰結:**

- 3層構造: Local File（SSOT）↔ Local DB（RxDB/IndexedDB）↔ Remote DB（MongoDB）（→ [data-architecture.md](./data-architecture)）
- ファイルの実体は Obsidian 互換の Markdown + YAML frontmatter
- File System Access API と FileSystemObserver でブラウザとの双方向同期を実現している

## [プレーンテキストは普遍的なインターフェース](/%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AF%E6%99%AE%E9%81%8D%E7%9A%84%E3%81%AA%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)

ページのソースはプレーンテキスト。CMSの管理画面からだけでなく、メモ帳でも Obsidian でも Cursor でも `sed` でも編集できる。

Obsidian がなぜ AI 機能を急いで詰め込まないのか？ プレーンテキストを使っているから。データがただのテキストファイルなら、どんな AI システムとも勝手に統合できる。「エコシステム」を囲い込む必要がない。

**実装上の帰結:**

- 現時点では Markdown を採用しているけれど、HTML に変換可能な任意の軽量マークアップ言語をサポートする構想がある
- コンテンツパイプラインは `source → parser → AST` で設計している（→ [information-architecture.md](./information-architecture)）

## ダダ漏れをアフォードする

公的な文章から私的なメモまで、混在を許容する。ブログとニュース、リサーチとブックマーク、日記とポートフォリオを区別なく保管できる。

気体（つぶやき）から液体（アモルファス）、結晶（アーカイブ）へ。コンテンツの成熟度にグラデーションを持たせるために、公開範囲の多段階設定と permanent フラグを用意している。

**実装上の帰結:**

- 公開範囲: `public` / `unlisted` / `protected` / `private`（→ [information-architecture.md](./information-architecture)）
- permanent フラグで permanent page / note page を区別
- `unlisted` はリストやバックリンクに出さず、直接の言及からのみ辿れる状態

## 愚行権を認める

パーサーは最終的にユーザーがカスタマイズ可能になる。サーバーに送るのは `{source, parsed_AST, ...metadata}` の組で、AST の生成はクライアントサイド。サーバーはインジェクション防止等の最低限のサニタイズだけ。

ページがぐちゃぐちゃになるのはユーザーページの話なので、CMS としてはそこに関知しない。
