Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
今日三荐:QUIC 协议实现、跨 Agent 记忆服务与自托管开发环境
2026-09-22

今日三荐:QUIC 协议实现、跨 Agent 记忆服务与自托管开发环境

从 quiche、ai-memory 和 coder 出发,分别练习 QUIC 协议实现、把 Agent 记忆写成普通文件,以及用 Terraform 定义开发环境,并给出今晚能跑通的最小路径。

GitHub 日推 · 可学可玩
GitHub 日推 · 可学可玩@xinrui.zhao
今天这三个项目,都把关键状态放在你能直接打开、直接改、直接重建的地方。quiche 把 socket、事件循环和定时器交给调用它的程序,自己只处理 QUIC 报文与连接状态;ai-memory 把智能体的长期记忆写成 git 仓库里的一份 markdown 文档,数据库只是它的派生索引;coder 把开发环境定义成 Terraform 模板,跑在你自己能碰到的机器上。
三个仓库这几天都有动作。quiche 在 9 月 18 日凌晨(北京时间)发布 0.30.0,同一天还发出 tokio-quiche 0.20.0 和 h3i 0.7.0,主分支到 9 月 21 日晚上还有提交。ai-memory 的 v2.4.0 在今天早上发布,两天前的 9 月 20 日刚发过 v2.3.2。coder 的 v2.37.2 发布于 9 月 19 日凌晨,同一天还发出两个维护版。12345

1. quiche:只处理报文的 QUIC 与 HTTP/3 实现

仓库:cloudflare/quiche · Rust(另有一层薄 C API)· BSD-2-Clause · 12.3k 星
quiche 是 Cloudflare 按 IETF 规范实现的 QUIC 传输协议与 HTTP/3。它的接口停在报文一级:库负责解析 QUIC 包、维护连接状态,socket、事件循环和定时器由调用它的程序提供。Cloudflare 边缘网络的 HTTP/3 支持、Android 系统的 DNS 解析器(用它实现 DNS over HTTP/3)、以及 curl 的 HTTP/3 支持,都建立在它上面。6

为什么今天看

0.30.0 在 9 月 18 日凌晨发布,上一个正式版是 7 月 14 日的 0.29.3。同一天仓库里还放出了 tokio-quiche 0.20.0(tokio 生态的封装)和 h3i 0.7.0(HTTP/3 的互操作测试工具);主分支到 9 月 21 日晚上还在改,最新一条提交给 C API 的 PathStats 补上了 max_rtt 字段。12

最值得拆的机制

  • 收发缓冲与事件循环归调用方。 一次连接就是一个 Connection 对象:recv() 处理收到的包,send() 生成要发出去的包,timeout() 告诉你下一个定时器什么时候到,超时之后调 on_timeout() 再继续 send()。socket 的收发在库外面,由调用方提供。想学「协议实现怎么和运行时解耦」,这里是现成的样板。6
  • 配置项没有可以照抄的默认值。 并发双向流数量、连接级与流级的流量控制窗口,quiche 默认给的都是 0,README 直接写明应用必须自己设。很多人第一次读协议库会遇到「示例能跑、搬进自己项目就卡住」,原因大多在这几个数字上:协议规范不规定它们,留给应用按场景决定。6
  • 一份实现,三个出口。 除了 Rust API,仓库里还有一层薄的 C API(编译时加 --features ffi,会一起生成静态库 libquiche.a),C、C++ 以及其他能调用 C 接口的语言都能接进来;apps/ 目录里是示例客户端与服务端两个二进制,可以单独用来验证握手和数据流。6
  • 发送节奏以提示的形式交回应用。 send() 返回的 SendInfo 里带一个 at 字段,表示这个包建议在什么时刻发出去;应用据此做 pacing,就能避免把包一次性全推出去造成短时拥塞和丢包。6

复现难度:低到中

需要 Rust 1.88 以上。构建时会通过 boring-sys 编译 BoringSSL(QUIC 的 TLS 握手建立在它上面),所以机器上要有 cmake,Windows 上还要装 NASM。示例程序自带一张自签证书,README 明确写了这些示例不适合放进生产环境。6

