封面:上架三个月,一个不联网的密码插件从零涨到一万用户

一句话结论:这不是增长复盘,是一份施工记录。一个不联网的密码插件,三个月被装进一万台电脑。 现在该做什么:每天在 dev、test、prod 之间切账号的,先拿一个测试账号走一遍一键填充;只有个人网站要自动登录的,用 Chrome 自带。

10 月 22 日上午,Chrome 应用商店的页面显示:10,000 用户。

不是十万。对一个做了十三个月、只有一个人维护的浏览器插件来说,这个数字够我在屏幕前坐一会儿。

同一天,GitHub 仓库上是 13 颗 star。

这两个数摆在一起,比任何一个单独看都诚实。装它的人有一万,给它点星的有十三个。用的人不等于围观的人,浏览器插件的分发从来不在代码里。

这十三个月攒下的东西,我先把能查的数摊开:48 个版本、1,120 次提交、3,951 项自动化测试。上架后的三个月改了 803 次。数字背后不是灵感,是不断被推翻的交互细节。

四套环境、16 组账号:麻烦不是存,是找

去年秋天我在做一套后台系统。开发、测试、预发、生产四套环境,域名长得像四胞胎。每个环境有管理员、运营、审核、只读四种角色,粗算 16 组账号。

一开始存在飞书文档里。文档越写越长,最后变成一张大表格:系统名、环境、角色、账号、密码、备注。每次登录的动作是:打开文档、搜系统名、找到行、复制账号、切回浏览器、粘贴;再切回文档、复制密码、再切回来。遇到验证码,还得摸手机。

步骤多还能忍,忍不了的是错。dev 的管理员密码填进 test 的登录框,页面只会告诉你密码错误。你先怀疑自己记错了,回去翻文档,最后发现只是选错环境。一来一回五分钟没了。

Chrome 自带密码管理我也用过。它能存能填,但它是按网站组织的,不是按环境和角色组织的。同一个后台八个账号,下拉里一排用户名,没有标签没有备注,也不能按项目筛。localhost 的不同端口之间更容易串。

Excel 和飞书文档是另一个方向的问题:能看不能填,而且是明文。测试账号里混着真实用户数据,放在共享文档里谁都能复制走。

Bitwarden、1Password 当然更专业,跨设备同步、团队共享都是它们的正业。但我当时要的不是一座保险库,是一个开发测试账号工作台:打开登录页,按环境和角色挑一个账号,填进去,登录,走人。为几十个临时账号配一套云端团队方案,太重。

同一站点的不同环境账号,用标签和域名隔开

所以我给自己定了一个很窄的目标:只做开发、测试、产品每天都会遇到的多账号登录;密码只留本机;不注册、不订阅、不上传。

这个目标后来变成产品边界。它让我拒绝了很多顺手也能做的功能:不做团队空间,不做跨设备同步,不做密码分享链接。不是需求不存在,而是它们会把产品带向另一个方向。一旦开始同步,就得有服务器、有账号体系、有恢复流程,也就有了一个可以被攻破的中心。

v3.16.0 的八项能力,先说三件

把 dev、test、prod 串起来的是下面这八项。它们都已经在发布版本里,没有一项是路线图。

能力 具体做了什么
一键登录 填充 + 勾选,可选自动提交
多环境隔离 精确 host,再按端口分档
内置 TOTP 验证码和密码存在一起
站点规则兜底 CSS 选择器,穿透 Shadow DOM
本地加密 PBKDF2 派生 + AES-256-GCM
离线安全体检 0–100 分,四维加权
迁移与备份 CSV / JSON / .aph 加密备份
防误操作 回收站 30 天、5 秒撤销

这些能力单拎出来都不新鲜,密码管理器早就有,自动填充也不是新技术。麻烦的是把它们组合到开发测试这个具体场景里,还要每一步都不添乱。下面挑三个最容易做歪的展开。

