前言
清明节将至,2025 年度总结的开发篇才姗姗来迟,游戏篇更是八字还没一撇。
清明写了框架,拖到谷雨前夕才着手完成,最近确实是忙里忙外,四月应该会好不少。
一览
GitHub Cards,2025-12 截的图,数据和现在可能不一样。内网 forgejo 的热力图趋势和 GitHub 差不多,而且长期归档项目我会删除,改用 git bundle 冷备份,反映不了实际活跃度,就不放了。

自建
25 年变动不大,简单列个 bullet list
- 网盘: Alist -> OpenList -> 不用
- 短链: Url-Shorten-Worker -> 手搓
- RSS: RSSWorker -> RSSHub + RSSWorker
- 公网 -> 内网: forgejo, game-stats
2025-06 Alist 被收购即停用,虽然有 OpenList,但我极少使用网盘,直接删了,省得夜长梦多。
多年前的 Url-Shorten-Worker,前几个月发现作者诈尸更新,简单审计下来,感觉整个写得挺烂,还强制远程拉取主题,一旦作者主页被劫持,所有下游都会受影响,于是照着手搓了一个凑合用。
RSSHub 已重新支持 Vercel 部署,现在 RSSWorker 只当 BiliBili 源。RSSWorker 微博源炸了之后还用过一阵子基于 weibo-crawler 这一大杀器的手搓方案,还想着用 ncurses/tkinter 写个 TUI。不过测试下来半个月才看一次微博对信息获取也没什么影响,一直苟到发现 RSSHub 恢复 Vercel 支持,直接转回 RSSHub,没继续研究。
公网 forgejo 因为不想开 Cloudflare Turnstile,被 LLM 爬虫爬得太狠,部署 anubis 效果也不太好,已经下架。
基于 datasette 的游戏记录数据库也是同病相怜,我明明都开放了完整数据库的下载,还有一堆不要脸的爬虫天天逐页抓数据🖕,不知道在抓什么🙄Vercel 的 WAF 也非常羸弱,虽然可以直接配置 QoS,但这样对正常用户的影响也很大,懒得研究。三月简单探索过基于 Cloudflare D1 的方案,但要是被刷流量,损失的可是真金白银。也考虑过改用 datasette-lite,通过 Pyodide 和 WebAssembly 在浏览器跑 datasette,但这要下 Python 并安装 datasette,太蠢,还不如下载数据库用 mise 本地运行……
Opengist 倒是还在,用作储存博客提到的各种脚本,这个访问量不大,真被爬垮了直接挪到博客也行,问题不大。
LLM
过去一年模型更新换代速度飞快,能力不断提高,价格陆续降低,形势大好。可惜今年走势不佳,模型更新停滞,生态逐渐封闭,业界还沉迷搞 OpenClaw 这种没卵用又浑身上下都是漏洞的花瓶。MCP 和各种 CLI/TUI 层出不穷,但恐怕难成气候,终成昙花一现。最合适的形态尚未出现,且行且珍惜。
跑题了,从征收 50% 过路费的 API2D 换到只收 5.5% 手续费的 OpenRouter,再也不用等 API2D 慢吞吞适配,上新速度堪称业界楷模。唯一的败笔就是账单地址填的纽约州,额外扣了我 9% 的税……
下面是我目前使用模型的价位表
- 百万 tokens 美元计费,不计入免费模型
- 分割点 0.25 <-> 1 <-> 2
- 都是未命中缓存、未使用 batch API、最高 tier 的价格
GPT-5-nano # 0.05/0.4
DeepSeek-V3.2 # 0.25/0.4
google/gemini-3.1-flash-lite-preview # 0.25/1.5
# GPT-5.4-nano # 0.2/1.25
moonshotai/kimi-k2.5 # 0.45/2.2
# google/gemini-3-flash-preview # 0.5/3
google/gemini-3.1-flash-image-preview # 0.5/3
anthropic/claude-haiku-4.5 # 1/5 # openai/gpt-5.4-mini # 0.75/4.5
openai/gpt-5.3-codex # openai/gpt-5.3-chat # 1.75/14
google/gemini-3.1-pro-preview # 2/12
openai/gpt-5.4 # 2.5/15
anthropic/claude-sonnet-4.6 # 3/15
语言
Formatter/Linter/Toolchain 写过好几篇,不再赘述,简单列下新接触的编程语言/替代实现:
- V: Vlang,零依赖,编译器自举,语法简单且变动少,官方支持 Termux,编译飞快,性能和 C 一致,支持 C => V 的自动翻译,自带软件包管理器。用着很爽,不过我跟了几个 example,到后面 GUI 的部分有点跟不上,一放就放到现在……
- Zig: 虽然 24 年提过,但当时只测试了 c compiler 的部分。一月份研究 terminal 因为 Void 没打包 LLVM 20,Zig 和 ghostty 没法升级,只能手动编译 ghostty,又研究了一下。Zig 编译速度挺快,唯二的槽点就是开代理会导致
zig fetch失败和标准库变动频繁,我随手写的程序每次升级都要改动……虽然理解到 1.0 才有稳定 ABI,但我就是讨厌这种捆绑版本的操作。无语,典型的 Visual Studio 的思维😅 - Nix: 语法非常拧巴,别说 Python,连 Lua 都不如,整个思路都是照搬 Haskell,没什么新意。eval 慢得要死,new nix cli + flakes 搞出一万个 overlays。然鹅在 overlay 有用的极少数场景,Gentoo USE flags 都是更好的替代。使用 nix 开发 nixpkgs 倒是爽,预先定义了一堆函数,常见编程语言的软件包打包很无脑,只要和闭源/毒瘤软件斗智斗勇。但使用 flakes 管理依赖或者用 nix shell 开发程序,就略蛋疼,不如直接 mise + lockfile。
- Bun: 只测了 runtime/package manager,实际上还能当 test runner/bundler。就 runtime 而言不如 node,更不如 deno。不支持权限管理,不支持 Termux,
bun run默认使用 Node.js,需要指定--bun才会使用 bun runtime……最离谱的是连.bunfig.toml都不遵守,那我用 NM 呢……作为 package manager 前几年不太行,截止 2026-04 勉强及格,各个 serverless function 都有 experimental support,也支持 dependency cooldown,还有 install.security.scanner API。 - Zsh: 虽然用了很多年,但为了兼容性一直都只用 POSIX/Bash 语法,直到 2025-12 powerlevel10k -> starship 迁移期间优化 Zsh 插件才真正体会到它的强大。2026-01 还参考 ohmyzsh,从零开始重新实现了一遍,性能优化到极致。无独有偶,shfmt-3.13.0 也添加了初步 zsh 支持。习惯了 Zsh,再回头用 Bash 各种不爽,改了几个 Zsh 脚本到 Nushell 用作练手,但语法还是没前者强大。
- Nushell: My Cli Setup (2026-01) 简单提了一嘴,用于替代 jq + jc + bash + PowerShell。不过
http get不稳定,有时还是得调用 curl。from xml做得非常烂,远逊于 jc,效果还不如手写 RegEx……对于跨平台脚本,path也还有很大的改善空间。 - Gnuplot: 上个月研究 How to Run VNDB Locally 试着用 nushell + gnuplot 写 vndb-backup-converter.nu 和已归档的 vndb,便于在 VNDB 导出的 XML 和我写的 VNDB-List-Export 导出的 CSV 之间转换,被
from xml坑了没搞定。尝试重写 SteamWishlistCalendar 也失败,日期解析还需要 Python,失去了重构的意义。但某 OKR 项目的 XML 用 RegEx 暴力解析很成功,后面可能再试试。
项目
虽然前面没多少字,但也写了两个多小时,写累了,而且有的没开源,这部分简单一笔带过。
结果又写了两个多小时,看来年度总结游戏篇又得延后……
按照状态简单分类,按更新时间升序,从 2025-01 推到 2026-04,今年的年度总结还能少写几个月。 持续维护的不列入,其实做新项目总是有动力的,最磨人的还是日积月累的维护。
新建
- sb: scoop bucket
- game-stats, vnstats, cngal-stats
- 基于 datasette + datasette-dashboards 的游戏数据库,本来打算复刻 VNDB Query (SQLBin) 的功能,但做着做着就变成现在这样:喜欢表格的可以当 Excel 用,会 SQL 的可以自己写 query,喜欢看图的还能看我预设的 SQL 自动生成的图表
- 只适配了我自己的游戏数据库,VNDB-List-Export 导出的 CSV 和 CnGal 数据汇总,这套方案挺灵活的,也不像 SQLBin 必须 PostgreSQL,支持 CSV/TSV/JSON/XLS/XLSX/SQLite/MySQL 等一大堆格式,便于在离线环境使用,手动修正数据也简单,迁入迁出都很方便,还能灵活替换工具
- datasette2vercel: 部署 game-stats 到 Vercel,官方的 datasette-publish-vercel 很久没更新已经不能用
- nix-config: NixOS 配置
- zsh-bench, zsh-optimize, init.zsh
- Timeline: ohmyzsh -> ohmyzsh+powerlevel10k -> ohmyzsh+starship -> init.zsh + carapace-bin + zoxide + starship, feat. zsh-bench
- zsh-bench 是 powerlevel10k -> starship 迁移中检测优化效果的副产品,名字源自 powerlevel10k 作者同名项目 zsh-bench
- zsh-optimize 是后续优化 zsh 插件的一系列措施
- init.zsh 是我自己的 ohmyzsh 实现
- 从逻辑、时间、难度上这三者都是循序渐进的
- carapace-bin 用于替代 zsh-completions,配合 init.zsh 的 comps 插件,处理 shell completion 非常灵活。其实 carapace + comps.plugin.zsh 就能实现 ohmyzsh 全部 300+ 插件的一大半功能,不看源码很难相信很多插件就只有补全功能……
- OS: 基于 mise task templates 的自用系统构建脚本,集大成之作,目标是支持几乎所有系统的 LiveCD 和 WSL 构建,和 Ventoy 一样通用,尚未完成。现在只用来创建 WSL,只写了 Alpine Edge, Debian 14, Devuan Excalibur, openSUSE Tumbleweed, Rocky 10, Slackware current 的文档,NixOS/Venom 测试失败,一直没修,搞定 linux-distro 重写再说吧……
- udon: 源自 risotto 的 Hugo 主题,不过是 hard fork,已经是独立项目。整体框架早已完成,但配置文档还懒得写。本来就是写了给自己的博客用,部分实现灵活但丑陋,没什么动力推进。
- gh-repo-size: Nushell 重构,不再要求 gnu-numfmt,支持 Alpine 的上古版本 Nushell
- Url-Shorten-Worker: 上文提到的手搓版短链服务
- scoop-url-protocol: 类似 choco-protocol-support 的 scoop 版本,挺简单,但写完感觉没卵用……
归档
- 所有 WSL 项目: 被上面无需维护的 OS 取代,批量生成也更方便。
- hltb: HLTB Linear & Temporal Breakdown 衍生项目,改为使用上文提到的 game-stats。
- qrenc: 研究 Flask 随手写的,改用 libqrencode,可以离线使用,还有 micro QR code。
- sanami: bash + jq 写的脚本,用于 game-stats 根据游戏标题快速匹配 Steam AppID,不过不准……Steam 已经删除了这个 API,直接归档。
- vndb: 研究 R ggplot2 的 VNDB Novel Data Breakup 衍生项目,改为使用上文提到的 vnstats。
- game-redirect: 和 iCalendar (ICS) 的养成方式#App 提到的基于 Cloudflare Python Worker 的 URL redirector 类似,用于 game-stats。但后面发现了 datasette-dashboards,这个也就没用了¬_¬
- espanso-packages: 改为使用 librime-lua,其实 Rime 自定义短语就足以满足大部分需求。
- weibo: 上文提到的基于 weibo-crawler 的大杀器,随 RSSHub Vercel 支持入土。
- anti-steam-commonredist: Windows 体验越来越烂,我现在更习惯攒一堆游戏/demo,一次性下载后断网慢慢打。运行库通过 scoop-cache.nu 管理。虽然很多游戏也自带 DRM,大部分都可以绕过(不传播=不违法,断网呢,想传都传不了🤷),D 加密的直接主机玩。Steam 不让离线卸载?我写了 fix-steam-reg.ps1,检测
$env:SCOOP\persist\steam\steamapps\appmanifest_*.acf再扫描HKCU\Software\Valve\Steam\Apps\{SteamID}\Installed对应注册表即可。云存档也没本地备份靠谱。 - bookmarks: 很简单的 buku server wrapper,现在用 uvx:
uvx --from "buku[server]" bukuserver run --host 127.0.0.1 --port 5001 - fortunes-vndb: 因为功能足够简单,其实我是当新语言的试验田用的……但现在接触的很多新语言都是只在特定领域有用(还没到 DSL 的程度),不够通用,这个就没用了= =
- rss2ics: 研究 pytest 和 iCalendar 随手搓的,很久没维护已经炸了,需求不再,直接归档。其实用 nushell 生成更简单。
- stream-pi: 刷 tg 构想的不间断计算并流式输出 π 的算法,没想到还真有,统称 spigot 算法,写了 Python/Haskell/Lua 实现,Python 中规中矩,Haskell 因为惰性求值效率非常高,Lua 则受限于 64 位数字精度一下就溢出了……
弃坑
- WTMSB-LLM: 微博的评论罗伯特复刻,24 年就开坑 25 年完全没碰,先弃了
- AoC2025: Advent of Code,图方便都是 Python 写的,做到 day 8 还是 day 9 就没空了,忙着忙着就忘了这回事,今年一定.avif
- netspeed: 很多年前写的 tmux 插件,用于在 status bar 显示网速,应该是参考了 KDE Plasma 的哪个插件。原先是 Bash 写的,这是 C/Go/Rust/Zsh 重制,本来想用 cosmopolitan libc build once run anywhere,但测试下来不同版本的性能差异可以忽略不计,小修小补继续用 Bash……也写了 Zig 版,但一更新标准库又改了,懒得改就删了
- swc.nu: 上文提到的 SteamWishlistCalendar in nu + gnuplot
- petpet: 基于 Cloudflare Worker 的 Telegram inline 摸摸头 bot,因为 workers 对库的限制比较多,头像获取/转换没搞定,弃坑
后记
3 月是不幸的,三件悲剧接踵而至:我推的地偶团体解散,Myrient 关站,Yorhel 去世。 4 月是光明的:单推转生,我还参加了生日 SP,Myrient 有了 BT 镜像,VNDB 短期也不会关站。 历经近两年漫长的蛰伏期,相信 make an impact 就如今的我而言轻而易举。
