forming / System Design Archive

Runtime Federation

Runtime Federation 把 MyBlog 定义为 Object Layer Glue 和 Projection Shell:Obsidian / Syncthing / OpenList / Quartz / Immich / Payload 或 Directus / Meilisearch 等成熟系统各自拥有权威,MyBlog 只做对象投影、关系语义、阅读空间和多客户端 Runtime 合同。同一原则也约束本地 workspace:多个 worktree 可以并存,但 build、deploy、PWA、runtime schema 和 OpenList authority 必须由 workspace capability 决定。

ObsidianSyncthingOpenList + COS / QuarkQuartz 4FlowershowPayload CMSAppFlowyWorkspace Capability SystemDeploy GuardAFFiNEAnytypeImmichPaperless-ngxMihonRead YouDirectusMeilisearchMyBlog Object Layer Glue
Inspiration

借鉴对象

  • Syncthing file truth sync
  • Quartz digital garden substrate
  • Flowershow Obsidian publish pipeline
  • Payload object and media admin
  • AppFlowy block runtime and collaboration
  • AFFiNE workspace runtime
  • Anytype object graph
  • Kubernetes namespace capability
  • Android permission manifest
  • AWS IAM
  • GitHub Actions environment protection
  • Immich media runtime
  • Paperless-ngx document objects
  • Mihon Android runtime
  • Read You feed runtime
  • Obsidian Remotely Save
Rejected

拒绝的方案

  • 自写 Vault sync,因为实时文件同步和冲突处理应该交给 Syncthing / Obsidian Sync;OpenList / Quark / COS 只能承担 control plane、浏览和冷归档后端。
  • 自写 Markdown compiler、backlink、graph publish 和 Digital Garden 基础,因为 Quartz / Flowershow 已经是成熟底座候选。
  • 自写媒体服务器、缩略图、EXIF、AI tagging 和 embedding,因为 Immich 已经覆盖媒体 runtime 的主体职责。
  • 自写 CMS、搜索引擎、WebDAV、PDF engine、Android source/download/update runtime,因为这些都不是 MyBlog 的差异化价值。
  • 复制 AFFiNE / Anytype / Mihon / Read You 的 UI,因为 MyBlog 要学习系统边界和 authority,不是复制外观。
  • 把 Android 做成第二套业务宇宙,因为 Android 只能消费同一 Runtime API 和 KnowledgeObject graph。
  • 用“单 canonical workspace”禁止所有 worktree,因为真正问题不是 workspace 数量,而是旧 worktree 拥有了不该拥有的 deploy 行为。
  • 继续手工从任意目录 scp 到 /srv/myblog/site,因为这绕过了 workspace authority 和 deploy capability。
Runtime