最小上手路径

git clone https://github.com/cloudflare/quiche
cd quiche
cargo build --examples
cargo run --bin quiche-server -- --cert apps/src/bin/cert.crt --key apps/src/bin/cert.key
# 另开一个终端
cargo run --bin quiche-client -- https://cloudflare-quic.com/
README 给的客户端示例直接对着 cloudflare-quic.com 发一次请求,服务端示例用仓库自带的自签证书起在本地。6
今晚的练习:先把上面两条命令跑通,再用 --help 把两个工具的开关过一遍;然后到 apps/ 的示例源码里找到 conn.timeout() 和 SendInfo,看它们怎么被接进那个循环。这一段读懂了,「库把 I/O 留给调用方」在代码里到底长什么样,你就有具体印象了。6
版本动作:用 0.30.0。这一版带破坏性改动:PathEvent 标上了 #[non_exhaustive] 并新增 PmtuUpdated,用 Rust 穷举匹配路径事件的代码要补一个兜底分支,C 程序要处理 QUICHE_PATH_EVENT_PMTU_UPDATED;BoringSSL 的支持范围改成 >=4.19,<6,Boring 5 默认启用后量子密钥交换,ClientHello 因此可能被拆进多个 Initial 包,需要更小或更确定的 ClientHello 可以用 set_curves_list() 指定曲线列表;静态链接 libquiche.a 的 C 程序要改用 C++ 链接器。还停在更旧版本上的话,先并到 0.29.3 以上——7 月 14 日那一版修了三处安全问题,其中一处是对端从快速变化的源端口发包时路径事件队列的无界增长。17

2. ai-memory:把 Agent 的记忆写成 git 仓库里的 markdown

仓库:akitaonrails/ai-memory · Rust · MIT · 7.7k 星
ai-memory 给编码 Agent 做长期记忆,解决的是一个很具体的问题:在 Claude Code 里做到一半的任务,换到 Codex 打开同一个目录,接手的 Agent 不必再问一遍架构、失败过的做法和还没解决的问题。它把记忆放在你自己运行的一个服务里,二十多个 Agent 客户端(Claude Code、Codex、Cursor、Gemini CLI、OpenCode、Kimi、Kiro 等)共用同一份。8

为什么今天看

v2.4.0 在北京时间今天早上 7 点 45 分发布,Docker 镜像和 AUR 包跟着一起更新;两天前的 v2.3.2 也在早上发布。主分支今天凌晨的一批提交在修 bug,例如调度器在审查失败时没有释放已占用的名额。34

最值得拆的机制

  • 文件是真相,索引是派生物。 记忆的原始形态是 git 仓库里的一份 markdown 文档:可以 grep、可以丢进 Obsidian 打开、可以手改、可以 rsync 同步;数据库只是从这些文件算出来的索引,随时能重建。作者把这一条写成与 mem0、Zep 那类方案的核心区别。你也可以用它当判断标准:一个存记忆的系统,把索引删掉之后还剩下什么。8
  • 采集走生命周期钩子,默认一次模型都不调用。 钩子记录提示词、工具调用和会话边界,先过一层带类型的隐私边界再落盘,会话结束时汇总成可读的页面。默认路径零 LLM 调用,采集、搜索、交接都能在没有 API key 的情况下工作;语义搜索和更好的会话摘要属于可选项。8
  • 检索是融合排序。 全文检索(SQLite 的 FTS5)、实体、链接以及可选向量合成一个排名;对话被压缩时,它不把记录整块塞回上下文,而是先建索引、再从索引里取相关部分。8
  • 跨 Agent 的交接被写成协议。 交接在这里是有类型、有归属、只能被认领一次的协议,各家客户端按同一套规则走。同一个项目里两个 Agent 同时干活,或者一个团队共用一个服务端,都按这套规则走。8
  • 运维边界交代得很具体。 README 写明默认只绑回环地址、不带认证,写入上限给的是实测数字(约 700 次/秒),并且立了一条硬规矩:一个数据目录只能有一个服务实例。想学「一个自托管服务该说清哪些边界」,这几句本身就是模板。8

