浏览器chrome

结论(2026-10-11 定案:日常改用 Chrome)

  • 日常浏览 = Chrome(Chromium 系)。选择理由(原话记录):生态优势;技术不输;易用性与个性化 Firefox 略好;隐私安全存疑;但 Google 账号登录事实上跟用微信账号登录一样,形成了护城河。
  • 决定性实测(单变量对照):同一部手机、同一代理环境 —— Chrome 能正常登录 Google ✓;Firefox for Android 输入邮箱后「下一步」点不动 ✗(攻略全试无效)⇒ 唯一变量是浏览器 ⇒ 故障在 Firefox 自身。(桌面端从 Chrome 迁移书签+密码本身正常。)
  • 已落地(2026-10-11,gen81 switch-firefox-to-google-chrome):configuration.nix 注释掉 browser/firefox.nix、打开 browser/google-chrome.nix;google-chrome.nix 原「去 Google 化」策略整块注释(保留作参考)⇒ 策略文件 = {}(纯 Chrome)。验收:Chrome 155.0.8059.39 可执行 ✓、firefox 已从 systemPackages 移除 ✓、/etc/firefox/policies/policies.json 被激活过程自动清理 ✓。
  • 开关机制(2026-10-11 实测,修正过一版误判):programs.firefox.enable 的 nixpkgs 默认值是 false(实测:空配置 = false);是 browser/firefox.nix:21 模块自己写 enable = true 把它打开的 ⇒ 注释 import 那一行就足以卸载 firefox ✓(不需要在 configuration.nix 额外写任何 enable)。曾经加过一行显式的 programs.firefox.enable = false;,已因证实为死代码删除(gen82 drop-redundant-firefox-disable,删前后 eval 逐项一致)✓。
  • 开关可逆性(注释 import 后 rebuild 到底发生什么):① 系统环境(PATH / 应用菜单 / /run/current-system/sw/bin)—— 包消失 ✓(模块是唯一来源);② /nix/store 里的包体 —— 留着 ✓(旧世代仍引用它,gc 不回收;本机 nix.gc --delete-older-than 30d 在 hermes.nix)✓;③ 用户数据(~/.config/google-chrome,含书签/密码/登录态)—— 完全不动 ✓(家目录普通文件,与 nix 无关)⇒ 再放开 import + rebuild 即原样回来 ✓。
  • 对 Hermes 侧的影响:自动化/取证必须 Chromium 系,靠 cdp-hermes.nix 提供常驻 9222 端点。Firefox 系一律不可用,原因只有一条:不实现 CDP(只提供 WebDriver BiDi / Marionette)—— 协议问题,与隐私取向无关。

链路与参数(现状)

项取值要点
mcp_servers.chrome-devtools--cdp-url=http://localhost:9222、--proxyServer=http://127.0.0.1:7890只连现成端点,不自拉起浏览器;代理由 MCP 侧带,浏览器不必再加 --proxy-server
browser 段cloud_provider: local、use_real_profile: truebrowser_exec 用 Hermes 自带 Chrome for Testing(~/.hermes/tools/chromium-1208/)+自己的 profile,不依赖系统装不装浏览器
cdp-hermes.nixsystemd user service + --remote-debugging-port=9222 + --user-data-dir=%S/hermes-chromium两条链 profile 各自独立;该专用 profile 登录一次即长期有效,且不污染日常浏览器 cookie

硬需求:常驻 CDP 端点(只有 cdp-hermes 提供;单装二进制不监听端口)、固定 user-data-dir、可调有窗口 vs --headless=new(有窗口对反机器人站点更友好)。

nixpkgs 26.05 实测

可用性:Chromium 系 ✓ = chromium 154.0.8037.92(更新最及时)、ungoogled-chromium 154.0.8037.57(自动化首选)、brave 1.96.59、google-chrome 155.0.8059.39(unfree)、vivaldi 8.2(unfree),以及不在 nixpkgs 的 zen / helium / thorium / yandex(社区 flake 已核实存在)。
Gecko 系 ✗ = firefox 157.0、firefox-esr 153.4.0esr、librewolf 156.0.1、floorp-bin 12.17.2、tor-browser 15.0.24、mullvad-browser 15.0.24(后两个刻意无定制,保指纹唯一)。
不在 nixpkgs:opera(已移除)、waterfox、orion(Kagi Orion 无 Linux 版;pkgs.orion 是同名无关包)。

选项事实:programs.chromium 只剩策略(无 package / 硬解 / 命令行参数,包要自己进 systemPackages);它只认三个策略目录 /etc/chromium、/etc/opt/chrome、/etc/brave;programs.firefox 本版无 profiles 选项(默认搜索/扩展只能走 policies);nixpkgs 无 firefox-addons(要 NUR);Firefox 系与 Chrome 系的 enable 默认值都是 false —— 谁装谁开,由模块自己声明(见结论第 4 条);Plasma 自动开 programs.chromium.enablePlasmaBrowserIntegration。

