Writing
一组关于代码、工具与判断的长期笔记。它们从具体实践出发,保留问题形成的过程,也记录那些在速度之外仍值得反复辨认的细节。
-
给 Next.js 套一层 Electron 壳:零改动打包成桌面应用
StockTracker 之前是一个纯 Web 服务,想着 Electron 易于分发,尝试把它打包成桌面客户端。本文记录整个过程中 Next.js 代码零改动的架构设计、踩过的坑和最终方案。
-
我如何组织 AI 翻译扩展的缓存、批处理与 Provider
在双语阅读扩展里,翻译请求如果由页面脚本随手发送,很快会变慢、变贵、难以恢复。我在 Parallel Translate 中如何把缓存、批处理、多 Provider 与页面渲染拆开处理。
-
我如何在浏览器扩展中把网页变成双语阅读视图
我最近在做一个双语阅读浏览器扩展。真正棘手的并不是把一句英文交给翻译服务,而是在不破坏原网页的前提下,找到正文、按需翻译、保留交互,并且随时还原页面。
-
为什么我用 SQLite 作为个人投资系统的数据底座
在 StockTracker 里,我没有把 SQLite 当成一个简陋的本地缓存,而是把它作为个人投资账本和 AI 工作流状态的本地数据底座。这篇文章从持久化方案对比讲到 SQLite 的机制和取舍。
-
为什么投资系统不能只使用 JavaScript number 计算金额
JavaScript 的 number 很方便,但它表达的是二进制浮点数,不是金融系统需要的十进制语义。这篇文章从 0.1 + 0.2 讲到手续费、每股成本、FIFO 成本队列和 big.js 选型。
-
AI 对话里的逐字输出,背后其实是一条不断吐数据的 HTTP 响应
很多 AI 对话产品看起来像是在一个字一个字地打出来,背后通常不是 WebSocket,而是基于 text/event-stream 或 ReadableStream 的 HTTP 流式响应。这篇文章拆解 SSE、Content-Type 和前端增量渲染的实现细节。
-
做 AI 对话产品,难点不在聊天框
在 StockTracker 里做 AI 对话之后,我越来越觉得真正难的不是把模型接进聊天框,而是让一次提问、一次澄清、一次分析和一段历史都能成为可继续推进的工作流状态。
-
让 AI 分析靠谱之前,先把投资账算清楚
在 StockTracker 里,我越来越意识到 AI 投研体验的底座不是提示词,而是可审计的交易账本、成本口径、手续费规则和行情有效性。
-
我如何从持仓数据设计个人投资 Agent
StockTracker 的 AI Agent 不是通用聊天机器人,而是围绕本地持仓数据工作的投研助手。这篇文章拆解它的设计思路、核心链路和一些取舍。
-
做 Agent 时,我越来越在意记忆所有权
很多 Agent 产品把“记忆”当成体验卖点,但从工程和产品角度看,我越来越觉得记忆所有权才是真正的核心。