先看一次填充在你自己电脑上到底走了几步。

一次填充在本机走的五步:识别登录页、按 host 取候选、本机解密、写进输入框、把登录走完

第 4 步最容易被低估,因为它比看上去难得多。

很多登录页不是普通 HTML。React、Vue 会给输入框套一层受控组件,你直接改 value,页面状态不认;有的站点把登录框塞进 Shadow DOM,外面 querySelector 根本找不到;还有的页面实时校验,你一次性把密码塞进去,它以为你什么都没输入。SPA 切路由之后表单才出现,iframe 里的登录框又是另一个文档。

所以填充不能只会一招。它的顺序是:先走原生 setter,再派发 input / change;不行试 execCommand;再不行模拟键盘输入。页面动态加载就用 MutationObserver 等表单出现。中文输入法还没上屏时不接管方向键和回车,免得字没打完就把密码填进页面。

这些用户看不见。他们只会说这个网站填不进去。但每一个填不进去背后,可能是一个框架、一层 Shadow DOM,或者一个奇怪的受控组件。

我不追求满分的填充成功率。网页千奇百怪,百分之百是句谎话,罕见页面我至今没跑全。能做的是常见框架尽量覆盖,覆盖不了时给用户一个自己修的工具,失败时给一句人话提示。

那个工具就是站点规则。某个自建后台的登录框实在识别不了,你可以在管理页为这个域名指定账号框、密码框的 CSS 选择器;也可以点拾取,切到已打开的登录页直接在页面上点选输入框,插件只把选择器带回来,不读取框里的值。规则导出成 JSON 时只含域名和选择器,不含账号密码。所以它能发给同事,也能在你自己的两台机器之间搬。

选中账号后先填充、再勾选协议;开启自动提交后连登录按钮一起点

一键登录是另一个被低估的地方。很多工具所谓的一键登录,其实只做到把账号密码填进去。真实登录页还有记住我、已阅读并同意用户协议这类复选框,有的藏在自定义组件里,直接 .click() 不生效。这个插件按字段逐项写入,把该勾的勾上,最后停在登录按钮前面。

默认不替你提交,是我刻意留的。自动化越深,误操作的成本越高。你确认一眼再点下去,这一步不丢人。想要更省事,可以在偏好里开自动触发登录,或者用侧边栏的填充并登录。

验证码这一项我想单说。很多后台开了两步验证,密码填完跳到验证码页,你再掏手机、解锁、找 App、等倒计时。一天登录十次,就是十次打断。插件把 TOTP 密钥和账号存在一起,列表里直接显示实时验证码和倒计时;GitHub 式两步登录会自动锚定验证码输入框,点一下填入就完成第二步。密钥和密码一样属于五个敏感字段,走同一套加密,不会以明文落盘。

密码列表里直接显示 TOTP 活码和倒计时,两步登录可以接力

边界写在 PBKDF2 与 AES-256-GCM 里

四句话讲清边界:PBKDF2、AES-256-GCM、五个字段、一次网络请求。

  1. 主密码不存储,只用来派生密钥。PBKDF2-SHA256,六十万次迭代,得到 256-bit 密钥。
  2. 用户名、密码、网址、备注、TOTP 密钥五个敏感字段分别用 AES-256-GCM 加密,每次新的随机 IV。
  3. 解密后的明文只存在于扩展自己的上下文里;锁定或会话过期时,密钥材料和内存快照立即销毁。
  4. 没有账号系统、没有云同步、没有遥测。它不像 Chrome 那样跟随账号同步,唯一的网络请求是每 6 小时一次的匿名版本检查。

翻译成人话:你的密码库是一堆密文,钥匙只在你输入主密码那一刻存在;一旦锁定或过期,钥匙就没了。

代价也很直接。忘记主密码找不回来,没有忘记密码邮件,因为我这里没有你的邮箱,也没有你的密码库,只能重置、清空、重新开始。不能跨设备同步,换电脑要么重新导入,要么把 .aph 加密备份带过去。这一步确实不如云产品省事。

