KizunaShelf 简介:一个为你所爱之物而设的书架
摘要
KizunaShelf 是一款自托管、模式灵活的媒体追踪器,数据以 Markdown 文件存储,提供桌面和移动应用,可用于追踪书籍、电影、动漫等。
暂无内容
查看缓存全文
缓存时间: 2026/07/16 13:51
# KizunaShelf 简介:收纳你所爱的一切的架子
来源:https://mudkip.me/2026/07/16/Introduction-to-KizunaShelf/
每个人都有自己的方式来记录生活中留下印记的事物——无论是一本书、一部电影、一部电视剧、一部动漫还是一首歌。有时,依靠一个拥有海量目录的在线服务,但平台的去留不由你掌控;有时,用一款设计精美、离线使用的手机应用,但你多样的兴趣很少能塞进某个预设的目录或数据模型中。而且,这些应用和服务明天就可能消失。
在辗转尝试无数工具后,我意识到自己需要真正能掌控的东西。我先在 Airtable 里搭建自定义数据库,后来转到 Notion,还尝试过自托管 NocoDB。最终,为了不再频繁迁移数据库,我接受了"文件优先于应用"的理念(https://stephango.com/file-over-app)。我选定了一个 Obsidian 库,把我关心的所有东西都存成 Markdown 文件,配上 front matter,并用 Dataview 以及后来的 Obsidian Bases 来组织。
但手动管理一个超过 2000 个 Markdown 文件的数据库又带来了新的不便:查找元数据、更新状态、记录日期。像图书管理员一样繁琐的工作,取代了发现下一件爱好的真正乐趣。
KizunaShelf 正是为了解决这一切。
## 设计理念
我一直铭记一个原则:KizunaShelf 不仅仅是又一个媒体追踪器。它带来了类似 Airtable 的动态灵活性,让用户可以精确地定义自己的数据意味着什么。schema 由你自行查看和修改,并作为"意义"的唯一真实来源。
保存在你的库文件夹中的单个 `KizunaShelf/config.yaml` 文件,声明了你的类型、它们的字段以及每个字段的具体作用。它定义了:
- 哪个字段代表条目标题,以及该标题使用哪种语言。
- 哪个字段描述一个日期以及这个日期代表什么(例如,游戏的发行日期、你开始看某部动漫的日期、或某个特定事件发生的日期)。
- 哪个字段代表状态,以及其自定义选项列表。
- 对象之间的关联方式以及如何连接不同类型。
但不必被 schema 的复杂度吓到。开箱即用,KizunaShelf 提供了传统媒体追踪器所应有的一切默认预设。你可以立刻从预设好的类型中选择:动漫、电视剧与戏剧、电影、游戏、桌游、书籍、漫画与图像小说、音乐专辑、播客、艺术家与创作者、角色。
这些类型还能直接连接到你熟悉的外部元数据提供商,包括 TMDB、TheTVDB、IGDB、Bangumi、Apple Music、MyAnimeList、Google Books 等等。
在 KizunaShelf 中添加条目极其快速简单:点击加号按钮,搜索你想要的内容,再点击添加即可。封面可以本地下载,状态和日期可以稍后按自己的节奏记录。KizunaShelf 还理解"子条目"的概念,比如动漫的单集或 CD 的曲目列表,让你能在同一个 Markdown 文件中以清单或项目符号列表的形式单独追踪它们。
## 工程架构
在底层,这是一次非常有趣的工程实验。
对于这个项目,我有一份具体且雄心勃勃的需求清单:
- 一个可以随时随地访问的自托管 Web 应用。
- 一个轻量级的 macOS、Linux 和 Windows 桌面应用,能打开与 Obsidian 相同的本地文件夹。
- 一个真正的手机应用,快速、愉悦且原生。
桌面端的答案是 Tauri。但解决移动端时,我冒出了一个"如果……会怎样"的想法:*如果我通过 UniFFI 将 Rust 核心直接桥接到 Swift 模块中,然后围绕它编写一个原生 SwiftUI 应用呢?*
这又带来了另一个挑战:如何让 Rust 核心在本质上是"2.5 个客户端"(因为 Tauri 桌面应用与 Web 应用共享几乎所有前端代码)之间保持完美一致?
我的解决方案是直接从 Rust 后端生成 OpenAPI(Swagger)规范,然后利用该规范自动生成 TypeScript 和 Swift 客户端。
结果是一个真正的跨平台架构。iOS 应用是完全原生的 SwiftUI,桌面应用避免了 Electron 的臃肿。未来的 Android 应用可以遵循完全相同的架构,在保持平台原生的同时,与其他客户端功能一致。
构建应用时遇到的一个小问题是不同平台上 Unicode NFC 与 NFD 规范化的问题。此问题已解决,现在可以安全地在文件名中使用 *Pokémon* 或 *ポケモン*。维基链接和关系匹配已在 NFC/NFD 差异之间进行了规范化。
## *kizuna*(絆):连接在一起的事物之间的纽带
许多作品对我意义重大,无论是动漫系列、电子游戏,还是启发了本应用名称的音乐项目(https://www.youtube.com/watch?v=0aBsD9jpL5I)。它们值得被铭记,也值得与我们生命中特定的时刻相连。KizunaShelf 正是为描绘这些连接而设计。日历追踪即将发布的计划、以及提及你所关心事物的日常日记条目。而活动动态则将你观看、游玩和阅读的瞬间汇聚成一条时间线,记录下它们何时成为你生活的一部分。
条目之间的连接是 KizunaShelf 的核心。通过将 front matter 关系、维基链接、反向链接和列表整合到一个统一的、详细的视图中,应用把所有东西汇集在一处:你最爱的动漫角色、她的声优、你参加过的现实活动,以及你书架上摆放的手办。
2017 年 5 月初的一天,我走进秋叶原的一家复古游戏店,买了一捆 PSP 游戏,其中包括 *Ever17(https://en.wikipedia.org/wiki/Ever_17:_The_Out_of_Infinity)*。就在那一刻,LeMU 的故事正在实时展开。那份记忆正是这个应用存在的理由——为了保存这样的羁绊。
## 永远,为梦想
我开发这个应用已经好几个月,并亲自使用了几周。KizunaShelf 的 iOS 版本现已通过 TestFlight(https://testflight.apple.com/join/hE7k3sWd)提供测试,开源桌面版和自托管 Web 版不久后也将上线。Android 版本计划于今年晚些时候或明年推出。我承诺会长期维护这个应用。
但所有应用终会消失。KizunaShelf 在设计时考虑到了自身的"寿命"。该应用没有服务器来存储你的数据,也没有专有格式。保存在 KizunaShelf 中的所有内容都是纯 Markdown,附带一些人类可读的 front matter。我还采用了一些技巧,使其能与现有生态良好集成:动漫或电视剧的每一集都有 📅 表示播出日期,勾选该集后会添加一个 ✅ 日期,遵循 Obsidian Tasks(https://publish.obsidian.md/tasks/Reference/Task+Formats/Tasks+Emoji+Format)的表示方式。智能列表使用了 Obsidian Bases 格式的子集,因此你可以在 Obsidian 中打开它们并显示完全相同的条目。
你的数据将永远与你同在,无论有没有这个应用。
相似文章
AutoShelf
AutoShelf 是一款自动整理文件的 Mac 应用。
Show HN:LastShelf – 您家庭文件、账单和联系人的应急地图
LastShelf 是一项服务,帮助家庭将关键文件、账单和联系人集中管理,在紧急情况下为亲人提供逐步指导。
@DanKornas: 你的Markdown笔记很有用,但答案可能横跨五个文件。Kwipu是一个本地Graph RAG系统,适用于那些……
Kwipu是一个新的开源本地Graph RAG系统,它将Markdown和Obsidian笔记索引到属性图中,支持通过混合检索进行自然语言查询,并通过Ollama支持本地LLM。
@ziwenxu_: https://x.com/ziwenxu_/status/2053241837453029439
文章详细介绍了一个使用 Obsidian 构建自动化“Codex 知识库”的工作流,其中 AI 智能体自动导入并整理每日书签至结构化的知识库中,以降低上下文负债。
karakeep-app/karakeep
Karakeep 是一款可自托管的全能书签应用,使用AI(包括通过Ollama的本地大语言模型)进行自动标签、摘要和OCR。它支持链接、笔记、图片、PDF,并提供协作、全文搜索、浏览器扩展和移动应用。