Skip to main content
K

forget-me-not

kllcoco/forget-me-not

勿忘我:给任何 LLM 用的封存式记忆大脑——艾宾浩斯遗忘、联想召回、可塑性性格、自动总结,附 3D 莫比乌斯记忆星环与脑图。DeepSeek Harness 插件 / MCP / REST

Install

dsh plugin --profile web add github:kllcoco/forget-me-not

README

勿忘我 · Forget-me-not

她会想起,也会遗忘。 把她留在时间里的痕迹,延长得再久一些。

勿忘我是给 AI 用的长期记忆大脑,任何 LLM 都能接。它按人脑的「多层记忆架构」来组织记忆:

  • AI 自己总结后写入:对话里值得记住的事,由模型自己总结成一两句话,写进对应的脑区。
  • 封存:记忆一写进去就被加密。AI 只能写入新记忆、联想回想、性格养成,不能修改、不能删除,也读不到原始数据。
  • 唯一的私钥:模型第一次写记忆时,会在你电脑上生成唯一的超级管理员私钥,放到桌面,并提醒你保存。钥匙和这份记忆一一对应。每次访问记忆都会去登记的路径看一眼:钥匙在就自动解锁,不在谁都打不开;丢了就再也打不开。
  • 艾宾浩斯遗忘:不复习的话,记忆在 6~90 天后被遗忘(越重要越久),上下文不会被占满;遗忘的记忆仍然可以按需召回。
  • 自动总结对话:每段对话结束后,模型像写日记一样自动把值得记住的事写进对应脑区,不用 AI 每次手动调用。
  • 更聪明的回想:模型(DeepSeek 等)亲自把候选记忆读一遍、按意思挑出相关的,不用装任何离线小模型;没有模型时退回字词匹配(BM25)。想起一段,会顺着关联把一整串相关的记忆一起召回。
  • 背景音乐:进入记忆后,你放进来的歌会依次循环播放。
  • 可塑性性格:性格不是写死的,会被一段段经历慢慢塑造,也会慢慢回落。
  • 记忆星环 → 脑图:3D 莫比乌斯 ∞ 星环,每一颗小星光是一段记忆;拉近星光会像走马灯一样逐个放映,重要的记忆旁边弹出那一刻的画面。钻进中间的星核,就进入「TA 的回忆 · 脑图」:每一团星是一个脑区,线是数据流和记忆之间的关联。

大脑的分区

脑区存什么
免疫系统 · 禁忌关乎安全、绝对不能忘的事:过敏、疾病、正在吃的药、忌口、害怕的东西、不能提的雷区。永远不会遗忘,每次对话都会自动出现在 AI 的上下文里;用户一提到,AI 就会主动记下来
长期记忆库值得长久记住的事件与事实、约定
边缘系统·情绪带强烈情绪的时刻,对人或事的感受
神经图谱人物与关系
生活回路作息、习惯、口味、喜好
工作记忆这几天的临时安排,很快会淡忘
语言中枢·表达喜欢的称呼、语气、彼此的暗号
内省·反馈AI 自己的反思与教训
视觉皮层 / 听觉皮层看过的画面、听过的歌

还有四个「器官」不存记忆,只在星环里显示数据流动:语言输入 → 海马体·写入 → 各脑区、大脑中枢·检索(回想时发出光束)、代谢·治理(让记忆淡去)。

记忆类型:事件、事实、偏好、技能、教训、反思。重要性从 0 到 1。


接法

不管接到哪个 AI 上,默认都用同一个数据目录 ~/.forget-me-not、同一把钥匙——在 DeepSeek、Claude、Codex 里,都是同一个她,记得同样的事。

① DeepSeek Harness(dsh)插件

装好之后,dsh 左侧栏会多一个 「记忆」 入口。点进去会全屏(盖住 dsh 左侧栏)播放星环成形的过场,然后就能多级缩放、浏览记忆;按 Esc 退出全屏。dsh 里的 AI 会自动拿到五个工具,系统提示词里会带上记忆的使用说明和 TA 现在的性格。

dsh 桌面版(最简单):设置 → 插件 → 输入包名 dsh-forget-me-not 安装,装好后重启桌面版。

命令行 / 网页版:

# 需要 pnpm 10+,dsh >= 0.2.1-rc.2
dsh plugin --profile web add dsh-forget-me-not
dsh web