它也不是绝对安全。本地恶意软件、被控制的浏览器、太弱的主密码,仍然能伤到你。它解决的是其中一层:密码数据不离开你的电脑。

我越来越觉得本地优先不是情怀,是成本结构。没有服务器,就没有服务器被攻破的风险;没有账号体系,就没有找回账号这条攻击链;没有订阅,也就不用为了续费去制造焦虑。你得到的是一个更小、更慢、边界更清楚的产品。

和 Chrome 自带、Bitwarden 差在哪

维度 账号密码管理助手 Chrome 自带 Bitwarden / 1Password
数据位置 本机密文,无云同步 可跟随 Google 账号同步 云端或自建服务
多环境隔离 精确 host + 端口分档 按网站组织,区分弱 通用保险库
一键登录 填充 + 勾选,可选提交 以填充为主 以填充为主
TOTP 内置,与密码同库 无 有,价格各不同
站点规则 CSS 选择器 + 影子树穿透 无 无或能力有限
跨设备 / 团队 靠 .aph 备份手工搬 跟随浏览器账号 成熟
价格 免费,GPL-3.0 开源 免费,不开源 高级功能多为订阅

所以 Chrome、Bitwarden 和它各有位置。个人日常上网,Chrome 自带就够。需要跨设备同步、团队共享、紧急访问,选 Bitwarden 或 1Password,它们在这件事上做了很多年。只有你每天在 dev、test、prod 之间切换,又不想把测试账号放云端,这个插件才是为你做的。

还有一种人不适合:完全不想记主密码的人。这里没有找回入口,因为设计上就不存在能帮你找回的人。

1 万用户和 13 颗 star:把时间线摊开

GPL-3.0 和免费都不构成增长。能查的是这几个时间点。

上架三个月的逐月提交柱状图与关键时间点

  • 2025-09-25,第一行提交,项目初始化。
  • 2026-05-25,第一篇推广文章在这个博客上线。
  • 2026-07-20,Chrome 商店链接第一次进仓库,从这天起算上架后。
  • 2026-09-09,一版商店草稿被驳回,理由是产品说明关键词堆砌。
  • 2026-10-14,v3.16.0 发布。
  • 2026-10-22,商店显示 10,000 用户,5 星、3 个评分。
指标 读数 怎么来的
商店用户 10,000 商店页取整读数
评分 5 星 / 3 个评分 商店页
提交 1,120 feature-dev 分支
版本 48 个 GitHub Releases
合并 PR 126 条 GitHub API
CI 运行 1,183 次 Actions 历史
自动化测试 3,951 项 / 269 文件 本机全量重跑
端到端 132 条 / 23 文件 playwright 列表

5 星、3 个评分,这个样本小到不能支撑任何结论,我不会把它当奖杯。真正有用的是那些具体的反馈:有人说终于在测试环境不用翻文档了;有人说 TOTP 接力省了掏手机;也有人直接甩来一个填不进去的域名,附上页面结构。最后一种最有价值,它指向一个真实的、我还没覆盖到的登录页。

这三个月我没做增长归因。用户是从商店搜索来的、从 GitHub 来的、从同事那儿转来的,还是从某篇帖子看到的,我分不清。能确定的是迭代输入来自三处:商店评价、GitHub issue,以及我自己每天用时觉得别扭的地方。

1,120 次提交里,有多少是在抠 1px

13 颗 star 旁边,提交数是另一种忙法。7 月到 10 月这三个月,光 feature-dev 就改了 803 次,占全部提交七成,10 月还没过完就三百八十多次。这不说明我勤快,只说明越到后面问题越碎:一个间距、一次滚动穿透、一个占位符颜色,都要单独改、单独测、单独发版。

