更新日志
这个平台在持续迭代,每次改动都记录在这里。
v3.10 · 首页补全结构化数据,标题拆掉中英混排,37 个工具的问答从 2 条补到 5 条
2026-10-30
- 先纠正上一轮的一个错误结论:我说过「全站没有结构化数据」,那是只 grep 了 index.html 就下的判断。实际 131 个页面里 99 个有 FAQPage、115 个有 SoftwareApplication、37 个有 HowTo——唯独首页是 0。这版给首页补 WebSite + Organization,品牌词现在能拿到 sitelinks
- SearchAction 指向 /?q={search_term_string}。但声明之前先让它真的能搜:renderHome 里读这个参数、回填进两个搜索框,末尾的 renderGrid 自然就筛出来了。结构化数据里写一个抓出来是空页的 URL,比不写更糟
- 工具页 title 去掉中英混排。原来是「JSON 格式化 / JSON Formatter · ToolHub」——搜索引擎不会因为写了两个词就给两份排名,只会把权重摊薄,页面语言也判不清楚。英文词条留在 i18n.json,等真正做 hreflang 双语站(两套 URL 互指)时再用
- 首页标题从「ToolHub · 开源工具,打开即用」换成「ToolHub · 本地执行的开源在线工具」,把差异化词放回 title 里。描述改成具体承诺:能在本地跑的都在浏览器里跑,文件不上传服务器
- 37 个本地工具的 FAQ 从每篇 2 条补到 5 条,合计 185 条(新增 98 条)。不写泛泛的「好不好用」,写具体边界:为什么 PNG 压缩几乎不掉体积、13 位时间戳混用的后果、pdf-lib 为什么不能做 OCR、Base64 的 33% 从哪来、CST 缩写为什么不能用(它对应三个时区)
- 补完发现一个反噬:articles.json 涨到 112 KB(gzip 44.5 KB),而工具页只用到自己那一篇(raw 平均 1.2 KB)。构建期按 id 拆成单篇 /articles/
.json,工具页加载量从 44.5 KB 降到 1.6 KB。整份文件保留作兜底,离线包一起带上(37 个文件合计 45 KB,相对 2.7 MB 可忽略) - 校验 47 → 50 项:新增「首页结构化数据(含 SearchAction 真接线校验)」「标题不中英混排」「工具页 FAQ 深度」。第三条会连单篇 JSON 是否存在一起查——内容掉回 2 条、或者拆分漏了文件,构建立刻红
- 浏览器测试 133 → 135:新增 /?q= 回填与真实筛选。顺带修了 clickRun 的偶发失败——它原来固定等 250ms,教程改成单篇加载后多了一次真实请求,偶尔按钮还没渲染出来;改成等元素出现而不是赌时间
- README 重写成对路过的人友好:首屏截图、一句英文卖点(no upload / no install)、在线地址、CI 徽章。补 MIT LICENSE(之前仓库没有,徽章指向的是死链)。阶段 A 的推广文案落在 docs/promotion.md
- 首屏 83.6 → 84.7 KB / 9 请求(预算 90.0 / 10)。增量来自首页 ld+json 与 ?q= 处理逻辑
v3.9 · 首屏两块并成一块:统计并进入口卡,高频推荐换成日常刚需
2026-10-30
- 起因是一句反馈:"上线的工具不是日常高频需要的"。先看首屏——原来是一行统计(97 精选 / 37 本地 / 9 分类 / 0 上传)+ 一行四张入口卡,两块在说同一件事,"97" 在屏幕上出现两次。现在合成一行:每张卡以一个数字打头(99 个工具 / 50 条资源 / 0 数据上传 / 5 篇评测),37 与 9 落到工具箱卡的说明里,首屏少一整行,视线少一次跳转
- 标题从两行长句"把 GitHub 上好用的开源工具/变成打开就能用"压成一行"安全、快捷、开源工具及资源";搜索框从 560 加宽到 700px——它现在是首屏唯一的主输入,窄了显局促。"随便看看"原本挂在统计条末尾,统计条撤掉后搬进搜索框下面那行提示里,和说明文字排成一行(窄屏自动折行)
- 高频推荐按"日常刚需"重排:图片压缩 / PDF 合并拆分 / 二维码 / 图片格式转换 打头,OCR、视频转码、小工具合集、白板跟上,JSON 与字数统计压到最后两位。原来的前八名里四个是开发者工具(CyberChef、DevDocs、Python 运行器、JSON),对普通人来说一年也用不上一次——这才是"看着不像日常"的真正原因,不是工具不做,是排序把它们顶到了最前面
- 推荐位上限 8 → 10。上限不是越大越好的旋钮,是"多少条还算精选"的判断:两列五行仍是一屏能扫完的量,再多就和下方网格抢注意力了
- 新收录两个外链工具,各配 300 字以上人工正文 + 3 个使用场景 + 3 组"什么时候该用站内工具"的配合建议:IT-Tools(41.1k★,开发者小工具合集)、ffmpeg.wasm(17.9k★,浏览器里跑 FFmpeg 压视频转 GIF)。选它们的标准不是星多,是"有没有官方在线实例、打开就能用、输入不上传"
- 顺手做了星标调研(2026-10-30 调 GitHub API 实测):增长最快的其实是 OpenCut(96.8k★ / 2025-06 建仓,约 5.7k★/月),但它只有桌面版和自部署方案,没有可直连的在线实例,做不到"打开就用",所以没收录——这条判断比数字本身重要
- 线上托管从 Cloudflare Workers 换成了 GitHub Pages(CNAME toolhub.bot.cd),构建基址跟着改成新域名:此前 canonical / og:url / sitemap 全都还指着 toolhub.guyang1966.workers.dev
- 工具数 97 → 99(本地 37 + 目录 62),静态页 131,sitemap 132 条
v3.8 · 样式预算重新定档:把「再拆一块」量化之后否掉了
2026-10-27
- 这一版没有改界面,改的是"怎么判断该不该拆样式"。v3.7 收尾时 style.css 只剩 0.6 KB 余量,于是按原计划去拆「内容页样式」——结果归因分析报出 0 条。原因不是脚本不准,是架构决定的:build-pages 生成的每一个 HTML(首页/内容页/工具页)都带着全部视图,SPA 只切显隐,所以「只在内容页出现的类」这个集合是空的
- 退到第二个候选「命令面板 + 快捷键面板那 24 条规则按需加载」,真的实现了:新分片 style.overlay.css、两个浮层加 hidden 兜底、加载前 await、并发关闭的竞态守卫。然后实测——首屏只省 0.43 KB,而这块单独成文件要 0.88 KB,加上新增的加载逻辑让 app.js 多 0.3~0.5 KB,合计从 82.5 涨到 83.0 KB。白干一趟,已完整回退
- 为什么只省 0.43 KB:压缩是按整个文件建共享字典的,.pal-box / .kbd-box 的声明跟别处的面板大量重复,搬出去等于把字典拆散。这条规律对以后所有"拆样式"的提议都成立——所以脚本里加了 --price,输入一段选择器就能算出"首屏能省多少 / 搬出去要付多少 / 净差价",不用再靠原始体积估算
- css-coverage.mjs 补了 content 归属档与两处实测结论,并修了一个 Windows 上的真 bug:walk() 返回反斜杠路径,跟 /-分隔的字面量比较永远不等,导致 pages.js 从没被摘出去(这才是"内容页样式看起来全是 base"的直接原因)
- 预算重新定档:styles 11.5 → 12.0 KB、total 92.8 → 90.0 KB。单项上限从此是提醒线,真正的刹车交给 total——同时新增闸门:styles 余量低于 0.5 KB 直接判死,防止上限再被压成实际值(那正是 v3.7 加一条样式都要先掂量的原因)
- 新增闸门「基础样式表无死规则」:style.css 里出现全站无引用的规则直接卡在发版前。预算膨胀最常见的来源不是加了一条大样式,而是删了功能、样式留着
- 测试 206/49/87/133 与体检 165 次全绿,校验从 45 项增到 47 项(新增两条都是这一版的闸门)
v3.7 · 新增图片裁剪 / 文件哈希校验 / CSV 选列三个本地工具
2026-10-27
- 三个新工具入库,工具总数 94 → 97:img-crop(拖框选裁剪,等比锁定 + 圆角 + PNG/JPEG/WebP)、file-hash(MD5/SHA-1/SHA-256/SHA-512 与官方校验值比对)、csv-columns(选列、拖动排序、按列值过滤后导出)
- file-hash 四种算法全部手写增量实现:crypto.subtle 没有 MD5,且必须一次吃下整个 ArrayBuffer(1GB 文件先占 1GB 内存)。自己写的好处是能分片读、边读边出进度,实测 30MB 文件 MD5 0.26s / SHA-1 0.62s / SHA-256 0.74s / SHA-512 1.02s
- MD5 手写最常错的两处都钉住了:padding 的长度位是 64 位小端(写成 32 位在 >512MB 才暴露)、末轮寄存器顺序。空串与 abc 两个公开向量同时锁死这两类错误,另与 node:crypto 交叉验证 9 组输入(含 55/56/64 字节的 padding 临界值与 300KB 随机数据)
- csv-columns 用引号状态机而不是 split:引号内的逗号、换行、双写引号都在状态机里处理,导出时按「原本是否带引号」还原风格。a,,c 是三列而不是两列——中间那个空字段被压掉是最常见的手写 bug
- img-crop 越界分两档:部分越界收缩到边缘并提示收到多少像素,起点本身在图外直接报错并给出图片真实尺寸,不会产出 1px 空白图。JPEG 导出先铺白底,否则圆角之外是黑的
- 补三条工具页样式(外包方无权改 assets,收包后补的):预览画布限高 42vh(800×2000 的长截图会撑到 630px,把坐标框整个推出视野)、CSV 列标签容器限高 112px 滚动(40 列的报表会换五六行)、.msg-warn 与 --warn 变量(之前只有 .msg-ok,提醒类提示在 exif-strip 和三个新工具里都是裸文本)
- 修两处深色模式缺陷:csv-columns 的列标签把颜色内联写死成 #fff / #eff6ff,深色主题下是一排白块;img-crop 的提示文字硬编码 #6b7280,深色下对比度只有 3.6:1。两处都改成 CSS 变量,体检复检 0 问题
- file-hash 的 accept 补上压缩包:原本只列了安装包与镜像,而开源项目的发布包绝大多数是 .zip / .tar.gz——那才是校验值最常见的对象。同时把「不认识的文件不硬推」的反例从 a.zip 换成 a.xyz(zip 现在是能被认出的文件了),并补两条正向断言:.zip 与 .iso 必须路由到哈希工具
- 功能测试 161 → 206(新增 45 条:img-crop 11 / file-hash 15 / csv-columns 17 / 拖放路由 2)
- 首次走完整外包流程交付:任务包 docs/taskpacks/TP4-new-tools.md 派给低成本模型,在 git archive 导出的隔离快照里完成,收包后用独立脚本复核(哈希与 node:crypto 逐位比对、CSV 状态机自造边界、几何纯函数),再合并验收
v3.6 · 移动端 375px 适配:工具表单、结果动作条、结果表格
2026-10-26
- 34 个本地工具的表单第一次为 375px 单独调过:字段间距 16 → 8px、标签间距 6 → 4px、面板内边距 20 → 14/12/10px、控件内边距 9 → 7px、textarea 160 → 120px。个税计算器(9 个字段)的运行按钮位置 1147 → 1043px,5 个长表单工具全部落在前两屏内
- 字段分组用纯 CSS 做:相邻字段的控件形态一变就画一条虚线(:has() 选中「一连串数字框 / 一连串下拉 / 文件与多行控件」的边界)。manifest 不支持 group 字段,也不许动 DOM,所以分组只能靠形态推断;有意不切「下拉→数字框」,否则个税末尾的「其他扣除」会被从扣除组里拆出去
- 结果动作条改两列等宽网格:以前 flex 换行 + nowrap + 省略号,4~6 个动作挤一行、宽度参差、长文件名下载按钮被截掉后缀(后缀恰是判断「下的是哪个文件」的唯一依据)。现在按钮等宽、文字换行显示完整,奇数个动作时最后一个占满整行
- 结果表格改为在容器内横向滚动(display:block + overflow-x),不再靠各工具 run.js 手写包装 div。个税明细表容器 293px、内容 578px,页面横向溢出 0
- 触摸目标补到舒适线:首页卡片星标 24×24 → 28×28、页脚「快捷键」36×24 → 36×28。全站量过一遍,<28px 的只剩这两个;chip / pg-btn / route-card / share-btn 本来就达标,没做无意义放大
- 所有新增规则都在 @media (max-width: 560px) 内,一条既有声明都没改——桌面端零风险。样式表 10.5 → 10.7 KB(预算 11.5),首屏合计 81.4 → 81.7 KB
- 试过「运行按钮吸底 sticky」,能让个税按钮首屏可见,但实测会盖住正在填的一整行字段,已回退,改成实线分隔 + 空隙
- 首次用外包流程交付:任务包 docs/taskpacks/TP2-mobile.md 派给低成本模型,在隔离快照里完成,我这边 diff 核对范围 + 八套全量复验后才合并
v3.5 · 样式瘦身:把工具页样式赶出首屏,再把预算收紧
2026-10-26
- 工具页样式拆出:style.css 里只服务 /tools/
/ 的 93 条规则(结果导出、结果表格、个税大数字卡、二维码结果布局、教程与常见错误、diff 配色、Markdown 预览、口令弹层、目录页正文…)搬到 assets/style.tool.css。首屏样式 12.2 → 10.4 KB,全站首屏 82.9 → 81.4 KB - 两条加载路径都堵上:整页加载 /tools/
/ 由构建期写 (不可能闪);从首页点卡片进工具的 SPA 路径由 ensureCss() 先取到再画——拿不到样式就不渲染,宁可多一个缓存往返也不给用户看裸结构 - 不另造一套加载器:v3.5 把 v3.3 的 ensureCss 从「塞进去就不管」改成返回 Promise,工具页 await 它,批量 / 离线 / 提交三页仍旧 fire-and-forget(内容页少几处样式不影响用)。一个机制两种用法,不再是两份代码
- 预算三条线同时收紧:样式 12.9 → 11.5、脚本 39.1 → 28.6、合计 107.4 → 92.8 KB。拆分只是手段,收紧才是目的——不收紧的话省下来的空间迟早被下一次「顺手加一点」吃回去
- 删掉 4 条确认无引用的死规则:header-note、usage-example(含深色变体)。顺手纠正上一版的错误结论:pv-ok / pv-mid / pv-warn 不是死代码,它们是 pv-${pvClass(x)} 模板串拼出来的,纯文本搜索天然搜不到,已在分析脚本里加动态前缀白名单
- 浏览器测试 128 → 133:新增「首页不加载工具页样式」「工具页构建期就引入 style.tool.css」「工具页专用样式真的生效(断言 .tool-head h1 计算值是 22px,光有 link 不算——断网或路径写错时 link 在、样式不在)」,以及 SPA 路径的同一组两条
- 校验 44 → 45:新增样式分片契约——首页不许引、94 个工具页必须逐页引、内容页不许引、六条工具专属规则不许回流 style.css、sw.js 预缓存必须含它
- 离线包 112 → 113 个地址(新增 style.tool.css):断网打开工具页也有样式,不会白板
v3.4 · 首页收口:把四个入口并成一行,把长列表截断
2026-10-26
- 四个入口并成一行:标签页原本是 3 列网格塞 4 张卡,第 4 张永远孤零零占第二行。改成 4 列,每块一个图标徽章 + 一个板块标签(工具箱 / 资源库 / 对比台 / 评测室),用颜色和符号区分,不用再靠读文字分辨
- 高频推荐 13 → 8 条,并改成两列行式列表:原来的卡片样式和下面的工具网格几乎一样,读者会以为是同一份列表在那重复一遍。现在它能一眼看出是「精选摘要」,下面是全集
- 工具列表分页:94 个工具一次全铺出来是 20 多行、页面高 7000px,页脚的说明和页面下半部分全被埋掉。改成每页 24 个 + 页码条,页码写进 URL(?page=2)可分享可刷新,切换筛选 / 搜索 / 排序 / 分类时自动回第 1 页
- 容器 1000 → 1160px:宽屏下工具卡从 4 列变 5 列。正文页有自己的 720px 上限,长文行宽不受影响
- 两个搜索框合并:首屏原本同时显示头部输入框和 hero 大框,两者行为完全一致(hero 输入直接镜像进头部框)。现在首屏只留 hero 框,负责就地筛选 + 粘贴识别 + 意图直达;头部换成一个放大镜按钮,点开的是命令面板——它搜的是全站(工具 / 资源 / 专题 / 评测 / 页面),和「筛选当前列表」是两件事
- 「为什么本地执行更放心」下移到页面最底:原来夹在资源区和工具列表之间,把最重要的差异化说明放在了没人往后读的位置。放到页尾收口
- 首帧视图标记:body[data-view] 在构建期就写对(首页 home、其余 page),避免静态 HTML 先画出一个搜索框、脚本跑起来再收掉,顶一下布局。CLS 仍为 0.000
- 修:?cat=图片 这类分类参数以前只写不读,刷新后会被丢回「全部」,筛选状态假保持
- 修:首页 hero 框按 Esc 只清了镜像的隐藏输入框,大框里的字还在,看起来像没反应
- 浏览器测试 122 → 128 项:新增翻页写 URL、第 2 页仍是满页、翻页后首卡不同(真换了内容)、切筛选回第 1 页等断言;筛选总数改看 #grid.dataset.total,不再依赖「整页都渲染出来」
- 新增 docs/taskpacks/:五个可外包任务包(内容补全 / 移动端适配 / 无障碍 / 新增工具 / 目录扩充),每个包写清独占文件、禁止触碰范围、验收命令与交付形式,可并行发放不打架
v3.3 · 瘦身与一致:拆开首屏用不到的代码,收敛空/加载/错误态
2026-10-26
- 样式分片:批量 / 离线 / 提交三页的样式从 style.css 拆到 style.batch.css、style.offline.css、style.submit.css,首页不再为它们付体积。静态页由构建期注入 ,SPA 内跳转由 ensureCss() 按需补上,两条路径都不漏样式
- 修:提交页的工具包生成器一直用未定义的 var(--line),卡片与输入框边框退化成文字色(深色下尤其明显);统一改用 var(--border)
- app.js 拆模块:工具页(表单渲染、结果区、分享/草稿/加密分享,约 740 行)拆到 assets/tool-page.js,内容页模板(关于/提交/反馈/隐私/批量/离线)拆到 assets/lib/pages.js,都按需 import。首页脚本从 37.5 KB 降到 23.7 KB,样式 11.5 → 11.1 KB,首屏 94.3 → 80.1 KB
- 依赖用注入而不是循环引用:tool-page.js 通过 bindToolPage(ctx) 拿到 app.js 的同一批函数,迁移代码几乎保持原样,Node 测试与浏览器跑的是同一份实现
- 修:拆分时把 REGISTRY 快照放在 await loadRegistry() 之前,首次进工具页 REGISTRY 还是 null,直接抛「reading tools」;快照移到加载之后
- 修:pages.js 里的隐私页依赖 analyticsOptedOut / ANALYTICS_OPT_OUT,拆出后作用域丢失导致整页渲染抛 ReferenceError;改为 makePages(reg, ctx) 显式注入
- 修:草稿提示条的「清空」调用了不存在的 renderTool,点一下必抛 ReferenceError;改为重新打开当前工具(openTool)
- 统一空态 / 加载态 / 错误态:新增 .state 一套样式与语义(loading/empty 用 role=status,error 用 role=alert),工具加载失败、结果出错、处理中、工具不存在、页面不存在、批量与离线模块加载失败全部换成同一套;减少动效时加载圈停转而不是高速闪烁
- 体检进 CI:真浏览器测试之后追加 audit.mjs(52 页 × 3 视口 + 深色对比度),并上传 audit-report.json。v3.2 修好的问题不会再被后续改动悄悄带回来
- 测试适配:verify 的源码断言改为同时读 app.js 与 tool-page.js;SPA 测试把 DOM 桩挂到 globalThis 供动态 import 的模块共用;browser 的隐私页断言改为等待 #page-body 渲染完成(延续 v3.2「动态挂载一律轮询」的教训)
- 回归:校验 44 / SPA 49 / 功能 161 / 冒烟 84 / 真浏览器 122 全绿;全站体检 156 次检查 0 问题(0 高优 0 中优)
v3.2 · 体检:把「用户会遇到但测试没覆盖」的问题一次扫出来
2026-10-25
- 新增全站体检脚本(npm run audit):52 个页面 × 桌面/平板/手机三档视口,专查横向溢出、控制台报错、CSP 违规、资源 4xx、工具表单没渲染、深色模式对比度不足、点击区过小
- 修:对比页在 375px 手机上把整页顶宽 149px——select 的宽度被最长选项名撑开、对比表列多又不换行。现在窄屏选择器改单列,表格在容器内左右滑动,不再有页面级横向滚动
- 修:深色模式下工具页那排「分享 / 加入对比 / 示例 / 嵌入」按钮是黑字配深底,对比度只有 1.2:1,等于隐形——按钮没显式设 color,用了浏览器的默认黑色
- 修:深色模式下主按钮白字压在亮蓝上只有 2.8:1,读起来发虚;按钮与键盘跳过链接改用更深的蓝(4.6:1)
- 修:手机头部图标按钮 30px、页脚「快捷键」16px、卡片星标 24×20,拇指点不准。分别提到 34px / 24px / 24×24(WCAG 2.5.8 硬线)
- 修:浏览器测试里离线页的两条断言是「取一次值」而非等待挂载完成,在慢一点的机器上会误报功能坏了
- 样式预算 11.7 → 12.6 KB 并冻结:v3.0–v3.2 新增了批量页、离线页、拖放浮层、口令弹层四套界面,样式变厚是结果而不是意外;这条线再超就该做 CSS 分片,而不是继续抬数字
v3.1 · 入口:文件拖进来、内容粘进来,都直接落到对的工具
2026-10-25
- 拖进来就能用:把文件拖到窗口任意位置,出现「松手,帮你找工具」,松手后给 2–3 个候选,点一个就带着文件跳过去——文件在内存里接力,不读盘、不上传、不留副本
- 候选只来自「真的吃这种文件」的工具:注册表新增构建期派生的 accepts / fileMultiple 字段,从每个工具的 manifest 算出来,不做「名字里有 PDF 就推荐」的猜测
- 多文件优先推能一次吃完的工具:拖 3 张图先推「图片转 PDF」而不是只能选 1 个的压缩;图片和 PDF 混着拖时退化成「只用第 1 个」,但面板会明确说出来,不默默丢弃
- 粘贴即问:把 JSON / JWT / CSV / 时间戳 / 颜色值 / Base64 / 链接 / Markdown 粘进搜索框,不再被当成关键词,而是一条「检测到 JSON · 格式化这段 JSON」,点一下直达工具、预填并自动运行
- 粘贴识别同样在本地完成:8 条规则按「越具体越先判」排序,认不出来就原样粘贴,绝不拦截正常输入
- 修:离线包原先漏掉按需加载的应用模块(批量处理、拖放、ZIP 打包、加密分享、意图解析),断网打开批量页会点了没反应;现在扫描 assets/ 自动进包,校验里加了「每个应用模块都必须在清单里」
- 修:本地 node scripts/sync-tools.mjs --check 因工作区目录联接(junction)静默不执行——退出码 0 但一行没跑,本地永远看不到「注册表没同步」;改用 realpath 判断主模块
- 校验新增一条:app.js 的静态 import 必须都在首屏清单里,静态依赖缺席不是「功能降级」而是整页白屏
v3.0 · 差异化:断网也能用、一次处理一批、加密后再分享
2026-10-25
- 完整离线包:sw.js 改由构建期生成,预缓存清单从 tools.json 派生(新增工具自动进包),断网、飞行模式、隔离内网都能打开全部本地工具
- 「下载离线包」带进度条:整包在后台逐个抓取,每完成 5 个回报一次进度,失败只记录不中断,可随时再点一次补全
- 可安装为应用(PWA):补齐 192/512/maskable 图标、manifest 快捷方式、beforeinstallprompt 捕获,装到桌面后像本地软件一样打开;新增 /offline/ 页把「安装」和「离线」的区别讲清楚
- 刻意不把 Python 运行时算进离线包:核心 13MB、含数据科学包 36MB,硬塞进装包会让首次安装变成几分钟,改为第一次用 Python 工具时单独下载并缓存
- 加密分享:结果可用 AES-GCM 256 在本地加密后放进链接的 # 片段——片段不会随请求发到服务器,服务器与 CDN 日志里没有明文;可选口令走 PBKDF2-SHA256 12 万次迭代
- 分享链接打开即自动解密回填:带口令时弹口令框,成功后清掉地址栏里的密文并提示;非文件类工具直接自动重跑,收到链接的人不用再点一次运行
- 批量处理图片:一次拖入多张,统一最大边长 + 输出格式 + 压缩质量,逐张显示状态与体积变化,结果可打包成一个 zip 或逐个下载;全部在浏览器内完成
- ZIP 打包抽成共享库 assets/lib/zip.js(STORE + CRC32 + UTF-8 文件名标记),批量页、工具结果区、工具包生成器三处复用同一份实现
- 自然语言 → 工具选择:命令面板与首页搜索框直接听懂「把这张图压到 200KB」「帮我算下月薪两万的个税」,命中就在列表顶部给出「也许你要」并带上预填参数跳转
- 意图解析完全在本地跑(规则表 + 参数提取),既不把输入发给大模型,也不联网——这是为了不换掉「输入不上传」这个立站之本
- 新增 /privacy/ 之外的两个说明页:/offline/ 解释离线与安装的边界,/batch/ 解释批量与单图工具的关系;两页都有长尾正文,可被搜索引擎单独收录
- 测试:校验 44 项 / SPA 56 项 / 功能 128 项 / 冒烟 84 项 + 内容抽查 / 浏览器 96 项,五套全绿
v2.9 · 质量与运维:把「上线之后」也纳入版本纪律
2026-10-25
- CI 流水线:GitHub Actions 串起 清单闸门 → 构建 → 校验 → SPA → 功能 → 性能预算 → 冒烟 → 真浏览器 E2E,PR 不绿不合;main 分支自动部署
- 本地服务器 scripts/serve.mjs:按线上规则返回安全响应头,本地也能测 CSP——「本地能跑、线上被拦」这一类问题不再靠猜
- 安全头改由 _worker.js 统一注入:CSP 放行 wasm-unsafe-eval(Pyodide)与 blob:(文件下载),HSTS + nosniff + Permissions-Policy 全站生效
- 顺带修掉一个长期矛盾:X-Frame-Options 一直把所有页面锁死,「复制嵌入代码」给出的 iframe 从来没生效过;改用按路径计算的 CSP frame-ancestors,工具页恢复可嵌入
- 性能预算 scripts/perf-budget.mjs:首屏 gzip 体积与请求数写进 perf-budget.json,超了就构建失败;第三方库(二维码 / Markdown / Pyodide loader)改为工具内按需加载,首屏少 90KB 原始体积
- 首页静态化:hero 统计、路线卡、高频推荐、资源精选、分类芯片、筛选栏改由构建期写入 index.html,CLS 从 0.249 降到 0.000,首页文案同时可被爬虫读到
- 真浏览器里量 LCP / CLS / CSP 违规:LCP 600ms、CLS 0.000、零违规、零第三方请求,四个指标都进了断言,改坏了会直接失败
- 统计配置升级为多后端(none / cloudflare / plausible / umami),默认 none 即零第三方请求;尊重 Do Not Track;新增 /privacy/ 页写明数据流向与本机退出开关
- 校验会把统计配置与 CSP 对齐检查一遍:开了统计却忘了放行域名,会直接报错,而不是「看着有数据其实一条没有」
- 链接巡检升级:health-check.mjs 支持 --json / --report / --fail-on-dead,配每周定时任务,有死链自动开 issue
- 测试:校验 39 项 / SPA 39 项 / 功能 116 项 / 冒烟 73 项 + 内容抽查 / 浏览器 85 项,五套全绿
v2.8 · 平台化:让第三方能往站里加工具,而且加不坏
2026-10-25
- Manifest 规范落地:tools/schema.json 定义 manifest 与 tool.json 的字段、类型、默认值规则,配套零依赖校验器(构建期与浏览器提交页共用同一份代码)
- 构建期闸门:清单不合规直接构建失败,错误精确到 file:line(例:tools/x/run.js:11 [inputs[0].options] select 必须提供 options),不再等用户打开页面才发现「工具缺少 manifest」
- 注册表拆分:每个工具自带 tool.json,tools/tools.json 变成派生产物,两个人同时加工具不再改同一个文件、不再冲突
- 语义校验补上 Schema 管不了的规则:字段名唯一、select 默认值必须在选项内、range 必须有 min/max、只有 select 能带 options、只有 file 能带 accept
- 接入契约硬约束:禁止 fetch / XHR / WebSocket / sendBeacon(本地执行是本站的信任基础)、单工具体积 ≤ 200KB,违反即构建失败
- 新工具「照片元数据剥离」:按公开契约实现,读 EXIF 与 GPS 坐标,剥离时直接裁掉 APP1/APP13/COM 段而不重编码——画质一位不变,ICC 色彩配置保留
- 提交闭环:提交页内嵌工具包生成器,填表单即生成 tool.json + run.js + README 并打包 zip 下载,校验规则与构建期完全一致
- 脚手架命令 node scripts/new-tool.mjs
:一条命令生成可运行的工具目录并自动登记排序、立刻跑一遍清单校验 - 契约文档 docs/TOOL-CONTRACT.md:三条硬规则、字段表、返回结构、常见拒绝原因,第三方照着自己就能提交
- 顺带修掉校验发现的真问题:text-diff 的示例数据用了中文键导致「示例」按钮填不进任何字段;tax-calc 的两个下拉选项 value 重复;三处 number 字段默认值类型不一致
- 测试:校验 34 项 / SPA 39 项 / 功能 116 项 / 冒烟 73 项 + 内容抽查 / 浏览器 71 项,五套全绿
v2.7 · 内容与内链:60 个目录工具补齐正文,全站加相关阅读与结构化数据
2026-10-25
- 目录工具正文:60 个第三方工具全部补上人工撰写的「它解决什么问题 / 三个使用场景 / 与本地工具怎么配合 / 使用限制」,最短 1819 字,平均 2000+ 字
- 修掉一个长期存在的构建 bug:静态页正文因
标签匹配失败从未输出,122 个页面的长尾正文此前对爬虫不可见 - 结构化数据升级:教程页新增 HowTo(含分步 position 与锚点),目录工具页新增 FAQPage(4 问,全部基于已写定的事实,不编造)
- 内链图谱:构建期自动把工具↔同类工具↔专题↔评测串起来,目录页平均 8 条站内链接,本地工具页全部补上「相关阅读」
- SPA 复用正文:目录工具页在脚本接管后仍保留正文区(原来会被整段删掉),用户与爬虫看到的内容一致
- 正文长度守卫:verify 检查每个目录工具 intro 与场景字数,构建时对不足 400 字的页面告警
- 冒烟测试新增内容抽查:正文 ≥400 字、内链 ≥3、FAQPage 与 canonical 齐备,防止正文被模板改坏却不报警
- 测试:校验 31 项 / SPA 39 项 / 功能 91 项 / 冒烟 72 项 + 内容抽查 / 浏览器 65 项,五套全绿
v2.6 · 统一结果出口 + 首页运行时筛选(工作台化第一步)
2026-10-25
- 统一结果出口:run() 返回 { html, text?, files? },平台自动渲染「复制结果 / 下载文件 / 分享链接」操作条,33 个本地工具中 30 个已接入
- 文件类工具改造:PDF 合并拆分、图片转 PDF、格式转换、压缩、缩放全部改走 files 契约,objectURL 由平台统一创建与回收,刷新/重跑不再泄漏内存
- 图片类产物自动预览:转换/压缩/缩放/二维码不再各自拼
,由平台统一渲染预览并做懒加载
- 复制降级:clipboard 不可用(非安全上下文/老浏览器)时自动退回 execCommand,复制失败给出明确提示
- 首页运行时筛选:全部 / 仅本机执行 / 断网也能用,状态写入 URL 的 runtime 参数,刷新与分享都能保持
- 首页排序:默认 / 最常用 / 最近收录,同样写入 URL 的 sort 参数
- 空态分因:收藏为空、无使用记录、筛选为空、搜索无结果四种情况给出不同引导
- 深链增强:/tools/
/?run=1 只带运行标记时也按默认值直接算一遍 - 结果出口契约守卫:校验脚本新增检查,本地工具 text/files 覆盖率低于 30 或出现自绘 copy-btn 即构建失败
- 测试:校验 28 项 / SPA 39 项 / 功能 91 项 / 冒烟 72 项 / 浏览器 43 项,五套全绿
v2.5 · 交互前置 + 可分享的深链 + 输入记忆 + 真浏览器 E2E
2026-10-25
- 工具页改版:输入区从页面第 1327px 提到 291px,教程正文(使用场景/步骤/常见错误)移到结果之后——先能用,再解释怎么用
- 深链参数:支持 /tools/
/?字段=值 回填表单,带 run=1 时打开即自动计算,可把「算好的结果」直接发给同事 - 分享按钮升级:不再只复制裸链接,而是把当前所有输入编码进 URL
- 输入记忆:每次运行后按工具保存草稿,下次进入自动恢复并提供「清空」,不用重复填相同参数
- 深色模式首帧修复:主题在 内联脚本中于首帧前生效,并同步 theme-color,消除每次加载的白闪
- 全站计数改为构建期从数据推导(此前 og:/twitter:description 有 84 个的陈旧计数,影响 122 个页面)
- 移动端修复:语言按钮内图标与文字换行、标题单字孤行(text-wrap: balance)、搜索框提示文案被截成半个括号
- 新增真浏览器 E2E:CDP 驱动本机 Edge 无头实例,32 项断言覆盖真实 DOM 交互、文件上传、复制链接、移动端视口、深色主题与无 JS 首帧
- 校验 27 项 / SPA 渲染 39 项 / 功能 91 项 / 冒烟 72 项 / 浏览器 32 项,五套测试全绿
v2.4 · 新增 5 个高频本地工具:房贷 / 时区 / 图片转 PDF / 图片格式 / 证件校验
2026-10-25
- 房贷计算器:等额本息与等额本金逐月摊还表,输出月供、总利息、利息占本金比例与逐年明细,并给出两种方式的总利息差额对比
- 时区转换:一个时刻换算 22 个城市的当地时间,标注时差、跨日(±1 天)与夏令时状态;印度等半小时偏移精确显示,留空按当前时刻换算
- 图片转 PDF:多张图片合成 PDF,支持 A4 纵向/横向与「适应图片」等尺寸页面、三档页边距;格式不支持时逐张提示并继续处理其余图片
- 图片格式转换:PNG / JPEG / WebP 互转,可选输出质量与透明区域填充色,显示体积变化与压缩率,浏览器不支持时提示降级结果
- 身份证 / 银行卡校验:批量按 GB 11643 校验码与 Luhn 算法校验,解析归属地(省级)、生日、性别、年龄与卡组织,展示时自动打码
- 测试:功能测试从 41 项扩到 91 项(房贷数学手工核算、时区冬夏令时与跨日、真实 PNG → 真实 PDF 页尺寸、身份证校验码正反例);SPA 渲染测试 34 → 38 项
- 全站工具数 88 → 93,本地执行工具 28 → 33;静态页 117 → 122,sitemap 118 → 123
v2.3 · 新增 4 个高频刚需本地工具:个税 / 单位换算 / 二维码解析 / PDF 合并拆分
2026-10-25
- 个税计算器:工资薪金按累计预扣法逐月计算,含五项专项附加扣除,输出当月个税、税后到手与全年 12 个月预测表
- 单位换算:长度/面积/体积/质量/温度/速度/时间/数据/压力/功率/能量/角度共 12 类 70+ 单位,类型与单位下拉联动,附带同类单位全量对照表
- 二维码解析:基于 jsQR 本地解码,图片不上传,自动标注识别位置,识别网址/WiFi/vCard 等内容类型,支持反色码
- PDF 合并拆分:基于 pdf-lib 本地处理,支持多文件合并(按选择顺序)、按页码提取(1,3,5-8)、按固定页数拆分,加密文件友好报错
- 平台能力扩展:工具表单支持多文件选择、渲染后联动钩子(onForm);jsQR 与 pdf-lib 按需加载,不为每个页面增加负担
- 测试扩充:新增 41 项功能测试(真实 PDF 处理 + 真实 QR 解码 + 个税数学手工核算),SPA 渲染测试增至 34 项
- 全站工具数 84 → 88,本地执行工具 24 → 28
v2.2 · 24 个工具教程升级:使用步骤 + 常见错误
2026-10-24
- 每个本地工具的详情页新增「使用步骤」与「常见错误」两个教程板块,内容同时写入 SEO 静态页
- 长尾正文结构升级为:简介 + 使用步骤(3-5 步)+ 常见错误(2-3 条)+ FAQ(2 条)
- 校验项同步加强:步骤少于 3 条或常见错误少于 2 条将无法通过构建
- 教程数据移至 /articles.json(运行时加载),SPA 与爬虫看到同一份内容
v2.1 · 专题扩到 10 个 · 新增工具评测板块
2026-10-24
- 专题从 3 个扩到 10 个:新增写作工具箱、接口联调试探、开源替代品清单、职场效率工具包、开发者速查手册、隐私与安全工具箱、设计与配色
- 每个专题补齐「常见问题」问答(校验项已升级为强制 ≥2 条)
- 新增「工具评测」板块:5 篇同类工具横向实测(图片压缩 / Markdown 编辑器 / PDF 工具 / 密码工具 / JSON 工具),含隐私边界与逐项优劣对比
- 评测页生成独立静态页与 Review 结构化数据,收录进 sitemap
- 主导航与首页路由卡新增「评测」入口,命令面板可直达每篇评测
v2.0 · 首页改版 · 命令面板 · 专题合集 · 更新日志
2026-10-24
- 首页搜索移到首屏中央,新增「三类内容」路由卡(工具 / 资源库 / 对比)
- 新增 ⌘K / Ctrl+K 命令面板:一次搜索工具、资源与页面,支持键盘导航
- 新增 3 个专题合集:前端调试工具包、图片处理全流程、数据清洗与转换
- 新增更新日志页面(本页)与 RSS 订阅
- 工具页新增「示例数据」一键填入与「嵌入」代码复制(可 iframe 引用)
- 开放公开接口 /api/tools.json,便于其他站点调用工具清单
- 修复资源库入口不可见的问题(新增主导航 + 首页资源精选区块)
v1.9 · 资源库扩到 6 合集 / 50 条
2026-10-24
- 新增 3 个资源合集:学习路线与免费课程、开源项目清单、模板与设计素材
- 模板合集明确标注「免费 ≠ 可商用」,逐条标注授权层级
- 健康巡检覆盖 110 个链接,支持并发与重试,状态分「正常 / 疑似反爬 / 需处理」三档
v1.8 · 资源库上线
2026-10-24
- 新增一级板块「资源库」,首期 3 个合集 26 条资源(图标 / 字体 / 配色)
- 每条资源标注来源站点与授权方式,只做外链不镜像
- 校验脚本新增资源库三项强制检查(结构 / 授权 / 静态页)
v1.7 · 工具对比上线
2026-10-24
- 新增 /compare/ 对比页:最多 4 个工具并排,10 个维度(运行方式 / 数据流向 / 离线 / 注册 / 输入输出 / 协议…)
- 底部对比栏与 URL 联动,可分享对比结果
v1.0 · 首个正式版本
2026-10-24
- 84 个工具(24 本地执行 + 60 个开源项目在线版)
- 中英双语、深色模式、PWA 离线可用
- 每个工具独立页面 + sitemap + 结构化数据
✦ OPEN SOURCE TOOLS ✦
安全、快捷、开源工具及资源
无需安装、无需注册、无需命令行 —— 挑一个工具,填参数,出结果。
99 个工具 · 50 条资源 · 文件拖进来、内容粘进来都能用 · 无需注册
工具箱
99个工具
37 个纯本地执行 · 9 个分类
浏览工具 →
资源库
50条资源
6 个合集:图标、字体、配色、学习路线
逛资源库 →
对比台
0数据上传
同类并排看:是否上传数据、能否离线、协议与来源
开始对比 →
评测室
5篇评测
横向实测:隐私、速度、功能边界一次讲清
读评测 →
⚡ 高频推荐大家都在用 · 优先试试这些
01
图片压缩
在浏览器本地压缩 JPG/PNG/WebP,图片不上传服务器
02
PDF 合并拆分
多个 PDF 本地合并、按页码提取、按页数拆分,文件不上传
03
二维码生成
把文本/网址变成二维码,可下载 PNG
04
图片格式转换
PNG / JPEG / WebP 互转,可选质量与透明填充色,本地转码
05
Tesseract.js OCR
浏览器本地图片文字识别(OCR)官方演示
06
ffmpeg.wasm
浏览器里跑 FFmpeg:视频压缩、转码、抽音轨、转 GIF
07
IT-Tools
几十个开发者小工具的集合页:哈希、时间戳、UUID、正则、编解码
08
Excalidraw
手绘风格白板画图,协作绘图神器
09
JSON 格式化
美化/压缩 JSON,自动校验语法错误
10
字数统计
中英文字数、字符、段落与阅读时长统计
📚 资源库精选免费可用的图标、字体、配色与学习资源全部 6 个合集 →
🔒 为什么本地执行更放心这一条是我们和多数工具站的根本区别
数据不出设备图片、Token、表格都在你的浏览器内处理,服务端不接触你的输入
没有账号体系不注册、不收邮箱、不做用户画像,收藏与记录只存在本机
可离线使用安装为桌面/手机应用后,断网也能运行全部本地工具