一个世界 = 一个目录:数据所有权的工程写法
「数据是你的」谁都会说,兑现要看存储架构。Foreverse 的写法:每个世界一个目录,角色卡是 chara_card_v3 标准文件,世界书是 JSON,伴侣可以打成搬家包整包带走,社区导入的内容带溯源记录,AI 生成的图片写入可读的来源标记。这篇把这套文件化架构摊开讲,包括它的代价。

「你的数据属于你」这句话在 App 行业已经说滥了,考察它的办法只有一个:看存储架构。数据存在平台数据库的一行行记录里,导出靠平台赏一个按钮,那句承诺的实际含义是「暂时租给你」;数据以标准格式的文件躺在你设备的目录里,承诺才有工程兜底。这篇讲 Foreverse 的文件化架构:它长什么样,为什么这么选,以及这么选的代价。
一个世界 = 一个目录
Foreverse 里每个「世界」(一本导入的小说、一张角色卡开的聊天)在设备上就是一个目录。摊开看:
| 内容 | 存储形态 | 格式 |
|---|---|---|
| 小说正文与分支 | 目录内文件 | markdown 系纯文本 |
| 角色卡 | 独立文件 | chara_card_v3(PNG/JSON,公开规范) |
| 世界书 | 目录内文件 | JSON,桌面酒馆同构 |
| 聊天记录 | 目录内文件 | 可导出的结构化文本 |
| AI 伴侣全家当 | 独立目录 + 搬家包 | zip(人设/记忆/贴纸/头像/转录) |
| API 密钥 | 设备加密存储 | 不出设备,请求直连供应商 |
这个架构的直接推论:搬家是复制操作。换手机、备份到电脑、把一张调好的卡发给朋友,都是文件层面的动作,不需要平台方参与,也就不存在「平台哪天不高兴了不让导」的问题。我们的角色卡去桌面酒馆能直接开聊,反方向也一样,因为两边读的是同一个公开规范。
三个容易被忽略的细节
伴侣搬家包。AI 伴侣是最怕丢的数据——几个月的记忆和相处痕迹。我们把它做成了显式功能:一键导出 zip,含人设、逐条记忆、贴纸、头像、聊天转录;导入侧做了条目白名单校验、路径穿越拒绝、失败自动回滚,坏包不会污染现有数据。这套导入导出闭环是当成正式功能测试的,不是藏在设置深处的摆设。
社区溯源。从社区导入的卡和世界书带一份溯源记录(哪个社区包、哪个版本),写进内容元数据,来查证来源用。有意思的是它的反面设计:这份记录不随再分享传播,你把卡分享出去时带的是干净文件,不夹带你的下载历史。溯源是给你用的,不是给别人看的。
AI 产物标记。App 里 AI 生成的图片在文件层写入了机器可读的来源标记(PNG 和 JPEG 的标准元数据字段),标明这是 AI 生成的内容。图片流出到别的平台时标记跟着走,这是我们对「AI 内容可识别」的一点工程投入。
代价,如实说
文件化不是免费午餐。第一,没有云同步:数据在你设备上意味着我们的服务器上没有副本,换机靠搬家包和目录复制,多设备实时同步目前没有(在路线图上,做的时候也会是端到端加密优先)。第二,文件读写比数据库慢,长聊天的加载我们花了不少功夫做索引和分片才把性能拉回来。第三,用户要自己对备份负责——文件在你手里,删了我们也找不回来。
和 BYOK 是一体两面
文件化管的是数据的家,BYOK 管的是数据的路:密钥加密后只存本机,请求直连你选的供应商,中间不过我们的服务器。两件事合起来才是完整的所有权:内容在你的目录里,流量走你的合同。从平台型产品搬过来的用户对这套架构的感受最直接——那篇迁移记录里写过,搬家最贵的成本是当初没有存档意识;文件化的意义就是让「存档」变成默认状态而不是抢救动作。
常见问题
「数据文件化」具体指什么?
你的每个世界(一本书或一张卡的全部数据)在设备上就是一个目录:正文、分支、世界书、角色档案、聊天记录,都是目录里可见的文件,格式是标准或公开的(chara_card_v3、JSON、markdown)。搬家是复制目录,不是求平台开恩给你导出接口。
AI 伴侣的数据也能带走吗?
能,专门做了搬家包:人设、逐条记忆、贴纸、头像、聊天转录打成一个 zip 导出,换设备后导入还原。导入侧有完整校验(条目白名单、路径穿越拒绝、失败自动回滚),坏包不会污染现有数据。
从社区下载的内容有什么不一样?
多一份溯源记录:从哪个社区包、哪个版本导入的,写进内容的元数据,来源可查。这份记录不随再分享传播——你把卡分享给朋友时,带出去的是干净的标准文件,不夹带你的下载历史。
BYOK 的密钥和聊天内容会上传吗?
API 密钥加密后只存在设备上,请求直连你选的模型供应商,不过我们的服务器。聊天内容存在本地目录里;官方渠道计费时服务端只记账单侧数据。你随时可以在数据导出页发起完整导出或删除。
有想法或问题?来 Discord 聊聊 →