48 个版本里大部分不是新功能。随手翻几条:

  • 3.15.0 把标签和站点筛选从下拉搬进左侧常驻分类栏,同一次发布里又撤回,恢复成顶部下拉。
  • 3.16.0 把侧边栏两颗复制图标的净间距从 12px 收到 8px,把关于抽屉标题下的空带从 52px 收到 24px。
  • 命令面板的遮罩先变成滚动容器,再剪断滚轮到底部列表的滚动链,列表滚到底不会把整页带着走。
  • 占位符颜色独立成一个主题令牌,内联下拉和输入框同色,换主题不会一个深一个浅。

前两条尤其能说明问题:搬进左侧分类栏那次,我自己觉得更完整,用了两天发现高频操作反而多了一次横扫。不是所有看起来更完整的布局都更好用。这些事情用户不会写进评价,但他们能感觉到这个插件有点顺,或者哪里说不上来的别扭。

支撑这些改动的是一张测试网。今天全量重跑一次的输出:

$ pnpm test:run
 Test Files  269 passed (269)
      Tests  3951 passed (3951)
   Duration  68.89s

$ npx playwright test --list
Total: 132 tests in 23 files

仓库 README 上写的还是 3,912 项,那是上一个版本的快照,我没来得及回刷所有表面。这两个数在几十处地方写死过:README 中英、落地页、商店文案、封面源文件、博客正文。它们错过的最惨一次,是因为并行跑只收到 215 个测试文件。从那以后加了一道守卫:数对不上,测试直接红。

测试不能证明产品没问题。它保证的是另一件事:我在改一个 1px 间距的时候,不会顺手把密码加密弄坏。

被商店驳回那一周,改的不是代码

9 月 9 日,3.8.0 的草稿被 Chrome 应用商店打回来,理由是 Spam 政策里的产品说明中有过多关键字。被点名的是一句把 Chrome、LastPass、Bitwarden、1Password 串在一起的描述。

代码一行没问题,是文案太想被搜到。

线上当时还是 3.7.0,用户没受影响。但这件事让我重排了一次优先级:商店文案不是 SEO 落地页。你把竞品名、功能词、场景词全塞进一句话,搜索也许多命中几次,读的人第一眼就知道你在堆词。后来四个字段全部重写,删掉竞品品牌名,改成完整句子,只讲这个产品到底做什么。

还有一件我到现在没搞明白的事:商店的用户数取整到千位,一万到底是九千六还是上一档,我没办法知道。这类读数只能当趋势看,不当结论用。

五分钟上手:Ctrl+Shift+F 走一遍

3,951 项测试兜住上面那些改动,你自己上手只要五步。

第一步,装。 在 Chrome 应用商店 点添加至 Chrome。访问不了商店就从 GitHub Releases 下载 zip,解压到一个固定目录,在 chrome://extensions/ 开启开发者模式,加载已解压的扩展程序。手动装不会自动更新,插件会每 6 小时检查一次新版本并提示。

更新时把新文件覆盖到原安装目录。Chrome 会把重新选择的目录当成一次全新安装,原有密码数据读不到。扩展详情页底部那行来源路径先确认再动手。

第二步,设主密码,然后先备份。 主密码只用来派生密钥,不存储,忘了就回不来。设完第一件事是导出一份 .aph 加密备份,再开始导入旧密码。这个顺序别反。

第三步,把账号搬进来。 支持 CSV / JSON,能自动识别 Chrome、LastPass、Bitwarden、1Password 的导出格式。导入时给账号打上环境、角色、项目标签,后面筛选和搜索全靠它。也可以点侧边栏的加号,它会预填当前域名。

第四步,试一次填充。 打开一个登录页,输入框旁会出现钥匙图标,点开选账号;或者直接按 Ctrl+Shift+F,macOS 是 Cmd+Shift+F。默认只填充和勾选,不替你提交。确认一眼,再点登录。

第五步,按需加两个能力。 有 TOTP 的账号,在编辑页填入密钥,验证码之后直接显示在列表里;遇到识别不了的自建登录页,在站点规则里为该域名指定选择器,或者用拾取在页面上点选。

