Repository navigation
Releases
FontManager v2.1.6
FontManager 2.1.6
启动页放大一倍、安装器改由主程序自己画、蓝色压到不抢眼。这是 2.1.5 之后的一次
整包发布:启动页从 560×380 等比放大到 1120×760 且每次至少停留 1.5 秒(严格「先关启动页、
再显示主界面」);安装器 / 卸载器的界面不再用 NSIS 那套,改由fontmanager.exe --installer-ui
画,和主程序共用字体、主题与措辞;装/卸之前发现软件还开着会先问一句,不再出现「文件被占用」
或「卸完了程序还在」。当天还有两处是照着用户截图改的观感:安装器右栏那块品牌图和启动页深色主题的光晕都调淡
了(「蓝色浅一些,太抢眼了,不要影响用户看左边的内容」「不要看起来太脏」),安装进度屏
长时间不动的问题也一并修了(「等太久,我还以为卡了」)。说明:这一批改动在本地先后按 2.1.7 / 2.1.8 编过测试包,从未发布。对外只有这一条
2.1.5 → 2.1.6 的线,避免版本号跳空。
安装器 / 卸载器
- 屏 3「等太久以为卡了」(用户实测:卡在
正在登记卸载信息+已用 0 秒四十多秒):已用 N 秒改成前端每秒自己走,超过 20 秒追加「正在写入,请勿关闭窗口」。原来只在跳步时
刷新一次,装到某一步之后长时间没有事件,数字就冻在那儿——看着和死机没有区别。- 填充条加呼吸动画(
.prog i.running,1.6s 明暗,减动效时关闭):只动亮度,宽度和百分比不动。 - 覆盖安装不再假跳:
fontmanager.exe/uninstall.exe开局就在,原来第 0.1 秒就跳到 88%;
现在主程序只在"开局不存在"时算一步,卸载程序改用 mtime 变新判断。
- 右图整体降音量:底
#0a1550/#060e3a(L≈18%)→#1e2a63/#131a3f(L≈25%);右上角光斑
rgba(22,44,150,.55)/ 半径 60% →rgba(104,132,232,.17)/ 64%;圆点#3455f2 → #1429bb
一系 →#6b83e0 → #3f4ea6一系,投影.42→.34。 - 噪点
.13→.09:底色提亮后同一层颗粒在亮面上会显脏(与浅色主题那次「太暗太脏」同因)。 - 口径:降的是音量(面积 × alpha),不是纯度。实测把饱和度压到 42% 会发灰、发浑,
比鲜艳更廉价 —— 写进setup.css注释与规格书 §4.4,别再调回去。
主界面
- 设置弹窗字阶层级(用户:「最顶部的设置要比所有字体都大,要有大小和粗细对比」):
面板标题 16 → 20 / 650;分区标题(语言 / 系统 / 字体库)13 / 500 → 16 / 600 / 正体 / 主文字色;
行标签 14 / 500 不动;.settings-section之间补 4px。三档 20/650 → 16/600 → 14/500 尺寸与字重同时递进。
实现在app.css末尾追加段(删整段即回滚),规格书 §3.7 与变更记录已回写。
启动页
- 深色光晕改淡蓝:
rgba(27,54,196,.55)/ 68% →rgba(100,136,255,.26)/ 72%。原来是深宝蓝
铺满小半张卡,整块底看着像海军蓝;现在色相往浅里提、音量降下来、半径放大让它散开。 - 进度条新增
--sp-bar令牌:深色#3f5be0 → #6f8cff(原来#1230c8 → #2f6bff那段太沉),
浅色保持原宝蓝不变 —— 纸上淡蓝会糊成灰。四段主题块都已补上该令牌。 - 浅色主题的底色、光晕、轨道一个值都没动。
2.1.7 那一轮(放大一倍 / 最短 1.5 秒 / 串行交接)
- 整张卡等比放大一倍(用户要求「启动页扩大一倍」):560×380 → 1120×760,图标块 78→156
(内边距 9→18、阴影偏移 28/60/-16 同步放大)、名称 15→30、进度条 168×2→336×4、
状态行 10.5→21、副状态 9→18、页脚 9→18、光晕 320→640(blur6→12)。
唯一的例外是窗口圆角只到 24(不是 32):圆角属于窗口外壳而不是画面内容,等比成 32
会让四角圆得不像 Windows 窗口(主窗口 1280×820 用的也是小圆角)。 - 最少显示 1.5 秒(用户要求「字体太少导致启动页关闭太快,最少 1.5 秒」)。计时起点是
启动页真正 show 的那一刻,不是进程启动那一刻 —— 热缓存下字体 3 ms 就绪,按进程起点算
等于没显示。判据移到原生侧(lib.rs::SPLASH_MIN_SHOW),前端不再自己掐表:
原来App.tsx里那个SPLASH_MIN_MS = 600删掉了,免得两处各算一套。 - 严格串行交接(用户要求「启动页关闭后主界面再显示出来」):
splash_done改成
等淡出 190 ms →close splash→ 立刻show main,去掉原来「先 show 再 close」的 220 ms 重叠。 - 修掉「第二次启动没有启动页」:热启动时
splash_done会早于 splash 窗口创建,
那一刻还没记下显示时刻,于是直接放行(日志里启动后 1214ms)。现在先循环等建窗完成
(最多 2 秒,--minimized启动不等),拿到起点再补足 1.5 秒;复测3118/3206ms。 - 安装器完成页的「立即运行」也走启动页:它和手动双击是同一条启动路径(
spawn_detached),
不再有「从安装器点进来就没有启动页」这种分叉。
安装器 / 卸载器 · 路线 C(界面由主程序画)
- 界面搬到主程序里:
fontmanager.exe --installer-ui/--uninstall-ui起一个 1000×620
的独立窗口,画面来自setup.html+src/setup/(vanilla TS,不引 React,产物 33 KB)。
主 bundle 里搜不到任何一句安装器文案,也不引用setup-*.js。 - 引擎仍是 NSIS:界面只负责问与显示,点「安装」时它拉起
setup.exe /S /D=<目录>,
卸载时拉起uninstall.exe /S [/PURGE=1],然后核对结果(fontmanager.exe、uninstall.exe、
注册表DisplayVersion三样都在才算成功)。不重写第二套解包/注册表/白名单逻辑。 - 装/卸之前先问一句「软件还开着」:用 Toolhelp32 枚举进程 +
QueryFullProcessImageNameW
比对路径,只认同一安装目录下的fontmanager.exe(不会误伤别的地方的副本)。
命中就发setup:blocked事件、界面弹遮罩对话框:取消 / 关闭软件并继续。
选继续时逐个TerminateProcess并回报「请求 N 个,仍剩 M 个」。 - 取消要能被引擎识别:用户点「取消」直接关窗时,退出码原本恒为 0,NSIS 会当成「装好了」。
现在Ctx.ok区分「真装完」和「一进来就关掉」,在RunEvent::Exit里按 10 退出。
坑:App::run()结束后自己exit(0)且不返回,所以退出码和清理都只能挂在
RunEvent::Exit回调里 —— 写在run()之后等于没写。 - 卸载界面必须从
%TEMP%跑:NSIS 先把主程序拷到%TEMP%\FontManager-setup-ui再执行,
否则界面自己就是$INSTDIR\fontmanager.exe,uninstall.exe /S删不掉它,
用户看到的是「卸完了但程序还在」。 /S一律不弹界面:三条路径都带${Silent}守卫,静默安装/静默更新仍是真静默。
安装器 · 静默路径与选包
- WebView2 安装失败分支在
/S下会MessageBox等人点,而update.rs用
Start-Process -Wait等进程退出 → 无人值守的更新会永久挂死。现在该分支在静默下
直接走失败路径并显式SetErrorLevel。 - 显式写非 0 退出码,不再依赖 NSIS 未文档化的默认值(实测裸
Abort/Quit在/S下退 2,
不是 0,所以「静默失败被当成功」这个说法本身是错的;改它是为了把契约写死)。 - 选包 rank 补上版本号比较:此前只比「有没有 x64」,同架构的旧包可能被选中。
卸载 · 残留
- 图标文件与空目录:卸载后
snapshot-icon.ico/pack-icon.ico/data-icon.ico/
library-folder.ico以及plugins/字体库这些空壳会留在安装目录里。现在新增一段清理
($UpdateMode <> 1,与「删数据」无关),只删空目录(RMDir不带/r)——
用户往里放过东西就自动保留。 %TEMP%\FontManager-setup-webview(约 1.3 MB)用完没删。清理动作从run()之后挪到
RunEvent::Exit(原因同上),删不动就重试 3 秒。- 桌面快捷方式:勾选「创建桌面快捷方式」时给 NSIS 补一个
/DS参数。模板里
$NoShortcutMode在覆盖安装时会把「要快捷方式」直接短路掉,导致升级后桌面上没有图标。
工程
tools/route-c.mjs:路线 C 的开关就是installer.nsi里的一行!define。2.1.7 起默认开启,
CI 用--assert-on钉住(此前是--assert-off)。--assert-off保留给将来做 A/B 对比。tools/check-silent-paths.mjs:进 CI 的护栏,专拦「/S会执行的区段里没有${If} ${Silent}分流」
这类硬错误(页面回调里的 WARN 不阻断,/S下页面回调根本不跑)。docs/安装器与启动页-UI交付规格书.md:新增 §4.9「程序还在运行 · 确认对话框」、§5 全部数值
按 ×2 重写、§5.3 最短显示 600→1500 ms;docs/make-spec-html.py同步生成 HTML 版。- 与 ZFontManager 彻底脱钩(用户 2026-11-14:「这个软件和 ZFontManager 已经不一样了,不需要
兼容」):安装器hooks.nsh不再清理%APPDATA%\ZFontManager旧目录、HKCU 字体表也不再认
%APPDATA%\ZFontManager\前缀;主界面「关于」里「从 ZFontManager 0.8.0 迭代而来」那一行
连同 9 份 locale 的about.linksTitle键一起删掉(出处只保留在 LICENSE 的 0.8.0 版权声明,
GPL 要求仍满足)。副作用:极老机器上那份残留目录不会被卸载器顺手清掉了,需要手动删。
文档
docs/安装器与启动页-UI交付规格书.md§2.2 / §3.1 / §4.4 / §5.1 / §5.4 按实现回写,并清掉
2.1.7 之后遗留的「深林绿」口径(品牌色早已是宝蓝);docs/installer-splash-ui-demo.html
原型同步;规格书 HTML 由python docs/make-spec-html.py installer重新生成。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.6_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.6_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.6_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.6_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
d6836f5743cccf72451261863f64e0c0544533445a1191050d9d2774ffaf4671 FontManager_2.1.6_x64-setup.exe
18895969eb0f6294cbeea6c7f24e46efd12e6df4f544aa864293fe3f1f02c58d FontManager_2.1.6_x64_en-US.msi
安装
| 文件 | 大小 | 说明 |
|---|---|---|
FontManager_2.1.6_x64-setup.exe |
6.3 MB | 推荐。NSIS 安装器,装到 %LOCALAPPDATA%\FontManager,不需要管理员权限 |
FontManager_2.1.6_x64_en-US.msi |
8.5 MB | MSI 版,perMachine 安装需要提权 |
python-runtime.zip / node-runtime.zip |
20.4 / 34.4 MB | 插件运行时,按需下载,首次启用插件时软件自己去取 |
覆盖安装即可升级,字体库、分组、快照、设置都保留。
校验(SHA-256)
d6836f5743cccf72451261863f64e0c0544533445a1191050d9d2774ffaf4671 FontManager_2.1.6_x64-setup.exe
18895969eb0f6294cbeea6c7f24e46efd12e6df4f544aa864293fe3f1f02c58d FontManager_2.1.6_x64_en-US.msi
8bfa6dcce3b06f2bf37ee6b3505cb4e16ed716e68bdc3bee526362139349b8b7 node-runtime.zip
14d4eb82d553879baee8a78c92be341f9b5c145c8cd466c441aa834af21a084f python-runtime.zip
已知差异(不是 bug):安装耗时约 40–60 秒,主要花在解压 24 MB 主程序与杀毒软件扫描上;进度条只能按「主程序落盘 / 卸载器生成 / 引擎退出」三档推,中间会有几十秒不动,但计时器与呼吸条会告诉你它还在干活。
FontManager v2.1.5
FontManager 2.1.5
数据跟着安装目录走:装到 D 盘,标签 / 分组 / 收藏 / 台账 / 快照 / 缓存 / 日志 / 在线下载全在
D:\…\data下,C 盘不再新增长出来的软件数据;安装器界面同时重做成黑白灰的现代排版,
换掉了那张 NSIS 自带的蓝色侧栏图。升级老版本时数据自动搬过去,旧目录留一份当退路。
安装器 · 观感与排版
- 蓝色侧栏图没了。此前欢迎页/完成页左侧是 NSIS 自带的
win.bmp(一张 2003 年风格的蓝天图),
和主程序的黑白灰完全不搭。现在换成纯白 + 右缘 1px 细线,不放 logo:
欢迎页改成自绘后这张图只剩完成页在用,而完成页右侧已经有「立即运行 / 桌面快捷方式」两个交互,
左边再放个图只是抢注意力;另外 MUI 的FitControl会把图拉伸到控件尺寸,图标会被拉变形。
注意这里不是「放不放图」的选择题:MUI_WELCOMEFINISHPAGE_BITMAP的默认值就是那张蓝图,
置空会编译期报错,所以必须提供自己的sidebar.bmp(164×314 24bit,由
src-tauri/windows/gen-nsis-images.py用纯标准库生成,可重新生成;带图标的版本留在脚本里
另一个函数,默认不调用)。 - 欢迎页改成自绘(
Page custom)。此前欢迎页是 MUI 默认版式:标题固定 12pt、正文固定 130u 高、
左边永远留 109u 给位图,做不出「大标题 + 宽留白」的层次。现在是自己画的内页:
22pt 产品名 + 灰色副标题 + 1u 细线 + 两行说明 + 页脚,坐标一律用u(不是像素),
125%/150% 下跟着系统 DPI 走。没有去自绘窗口边框/按钮——那要把 hover/pressed/focus/
键盘 Tab/高对比度全自己兜,等于重写整个向导,还会丢屏幕阅读器。 - 一屏五行废话砍到三行。此前欢迎页是 MUI 默认文案(「建议关闭其它所有程序」之类),
占满一屏还没说清这软件是干什么的。现在大标题 + 一句副标题 + 两行说明,其余留白。 - 按钮文字保持 NSIS 原生(下一步/上一步/取消/安装/完成)。之前考虑过统一改措辞,
但^Next/^Install是全局 LangString,覆盖会影响所有页面,收益只是措辞 —— 不做。 - 页面流程仍是 4 页(欢迎 → 安装位置 → 安装中 → 完成)。开始菜单页的代码原样保留,
只是因为没有配startMenuFolder而被 PRE 回调跳过;删掉它会让「将来想配开始菜单名」
变成静默功能回退。 - 修掉欢迎页正文与页脚叠字。第一版自绘页按「页面高 200u+」排版,而实测内页白区只有约
141u(100% 下 1u≈1.88px、客户端 662×416、内页 y≈84..348px),页脚-22u解析成距顶约
119u,正好压在正文第二行上。现在整体上移、页脚下移留白(-10u),截图量出的文字带
标题 140..169 / 副标题 193..208 / 正文 257..270、287..300 / 页脚 332..341,两行正文与页脚
之间隔 32px 无重叠;注释里把「内页 141u、1u≈1.88px、负值=距底按内页高度解析」三个事实写死,
免得下次又按错误的页面高度排版。 - 升级维护页默认勾选「直接覆盖安装(推荐)」。此前默认停在「先卸载再安装」上
(Tauri 上游默认,2.1.4 也这样),2.1.5 给另一项加了「(推荐)」之后就自相矛盾:
用户直接点下一步 = 走卸载分支,卸载成功但安装失败就没软件了。
现在只改$ReinstallPageCheck的初值(升级/降级分支勾第 2 个 radio),
$R1/$R2/$R3的映射与卸载分支逻辑一个字节没动(R-18 红线)。 - 完成页会告诉你数据在哪。此前装完只有一句「完成」。现在多一行「数据保存在安装目录的 data 文件夹,
卸载时可选择是否保留」—— 「装到 D 盘数据在哪」这个问题不该让用户去翻文档。 - 安装位置页顶部有一句人话:「程序、字体库和全部数据都会保存在这个目录下。以后想整体搬走,
直接搬这个文件夹即可。」 - 选中
C:\Program Files会当场被拦下。此前普通用户选 Program Files 时,NSIS 会在写 exe
那一步报Error opening file for writing,然后留下一个「目录建了、文件没写、注册表没写全」的半装状态。
现在目录页离开时先做写探针(建目录 → 写一个 0 字节文件 → 删掉),失败就弹提示并停在原页。 - 升级时目录页被跳过、装回原目录。此前理论上允许升级时改安装目录 —— 老用户手滑把
%LOCALAPPDATA%\FontManager改成D:\FontManager,装完就是两套(快捷方式指向新的,
字体库和账本留在旧的),用户看到的是「升个级标签分组全没了」。现在注册表里已有安装目录时
直接跳过这一页并锁回去(显式/D=仍然按用户意愿执行,留给企业静默部署)。 - 中英双语,跟随系统。此前只有英文(MUI 默认)。现在
languages: ["SimpChinese","English"],
不显示语言选择框;文案集中在src-tauri/windows/zfm-strings.nsh,与模板分离。 - 全程没有
SetDetailsPrint none:安装过程中的 DetailPrint 明细仍可在「显示详细信息」里展开。
好看不能以「静默安装失败时零线索」为代价。
数据落盘 · 全部收进安装目录
<安装目录>\data成为唯一数据根。此前是%APPDATA%\FontManager(1.2.4 至今),
装到 D 盘也只是程序在 D 盘、数据留在 C 盘。现在state.json/prefs.json/font-cache.json/
system-ps.json/api.json/activation.log/preview-cache/thumb-cache/online/
staging/Trash全在data下。字体库与plugins故意不搬进data:它们本来就在安装目录下(用户的原话是「都放在
安装地址下面」,这两个已经满足),而且字体是用户资产、插件自带运行时。搬一次要改 4 处口径、
动几个 GB 的文件、改写 state 里几千条绝对路径 —— 收益为 0,事故面极大。- 四条判定链,只锚定一次:
ZFM_DATA_DIR(排障用,需绝对路径且真的可写)→<安装目录>\data
已存在即锚定 → 可写就建 →%LOCALAPPDATA%\FontManager\data→ 最后兜底%APPDATA%\FontManager。
为什么不每次重新探测:用户今天以管理员身份跑一次(Program Files 可写)、明天普通权限跑
(不可写),数据就会在两处之间横跳,表现为「我的标签怎么少了一半」。 activation.log第一行就写数据位置:data_root=<路径> source=install|localappdata|roaming(fallback)。
四条分支在界面上长得一模一样,有这一行,「你的数据在哪」一句话就能答。- 修掉一处会让老用户插件全消失的隐患:
plugins::legacy_plugins_dir()原本写成
app_data_dir().join("plugins")。app_data_dir()语义一改,这个「老位置」会漂到
<安装目录>\data\plugins,于是「老位置有插件 → 沿用老位置」的规则判定成「老位置什么都没有」,
老用户几十个插件会在界面上全部消失(文件其实还在%APPDATA%里)。现已钉死到
legacy_app_data_dir()。 - 本地 API 的报错文案不再骗人:此前硬编码「令牌在
%APPDATA%\FontManager\api.json」,
路径一改就是让用户去空目录里找。现在动态拼实际路径。 - MCP 服务发现跟着改:
mcp/index.mjs依次找ZFM_API_JSON→$ZFM_DATA_DIR\api.json→
%LOCALAPPDATA%\FontManager\data\api.json→%APPDATA%\FontManager\api.json
(后两个覆盖「默认安装」与「装到 Program Files 后的回退」两种常见情况)。
升级迁移 · 一个都不能少
- 自动把
%APPDATA%\FontManager的数据复制进data\,然后才切过去:state.json(标签 / 分组 /
收藏 / 启停台账 / 快照)、state.json.bak*(滚动备份是救命绳)、prefs.json*、font-cache.json、
system-ps.json、api.json、activation.log*、Trash\、online\、Deactivated\、plugins\
(仅当<安装目录>\plugins还不存在时)。 preview-cache(实测 385 MB)与thumb-cache(上限 256 MB)不搬,而且升级后旧的那份刻意不保留:
它们是纯生成物,搬一遍要读 640 MB 写 640 MB,机械盘上是分钟级,而用户的感受是「升级卡住了」;
留一份旧的又等于在 C 盘继续占 400 MB,与「缓存都放到安装目录下面」的要求相反。
所以迁移成功后旧缓存会被清掉、由新位置按需重新生成(首次预览/缩略图会慢一点)——
这是设计行为(验收项 A-06),不是「没删干净」;账本类(标签/分组/收藏/台账/快照/插件)
一个字节都不会少,那是「可回滚」真正要保的东西。- copy 不 move:搬到一半失败(磁盘满 / 权限 / 杀软拦)时源文件已经没了的场景绝不允许发生;
而且用户回退到 2.1.4 时还能接着用旧位置。代价是%APPDATA%\FontManager剩一份约 9 MB 的副本。 - 账本先写
.tmp再 rename,且回读校验字节数:直接 copy 到state.json被打断会留下半份文件,
下次启动会被当成「坏文件」走留证 + 回滚流程,用户看到的是「标签少了一半」。 .zfm-migrate-in-progress标记挡住最致命的一条链:迁移中途失败 → data 目录只剩半个.tmp→
下次启动当成全新安装 → 把默认 state 写进去 → 几年的账本被一份空账本覆盖。
只要标记在,load()就绝不会以「空账本」启动;老位置也没有可用账本时宁可用弹窗报错并停下。- 任一失败就回退老位置:搬不动就继续用
%APPDATA%\FontManager,功能完全正常,下次启动重试。 - 只有一处会删东西:老位置的
preview-cache/thumb-cache,且必须同时满足「目标账本已写入
并能反序列化」「白名单全部搬成功」「目标不是老位置本身」三个条件。 - 删旧缓存挪到后台线程,不再阻塞启动。实测删这两个目录(383MB + 256MB 上限)约 151 秒,
而迁移跑在建窗之前 —— 同步删会让首次升级启动黑屏两分半,用户以为软件卡死。
现在migrate_to_data_root立刻返回、界面正常出现,删除在std::thread::spawn里跑;
失败只记日志(文件被占用是常态),不重试、不拦启动。已知限制:进程若在删完之前被强杀
会留下部分残留(下次启动不补删 —— 幂等出口看到state.json就直接返回),
用户可手动删,只占磁盘、不影响功能;这不是缺陷,别当缺陷查。 - 幂等:唯一判据是
data\state.json是否存在。它还有两个副作用 —— 卸载时保留数据再装到别的目录,
会自动「收养」旧账本;连续启动多次不会重复搬。 - 迁移期间的日志延后写:迁移过程中数据根还可能回退,那时写日志会分裂到两个文件、
还会先建一个空的activation.log再被 copy 覆盖(丢掉会话头)。现在先收集,等路径定下来再统一落。
卸载 · 口径只加不减
- 复选框文案改成「同时删除全部数据与字体库」。此前用的是 Tauri 的默认文案
「Delete the application data」,但勾选后hooks.nsh实际会连$INSTDIR\字体库一起删
—— 里面有用户花钱买的字体。文案不写清楚就是在踩口径风险,这属于信息披露不是行为变更。 - 勾「同时删除应用数据」时新增两条白名单:
<安装目录>\data(先认state.json/
font-cache.json/api.json/.zfm-data-root任一特征文件,避免误删用户塞进同名目录的东西)
与%LOCALAPPDATA%\FontManager\data(Program Files 安装时的回退位置)。 - 这两段在
$UpdateMode <> 1括号里面,覆盖升级(/UPDATE)时一个字节都不动 ——
挪出去等于升级时把用户 1.7 MB 的账本连根删掉。 RMDir "$INSTDIR"保持非递归:data存在时它自动失败,正是我们要的。- 字体注册项的前缀白名单追加
$INSTDIR\data\(预防性:当前字体库不在 data 下,
这条今天匹配不到任何东西;留着是为了将来若真把库搬进 data,不会残留一堆指向已删文件的字体项)。
已知差异(不是 bug)
- MSI 版(按机器装进
Program Files)在普通权限下写不了程序目录,数据会走
%LOCALAPPDATA%\FontManager\data回退分支 —— 这是「程序目录不可写」的自洽行为。
MSI 卸载也没有「删除应用数据」复选框,数据永远保留。 bundle.targets仍是"all",NSIS 与 MSI 都出。- 安装器不是无边框自绘窗口:只有欢迎页是自绘的,目录页、进度条、完成页、按钮
仍由 Windows 主题绘制,做不到参考图那种「控件全自绘」的排版。理由写在模板头部注释里:
自绘等于把拖拽、DPI 换屏、键盘可达性、高对比度全部自己兜,维护成本远超收益。 - WebView2 内核缓存(约 100MB)仍在
%LOCALAPPDATA%\com.iieozo.fontmanager,本期不改道。
它不是软件数据,是 Windows 托管的浏览器 profile(里面还有界面语言等设置,换目录不搬 profile
会把语言重置)。改它需要把整个app.windows从tauri.conf.json搬进 Rust —— 窗口配置从此
没有单一事实来源,且 profile 初始化失败时窗口建不出来、用户双击毫无反应也没有错误框。
为一个一次性 100MB 付永久维护税不划算。README 已如实披露这块体积,卸载勾选删除数据时会一并清掉。 - 英文侧目录页标题仍是 MUI 原生的「Choose Install Location」(定稿表写「Choose a location」)。
为一句措辞去覆盖全局私有 LangString 不划算;中文侧「选择安装位置」与定稿表逐字一致。 - 设置页没有「数据位置」这一行(需要 3 个 i18n key × 9 种语言,列 P2):
位置信息这一版由「安装器完成页文案 + 启动日志第一行 + README」三处承担。 - 安装器模板是从 Tauri CLI 2.12.2 内嵌模板 fork 的(984 行 handlebars)。
升级 Tauri 时必须重新提取上游模板与src-tauri/windows/installer.nsi做 diff,
否则上游对安装器的修复不会自动进来,而且不会有任何报错。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.5_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.5_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.5_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.5_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
a6b82715df8264639db4bec1e9299e42d797fd754c938a74c6fd053169325873 FontManager_2.1.5_x64-setup.exe
58908257f66d5b0dcecc463cd4e789393086ff58f4bcde887b4221364ff2089a FontManager_2.1.5_x64_en-US.msi
FontManager v2.1.3
FontManager 2.1.3
四处交互缺陷修复:速览筛选面板点外面收不起来、Photoshop / Illustrator 套用字体失效、
顶栏换行时视图切换按钮浮在列表上、开关滑块飘出轨道、筛选二级菜单时有时无。
速览 · 筛选面板
- 点面板外的任何位置都会收起。此前在速览里点列表区、点空白处都没反应,只能按 Esc 或再点一次漏斗。
原因是遮罩挂在窗口拖动区里:按下时指针被拖动逻辑捕获,浏览器把 click 派发给了拖动区本身,
遮罩的关闭回调永远收不到。现在遮罩与菜单盒都不再是拖动起点,另加了一层不依赖 click 合成的外部点击判定。 - 顺带修掉「在速览里按住筛选菜单的空白内边距会把整个窗口拖着走」。
套用字体到设计软件(Photoshop / Illustrator)
- 修复「在 Photoshop 中应用…」完全无效:脚本里新建文字图层那一段引用了一个从未声明的变量,
一走到「没选中文字 → 新建示例文字」这条路就抛异常并被吞掉,最终报成「PS 不认识这个字体」。
Illustrator 侧是同一个漏写,症状是「套用失败」。 - 中文族名不再乱码:脚本文件改为带 BOM 的 UTF-8 落盘,并优先用
DoJavaScriptFile让宿主按文件编码读取。 - 套用成功后不再误报失败:回读字体名改为归一化比较(忽略空格 / 连字符 / 下划线 / 大小写)——
Photoshop 会把Arial MT读成ArialMT,原来的精确比较会把成功判成失败。 - 软件在运行但自动化接口取不到时,不再谎报「没有运行」,改为提示「没有响应」并建议切过去唤醒它。
主界面 · 顶栏
- 窗口变窄、顶栏换行时,网格 / 列表 / 列三个视图按钮不再浮在列表内容上方。
顶栏此前会被 flex 布局压回一行高度,第二行溢出到盒子外面压住列表;现在顶栏高度由自身内容决定。
开关(全站五个视图)
- 开关的白色滑块不再飘出轨道、滞后于手指:滑块原来用动效库的布局投影,位置取自「上一次渲染量到的框」,
而列表是虚拟滚动(行会被回收复用)、详情面板宽度逐帧变化、窗口还会缩放 —— 投影常常基于别的行 / 别的宽度,
滑块就从错误的位置飞过来。现在位置由轨道尺寸直接算出,不再依赖任何测量。
此前详情面板左上角那块莫名的白色方块、以及「已停用」开关滑块跑到卡片外面,都是同一个原因。 - 视图切换的滑动指示器同样改为按序号定位,缩放窗口时不再短暂停在按钮外面。
筛选菜单 · 范围(标签 / 分组 / 快照)
- 二级菜单不再「时有时无」:悬停打开后,上一项留下的收起计时器会把新面板关掉;指针停在入口行上
但面板已被关掉时,又不会自己重新出来(只能移开再移回)。现在打开时会先清掉旧计时器,收起前会复查
指针是否还压在入口行或子面板上,并支持「指针已在行上但面板是关的」自动补开。 - 从入口移向子面板的容错时间从 160ms 放宽到 240ms,斜着穿过那 6px 空隙不再容易断。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.3_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.3_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.3_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.3_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
30a0553e61c2fc3cbf28ab804035339ba31991c30596070aefd3669c3e9d52c6 FontManager_2.1.3_x64-setup.exe
e1862964178f6c317ab942593032b82ab6d846c3ede789816157b637b43f4d0d FontManager_2.1.3_x64_en-US.msi
FontManager v2.1.2
FontManager 2.1.2
搜索框光标、下拉菜单、授权状态、标签到期、版权设置、分类筛选六处更新。
输入光标
- 自绘闪烁光标:搜索框、预览文本框等全部 6 个输入框的光标改为蓝色块状竖条并闪烁
(用户点名要的效果;深浅主题各自配色)。光标跟随输入位置移动,文本滚动时贴边缘,
中文输入法打拼音期间自动切回原生光标跟手、上屏后切回。开启系统「减少动态效果」时常亮不闪。
密码框类型不支持自绘(避免明文进 DOM),自动退回原生光标。
右键菜单 · 打字即搜
- 右上角「全部字体 / 已启用」按钮移除下划线,恢复圆角胶囊形态(R4 时期的重样式误伤,本次清理)。
- 结果列表滚动条改细改淡,且不再响应「鼠标靠近变宽」的全局热区 —— 修复「全部字体」下方
出现一块灰色区域、看似被文字压住的观感问题。
授权状态(详情面板)
- 选项调整为四枚:自动识别 / 商用免费 / 个人免费 / 已购买(到期日期)(原「有时间限制」)。
「收费(永久)」选项移除;此前已设置过的字族不受影响 —— 徽标仍显示「永久授权」、顶栏筛选可用、
目录后缀(收费字体)保持,键盘 Tab 也能正常进入授权状态区。 - 选中「已购买(到期日期)」并选日期后,版权徽标显示「已购买(2026-11-12)」。
- 顶栏版权筛选与自动判定文案不变(试用版等自动判定为「有时间限制」的字体不会误标「已购买」)。
标签到期日期(新功能)
- 每个标签可设一个到期日期(详情面板标签编辑区,chip 上的日历按钮);到日期次日不经确认自动移除
该标签(从所有字体上清除),删除会弹提示。标签 chip 与侧栏标签列表显示红色日期:
跨年显示2026-11-12,今年内只显示11-12。删除部分失败时自动保留并重试,不会静默丢失。
版权设置(bug 修复)
- 手动设置不再「看起来回到自动判定」:详情面板许可证盒子的判定行现在优先显示手动结论,
自动判定降级为附注小字(「自动识别:…」)。此前那个盒子永远只显示自动判定,是「设置丢失」观感的主因。 - 历史值 "free" 两端口径统一(前端认「商用免费」、Rust 认「未知版权」,导致相关字族目录在两个
后缀之间反复改名):统一为商用免费。存量 "free" 字族下次同步时目录会从(未知版权)一次性改名为
(商用免费),属预期行为。 - 改名失败的提示带上具体目录路径;偏好写盘失败不再静默。
分类筛选
- 名字关键词第二批扩充:宋黑合体(FZSongHei 等)→ 无衬线;魏碑/北魏楷/行楷/瘦金/颜体/柳体 → 手写;
倩体/剪纸/菱心/童体/彩云等 → 展示;日文(丸ゴ/ゴシック/教科書体)与韩文(바탕/궁서/돋움/굴림)覆盖。 - 拉丁关键词改 CamelCase 感知词边界:
pop不再误伤 Poppins、round不再误伤 Gotham Rounded、
hand不再误伤 Handel Gothic;手写词补全形态(handwriting/calligraphic/calligraphy/brushhand),
修复 9 个手写字族被词边界打丢的回归。 - 覆盖表(康体/新秀丽/Chibrush 等)补「键必须全小写」守卫测试;目录后缀字符串被七态表驱动测试钉死。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.2_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.2_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.2_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.2_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
3765115e466b9af19a1f8932490a8039a04f9aef85901777d30872b8c653fae9 FontManager_2.1.2_x64-setup.exe
bbd12ca0a553102479062d9f9d504e8e46e3010813c7a159a988fc602c6cccc3 FontManager_2.1.2_x64_en-US.msi
FontManager v2.1.1
FontManager 2.1.1
分类筛选重做:以前 45% 的字体在任何分类筛选下都找不到;现在每一族都有归属。标题栏「导入文件夹」图标也加上了加号。
分类筛选(用户最常用的功能)
- 「未知」清零:以前 4055 个族里 1924 个(45%)是「未知」,而筛选菜单里没有「未知」——
这些字体在任何分类筛选下都不出现,等于消失。现在每一族都有明确的分类。 - 新增「按字形几何判定」(对任何新导入的字体都成立,不依赖名字和元数据):
- 拉丁衬线:
I与l的上下衬线带墨宽 ÷ 中间墨宽(衬线 ≥2,无衬线 ≈1;必须两个字形一起作证,
Verdana / Tahoma 的大写I天生带横杠,单看会把它们判错); - 拉丁笔画对比度:
o的竖画厚 ÷ 横画厚(实测衬线 2.1–4.0、无衬线 1.0–1.37); - 中文宋 / 黑:
一两端顿角比 +十横细竖粗比(宋体 ≥1.5 / ≥1.6,黑体 ≈1.0 / 1.1)。
- 拉丁衬线:
- 中文美术字关键词:综艺 / 琥珀 / 娃娃 / 布丁 / 彩带 / 海报 / 圆体 / 图标符号(华康XX篇)等
全部归「展示」;行楷 / 魏碑 / 瘦金归「手写」;印刷楷体(华文楷体、楷体_GB2312)归「衬线」。
日文(ゴシック / 教科書体)与韩文(바탕 / 돋움)同批覆盖。 - 装饰性否决:像素字 / 方块字(
o全直线)、海报体(笔画超粗)与发丝体(极细)
不许被字形层塞进衬线 / 无衬线 —— 它们属于「展示」(用户点名的04b系列、32768 NO已验证归位)。 - 判定顺序:名字关键词 → 家庭覆盖 → OS/2 / PANOSE → 字形几何 → 兜底「展示」。
宁可偏差,不让字体消失(用户口径)。 - 缓存版本 v9 → v10:分类烤在缓存字面上,老库首次扫描会自动全库重算(约 20 秒)。
- 量化(用户真实字体库 4055 族):展示 1333 / 无衬线 1405 / 衬线 859 / 手写 398 / 等宽 60 / 未知 0。
界面
- 标题栏「导入文件夹」图标加号:保留打开文件夹形状,右下角外挂加号;
加号先垫一圈标题栏底色底衬再叠上去,交叠处自动留白(用户从四个方案里定的 V2)。
纯内联 SVG,描边风格与其它 lucide 图标一致,深浅主题自动跟随。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.1_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.1_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.1_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.1_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
98fcf4640fc2f15128d994275086165e639eae549eeb2a02c2f6d24f047921a5 FontManager_2.1.1_x64-setup.exe
75a35961b2bfa6335b5f23dfb4ce1d20c7b2cfcfdea6a1f72cad4b5c0b5b3a7a FontManager_2.1.1_x64_en-US.msi
FontManager v2.1.0
FontManager 2.1.0
2.1.0:插件崩了不用再翻日志 —— 设置页那一行会直接写出死因,旁边还给一个「查看日志」。
新增(设置 · 插件)
- 崩溃原因直接显示在插件行上。以前插件启动失败只会显示「上次运行中退出了(崩溃或被结束)」,
真正的原因(例如ModuleNotFoundError: No module named 'meta')只躺在
%APPDATA%\FontManager\activation.log里,用户没有任何自助排查的入口。
现在这一行下面会多一行等宽小字:原因:File "…\syncer.py", line 20 → ModuleNotFoundError: No module named 'meta'。
超过 240 字截断,悬停可看全。 - 「查看日志」按钮:同一行右侧,用系统默认程序打开
activation.log。 - 解析规则:只认属于该插件的行;
Traceback/Error/Exception/error:才算错误,
「进程已退出」「已就绪」「已握手」这类噪音行一律跳过;两条以上错误取最后一条,
并拼上这次 traceback 里最内层的那一帧File "…", line N(中间夹的源码行、^^^^
不影响,函数级报错也能指到准确行),显示成File … → 错误的形态。 - 只在插件确实报错时才读日志,且只读尾部 64 KiB;日志超过 1 MB 被轮转成
activation.old.log时自动回落到那一份 —— 凌晨崩、上午才打开设置也照样能看到死因。 - 六个解析单测(真实日志回放、两个插件交错写日志、噪音行、超长截断、轮转文件名约定)。
说明
- 插件行里那句话有三种来源:manifest 要求更高的 API 级别、崩溃、缺解释器。
「原因」行只在真的解析到错误时才出现,API 级别不兼容那种不显示,免得被读成「插件崩了」。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.1.0_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.1.0_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.1.0_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.1.0_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
bd264c3ffb2c531061b754fc737e05b46b0ed6f114ceaeaaa5e01a2f122bab70 FontManager_2.1.0_x64-setup.exe
d9793e65555e723e9274284a1873d8b0867340c66e5bc1743425b33f28a74429 FontManager_2.1.0_x64_en-US.msi
FontManager v2.0.0
FontManager 2.0.0
2.0.0:标题栏接管「导入文件夹 / 重新扫描」这两个整库级动作,顶栏回到「只作用于当前视图」;
另做了一轮资源回收与动效冲突审计,修掉一处事件监听泄漏。
变更(界面)
- 「导入文件夹」「重新扫描」从顶栏移到标题栏,位置在「设置」之后、窗口按钮分隔线之前:
30×30、无边框透明底、hover 才出底,与标题栏其它动作按钮同一套手感。
两个动作作用于整个字体库(往库里拷文件、重扫整个目录),和「筛选 / 排序 / 对比」这些
「当前这一屏」的控件本来就不是一类,混在一行会让人以为它们只管眼前。 - 顶栏右侧因此只剩「视图切换」一组,窄窗口换行时仍贴右缘(
margin-left: auto)。 .rescan-btn的顶栏样式一个字没动,标题栏尺寸用.tb-action叠加 —— 想回滚只删那一小段。- 说明气泡、
aria-label、扫描中的转圈(含「减少动效」下的 CSS 慢转)与禁用逻辑全部原样保留。 docs/UI设计交付规格书.md§3.1 / §3.2 + 版本记录回写,HTML 已重新生成。
变更(关于页)
- 功能一览 6 条 → 9 条(补「套用设计软件」「对比视图」「多字体库」),3 列网格正好 3×3,不留半行空位。
- 9 个语言包补齐
about.featApply/about.featCompare/about.featLibraries。
修复(质量审计)
- 事件监听泄漏:
App.tsx里四处 Tauri 事件(app://activate/app://open-file/
quickbar://hotkey/quickbar://hotkey-error)补dead标志 ——listen()返回的 Promise
若在 effect cleanup 之后才 resolve,原来的return () => un?.()拿到的还是undefined,
监听器就永远不解绑(开发模式 StrictMode 双调用、热重载时表现为同一事件被处理多次)。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_2.0.0_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_2.0.0_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_2.0.0_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_2.0.0_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
0326e9b94ac41bcc2c2f0781a7e5c0bfafb1f992985a1d802d3e28b00df31afb FontManager_2.0.0_x64-setup.exe
90dde62c50f3022208ec2f5ba333a1296eec27092b444ce97eb4277b604c1474 FontManager_2.0.0_x64_en-US.msi
FontManager v1.9.26
FontManager 1.9.26
1.9.26:多个 MCP / 多个本地 API 脚本可以分开授权了 —— 客户端标识支持带名字。
新增
- 客户端标识支持
mcp:<名字>/api:<名字>(请求头x-zfm-client),
设置页「允许谁做重大操作」可以按实例勾选,并支持手动添加。 - 授权规则:勾
mcp(或mcp:*)= 这一类全部允许(含带名字的);
只勾mcp:claude= 只放行那一个。插件 id 仍然只认精确匹配。 - MCP 端加
ZFM_CLIENT_NAME环境变量即可带名字,不改代码:
"env": { "ZFM_CLIENT_NAME": "claude" }→ 请求头变成mcp:claude。 - 客户端标识做了白名单清洗(小写、
[a-z0-9._-:]、≤48 字符),非法值退回api。 - 文档:
docs/PLUGINS.md补授权矩阵,mcp/README.md补多客户端接入示例。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_1.9.26_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_1.9.26_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_1.9.26_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_1.9.26_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
75e5d55736890ec27123b1d22860240ca55116a1557d745c41ae1288d9c86972 FontManager_1.9.26_x64-setup.exe
1de2d2249be851b0d920a97eb610d193e3847fe385fc38470f0c0abbf91f39ca FontManager_1.9.26_x64_en-US.msi
FontManager v1.9.25
FontManager 1.9.25
1.9.25:所有「重大操作」改成两道闸 —— 总开关 + 单独授权,插件 / 本地 API / MCP 一视同仁。
新增
- 「重大操作」双闸:启用 / 停用 / 重扫(
write:fonts)、导入字体包(import)、
应用 / 建 / 删快照(write:snapshot)这几类会改字体库或系统字体状态的操作,
现在必须同时满足:① 设置 → 本地 API 的「允许危险操作」总开关打开;② 该客户端在
「允许谁做重大操作」里被单独勾选。否则一律 403,正文写明缺哪一道。 - 按客户端单独授权:
api(本地 API 脚本)、mcp、以及每个插件的 plugin id。
插件令牌的名字就是 id,客户端改不了;mcp靠请求头x-zfm-client: mcp与脚本区分。 - 设置页新增勾选列表(总开关打开后才出现),改完立刻生效、不用重启。
api_status多返回dangerousAllow;新增命令api_set_dangerous_allow(client, on)。docs/PLUGINS.md补「端点 / 权限 / 是否重大操作」全表,写清默认端口与监听地址。- MCP 客户端请求带
x-zfm-client: mcp,这样能单独授权 / 收回 MCP 而不影响脚本。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_1.9.25_x64-setup.exe -Algorithm SHA256把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_1.9.25_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_1.9.25_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_1.9.25_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
4036bcf42ab79ea6fda6daac564e955900c1ee4860594b44a4e96cd9e55c0412 FontManager_1.9.25_x64-setup.exe
ba2a1452cd416fd4fa4dd15bcf91e27f5f252a0e900c7c1ea3c9304708701f59 FontManager_1.9.25_x64_en-US.msi
FontManager v1.9.24
FontManager 1.9.24
1.9.24:给插件补一个写分组的端点(
PUT /curation/collection),让「字体库同步」能把分组也备份走。
新增
PUT /api/v1/curation/collection(权限write:curation):写入一个分组的完整成员名单,
空数组 = 删掉这个分组。整份写入而不是「加一个 / 删一个」,是因为插件那边算的是「本地 ∪ 远端」,
整份写回才不会把别人刚加的成员漏掉(代价:同一分组并发写时后者覆盖前者)。
服务层早就有services::curation::set_collection,这次只是把它接到本地 API 上(约 20 行)。
⚠️ 本版本未做代码签名
两个安装包目前没有数字签名,Windows 因此无法验证发布者。下载或安装时可能遇到下面两种提示,
都不是病毒告警,按说明处理即可。
1. 浏览器提示「通常不会下载」(Edge / Chrome 的下载保护)
点提示条右侧的「…」或「更多」,选择 保留 / 仍然下载。
2. Windows 11 智能应用控制(Smart App Control)提示「已阻止可能不安全的应用」
这个提示没有「仍要运行」按钮,只有两个选择:
- 点「正常」关闭提示,按下面的方式验证文件完整性后自行决定是否继续;
- 或在「设置 → 隐私和安全性 → Windows 安全中心 → 应用和浏览器控制 → 智能应用控制」里
关闭该功能。注意:智能应用控制一旦关闭,通常无法再次开启(需重置或重装系统),
请自行权衡,不建议为装一个软件长期关掉系统防护。
验证文件完整性(推荐,用来确认下载没被篡改):
Get-FileHash .\FontManager_1.9.24_x64-setup.exe -Algorithm SHA256
把输出与下方 SHA-256 对照,一致即说明文件完整。
本项目是个人维护的免费开源项目,没有购买代码签名证书,详见仓库根目录的
CODE_SIGNING_POLICY.md。
下载
| 文件 | 说明 |
|---|---|
FontManager_1.9.24_x64-setup.exe |
NSIS 安装包,推荐(同版本号可覆盖安装,装到当前用户目录,不需要管理员权限) |
FontManager_1.9.24_x64_en-US.msi |
MSI 安装包(同一版本号的 MSI 无法覆盖安装,升级请用 setup.exe) |
setup.exe:装到%LOCALAPPDATA%\FontManager,普通用户双击即可,同版本可直接覆盖重装。.msi:装到Program Files,需要管理员权限,适合域内 GPO / Intune / SCCM 静默推送:
msiexec /i FontManager_1.9.24_x64_en-US.msi /qn。
⚠️ 两个安装器共用注册表项HKCU\Software\IIEOzo\FontManager记录安装目录,
裸.msi只在干净机器上用;已经装过 setup.exe 的机器请继续用 setup.exe。
1.5.5起发布者署名改为IIEOzo,该键路径随之变化;若你曾自定义安装目录,
建议先卸载旧版(不要勾选「删除全部数据」)再安装本版,用户数据不会丢。
插件运行时(普通用户不用下)
python-runtime.zip / node-runtime.zip 是插件系统用的可选运行时。插件面板点「补全运行时」
时,程序从本 Release 的 latest/download/<kind>-runtime.zip 拉取,所以这两个包必须一起上传。
不装插件的话完全用不到,不必下载。
SHA-256:
fb08224f89458031d06d34931ddfea6c272ca25be3babd657154954dfa172824 FontManager_1.9.24_x64-setup.exe
86d842c97982890285fa913d176c28d9ecfa7d731489d30f2cde0fdefa2af68a FontManager_1.9.24_x64_en-US.msi