运行方式

  • 当前 active 链路是 Obsidian E:\Vaults\Obsidian -> Syncthing -> Linux /home/vault/Obsidian hot mirror -> OpenList /openlist/Obsidian content control plane -> server-side Runtime MarkdownObject projection -> MyBlog Runtime API / Object Layer Glue -> Astro UI Shell / PWA-TWA / Android / Search / CLI / AI Agent。
  • 成熟替换优先级是 Syncthing、Quartz 4 / Flowershow、Meilisearch、Immich、Payload / Directus;新增功能前先判断能否由这些层接管,不再新增 watcher / scp / build-sync glue。
  • Obsidian 拥有唯一 authoring truth;Syncthing 当前拥有 hot mirror sync;OpenList /openlist/Obsidian 拥有 content control plane identity,OpenList + COS / Quark 继续拥有 blob / cold archive backend。OpenList 不拥有文章写作 authority。
  • Quartz 4 与 Flowershow 是 Obsidian Digital Garden substrate candidate:优先学习 / 复用 Markdown transform、wikilink、backlink、graph、folder/tag publish 和基础 search。
  • Payload CMS 是 object / media admin reference:学习 object modeling、media layer、relation layer 和 admin architecture;AppFlowy / AppFlowy Cloud 是 Project Studio collaboration runtime target,不是当前运行依赖。
  • Project Studio 的当前页面只允许作为 GitHub Workbench fallback:repo、issues、PR、commits、contributors、Wiki / Timeline write-back。AppFlowy 未部署前,不继续把 block editor、kanban、comments、presence 和权限系统手搓进 MyBlog。
  • AppFlowy 的推荐部署边界是独立 `project.tengokukk.com`,MyBlog `/projects/[slug]/` 只在项目 frontmatter 配置 `appflowyUrl` 后嵌入 workspace;否则必须显示 target-not-deployed 状态。
  • 当前收束期不启动 AppFlowy:先完成 Linux Vault、MarkdownObject schema、Runtime Content Index 和 Quartz Runtime Layer。AppFlowy skeleton 只保留路线,不拥有当前 runtime authority。
  • AFFiNE 与 Anytype 是 workspace runtime 和 object graph 的 reference only,不是当前运行依赖。
  • Immich 是 Media Runtime 目标服务:当前 skeleton-not-started,不能写成已上线媒体库。
  • Paperless-ngx 是 Document Object reference,核心启发是 file != document,文件只是载体,文档对象才拥有 metadata lifecycle。
  • Mihon 和 Read You 是 Android / Feed Runtime reference,主要学习 source abstraction、cache、downloads、updates、offline feed 和 reading state。
  • Directus、Dify 与 Meilisearch 仍是 target-not-deployed:Directus 负责 structured content / metadata truth,Dify 负责 AI workflow orchestration,Meilisearch 负责 dynamic object search。
  • MyBlog 自己只写 Object Layer Glue、Runtime Schema、Projection Logic、Relation System、Knowledge Runtime Semantics 和 KnowledgeObject projection。
  • workspace.manifest.json 是当前 workspace 的机器可读 authority 声明;workspaces/canonical.json、workspaces/experimental.json、workspaces/sandbox.json 是分级模板。
  • tools/deploy-guard.mjs 在部署前检查 workspaceId、workspaceType、allowedRoots、deploymentAuthority 和 capabilities.canDeploy;.codex-runtime/worktrees/* 默认不能声明生产部署权。
  • npm run deploy:site 是生产静态站点发布入口;它先运行 deploy guard,再 build,再上传 apps/web/dist 到 /srv/myblog/site。
Tradeoff

取舍

  • Runtime federation 增加部署、监控和接口治理成本,但避免把个人项目拖进自研同步器、媒体库、搜索引擎和移动端运行时的长期维护泥潭。
  • 成熟 Digital Garden 底座会限制局部定制,但能减少 Markdown/Graph/Search 基础设施维护,把精力留给 Runtime Feed、Reader、Visual 和对象投影。
  • 学习成熟项目的系统角色比直接 clone 代码慢一点,但能保护 MyBlog 的 authority 边界和视觉身份。
  • 多系统组合会有同步延迟和 failure mode,但每个系统拥有清楚 authority 后,比一个全能后端更容易排障和替换。
  • reference-only 系统必须明确标注,否则文档会把“应该学习”误写成“已经依赖”。
  • workspace capability 增加了发布前步骤,但能防止旧 worktree、实验分支或 AI 临时环境把生产站点回滚到早先版本。
  • experimental worktree 仍可 build 和 preview,保留并行研发效率;上线必须把改动提升回拥有对应 capability 的 workspace。
Future Direction

后续方向

  • 把 Runtime Federation 加入 project.json 的 machine-readable contract,并要求新服务声明 authority、status、integration path、secret boundary 和 failure mode。
  • 为 workspace.manifest.json 增加 sync fingerprint:lastSyncedFrom、lastSyncedAt、baseCommit、syncAge 和 feature scope,部署前提示 stale workspace 风险。
  • 把 feature capability audit 接入 git diff,修改 PWA、Reader Runtime、OpenList authority 或 runtime schema 时自动检查 workspace 是否拥有对应 capability。
  • 把 Runtime API schema 从 README 推进到 packages/runtime-contract,让 Web、PWA/TWA、Android、Search、CLI 和 AI Agent 共用同一 envelope。
  • 为 KnowledgeObject 增加 source provenance 字段,记录对象来自 OpenList、Directus、Immich、MySQL runtime 还是 Astro content collection。
  • 部署 Directus / Meilisearch 前先完成 disk readiness、secret boundary 和 rollback contract。
  • 评估 Quartz 4 的 transform / graph / backlink / hover preview 能力,优先替换自研 Markdown runtime 缺口而不是继续扩写本地 compiler。
  • 评估 Payload / Directus 在 metadata overlay 上的边界,二选一承担对象和媒体 admin,避免 MyBlog 继续扩成 full CMS。
  • Native Android 只在 Runtime API 稳定后启动,且只实现 projection 与 local mirror,不实现第二套业务逻辑。