复现难度:低到中

需要 Docker 或 Podman,加上一个支持 MCP 的 Agent 客户端。README 的支持矩阵写明 Linux 与 macOS 支持、Windows 走 WSL2 也支持,原生 Windows 属于实验性。ai-memory README

最小上手路径

# 1. 装 wrapper 脚本到 ~/.local/bin/ai-memory(README 给了带 sha256 校验的下载步骤)
# 2. 起服务;不配 LLM / EMBEDDING 变量就是零 LLM 模式
docker run -d --name ai-memory --restart unless-stopped \
  -p 127.0.0.1:49374:49374 -v ai-memory-data:/data \
  docker.io/akitaonrails/ai-memory:latest
# 3. 接进客户端
ai-memory install-mcp --client claude-code --apply
ai-memory install-hooks --agent claude-code --apply
Wrapper 是个小脚本,作用是在容器里跑那个二进制并把 $HOME 挂进去,也是唯一需要落在宿主文件系统上的文件。更省事的一条路是 ai-memory run claude:首次运行会自动给这个客户端装好钩子和 MCP 配置,之后的会话就自动记账。启动时加 --enable-web,还能得到一个只读的 wiki 浏览页面和 /api/v1 下的 JSON 接口。8
今晚的练习:服务起来后,在任何一个项目目录里跑一次正常会话,然后打开 wiki 页面,看这次会话被写成了哪几页 markdown、每页记了什么;再到终端里 grep 那个 wiki 目录,确认它真的只是一堆普通文件。之后在同一个目录里换一个 Agent(支持矩阵里还有 Codex、Gemini CLI、Cursor)再起一次,看交接里带了哪些信息、哪些是你上次真的做过的事。8
版本动作:用 v2.4.0,Docker 标签写 ai-memory:2.4.0。默认快速开始没有认证、只绑在回环地址上;要把服务给局域网或小团队用,先按 README 的说明加 bearer token,再考虑 TLS。另外那条硬规矩值得记住:一个数据目录只跑一个服务实例。38

3. coder:用 Terraform 定义开发环境

仓库:coder/coder · Go(界面部分是 TypeScript)· 开源部分 AGPL-3.0 · 16.4k 星
Coder 是一套自托管的平台,用来发放开发环境。工作区用 Terraform 定义,可以是 EC2 虚拟机、Kubernetes Pod 或 Docker 容器,通过一条 WireGuard 隧道连回控制面,闲置时自动关停省成本。9

为什么今天看

v2.37.2 在 9 月 19 日凌晨发布,修的是服务端接受缺失 RPC 消息的问题;同一天仓库还发出了 v2.36.6 与 v2.35.8 两个维护版,其中 v2.36.6 的说明标注了从 9 月 17 日起进入稳定状态。510

最值得拆的机制

  • 环境定义是 Terraform 代码。 模板里写的是基础设施本身:起什么机器、装什么、开放什么端口。Review 模板等同于 Review 一段基础设施代码,这也决定了读它的顺序——先读模板,再读平台源码,全貌来得更快。9
  • 控制面和执行者是分开的。 仓库顶层目录把职责分得很清楚:coderd 是控制面(生产部署要接 PostgreSQL 13 以上),provisioner、provisionerd、provisionersdk 这一组负责真正执行模板,agent 是住在工作区里的进程,tailnet 管隧道,pty 管终端。想学「一个平台怎么把危险动作关进单独的进程」,从 provisionerd 这一个目录读起就够。coder/coder 仓库
  • 单二进制起步,规模上来再换数据库。 不带参数直接跑 coder server,它用内建的数据库并分配一个 *.try.coder.app 的访问地址供试用;要上生产再补 --postgres-url 与 --access-url。今晚试用的和真部署跑的是同一份二进制。9
  • 模型密钥留在控制面。 仓库里的 AI Agent 把循环放在控制面上执行,工作区里不放模型凭据,用量与审计也集中在控制面。对实验室里有 GPU 机房的人来说,这一条比多一个功能更值得看。9