不需要任何设置:模型第一次写记忆时,会自动在桌面生成钥匙并告诉你。

在 dsh 里,插件会借用你当前对话正在用的模型来自动总结和联想,不需要额外配置任何 key。 可选配置(桌面版写在 $DSH_HOME/profiles/desktop/cordis.patch.yml 或 $DSH_HOME/cordis.patch.yml,网页版写在 $DSH_HOME/profiles/web/cordis.patch.yml):

- insert:
    - id: forget-me-not
      name: dsh-forget-me-not
      config:
        autoDigest: true    # 每段对话结束后自动总结成记忆
        digestEvery: 3      # 每几轮总结一次(说到重要的事会立刻总结;太短的闲聊会自动跳过)
        autoRecall: true    # 用户每说一句话,自动想起可能相关的记忆放进上下文
        character: 绯语     # 用哪个角色的大脑(角色名或 id;不写就是主角色;写错了会退回主角色)
        aurabot:            # 和 Aurabot(QQ 插件)一起用时
          group: off        #   群聊 / 陌生人会话里不用勿忘我(默认);full = 也用(不推荐:群友能翻主人的记忆)
          private: full     #   主人私聊里用勿忘我(默认)
          persona: false    #   主人私聊里不叠加勿忘我的人设卡,人设交给 Aurabot(默认)

dsh 重启后续接旧会话,不会把整段历史重新总结一遍;子代理(subagent)的任务也不会被当成你说的话记下来。

② Claude Code 插件

/plugin install forget-me-not --marketplace kllcoco/Forget-me-not

旧版本的 Claude Code 分两步:/plugin marketplace add kllcoco/Forget-me-not,然后 /plugin install forget-me-not@forget-me-not。

装好之后:

  • AI 自动拿到记忆工具(MCP);
  • 每次开新对话,自动带上人设卡、性格和最重要的几段记忆;
  • 每说一句话,自动想起可能相关的记忆;
  • 每隔几轮自动总结成记忆:配置了 DEEPSEEK_API_KEY 或 FMN_LLM_* 时在后台静默总结;没配置时,会请 Claude 自己回顾一下再写;
  • 输入 /forget-me-not:memory,就在浏览器里打开记忆星环。

③ Codex 插件(OpenAI)

codex plugin marketplace add kllcoco/Forget-me-not

然后在 Codex 里输入 /plugins 安装「forget-me-not」,或者在 ChatGPT 桌面版的 Codex 里安装。功能和 Claude Code 版一样:记忆工具、醒来、自动想起、自动总结、打开记忆星环。Codex 会先让你审核一次插件的钩子,才会运行。

④ 任何支持 MCP 的客户端(Claude Desktop / Cursor / Cherry Studio …)

{
  "mcpServers": {
    "forget-me-not": { "command": "npx", "args": ["-y", "dsh-forget-me-not", "mcp"] }
  }
}

也可以用远程 MCP(streamable HTTP):http://127.0.0.1:7777/mcp。

⑥ QQ(NapCat + LangBot)

推荐在 dsh 桌面版里装 Aurabot + 勿忘我:表情包、语音、空间、主动搭话交给 Aurabot,记忆只有一份(勿忘我)。一步一步的教程见 docs/QQ接入.md。

⑦ Aurabot(dsh 里的 QQ 伙伴):只有一份记忆

Aurabot 自带一套明文的 SQLite 记忆。装上勿忘我版的记忆模块,就把它整个换掉——QQ 里的她和 dsh 里的她用同一个大脑:

dsh 里同时装了 Aurabot 和勿忘我的话,重启一次 dsh 就自动换好了,不用敲命令(配置 aurabot.module: builtin 可以关掉)。命令行手动装:

forget-me-not aurabot install            # 默认装进 ~/.dsh/plugins-data/aurabot(Windows:%USERPROFILE%\.dsh\plugins-data\aurabot)
forget-me-not aurabot install --dir <Aurabot 数据目录>
forget-me-not aurabot uninstall          # 用回 Aurabot 内置的记忆

