项目
这是一个整理我至今做过的项目的页面。从个人项目到开源贡献,再到学校作业,全部都汇总在这里(……)比想象中要多。
开源贡献
我并没有想着要靠开源贡献获得什么荣华富贵,但是用各种开源软件用得多了,难免会遇到一些不能正常工作的情况。与其等别人来修,不如自己动手更快,所以遇到需要的时候我会自己修好然后提 PR。
2025
- rustfs/rustfs #1018 — 在 Helm chart 中将 storageSize 拆分为 data/log 各自的参数。把数据存储设成 2TB 的话日志也会变成 2TB(……)所以拜托请把它分开吧。
- thuliteio/doks #1356 — 升级了 Hugo 版本之后原本能跑的东西不能跑了,于是修了一下。
- Jaydee94/kubeseal-webgui #278 — 用得挺好的,但 Secret 复制到剪贴板坏了,于是修了一下。
2024
- opensearch-project/helm-charts #618 — Helm 升级版本之后部署失败了,查了一下发现默认的 opensearch.yml 和 security plugin 冲突。
2023
- minio/operator #1910 — existingSecret 不生效,查看后发现 YAML 缩进写错了。
- getsentry/sentry #60571 — 在读文档时发现了一个错别字……各位,错别字修复 PR 一般很快就会被合并的。这是给大型开源项目蹭一脚的最佳方式。
- stepci/stepci #66 — 新增 CLI 默认命令的输出。这是我第一次给开源项目提 PR!
2026
2025
2024
2023
2022
2021
2017
lemon-design-system
GitHub ↗AI 智能体友好的个人设计系统
我在 GeekNews(韩国技术资讯网站)上看到了 awesome-design-md ,虽然把别人网站的设计扒下来作为预设来提供这件事我并不喜欢,但「AI 可以拥有一致的设计系统」这个想法本身我觉得很不错。
因为我做的项目本来就比较多,所以我一直希望能拥有一套自己的设计系统,让人一眼看到设计就能知道:啊,这是 LemonDouble 的项目!
我之前确实找过认识的设计师朋友用 Figma 外包过,但是……毕竟我是服务器开发者,有些东西实现起来挺难的,而且每个项目都需要不断新增组件,总不能每次都去找设计师外包,所以一直都没能真正应用起来。
但有了这个方法论之后,我觉得也许真的可以做到了,于是从我 favicon 的 logo 出发,提取出 Primary / Secondary 颜色,然后调整每种颜色的饱和度和明度,做出方案后用眼睛检查、不断修改直到满意为止。
从博客开始,我把它应用到了所有前端页面上。
效果还挺不错的。
hayakoe
GitHub ↗ONNX 优化的日语 TTS 库
在 TTS 领域有一条 Bert-VITS → Style-Bert-VITS2 的脉络。
Bert-VITS 是 Fish-Speech 团队的旧模型,现在他们已经转向 autoregression 方式的 Fish-Speech 仓库,原仓库的更新就停了。
在此基础上加入了 style 相关的 layer,并用更多的日语数据训练,提供日语强化的 Pretrained 模型,这就是 Style-Bert-VITS2 仓库。
此外还有一些其他的改进。
但是 Style-Bert-VITS2 的更新也已经停了大概 8 个月了……反正都停更了,我想趁这个机会整理一下代码,让它用起来更顺手,于是就开始做这个项目了。
已实现内容
- 由于 pyopenjtalk-prebuilt 库已停更,无法在 Python 3.12 以上版本使用,于是我把那个仓库 fork 出来,修改成最新版本也能构建的 lemon-pyopenjtalk-prebuilt 库,并替换掉了原依赖
- 修复了 TTS 文本中包含英文时会被处理为静音的问题。利用 loanwords_gairaigo 数据自动支持约 22 万条 英文→片假名 映射,并简化了自定义词典注册功能
- 对 BERT 权重进行动态量化,内存占用减少约 50%
- 把 Synthesizer 用 ONNX 优化,CPU 推理速度提升约 1.6 倍
- 把 BERT / Synthesizer 模型加载分离开来,BERT 共享使用,每个说话人只单独加载对应的 Synthesizer,使每个说话人只占用约 200MB 内存
- 发布到 PyPI,
pip install hayakoe后只需 3 行代码就能直接使用 - 在仅 CPU 环境下不需要安装 PyTorch,仅靠 ONNX Runtime 也能推理,改造为双后端架构
- 支持按句子粒度的流式 TTS(
stream())。不再一次性处理长文本,而是逐句顺序生成,可用于实时响应 generate()自动把长文本按句子分割处理,速度提升约 37 倍(以 400 字为基准从 143 秒缩短到 3.8 秒)- 通过
weight_norm→parametrizations.weight_norm的迁移确保 PyTorch 2.x+ 的兼容性
实现中内容
- 正在实现一条预处理流水线,可以从想要提取数据的视频中自动生成训练数据。视频上传 → 提取音频 → 分离背景音 → Whisper 生成字幕 → 自动构建数据集,全流程一气呵成
- 正在实现一个交互式训练 CLI,从数据集预处理到模型训练、再到生成质量报告,可以一条龙完成
super-arona
和 Arona 对话 - 基于 LLM 的 3D MMD 角色查看器
这是一个可以和《碧蓝档案》中的 Arona 对话的 3D 角色查看器。
- 使用 Babylon.js + babylon-mmd 渲染 PMX 模型
- 支持 16 种表情 morph target、14 种 VMD 动作
- 使用 Bullet WASM 进行头发/衣物的物理模拟
- 计划接入基于 LLM 的对话功能
之前有一个叫做 arona 的项目,那个项目只是一个通过 query 参数接收文本并显示的简单聊天界面。
super-arona 是它的后续作品,正如其名,是更具野心的版本。
shiroko
告诉我天气吧
这是为了在 HomeAssistant 中通过 ADB 投屏到电视上而做的天气应用。
根据韩国气象厅预报中的降水类型,会展示雨/雪等天气动画。
虽然只是个人用,没什么特别的,但每天早上播报一下天气,可以决定是骑自行车上班还是不骑,挺方便的。
haruna
周五美食会问卷工具
这是一个美食评价系统。
每周五我都会和朋友一起去探店,既然都吃了,要是能顺便打个分就好了,于是做了一个匿名投票系统。
- 转盘抽签
- 星级评价
- 自动复制 Google Maps URL
- 生成 QR 码
claude-dashboard
为自己做的 Claude Code 网页仪表盘
解析 ~/.claude/projects/ 中的 JSONL 文件,将 Claude Code 的使用情况(费用、token、会话、模式)可视化的网页仪表盘。
用 Docker Compose 起一下就能跑。
可以一目了然地看到自己究竟把 Claude 用得有多狠(……)。
Style-Bert-VITS2
GitHub ↗基于 Style-Bert-VITS2 的日语 TTS 库
正在把原项目重新打包成可以直接通过 pip install style-bert-vits2 安装的库。
打算让它在 ONNX 运行时下也能在 CPU 上实时推理,下载包之后只需要 3 行代码就能进行推理。
kepco_powerplanner_ha_addon
GitHub ↗韩国电力公司 PowerPlanner Home Assistant 插件
原版插件是用 HA REST API 创建传感器的方式,因此无法指定 Entity ID 的 alias。
- 改为 MQTT Discovery 方式,赋予
unique_id,使其在 HA UI 中可以修改传感器名称并进行管理 - 通过 Supervisor API 自动检测 MQTT broker,简化设置
claude-slack-bridge
GitHub ↗Claude Code ↔ Slack 双向桥接 MCP 服务器
这是一个为了在让 Claude Code 干活、自己暂时离开座位时使用而做的 MCP 服务器。
相比原版做了相当多的扩展,主要功能如下:
- 4 种 MCP 工具:
ask_on_slack(发送问题并等待回答)、notify_on_slack(仅发送通知)、upload_to_slack(文件上传)、download_slack_file(下载 Slack 附件) - Slack → Claude:在 Slack 中 mention 机器人,会显示项目列表,选择后会在该项目下开启 Claude 会话。也可以直接在 Slack 中创建新项目。
- 实时进度:每当 Claude 调用 Read、Edit、Bash 等工具时,Slack 消息会实时更新。
- 消息排队:在 Claude 工作期间往 Slack 线程留消息,工作结束后会自动接着处理剩下的内容。
- 通过表情反应取消:加上 ❌ 反应可以中断工作。
- 模型/effort 设置:可以在线程内通过命令切换模型(sonnet/opus/haiku)和 effort 等级,也可以保存全局默认值。
- token 用量显示:响应完成后会自动显示模型名、token 数、缓存命中率、费用、耗时。
ble_controller
GitHub ↗基于 BLE GATT Write 的通用 Home Assistant 控制器
我在速卖通买了个便宜的电视联动背光灯,App 联动是有的,但没有第三方接入接口……既然如此,我想着借这个机会顺便学一下 BLE HCI 抓包,于是就开始了这个项目。
这是一个通用控制器,对于没有专属 HA 集成的 BLE 设备,只要在 UI 中指定 Service UUID/Characteristic UUID/hex payload 就能控制。
我也写了一篇开发记博客 。
extended_graph_agents
GitHub ↗LangGraph 风格的可视化多 agent 工作流编辑器
受 LangGraph 启发而做的项目。
Home Assistant 中 Entity 越来越多,让一个 Agent 处理全部就太吃力了,能不能拆分成合适的 subagent?基于这个想法做了这个项目。
光是现在 entity 就有差不多 300 个了。
一开始的方向是用 React Flow 画布拖拽节点来手动构建工作流,但是认真用 Claude Code 用着用着我发现一件事情。
其实大家几乎没有「想自己动手做图」的需求。
而且要怎么搭其实也得跑一次才有感觉……
所以从 v2 开始我转向了 Claude Code 那种风格——通过自然语言不断更新工作流,最后只在那些真的搞不定的地方手动调一调。
只要用自然语言描述,AI 就会自动生成/修改 LangGraph 风格的工作流,保存后会直接注册为 HA Conversation Agent。
lemon_tts
GitHub ↗多语言输入→日语 TTS Home Assistant 集成
反正 BERT-VITS 服务器一直都在跑着……抱着「就让认识的人一起用吧」的心情做的 HA 集成。
- 输入韩语/英语等会自动翻译后输出日语语音
- 从 API 服务器获取 speaker 列表,按 speaker 自动生成对应的 TTS 实体
kanban
GitHub ↗Obsidian 看板插件
做个人任务管理时我喜欢用看板……Jira 在公司用得付钱,Notion 又慢、功能也不顺手,其他的也总感觉缺了点什么,所以干脆自己做。
- 卡片是
.md文件,可以用 LLM 自动处理 - 归档之后可以当作个人工作笔记使用
- 基于 Obsidian,所以数据完全本地保存
write-helper
GitHub ↗基于 LLM 的写作辅助 Obsidian 插件
保存笔记时 LLM 会自动推荐标签,可以通过 YAML 定义表单模板、为每个字段单独配置 LLM prompt 的插件。
本来是为了写东西而做的,但忙起来反而不写了(……)。
image-manager
GitHub ↗Obsidian 图片自动优化插件
Vault 里占空间最大的就是图片……粘贴剪贴板或往 vault 加文件时会自动把 JPG/PNG/HEIC→WebP/AVIF 转换。
从剪贴板粘贴时图片有时会以外链的形式插入,之后会失效,这个插件也能防止那种情况。
git-sync
GitHub ↗Obsidian Git 同步插件
虽然原本就有 git 插件,但是……我老是在退出 vault 之前忘了同步,于是做了这个。
按 X 按钮就会自动 commit→push,忘记同步的次数大幅减少了。
lemon-pyopenjtalk-prebuilt
GitHub ↗pyopenjtalk 预构建 wheel 包
因为 pyopenjtalk 不支持 Python 3.10 以上版本,我自己构建了一个公开发布的包。
不需要 CMake/C++ 编译器,只需 pip install 就能安装。
lemon-protocol
基于 Cloudflare R2 的个人文件分享服务
这是之前做了一半就放弃的 RabbitProtocol 的后续作品。
需要分享大文件时找不到合适的服务,就自己做了一个。
- 通过 S3 multipart upload 实现大文件上传(chunk 在 10MB~500MB 之间自适应)
- 密码保护、下载次数限制、IP 过滤(CIDR)
- TTL 1~90 天的过期设置
- Drop Link:可以让对方往我这里上传文件的一次性接收链接(24 小时过期)
- 下载日志追踪以及 Web Push 通知
- 与 lemon-auth 联动
lemon-vitepress-theme
GitHub ↗应用了 LemonDouble 设计系统的 VitePress 主题包
想公开各种各样的库,那 docs 页面也希望保持统一的调性,于是做了这个。
这是一个把 lemon-design-system 的颜色/排版应用到 VitePress 的主题包。
hayakoe docs 就是用这个主题做的。
lemon-auth
GitHub ↗用于接入 auth-server 的 Next.js 认证库
随着 auth-server 的功能越来越多(个人资料设置、Passkey、TOTP 2FA、审计日志、设备管理等等……),接入流程变得相当复杂。
每次新做服务都要从零开始写认证集成实在太烦,于是做了这个 Next.js 专用的库,用标准化的方式来接入。
hass-kakao-map-changer
GitHub ↗把 Home Assistant 地图替换成 Kakao Map 的 HACS 集成
openrouter_monitor
GitHub ↗OpenRouter 余额监控 Home Assistant 集成
skopeo-setup-action
GitHub ↗在 GitHub Actions 中安装 skopeo
这是在 GitHub Actions runner 上安装 Skopeo 的 action。
自托管的 OCI 兼容 registry 仅靠 docker buildx 无法做到 layer 更新……需要这种 action,但找不到合适的,于是决定自己做一个来用。
misskey
GitHub ↗自托管的微博平台
已经在 sns.lemondouble.com 运营了大约 1 年的 Misskey 实例。
在 lemon 分支上做图标更换之类的定制,同时持续与上游 release 同步。
fastapi-tdd
GitHub ↗FastAPI TDD 课程实践
HateGuard
基于浏览器的仇恨言论自动过滤系统
我设想了一个像 AdBlock 那样、能用 ML 在浏览器 DOM 中自动过滤仇恨言论的系统。
架构是用 PyTorch 训练模型,转换为 ONNX 后通过 Transformers.js 在浏览器中推理。
因为存在数据集公开方面的问题,所以是非公开进行的,最终在 DOM 中检测到仇恨言论时用红色方框标记的部分是成功了……
但是数据集的进一步迭代很难,Transformers.js 的支持也比较弱,DOM 中要处理的数据量太大需要极致优化,再加上一个人覆盖所有网站根本不可能,所以就先放弃了。
project-arona
基于端侧 ML 的自定义唤醒词 + Arona 智能音箱
想做一个用 OpenWakeWord 训练自定义唤醒词、喊「Arona」就会响应的音箱。
唤醒词训练我做完了……但是写固件让我心慌、内置麦克风性能也不好、再加上不太确定方向是否正确,就放弃了。
因为我其实想看到的是会动的画面里的 Arona 啊。
misskey-geeknews-webhooks
GeekNews → Misskey 自动发布机器人
接收 GeekNews(韩国技术资讯网站)提供的 Google Chat webhook,并以 Misskey 机器人账号自动发布的 Cloudflare Workers。
从 2023 年 7 月开始已经运营了约 3 年。
大概 2 个月前 GeekNews 那边新增了域名检查导致集成断了,抱着死马当活马医的心情向 GeekNews 反馈,对方很贴心地为我做了例外处理,所以又恢复运营了。
lemon-k8s-cluster
家用 K3S Homelab 集群
家用 K3S 集群的 GitOps 配置仓库。
以 ArgoCD Apps-of-Apps 模式管理,运行在迷你 PC(Ryzen 3750H)和 GPU 工作站(Ryzen 5600x/RTX 3090/64GB)这两节点上。
运行在这个集群上的服务:
- auth-server:用 Go 写的 SSO 服务器(与 Traefik ForwardAuth 联动)
- search-server:基于 OpenSearch 的搜索 API 服务器
- ml-server:TTS / ML 相关服务器(使用 RTX 3090)
- Immich:自托管照片/视频备份
- LibreChat:多 LLM 聊天 UI
- Ollama:本地 LLM 推理服务器(KEDA HTTP 扩缩容)
- OpenSearch:搜索/日志数据库 + 仪表盘
- RustFS:S3 兼容对象存储
- Zot:OCI 兼容的容器镜像 registry
- CloudNative PG:PostgreSQL 集群(pgvector、S3 备份)
- Argo Workflows:定时工作流(关注列表检查、Misskey 缓存清理等)
- Longhorn:分布式块存储(SSD/NVMe/HDD 三层)
- 此外还有 Traefik、MetalLB、cert-manager、KEDA、Sealed Secrets、Beszel 等基础设施栈
lemon-talkgpt
基于 talking-head-anime-3 的虚拟角色聊天
这是一个只要有一张动画角色图就能在浏览器里和这个角色对话的项目。
把 talking-head-anime-3-demo 部署到 ML 服务器上来生成上半身动画,并通过 MediaPipe 提取人脸 landmark 映射到角色身上。
流水线挺长:录音→STT→ChatGPT 生成回复→翻译→TTS 语音合成→talking-head-anime-3 生成视频,全部一气呵成。
细节方面也下了功夫,比如把双眼眨眼用平均值校正使其同步、对话结束后让嘴闭上、根据头/身体方向让角色看向我等等。
为了浏览器兼容性,视频编解码器也从 VP9 换到 H.264(PyAV)折腾了一番,并且把翻译和 TTS 生成放到异步并行执行从而缩短了推理时间。
虽然算是认真做了,但现在已经不用了,所以处于 archived 状态。
chatgpt-serverless-discord-bot
GitHub ↗ChatGPT API + Lambda Serverless Discord Bot 模板
利用 ChatGPT API 和 AWS Lambda 来做 Serverless Discord Bot 的模板。
毕竟为了跑一个 bot 就开一台服务器,太贵了~
chatgpt-serverless-slack-bot
GitHub ↗ChatGPT API + Lambda Serverless Slack Bot 模板
lemon-chatgpt-translator
GitHub ↗ChatGPT 检索时自动把 prompt 翻译成英文
这是一个会在用 ChatGPT 检索时自动把韩语 prompt 翻译成英文的 Chrome 扩展。
那个时候韩语的表现远不如英语,所以用英语提问算是个小技巧。
就算是机翻出来不太通顺的英语,也比韩语回答好得多——那是那么一个时代。
twitter-remove-doge
GitHub ↗把 Twitter logo 改回 Larry 的 Chrome 扩展
有一天 Elon Musk 突然把 Twitter 的 logo 换成了狗狗币的图标(……),看着实在想把它干掉,所以第一次写了 Chrome 扩展。
这是一个把 Twitter logo 还给原主 Larry 的扩展。
Lemon Twitter Toolbox
基于 Twitter 的 BERT 聊天机器人服务
反正都要做求职作品集了,那不如做点有意思的 + 做一个流量大一点的服务,把 AWS 账单附在简历里说不定会很显眼?基于这个想法做的野心勃勃的项目。
这是一个把用户的 Twitter mention 对(提问/回答)通过 BERT embedding 训练,做成个性化聊天机器人的服务。
架构方面用 AWS Lambda + SQS 流水线来并行处理 ML,由 Spring 家用服务器负责认证/数据库,做成混合架构。
上线当天 Spring 的 SQS 消费瓶颈和 Twitter API 速率限制同时爆发,让我吃了不少苦头,详细的故事我写在回顾文章里了。
在 LLM 已经普及的现在,BERT 看起来像是过时技术,但当时对本科生来说是相当新奇的最前沿技术。
RabbitProtocol
综合文件管理程序
Beacon_based_Automatic_visitor_check_program (GBPL)
GitHub ↗基于蓝牙 beacon 的访客登记自动化
疫情期间所有人每次进出场所都要写访客登记,那时我想:用 BLE 让人路过时自动登记,岂不是双方都方便?基于这个想法做的项目。
这是通过学校的全球协作项目(GBPL)和日本、中国、台湾、越南的朋友们一起做的,能和不同国家的伙伴协作,是非常神奇的经历。
蓝牙 beacon 也是自己做的,对 Android 一窍不通的我也想方设法让它能跑起来(……)。
Audio_processing_practice
GitHub ↗语音处理脚本合集
第一次实习时进了一家做音乐处理相关的初创公司,为了学习而建的仓库。
梅尔频谱图之类的东西就是在这里学的,现在玩 VITS 时还派上了用场。
学过的东西终归都会有用武之地。
Socket_Order_Program
GitHub ↗基于 C++ socket/线程的点餐服务器/客户端
大学网络套接字编程课的作业,记得是发表前一天通宵勉强搞出来的(……)。
第一次用 C++ 做底层 socket 通信,自己定义 packet 大小并实现自定义协议,挺有意思的。
C_minus_compiler
GitHub ↗C minus 编译器实现
大学编译器课的作业。
实现到了 Scanner 和 Parser,本来还想继续做的,但本科一个学期太短,做到这里就停下了。
有机会的话还是想做一门自己的语言。
因为真的很有趣。
python_architecture
GitHub ↗《Architecture Patterns with Python》一书的实践
边读《Architecture Patterns with Python》(Cosmic Python)边学 DDD、Repository 模式、Unit of Work、CQRS、事件驱动架构等概念的仓库。
学到了很多,但工作之后才意识到,真正落地是另外一回事。
Omok / Snake_Game / Simple_SQL
GitHub ↗大学一年级时的项目们
大学一年级学 C/C++ 时做的一些东西。
- 五子棋
- 基于 System Call 的贪吃蛇游戏
- 模仿 MySQL 基本功能的简易 SQL 实现
毕竟是大一做的,请大家可爱地看待(……)。当时对我来说真的挺难的……