Skip to content

Releases

FontManager v2.1.6

Choose a tag to compare

@706972745 706972745 released this 14 Nov 05:39

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(blur 6→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

Choose a tag to compare

@706972745 706972745 released this 13 Nov 14:10

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

Choose a tag to compare

@github-actions github-actions released this 13 Nov 09:04

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

Choose a tag to compare

@706972745 706972745 released this 13 Nov 05:30

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

Choose a tag to compare

@706972745 706972745 released this 13 Nov 02:06

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

Choose a tag to compare

@706972745 706972745 released this 13 Nov 00:09

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

Choose a tag to compare

@706972745 706972745 released this 12 Nov 16:40

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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 15:54

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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 15:32

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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 15:16

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