它在 Aurabot 的 modules/memory/ 写一个入口文件(同名模块替换内置的;原来有别的就改名成 _memory.bak-… 备份),几秒内自动生效。

  • 主人私聊 → 勿忘我主大脑(和 dsh / Claude Code 共用;「我眼中的你」也会跟着更新)。
  • 群友、陌生人 → 单独的角色「QQ 群友」(记忆星环里能切过去看),每条记忆都带 qq:号码 和昵称标签;每个人还有一份加密的小档案(印象、关系、相处经验、说话方式、喜欢/讨厌)。和主大脑用同一把钥匙。
  • 主人在群里说的话一律不记:不进主大脑,也不当群友记。
  • 群里只带「正在说话的两个人的小档案 + 一句群印象」,私聊只带称呼和一句总体印象,相关记忆每轮最多 3 条(省 token);群里翻不到主人的任何记忆。
  • 工具 remember / recall_memory / lookup_person / chat_impression,以及空间日记、B 站、翻唱、主动搭话等模块用到的 add / addEvent / topicScore / dislikes / profiles …… 都照常能用。
  • 「忘掉…」和 /忘掉 …:勿忘我的记忆是封存的,AI 改不了也删不掉;这里是「取代」——旧的标成已被取代、不再被想起,原文仍封存着。要彻底删除请在记忆星环里用钥匙删。
  • 钥匙不在时不会出错:照样能记,翻记忆时她会说「记忆暂时打不开」。
  • 模块在跑时,dsh 插件在 Aurabot 的会话里自动让开(不给 memory_* 工具、不注入、不自动总结,避免记两遍);插件配置 aurabot.module: ignore 可以关掉这个行为。

⑤ 任何能调用函数的模型(OpenAI / Gemini / GPTs / Dify / Coze …)

先启动记忆星环服务:

npx dsh-forget-me-not serve     # 打开 http://127.0.0.1:7777
用途地址
OpenAPI(GPTs Actions、Dify、Coze)GET /openapi.json
各家函数格式GET /api/tools?format=openai|anthropic|gemini|mcp
直接调用工具POST /api/tools/<工具名>,请求体是 JSON 参数
给模型的使用说明GET /api/protocol(可以放进 system prompt)
自动总结一段对话POST /api/digest,{"transcript": [{"role":"user","text":"…"}, …]} 或纯文本

自动总结 · 更聪明的回想:用哪个模型

环境用来总结、联想的模型
DeepSeek Harness自动借用当前对话的模型
其他(MCP / REST / 命令行)DEEPSEEK_API_KEY(默认 deepseek-chat),或任意 OpenAI 兼容接口:FMN_LLM_BASE_URL + FMN_LLM_API_KEY + FMN_LLM_MODEL

回想是怎么「读懂意思」的:先粗筛候选(记忆不多时全部拿出来;多了就取字面相关、最重要、最近的各一批),再交给模型像人一样读一遍,挑出真正相关的、按相关程度排好。比如问「宠物不舒服」,它知道团子是猫,就会想起「团子今天吐毛球了」——一个字都不一样也没关系。模型挑不出来或超时,就自动退回字词匹配。

语义向量(可选,一般用不着;配了之后「意思相近、一个字都不一样」的记忆也能想起来): FMN_EMBED_BASE_URL + FMN_EMBED_API_KEY + FMN_EMBED_MODEL,任何 OpenAI 兼容的 /embeddings 都行,比如 OpenAI text-embedding-3-small、硅基流动 BAAI/bge-m3,或本地 Ollama 的 bge-m3。已有的记忆会在后台慢慢补上向量;向量和内容一起加密保存。

没有配置任何模型也能用,只是不会自动总结,回想只靠字词匹配和关联。

# 命令行:把一段对话总结成记忆
DEEPSEEK_API_KEY=sk-... npx dsh-forget-me-not digest 聊天记录.txt

AI 能用的工具

工具作用
memory_wake醒来:看看每个脑区有多少记忆,以及最重要、最近的几段。每次对话开始先调用。
memory_remember把自己总结好的一段记忆封存进某个脑区:内容、脑区、类型、重要性、情绪、标签、发生时间;重要的记忆可以带 image(链接 / base64 / 本地路径)或 image_prompt(描述那一刻的画面)。
memory_recall联想式回想:先想起最相关的几段,再顺着关联线把一整串相关的记忆(最多两跳,包括已遗忘的)一起召回。被想起的都会记得更久。
portrait_update更新「我眼中的你」:只改有新认识的那几栏,和原来的合并;随时可以改,旧版本保留。
persona_reflect性格养成:反思后微调自己的性格特质,必须写明原因。

