数据与隐私

我们怎么处理你和孩子的数据

这一页写给家长看:孩子的什么被存下来了、放在哪儿、会发给谁、不想要了怎么删。 写的是这个站实际在做的事,不是承诺。 技术上的底稿放在最下面那一栏里——想看可以点开,不看也不影响你读完这一页。

一、孩子的照片,我们没有留

你上传的那张照片,只在给他画第一张形象那一次用一下: 缩到合适的大小、把背景填成白色、发给出图模型照着画,然后就没了。 磁盘上从来没有过那份原图——不是「用完删掉」,是从来就没有写过。

你录的那段声音一样:它只出现在建那条音色那一次的请求里, 语音厂商回一个编号,我们这边只留那个编号。

这两件是家长最先问的,所以放在最前面。想自己核对的话, 最下面那一栏里有可以跑的检查。

二、留下来的只有这些

孩子的档案

名字、名字怎么念、年龄档、你挑的那几个长相标签。

他的形象

你确认过的那张参考图,加上它的"外貌锚点"(每次画他都照着这些来)。改过一版就多留一份——旧书里那些页指着旧版,覆盖了就说不清"这一页是哪一版画的"。

他做过的书

故事文字、每一页的图和配音、封面。

缩小版预览图

书架和卡片墙上显示的那些小图,是上面那些图缩出来的。它也算他的脸,所以删孩子的时候一起删。

你的账号

手机号、昵称,以及密码的哈希(原文我们看不到)。

你建的那条音色

一个编号、你给它起的名字。★ 声音本身在语音厂商那边,我们这边只有一个编号。

站里调模型用的钥匙

这不是你的东西,是站里用来调模型的。

每个账号各存一份,彼此分开:别人的东西不在你这一份里,你也不在别人那一份里。 删一个孩子的时候,我们也是按这一份一份地数给你看。

三、会发给谁

只有两次,而且是不发就做不成的那两次:

  • 画他的第一张形象那一步,那张照片会发给出图模型厂商——它就是照着这张照片画的。
  • 建音色那一步,你录的那段声音会发给语音厂商——它就是听着这段声音来复刻的。

两次都在服务器上发生,浏览器里不留副本。除此之外没有第三处拿到过它: 照片和录音不进记录、也不进日志。

★ 还有一件要说在前面:这个站是自己架的。谁能让这台服务器跑起来, 谁就能读到那台机器上的这些文件——它不是那种「只有我们看得到」的云服务。 这一格请你自己判断:这台服务器是谁在管,你就等于把这些文件交给了谁。

四、会留多久

不会自动过期。今天没有任何定时清理:你不删,它就一直留着。 这里不写「我们会定期清理」——因为没有那个东西。不想留了,看下一节。

五、不想要了,怎么删

删一个孩子

角色卡那一墙,他卡片上的「删掉他」

连他的书、他的形象、那些缩小版预览图一起删。删完给你一张单子: 每个地方各删掉几条、哪几本书一起没了

删一本书

书架,那一本上的删除

那一本的图和配音一起没

删一条音色

我的声音,那一张卡上的删除

厂商那边也一起解绑。解绑失败会照实说失败,不会把本地那条记录偷偷删掉再假装成功

★ 缺一件:注销整个账号今天没有自助入口。要连账号一起清掉, 得让管这台服务器的人来办(管理页里有「删号」,那是给管理员用的)。 在那之前,上面三个入口能把跟孩子有关的东西清干净——账号里剩下的只有手机号、 昵称和密码的哈希。

给技术评审:这一页的每一句话怎么自己验

这一页不是宣传页:上面五节里的每一句都对应下面某一条。写成这个样子是有代价的 ——它要求那些句子**有东西撑着**,否则就得删掉那句话,而不是换一句好听的。

三条可以跑的检查

  • 孩子的照片原图没有落盘

    它只在那一次请求的内存里活一遍:读进来 → 缩到接口能收的尺寸并压平白底 → 当参考图发给出图模型 → 出作用域。磁盘上从来没有它。

    命令:pnpm check:family

  • 你自己的录音样本没有落盘

    同上:样本只在创建音色那一次请求的请求体里,厂商回一个 voiceId,我们只存那一个编号。

    命令:pnpm check:family

  • 编故事时给你的每一段文字增量不进日志

    屏幕上"正在写第 k 页"那些字是一段段从网络上来的,但它们不进 events.jsonl——那里只有整件事的语义事件,没有逐字增量。

    命令:pnpm test -- route-stream

pnpm check:family 会真的跑一遍那两条路(照片那条走 cardFromPhoto, 录音那条走创建音色的请求解析与适配器),跑完再逐字节搜整个工作区与那一轮的临时资产根。 它同时埋了两根「应该被找到」的对照针(模型画出来的那张形象、发往厂商的请求体)—— 没有那两根,搜不到照片这件事本身是没有意义的:一个什么都没跑的探针也搜不到。 它也挂在 pnpm verify 里,push 之前自己跑一遍。

第二节那张表在磁盘上的落点

孩子的档案

u/<你的账号>/children/<编号>.json

名字、名字怎么念、年龄档、你选的那几个外貌标签

他的形象

u/<你的账号>/cards/<卡号>/

外貌锚点、画风,以及模型画出来的那张参考图,每个版本一份

他做过的书

u/<你的账号>/books/<书号>/

故事正文、每一页的图和配音(配音是合成出来的音频文件)、封面,以及 events.jsonl——生成过程的事件流水,出图与审核那几步的读数都在里面

缩小版预览图

u/<你的账号>/thumbs/<尺寸>/

上面那些图的派生缓存。★ 它也是他的脸,所以删孩子的时候它算一个位置

你的账号

站的后端(不在这个仓库里)

手机号、昵称、密码的哈希、能不能用哪些能力

你建的那条音色

站的后端 voices 表里一条记录

一个 voiceId、你给它起的名字、建它时用的模型名。声音本身在语音厂商那边,我们这边只有一个编号

站里调模型用的钥匙

.env.local,或管理页写出来的 models.runtime.json

站里调模型用的钥匙。这两个文件都在 .gitignore 里,仓库是公开的,它们不入库

u/<你的账号>/ 这一层是分片的: 别人的东西不在你这一片里,你也不在别人的那一片里。这一层是删除凭据报数的单位—— 删一个孩子,它逐位置报出「档案 1 条 / 角色卡与参考图 3 条 / 他的书 11 条 / 缩略图 20 条」。 ★ 这张表与前四行的路径出自 child-deletion.ts 同一处 (两处各写一遍的话,总有一天会出现「隐私页说四个位置、删除只删了三个」)。

晋ICP备2026016635号-1