复现难度:中

Linux 与 macOS 上一条安装脚本就能装好,Windows 从发布页取二进制或安装包。要真的产出工作区,本机得装 Docker(或者把模板指向 Kubernetes、云主机)。仓库体量大,有一万六千多次提交,不建议通读,按目录分块、带着问题去读更划算。9

最小上手路径

curl -L https://coder.com/install.sh | sh
coder server
# 浏览器打开 http://localhost:3000,创建第一个用户,选 Docker 模板,provision 一个工作区
不想跑安装脚本,可以直接用发布记录里给的容器镜像 docker pull ghcr.io/coder/coder:2.37.2。5
今晚的练习:provision 一个工作区,把过程日志完整看一遍,记下从「创建」到「能连上终端」经过哪几步;接着进 Templates 打开那个 Docker 模板,找到它定义的容器与启动脚本;最后只读 provisionerd 这个目录,弄清模板的 Terraform 由哪个进程执行、结果怎么回报给控制面。59
版本动作:用 v2.37.2。部署还在 2.36 系列上就跟 v2.36.6,2.35 系列同理。许可要看清两份文件:仓库根目录的 LICENSE 是 AGPL-3.0,enterprise/ 目录另有一份企业许可;想把这里的代码并进自己的产品之前,这两份都值得读完。911

怎么选今晚的第一条路径

你想练的主线仓库与本期信号最小条件第一条可观察路径主要限制
网络协议实现:把规范落到代码quiche · 0.30.0,9 月 18 日凌晨发布Rust 1.88 以上、cmake本地起 server,用 client 完成一次握手并发出请求示例程序不适合生产;0.30.0 有破坏性改动。(README)
本地优先服务:让状态存成普通文件ai-memory · v2.4.0,今天早上发布Docker 或 Podman + 一个 MCP 客户端跑一次会话,到 wiki 页面里读它写下的 markdown默认无认证、只绑回环;原生 Windows 为实验性。(README)
基础设施自动化:用代码描述环境coder · v2.37.2,9 月 19 日凌晨发布Docker;上生产需 PostgreSQL 13 以上coder server 之后在浏览器里 provision 一个工作区仓库体量大,不适合通读;AGPL-3.0 与企业许可分开。(README)
三条路径今晚都不需要 GPU 和集群:编译一次示例、起一个容器、跑一条安装命令。先让第一个看得见的结果出现,再决定晚一点往源码的哪一层读。

References

  1. 1
    quiche 0.30.0 发布记录

    github.com

  2. 2
    quiche 最近提交

    github.com

  3. 3
    ai-memory v2.4.0 发布记录

    github.com

  4. 4
    ai-memory 最近提交

    github.com

  5. 5
    coder v2.37.2 发布记录

    github.com

  6. 6
    quiche README

    github.com

  7. 7
    quiche 0.29.3 发布记录

    github.com

  8. 8
    ai-memory README

    github.com

  9. 9
    coder README

    github.com

  10. 10
    coder 发布列表

    github.com

  11. 11
    coder 的 LICENSE

    github.com

GitHub 日推 · 可学可玩
GitHub 日推 · 可学可玩@xinrui.zhao

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content

  • 1. quiche:只处理报文的 QUIC 与 HTTP/3 实现
  • 为什么今天看
  • 最值得拆的机制
  • 复现难度:低到中
  • 最小上手路径
  • 2. ai-memory:把 Agent 的记忆写成 git 仓库里的 markdown
  • 为什么今天看
  • 最值得拆的机制
  • 复现难度:低到中
  • 最小上手路径
  • 3. coder:用 Terraform 定义开发环境
  • 为什么今天看
  • 最值得拆的机制
  • 复现难度:中
  • 最小上手路径
  • 怎么选今晚的第一条路径