AI 没有修改和删除的工具。写错了,它只能再写一条更正的记忆。


钥匙:封存是怎么做到的

可以把它想成一个邮筒:谁都能往里投信,只有拿钥匙的人能打开。

  1. 钥匙的诞生:模型第一次写记忆时,在你的电脑上生成一把 X25519 私钥,存成桌面上的 勿忘我-超级管理员钥匙.key,并在工具结果里要求模型马上告诉你钥匙的位置和指纹。数据目录里只留下公钥、指纹和钥匙的路径,私钥本身从不进入数据目录。
  2. 写入不需要钥匙:每段记忆用一把一次性密钥和公钥协商出加密密钥(ECDH + HKDF + AES-256-GCM),所以钥匙不在的时候 AI 也能写。
  3. 读取每次都要钥匙:回想、在星环里查看、搜索、修改、删除、导出之前,都会去登记的路径读一下私钥。钥匙在,就自动解锁;不在(比如你把 U 盘拔了),谁都打不开,包括 AI 自己。
  4. 小钥匙按钮:星环右下角有一个很小的钥匙(绿点表示钥匙在,红点表示不在)。挪了钥匙的位置,就在这里填上新路径。只有真正配对的那把钥匙才能登记上去。
  5. 一一对应:导出的记忆文件(.fmn)里内容仍然是加密的,只认这一把钥匙;导出和导入都必须有这把钥匙。 在记忆星环右下角的小钥匙里点「导出记忆」「导入记忆」,或者直接把 .fmn 文件拖进页面。换电脑时:带上钥匙和记忆文件,在新电脑上填好钥匙路径再导入。
  6. 磁盘上只有记忆的「外形」是明文:脑区、时间、重要性,用来在锁着的时候也能画出星环。内容、标题、情绪、标签、配图、性格,以及回想时用的线索,全部是密文。

⚠️ 钥匙只有一份,丢了就再也打不开这些记忆,谁也无法重新生成。也请不要把钥匙交给 AI。如果 AI 有读取你桌面的权限,它理论上能读到这个文件,所以备份后可以把钥匙挪到别处,再用小钥匙按钮更新路径。

数据目录:~/.forget-me-not/(独立运行、dsh、Claude Code、Codex 共用同一份),也可以用环境变量 FMN_HOME 指定。生成钥匙的目录可以用 FMN_KEY_DIR 改。

