我做了一个 NAS 上的个人数字资产终端

我是大西瓜焚岚,《中年数字娱乐指南》的作者。
是的,一年多前我就在倒腾这些东西:NAS、电子书、漫画、模拟器、家庭媒体库、各种 Docker 服务。现在我还在倒腾这些。
区别是,这次我不只是把别人的工具装起来了。
我刚做了一个跑在 NAS 上的个人数字资产终端,叫 FolioSpace Library。你可以把它理解成一个专门管理自己收藏内容的本地服务:电子书、漫画、游戏 ROM,后面还会扩展到 PDF、设定集、照片、空间照片、视频、空间视频,以及和这些内容相关的 OST、资料、笔记。
它不是一个“大而全”的媒体中心,也不打算替代 Plex、Jellyfin 或 Immich。
它更像是我给自己数字收藏建的一个底座:负责扫描、索引、封面、分类、搜索、收藏、阅读进度、最近访问和一些私有状态。真正的阅读、游戏、XR 浏览体验,可以交给不同设备上的客户端来做。
你可以在 Docker Hub 搜索 foliospace-library 找到它。
也可以访问官网:https://foliospace.app/zh 获得关于它的最新信息。

最早催生这个项目的原因,其实很朴素。
之前我用过很多现成方案。电子书用 calibre-web,漫画用 Komga,媒体用别的服务,游戏 ROM 又是一套自己的目录结构。它们各自都能用,但时间久了以后,问题就出来了。
每一类内容都有一套扫描逻辑。
每迁移一次设备,很多东西都要重新扫。
漫画重新建库很慢,封面和系列识别也经常要重新整理。
calibre-web 的在线阅读器对我来说也不太够用。
更麻烦的是,这些服务大多只关心自己的那一类内容。电子书是电子书,漫画是漫画,游戏是游戏,照片是照片。可在我自己的数字生活里,它们其实不是分开的。
一本游戏设定集,一套漫画,一个模拟器 ROM,一个 OST,一个攻略 PDF,它们可能属于同一个作品、同一个系列,甚至同一段记忆。
我想要的其实不是“再装一个阅读器”。
更准确地说,我想要一个只属于自己的“豆瓣”。
当然,它不是一个给别人看的评分网站,也不追求社交、热榜、短评和小组。它更私人一点,也更底层一点:保存我文艺生活所需要的一切内容。
一本书,一套漫画,一个游戏 ROM,一张 OST,一份设定集,一个攻略 PDF,一段阅读进度,一个“想看”或“已通关”的状态,甚至将来某个作品相关的笔记和截图,都应该能被放进同一个地方。
过去这些东西散落在不同 App、不同目录、不同服务里。电子书在 calibre,漫画在 Komga,游戏在模拟器目录,电影和剧集在媒体库,笔记又在另一个系统。
但对我来说,它们并不是分开的。
它们共同构成了我的兴趣、记忆和文艺生活。
所以 FolioSpace Library 想做的,不是替代某一个阅读器或媒体服务器,而是把这些内容先收拢成一个属于自己的资产库。设备、客户端和入口可以不断变化,但这套关于“我看过什么、读到哪里、收藏了什么、还想继续探索什么”的记录,不应该总是跟着工具一起消失。
为什么用 Go 重构
这个项目一开始是从阅读器需求长出来的。后来我问 Codex,如果要把它从一个简单阅读服务,扩展成一个更长期的个人资产库,应该怎么做。
它建议我用 Go 来重构服务层。
我觉得这个建议是对的。
Go 的好处不在于时髦,而是它很适合这种要长期跑在 NAS、Docker 或小服务器上的东西。
部署简单,编译出来就是一个服务,不需要在 NAS 上折腾一堆运行时依赖。

内存和性能都比较克制,适合 24 小时挂着扫库、建索引、提供 API。
并发模型也适合处理扫描任务、封面生成、资源流式读取这些事情。
更重要的是,它方便我把这个项目做成一个相对稳定的本地服务层。前端可以换,iPad 客户端可以换,Vision Pro 客户端也可以换,但 NAS 里的索引、状态和 API 不要跟着每个客户端一起重来。
这是我现在越来越在意的一点:
设备会换,App 会换,入口会换,但自己的数字资产不应该每次都被迫搬家。
目前支持什么
现在这个版本还很早,但已经不是纯概念了。
它现在管理的范围,已经从最初的电子书和漫画,扩展到更接近“个人文艺资产库”的形态:电子书、漫画、PDF 手册和设定集、本地 ROM 目录、本地视频目录,后面还会继续往空间照片和空间视频走。
阅读这块,FolioSpace Library 已经可以处理 EPUB、ZIP / CBZ 漫画和 PDF。EPUB 会保留章节、封面、阅读进度和私有状态;漫画归档可以按需读取页面,不用一开始就把大文件全部解开;PDF 可以扫描、生成首页预览,也可以通过服务 URL 做单页或双页阅读。
游戏这块,它不是简单把 ROM 文件夹挂出来,而是把本地游戏资产当成正式内容来索引。FC、SFC、GB、GBA、NDS、3DS、Mega Drive、32X、Saturn、PS1,以及街机、NeoGeo、NAOMI、Model 3 这类 ROM set 或光盘镜像,都可以逐步进入同一个资产库。
视频这块也已经开始有了轻量支持:MP4、M4V、MOV、MKV、AVI、WebM 这类本地视频可以进入目录。浏览器能直接播放的,就走 Range streaming;遇到 HEVC / H.265 这类不兼容编码,也可以按需转成缓存 HLS,避免 NAS 一上来就被转码任务打爆。
这里要特别说明一下:FolioSpace Library 不提供 ROM 下载,也不分发任何游戏资源。它只负责索引你自己本地已有的内容,并把它们变成客户端可以安全访问的 manifest。真正启动游戏,可以交给模拟器客户端,比如我自己的 GameEMU。