日常还有几个快捷键:Ctrl+Shift+L 开关侧边栏,Ctrl+Shift+P 打开管理页,Ctrl+Shift+K 在聚焦的输入框上展开账号下拉,管理页里 Ctrl/Cmd+K 唤起命令面板,27 条命令,支持中文、拼音和首字母检索。界面有 6 款主题、中英文双语,Firefox 也能自己构建。

接下来:不做云同步,2027 年 1 月验这条

CSV 和 .aph 能搬家,但它们替代不了云同步,而云同步我短期不会做。不是不能做,是做了就不再是同一个产品:同步一旦存在,服务器、账号体系、恢复流程、合规责任都会跟着来。跨设备的需求现在用加密备份加你自己的网盘解决,它不省事,但选择权在你手里。

接下来主要三件事。一是把填充成功率再往上抬一点,重点是 Web Components 和动态表单。二是把站点规则做得更傻瓜,让不懂 CSS 的人点两下也能修好填不进去的后台。三是把导入、备份、换机流程再理顺,少几步手工动作。

13 颗 star 和一万用户之间的落差,我也还没找到弥合的办法。如果到 2027 年 1 月商店用户数不再涨,我会把时间从加功能挪到写说明和分发上。这条判断到时候能验。

一万个人愿意把密码交给一个不联网的小插件,这个信任比数字重。

装完别急着导入全部密码,先拿一个测试账号走一遍:打开登录页,按 Ctrl+Shift+F,看它把账号填进去、把协议勾上、停在登录按钮前。那一刻你就知道它是不是你要的。不是的话,用 Chrome 自带或 Bitwarden 都没问题。

项目是开源的,问题、建议、填不进去的网站都欢迎提 issue。提页面结构就行,别带账号密码。


数据说明:用户数与评分取自 Chrome Web Store 商店页(2026-10-22 抓取)。提交数与逐月分布取自 feature-dev 分支 git log,其中 803 次是 7 月至 10 月的整月合计。测试数为同日本机全量重跑。PR 与 CI 次数取自 GitHub API。完整出处、命令与主分支读数记在 _drafts/evidence/account-password-helper-10k.md。

项目地址:https://github.com/liaolongdong/account-password-helper 在线演示:https://liaolongdong.github.io/account-password-helper/

FAQ · 常见问题

常见问题

账号密码管理助手会把密码上传到服务器吗?

不会。它没有账号系统,也没有云同步。主密码经 PBKDF2-SHA256 六十万次迭代派生 256-bit 密钥,用户名、密码、网址、备注、TOTP 密钥五个敏感字段分别用 AES-256-GCM 加密,每次使用新的随机 IV。扩展唯一的网络请求是每 6 小时一次的匿名版本检查。

忘记主密码还能找回吗?

不能。主密码不存储在任何地方,只用来派生密钥;忘记后只能重置并清空数据。所以装好之后第一件事应该是导出一份 .aph 加密备份,放在你自己信得过的地方。

它和 Chrome 自带密码管理、Bitwarden、1Password 有什么区别?

Chrome 自带适合个人日常网站;Bitwarden、1Password 适合跨设备同步、团队共享和长期保险库。这个插件只做开发、测试、产品每天遇到的多账号登录:按环境和角色分组、精确域名隔离、一键填充并可自动提交,数据只留在本机。

它会自动替我点登录按钮吗?

默认不会。Ctrl+Shift+F 只完成填充和勾选记住我、同意协议,登录按钮留给你自己确认。开启自动触发登录,或者用侧边栏的填充并登录,它才会连提交一起做。

适合哪些人?哪些人不适合?

适合经常在 dev、test、staging、prod 之间切换的开发、测试和产品;不适合需要跨设备同步、团队共享、紧急访问恢复的人,也不适合完全不想记主密码的人。