vault.json      公钥、指纹、钥匙的路径(没有私钥)
memories.json   记忆(外形明文,内容密文)
persona.json    性格(密文)
events.jsonl    大脑活动日志(线索加密)
images/*.bin    加密后的配图

遗忘曲线(艾宾浩斯)

保持率 R = e^(-t/S),R 低于 0.12 就被遗忘。

  • 「免疫系统 · 禁忌」里的记忆永远不会遗忘。
  • 其他脑区不复习的话,遗忘天数 = 6 + 84 × 重要性:闲聊小事 6 天,一辈子的事 90 天。工作记忆是 6~12 天。
  • 每被想起一次,稳定期 S 变长 60%(间隔重复,最多算 6 次)。
  • 遗忘的记忆不会出现在 memory_wake 里,不占上下文;但回想时可以按需召回,召回后重新开始计时。

回想排序:0.65 × 相似度 + 0.15 × 重要性 + 0.2 × 当前强度。

关联度 = 0.55 × 内容相似 + 0.3 × 共同的人和事(标签)+ 0.1 × 发生时间相近 + 0.05 × 同一脑区,高于 0.3 就连一条线(每段记忆最多 4 条)。召回时顺着这些线走两跳。


可塑性性格

八个特质:温柔、好奇、俏皮、沉稳、敏感、坦率、耐心、独立,每个 0~1,一开始都在 0.5。

  • 塑造:模型反思后用 persona_reflect 微调,每次最多 ±0.05;写入带情绪的记忆时也会自动留下很小的痕迹(比如开心的情绪记忆让 TA 更温柔,反思教训让 TA 更有耐心)。
  • 不失控:同一特质 24 小时内总变化不超过 ±0.1。
  • 会回落:长期不被强化的变化会慢慢回到基线(半衰期 180 天)。
  • 现在的性格和最近的成长原因会放进系统提示词里,脑图右侧有性格雷达图。

背景音乐

进入记忆后,音乐文件夹里的每一首歌会依次循环播放(mp3 / m4a / aac / ogg / opus / flac / wav / webm)。

  • 音乐文件夹:数据目录/music/(默认 ~/.forget-me-not/music/;每个角色有自己的音乐文件夹),也可以用 FMN_MUSIC_DIR 指定。
  • 更简单的办法:直接把歌拖进记忆星环的页面,就会放进这个文件夹并开始播放。
  • 右下角的小音符:点一下暂停或继续;换歌时会浮出歌名。
  • 想放《可塑性记忆》的 OP / ED?请放你自己合法拥有的音源,自己听没问题。歌曲有版权,即使是免费、非商业的开源项目也不能把歌打包分发,所以本项目不附带任何歌曲。

记忆星环怎么玩

  • 开场:一颗星核亮起,星尘从四面八方飞来,沿着 ∞ 绕一圈,连成莫比乌斯星环。双击屏幕、按任意键或点右下角「跳过」都可以跳过。
  • 全屏:在 dsh 里点「记忆」直接全屏;独立页面第一次点击时进入全屏。按 Esc 退出。
  • 多级缩放:滚轮或双指缩放,右侧也有缩放条。离得越近,星光越显出各自脑区的颜色。一直拉近到中间的星核,会穿进去变成脑图(也可以点「脑图」按钮);莫比乌斯星环不会消失,会变成环绕整个大脑的一圈星河;星河内部的背景是一整片旋转的银河——金色的核心、四条旋臂、粉色星云和尘埃带,内圈像群星风暴一样卷动。在脑图里拉远,又会退回星环。
  • 脑图 = 一个太阳系:中间的「心核」是太阳,也是 TA 的人设卡(点一下太阳或右边的卡片);四个过程器官是内行星,九个记忆脑区是外行星,沿着各自倾斜的椭圆轨道公转,越靠外转得越慢;每段记忆是绕着自己脑区转的卫星,长期记忆库像土星,记忆排成一圈光环。看记忆卡片时公转会放慢。轨道几乎透明。
    • 永不遮挡:所有轨道在同一平面上、是同心圆;相邻轨道的间距按两边模块的大小算出来,满足 Δr · sin(35°) ≥ 内侧半径 + 外侧半径 + 留白;镜头的仰角也限制在 35° 以上。所以从任何允许的角度看,无论行星转到哪里,都不会互相挡住。
  • 我眼中的你:一颗绕着心核转的小卫星,是 AI 对用户的完整了解,就像你心里对一个老朋友的档案。分成 12 栏:基本信息、性格、身边重要的人、喜欢的、不喜欢的、作息与习惯、情绪、沟通方式、最近、目标与梦想、在意的事、我们。另外还有「总体印象」「还想知道的」和「了解程度」(填了几栏)。
    • 它不是封存的记忆:AI 一知道用户的新信息,就用 portrait_update 只改对应的那几栏(自动总结对话时也会顺便更新);用户在钥匙在的时候也能手动改。每一版都留着。
    • 每次对话都整份带上,规则要求 AI 回答前先想想它:按 TA 喜欢的方式说话,记得 TA 身边的人和最近的事。
    • 「还想知道的」里的事,AI 会在聊天自然走到那里时再问,一次最多问一件,不会像查户口。
    • 健康、过敏、雷区放在「免疫系统 · 禁忌」里,这里不重复。
  • 人设卡:名字、身份、人设与外貌、性格底色、说话方式、关系与世界观、开场白、头像。人设卡会和性格一起放进系统提示词。只有钥匙在的时候能编辑;可以直接导入酒馆(SillyTavern)的角色卡(.png / .json,V1 / V2 / V3),拖进页面就行。线是弯曲的「神经纤维」:两端亮、中间淡,光脉冲沿着它流动。彩色粗一点的是脑区之间的数据流,细的是记忆之间的关联。点任意一颗星,会按关联放一串「联想走马灯」,卡片下方能直接跳到关联的记忆。
  • 走马灯:靠近星环停一会儿,就会从最近的那颗星开始逐个放映。镜头沿着星环滑行,记忆卡片跟着星光弹出;重要的记忆停留得更久,并配上那一刻的画面。没有真实图片的记忆,会按 image_prompt 画一幅「记忆画」(离线生成,同一段记忆永远是同一幅画)。也可以点左侧的脑区,或点任意一颗星。键盘 ← → 切换,空格暂停,Esc 离开。
  • 实时动画:AI 写入记忆时,一颗彗星从「语言输入」飞到「海马体」,再飞进对应脑区,新星诞生。回想时,「大脑中枢」向被想起的星发出光束。淡忘时,星光像灰烬一样落下。复苏时会迸出金色火花。
  • 搜索(钥匙在的时候):右上角「想起……」。
  • 锁着的时候:星环照样会画出来,但每张卡片都是封着的。

更多能力

一个角色一个大脑

同时养好几个角色(比如「星眠」和「大肥鱼」)时,每个角色都有自己的记忆、自己的人设卡、自己的钥匙,互不相通。

  • 记忆星环左上角的角色按钮可以切换角色、新建角色。主角色在 /,其他角色在 /c/<角色 id>/。
  • 给 AI 选角色:环境变量 FMN_CHARACTER=<角色 id>(MCP、Claude Code、Codex 插件),或 dsh 配置里的 character(写角色名或 id 都行)。
  • 命令行:forget-me-not characters 列出角色,forget-me-not characters new 大肥鱼 新建。

记忆会过时

情况变了(搬家、换工作、分手、喜好变了),AI 写新记忆时会在 supersedes 里填上旧记忆的 id,旧的就「退休」:不会再被想起,也不会复苏,但在星环里还看得到(标着「已被新的记忆取代」)。自动总结对话时也会这样做。

睡眠整理

像人睡觉时整理记忆一样,每天把同一脑区里零碎、相似的小记忆(至少 3 段)合并成一段。比如五次「去楼下面包店买海盐卷」会合成一段「……这样的事发生过 5 次」。有模型时由模型写概括。原来的记忆内容不改,只标记「已整理」,不再被单独想起。也可以在小钥匙里点「睡眠整理」,或运行 forget-me-not sleep。「免疫系统 · 禁忌」和重要的记忆不会被合并。

钥匙备份

把钥匙拆成 3 片,任意 2 片就能拼回来;只拿到 1 片的人什么也打不开。用的是沙米尔秘密分享(Shamir's Secret Sharing)。

  • 星环小钥匙里点「备份钥匙」,会打开一张可以打印的页面,每片一个二维码,也可以存成文本。
  • 钥匙丢了:点「用碎片恢复」,选任意 2 片,钥匙会重新放到桌面并自动登记。
  • 命令行:forget-me-not key split,以及 forget-me-not key restore 碎片1.txt 碎片2.txt。

主动找你聊天

TA 不只是等你开口:隔一阵子会主动来问问你——前几天你说的面试怎么样了、饭点吃了没、那年今天、周日晚上「这周我记住了你的这些事」、还有「我眼中的你」里一直想知道的事。 每天最多 3 次、9 点到 23 点、两次至少隔 3 小时;你正在聊天时不打扰,连着被冷落就自觉少来。 forget-me-not proactive --once --dry-run 先看看 TA 会说什么;接 QQ 见 docs/QQ接入.md。

省 token

自动总结会攒几轮再一起做;聊到生日、过敏、喜欢讨厌、约定这类事才立刻总结(dsh 的 digestEvery 默认 3,Claude Code / Codex 用 FMN_DIGEST_EVERY)。

回忆时间线

工具栏的「时间线」:一年里每一天留下了多少记忆(越亮越多)、「那年今天」、按月份翻看。点任意一段,镜头就会飞过去放映。


开发

npm test                                   # 单元测试(node:test,零依赖)
node bin/forget-me-not.js seed --reset   # 放入一年份的示例记忆(全部虚构),第一次会在桌面生成钥匙
node bin/forget-me-not.js export / import <文件> --key <钥匙路径>
node bin/forget-me-not.js serve
  • 运行时零依赖,只需要 Node 20 或更高版本。Three.js r170 放在 web/vendor/ 里,可以离线使用。
  • lib/core/:大脑、加密、工具定义、HTTP、MCP。独立服务和 dsh 插件共用这一份。
  • lib/index.js / lib/client.js:dsh 插件的 Host 端和浏览器端。
  • web/:记忆星环与脑图(Three.js + 自写着色器 + Bloom)。

License

MIT。Three.js 使用 MIT 许可,见 web/vendor/three/LICENSE。

Related plugins