也就是说,它不是“资源站”,也不是另一个大而全的云盘。
它是你自己 NAS 里的资产目录和调度层。
为什么我要做 API 和 MCP
我不想把 FolioSpace Library 做成一个只能在网页里点来点去的工具。
网页只是一个入口。更重要的是,它应该能被不同设备、不同客户端、甚至 Agent 调用。
所以现在它已经有一套 client API。客户端可以通过 API 拿到首页、书籍列表、阅读 manifest、游戏 manifest、封面、进度、偏好设置等等。
这些返回结果会尽量避免暴露 NAS 里的真实文件路径。客户端拿到的是服务生成的 URL 和资源描述,而不是 /volume2/xxx/xxx 这种路径。
这样做有几个好处:
第一,客户端不用理解你 NAS 的目录结构。
第二,未来换设备、换硬盘、换挂载路径,不至于整个客户端都跟着崩。
第三,你可以在 iPad、手机、Mac、Vision Pro、AR 眼镜上,用各自最舒服的方式访问同一套收藏。
我也给它做了 MCP 支持。
这对我来说不只是赶个技术热闹,而是新时代本地服务应该有的入口。
以前我们做 NAS 服务,默认入口是网页。你打开一个后台,点按钮,搜关键词,改配置。这个逻辑当然还会存在,但有了 Agent 以后,很多操作其实可以变成一句自然语言。
比如你可以直接问:我自己的库里有没有《沙丘》?它不用去网上乱搜,也不用猜你的目录结构,而是通过 MCP 查 FolioSpace Library 的索引,告诉你本地有没有、是什么版本、在哪个 collection 里、有没有读过、进度到哪里。
再比如,你可以让 Agent 帮你做一次“整理前检查”:最近扫描的库里有哪些打不开的压缩包,哪些 EPUB 没有封面,哪些游戏 ROM 缺少平台信息,哪些收藏很久没打开过。它不需要直接翻你的硬盘,只需要通过受控接口读扫描结果和错误列表。
这就是我想要的关系。
Agent 不是一个能随便进入 NAS 文件系统的超级管理员。它更像一个懂你收藏结构的管家,能帮你查、整理、诊断、调度,但每一步都通过 FolioSpace Library 暴露出来的安全接口完成。
这点对我来说很重要。
我一直觉得,未来个人数字资产一定会被 AI 管起来。但前提是,你不能把所有东西都丢给云端,也不能让 Agent 随便摸你的文件系统。
比较合理的方式是:本地服务把资源整理好,给 Agent 一个受控的接口。Agent 可以帮你做事,但不直接暴露底层路径和原始文件。
这才像一个能长期共处的系统。
这只是第一步
FolioSpace Library 现在还不是我脑子里那个完整形态。
它目前更像一个起点:先把电子书、漫画、游戏这些我最常用的内容统一起来,然后逐步扩展到 PDF、设定集、照片、空间照片、空间视频,以及更多 Apple 设备上的体验。
我最终想要的东西其实很简单:
我的数字收藏在我自己的 NAS 上。
它们有统一的索引、统一的状态、统一的 API。
我可以在 iPad 上读漫画,在 Vision Pro 里看空间照片,在模拟器里打开老游戏,也可以让 Agent 帮我整理库、查缺封面、发现错误、生成收藏清单。
设备变来变去,但内容不跟着漂流。
过去我们总是在适配设备:换一个 App,搬一次库;换一个系统,重扫一次;换一个屏幕,重新折腾一套入口。
我现在更想反过来。
让自己的数字资产先稳定下来,然后让不同设备来接入它。
FolioSpace Library 就是我为这件事做的第一个底座。
它还很早,肯定有很多粗糙的地方。但对我来说,这是个好的开始。
如果你也有一台 NAS,硬盘里塞满了电子书、漫画、游戏、PDF、照片和各种舍不得删的数字收藏,那你应该能理解这种冲动。
我不是想再装一个工具。
我想要的是一个个人版的“豆瓣”,但它不关心别人怎么看,也不急着给世界展示什么。它只负责替我保存那些真正和我有关的东西:我读过的书,看过的漫画,玩过的游戏,收藏的设定集、OST、PDF、照片,以及这些内容在我生活里留下的痕迹。
说到底,我只是想把自己的数字生活,慢慢收回自己家里。