firefox 与 firefox-esr 互斥:两者编译期产品名都是 firefox、读同一份 /etc/firefox/policies/policies.json;Nix 模块无 import 顺序语义 ⇒ 在 esr 侧写 programs.firefox.enable = lib.mkForce false; 固定胜者(不报错、结果确定)。踩坑:policies 是 mkDefault 级,自写同名 environment.etc 会静默覆盖;模块顶层 assert 会 infinite recursion,要用 assertions。(eval 验证过:双开不报错、只装 ESR;注释 import 即关闭。)

包从哪来(三档,2026-10-11 实测):① 二进制缓存命中(substituters = TUNA / SJTU / cache.nixos.org)⇒ 直接下谁编好的产物(coreutils 等绝大多数);② 缓存没有 ⇒ 本地编译(7.2 内核那次 nvidia 模块即此路失败);③ 源码/上游二进制(fetchurl 类)⇒ 必须去上游 URL 抓,任何包都绕不开。Chrome 属 ① 不命中 + ③(unfree=true ⇒ 公共缓存不分发,只能从 dl.google.com 抓 .deb,依赖 nix-daemon 的 http_proxy)。

模块清单(modules/desktop/browser/:import 那一行就是开关)

包与策略:firefox.nix / firefox-esr.nix / chromium.nix / ungoogled-chromium.nix / brave.nix
google-chrome.nix / vivaldi.nix / floorp.nix / librewolf.nix / tor-browser.nix / mullvad-browser.nix
策略路径:/etc/<厂商>/policies/… 或 …/policies/managed/extra.json(ungoogled/vivaldi/floorp/librewolf 目录名待实测)
策略内容:禁遥测上报、禁密码管理/自动填充、拦第三方 cookie、禁后台常驻、DuckDuckGo 默认搜索、强制 uBlock Origin
cdp-hermes.nix:ungoogled-chromium 直启,systemd user service + 9222 + %S/hermes-chromium
约定:每文件自包含(包+策略+头注释),不互相引用;可任意组合 import
当前启用:仅 google-chrome.nix(其策略已整块注释);firefox.nix 已弃用——注释 import 即卸载(enable 由模块自己声明,nixpkgs 默认 false)

启用与验证

# configuration.nix 的 imports 里打开/注释对应行,然后:
rebuild "browser modules"
curl -s localhost:9222/json/version # 期望返回 Browser 与 Protocol-Version

附:脱 Google 生态的账号路线(要点)

  • 账号来源优先级:站点自带邮箱注册 → GitHub OAuth(属 Microsoft,目标是绕 Google 不是无大厂)→ Apple/Microsoft → Google(只当登录器)。Google 作为 IdP 时,它必然知道你在哪些站点用它登录过——这是协议固有,不可消除。
  • 密码库 / 2FA(nixpkgs 实测):vaultwarden 1.37.3✓(有 NixOS 模块)、keepassxc 2.7.12✓、authenticator 4.6.2✓、yubioath-flutter 7.3.3✓、password-store 1.7.4✓、gopass 1.16.1✓;anonaddy 不在 nixpkgs;桌面端 bitwarden 包已被移除(CLI 尚有)。
  • 自建 IdP 只服务「你自己的服务」,对「站点只给 Google 登录」无能为力(provider 列表是站点硬编码)。可选项:Pocket ID 2.16.0✓(最轻)、Keycloak 26.7.5✓(最标准)、Zitadel 2.71.7✓、Dex 2.45.1✓(收口上游)、Authelia 4.39.20✓(反代前置认证)、tinyauth 5.2.0✓;Authentik / Ory Hydra 无 nixpkgs 模块;Kanidm 包已被移除。

待实测 / 待核实

  • ungoogled-chromium / vivaldi / floorp / librewolf 的策略目录到底生效哪个(chrome://policy、about:policies)。
  • use_real_profile: true 是否去找不存在的 ~/.config/google-chrome(本机从无 Chromium profile)。
  • 首次装 Chromium 系若无 binary cache 会本地编译(ungoogled 通常有缓存)。
  • cdp-hermes 启用后 9222 是否可用、MCP 是否连得上(403 / WS 拒绝则加 --remote-allow-origins=*)。
  • Chrome 里要不要加回部分硬化(遥测 / 第三方 cookie / 后台常驻)—— 原 18 条策略已在 google-chrome.nix 中注释保留,逐条取消注释即恢复。⚠️ 与 Google 生态冲突的四条勿开:BrowserSignin / SyncDisabled / PasswordManagerEnabled / Autofill*。

相关

  • skill:nixos-per-app-modules(模板与已核实事实表)
  • 同层笔记:「文件管理器选择」
  • 压缩前全文快照:~/.hermes/profiles/nixos-u533b-u751f/backups/trilium/hQmHCr0HhvqR-browser-choice-snapshot.html