---
title: garden.ooo Devlog
date: 2026-03-25T04:09:21.451Z
updated: 2026-04-01T05:04:19.649Z
tags:
  - garden
url: https://baku89.com/ja/garden/devlog
---

# garden.ooo Devlog

## TODO

- [ ] Markdownエディタが若干重い

- [ ] MDエディタよこはみだし

- [ ] MDモバイルみぎスプリットいらん

- [ ] ![](https://wp.baku89.com/wp-content/uploads/2026/03/IMG_6877.jpeg)

- [ ] admin専用の `modified` フィールド

  - admin認証下のmutationでだけサーバースタンプ。garden-ooo側の自動編集（リネーム等）では更新しない
  - 保持先: `content_id → modified` のマップをDB側に別途持つ。frontmatterには書かない（source\_hash汚染を避ける）
  - ローカルバックアップ: `.garden/modified.json` に debounce + atomic rename で書き出し。reset / 初回DB構築時にのみ読み込む一方向同期、差分検知なし
  - DataView の `sortBy` キーに追加（`types/query.ts:135` の enum）。一般 / ログインユーザーからは不可視で、指定された場合は `updated` に自動フォールバック

- [ ] 内部リンクのバックリンク時アンカージャンプ

  - パース時、内部リンクを含むブロックに block-level anchor を付与し、バックリンクURL を `?p=source#b-XXXX` 形式にする
  - アンカー単位は **per-block**（per-link ではない）。AST を登って最初の block 相当ノードに振る
  - custom prose-component（DataView 等の block-level）は **コンポーネント自身を1ブロックとみなす**。component の root に `id` を forward する規約。inline component の場合は更に上の block 祖先まで登る
  - ハッシュ算出: ブロック正規化テキストの短縮ハッシュ（8文字程度）。段落編集で外れた場合はベストエフォート（ページ先頭にスクロール）で許容
  - links テーブルは `(source_id, target_id, block_anchor)` の単位で記録。同一ページ内の同一ターゲット複数参照は別行

- [ ] ページ単位の changelog コンポーネントとフィード表示

  - `::changelog{at="..." version="..."}` MDC コンポーネント。`default` スロット = 単独ページとフィード両方に出る本文
  - props: `at`（基本必須、未指定時は `page.modified`（admin 専用 modified が出来たらそちら）にフォールバックし warn）、`version`（optional, MVPでは無くてもOK）、`title`（optional plain text, 未指定時は `at` + version から自動生成）
  - パース時に `changelog_entries` 相当を DB へ事前抽出: `(page_id, at, version, title, default_html, default_md)`。`source_hash` ベースの reconcile に乗せる
  - 表示用に専用コンポーネント `<ChangelogFeed>`。クエリインターフェースは DataView と揃える（`from`, `where`, `related-of` 等）。1エントリ=1カード形式で `[date] [v-badge?] [title]` + 本文snippet
  - `<ChangelogFeed related-of="this">` で frontmatter `related` を辿って関連ページの changelog をまとめる用途を想定
  - 同じクエリを `?format=rss` で RSS 出力できる設計に最初から寄せる

- [ ] per-site secret 管理基盤（Secret Registry パターン）

  - 用途: WP/Cloudinary 等のメディアアップロード鍵、OAuth app credentials（GitHub Sponsors 等）、SMTP、その他将来の per-site 第三者サービス credentials を一元化

  - runtimeConfig に置く secret は `SITE_SECRET_KEY`（32byte AES master key）の1個のみ。それ以外の credentials は admin UI から入力 → 暗号化して DB へ

  - **3要素構成**:

    1. **Registry（コード）**: `server/secrets/registry.ts` に namespace ごとに `{ schema: zod, label, test?: async fn }` を登録。namespace 規約は `<category>.<provider>[.<role>]`（例: `media.wordpress`, `oauth.github-sponsors.app`）
    2. **Storage**: `site_secrets` collection（**MongoDB only, client RxDBには乗せない**）。`{ _id: namespace, key_version, ciphertext: AES-256-GCM(iv, payload, tag), updated_at, updated_by }`
    3. **Accessor**: server-side `getSecret(namespace)` で typed object を返す。in-memory キャッシュ（TTL \~5min）+ 更新時 invalidate

  - **Admin UI**: registry を introspect してフォーム自動生成。`schema` から zod-derived form、`test` 関数があれば接続テストボタン、`updated_at` 表示

  - **OAuth は2層**: app credentials（`oauth.<provider>.app`）は site\_secrets、user token（access/refresh）は別 collection `user_oauth_tokens`（per-user ライフサイクル分離）。暗号化は同じ master key で OK

  - **段階的ロールアウト**:

    - Phase 1: 基盤（registry + collection + accessor + UI）を作り、既存 `.env` の WP credentials を移行
    - Phase 2: OAuth app credentials を registry 化（GitHub Sponsors 等）
    - Phase 3: 暗号化された backup の export/import を admin UI に追加（DB reset 時の再入力回避）

  - その他: `key_version` フィールドは最初から持つ（rotation は後実装）。値はログに出さない、`updated_by` のみ監査用に残す

- [ ] マルチプロバイダの monetization / メンバーシップ基盤

  - GitHub Sponsors だけでなく、Patreon / Gumroad / Stripe / Lemon Squeezy 等を併用できる抽象化
  - 単品購入（per-content）と subscription tier の両方をサポート、訪問者が progressive にエンゲージできる導線（単品 → サブスク のアップセル等）
  - provider 中立な「Entitlement」概念に集約し、ページの frontmatter `paywall: any_of: [...]` で provider 横断で OR 評価
  - 各 provider は adapter として実装（OAuth / license key / webhook など各々の流儀を吸収）。adapter の credentials は前述の Secret Registry に乗せる
  - 同期戦略は provider ごとに webhook / pull-on-demand を使い分け、結果を server-only `entitlements` collection に正規化保存

- [ ] 2カラム Markdown エディタの廃止 → TipTap.dev ベースの単一エディタへ移行

#### 2026-04-12

音声配信機能をつけた。

- [WWWと庭](/www-and-garden)
- [Podcasts](/podcasts)
- [www-and-garden#t=120](/www-and-garden#t=120)

#### 2026-04-01

[詰め方の問題](/how-to-pack)で触れられていたSkylineアルゴリズムをDataViewに実装した

#### 2026-03-30

うれピ

<https://x.com/zztkm/status/2038178965693886500>

#### 2026-03-29

I'm tinkering with the new visual identity

![](https://wp.baku89.com/wp-content/uploads/2026/03/app_icon-1.png)

![](https://wp.baku89.com/wp-content/uploads/2026/03/ogp-1.png)

#### 2026-03-25

文字数カウント用のカスタム要素を作った　もろもろの応募に便利

![](https://wp.baku89.com/wp-content/uploads/2026/03/2026-03-25-13-04-11.2026-03-25-13_12_18.gif)

#### 2026-03-17

[garden.ooo](/garden)の同期実装がバイブス過ぎて、定期的に全ページの1割が勝手に消えるのを復元している

#### 2026-02-19

<https://x.com/_baku89/status/2024345687140520206>

#### 2026-02-12

<https://x.com/_baku89/status/2021929205538455936>
