Author SHA1 Message Date
lyrathorpe 39b2b1d24b Merge pull request 'fix(tmux): stop clip.exe mangling non-ASCII in the WSL clipboard' (#103) from fix/tmux-clipboard-utf8 into main
CI / flake (push) Successful in 5m47s
Reviewed-on: #103
2026-08-24 13:36:15 +01:00
lyrathorpe 0022a152e3 Merge pull request 'fix(edaas): restore passwordless wheel under sudo-rs' (#102) from fix/edaas-passwordless-sudo-rs into main
CI / flake (push) Successful in 7m44s
Reviewed-on: #102
2026-08-24 13:29:39 +01:00
Emma Thorpe d9db12c4a5 fix(tmux): stop clip.exe mangling non-ASCII in the WSL clipboard
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 7m8s
tmux-yank autodetects WSL and pipes the selection to clip.exe, which
decodes its stdin as the console OEM codepage rather than UTF-8. Copying
an em dash out of a pane put "ΓÇö" on the Windows clipboard; the same
applies to every non-ASCII character.

Override the copy command to route through tmux's own buffer. With
set-clipboard on, that emits OSC 52 and the terminal receives UTF-8
directly, with no Windows-side helper in the path. Windows Terminal
honours OSC 52; verified against the running client.

Guarded on /proc/version so only WSL is affected. iTerm2 does not accept
OSC 52 by default, so the Darwin hosts keep pbcopy.

Set in the plugin's extraConfig rather than the shared block because
yank.tmux bakes the copy command into its key bindings at load time, and
home-manager emits plugin extraConfig before the run-shell.
2026-08-24 13:26:21 +01:00
Emma Thorpe 4ac9d1108b docs(shell): record the EDaaS passwordless-wheel exception
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m10s
The sudo-rs section claimed the whole fleet runs the stock "wheel, with a
password" policy, which is no longer true for the WSL host. Explain why the
NixOS-WSL default does not survive the sudo-rs swap, and mark the difference in
the per-host table.
2026-08-24 11:16:15 +01:00
Emma Thorpe 0c151943de fix(edaas): restore passwordless wheel under sudo-rs
NixOS-WSL sets `security.sudo.wheelNeedsPassword = false`, but that option
belongs to the `security.sudo` module and does not carry over to the sudo-rs
swap in modules/common-nixos.nix, whose equivalent option defaults to true.
Since that swap landed, sudo on this host prompts for the account password --
which WSL set during install and nobody knows -- so escalation only worked
through `wsl -u root`.

Set `security.sudo-rs.wheelNeedsPassword = false` on the host to match the
NixOS-WSL default. Other NixOS hosts are unaffected and keep the prompt.
2026-08-24 11:16:12 +01:00
renovate-bot dcb8a5e66a Merge pull request 'chore(deps): lock file maintenance flake inputs' (#101) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 6m6s
2026-08-24 03:10:24 +01:00
Renovate Bot bdb21a6d50 chore(deps): lock file maintenance flake inputs
CI / flake (push) Skipped
renovate/stability-days Updates have not met minimum release age requirement
CI / flake (pull_request) Successful in 7m14s
2026-08-24 02:02:49 +00:00
renovate-bot 1da34d6232 Merge pull request 'chore(deps): lock file maintenance flake inputs' (#100) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 4m53s
2026-08-24 00:07:42 +01:00
Renovate Bot 19e0b7f13f chore(deps): lock file maintenance flake inputs
CI / flake (push) Skipped
renovate/stability-days Updates have not met minimum release age requirement
CI / flake (pull_request) Successful in 4m53s
2026-08-23 23:02:35 +00:00
4 changed files with 69 additions and 41 deletions
+17 -9
View File
@@ -186,6 +186,14 @@ fleet's stock "wheel, with a password" policy. What it does **not** implement:
host aliases, LDAP/SSSD sudoers, `sudoreplay`, and most `Defaults` settings. host aliases, LDAP/SSSD sudoers, `sudoreplay`, and most `Defaults` settings.
Needing any of those means reverting to `security.sudo`. Needing any of those means reverting to `security.sudo`.
One exception to the password: the EDaaS box sets
`security.sudo-rs.wheelNeedsPassword = false`. NixOS-WSL ships that default for
`security.sudo` — WSL has no console login, so the trust boundary is the Windows
session and the Linux account password is never one the user chose — and the
option does not carry across to the `security.sudo-rs` module, which defaults to
requiring one. Without the explicit setting, `sudo` on that host prompts for a
password nobody knows.
If a host ever refuses to escalate, get a root shell that does not go through If a host ever refuses to escalate, get a root shell that does not go through
sudo (`wsl -u root -d NixOS` on the work box; the console or a serial/HDMI login sudo (`wsl -u root -d NixOS` on the work box; the console or a serial/HDMI login
elsewhere) and roll back with `nixos-rebuild switch --rollback`, or pick the elsewhere) and roll back with `nixos-rebuild switch --rollback`, or pick the
@@ -349,12 +357,12 @@ Claude to route new memories there.
## Per-host differences ## Per-host differences
| | Personal Linux (sway) | macOS | Work WSL (EDaaS) | | | Personal Linux (sway) | macOS | Work WSL (EDaaS) |
| --------------------------- | --------------------- | --------------------- | --------------------------- | | --------------------------- | --------------------- | --------------------- | ---------------------------- |
| Auto-tmux | yes (foot/TTY) | yes (iTerm2) | yes (WSL shell) | | Auto-tmux | yes (foot/TTY) | yes (iTerm2) | yes (WSL shell) |
| `kubectl` → kubecolor | no (no kubectl) | no | yes (work module) | | `kubectl` → kubecolor | no (no kubectl) | no | yes (work module) |
| `sudo` implementation | sudo-rs | Apple sudo + Touch ID | sudo-rs | | `sudo` implementation | sudo-rs (password) | Apple sudo + Touch ID | sudo-rs (passwordless wheel) |
| git email | `iam@emmathe.dev` | `iam@emmathe.dev` | `…@citrix.com` (work) | | git email | `iam@emmathe.dev` | `iam@emmathe.dev` | `…@citrix.com` (work) |
| ssh config managed | yes | yes | no (keeps corporate config) | | ssh config managed | yes | yes | no (keeps corporate config) |
| ssh-agent | yes | launchd | yes (work module) | | ssh-agent | yes | launchd | yes (work module) |
| GUI / theming (desktop.nix) | yes | no | no | | GUI / theming (desktop.nix) | yes | no | no |
Generated
+31 -31
View File
@@ -3,16 +3,16 @@
"brew-src": { "brew-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1786348930, "lastModified": 1786945682,
"narHash": "sha256-bCQJkbgsAMDp5HQystZLCq11UHiyEuoWbxKulAPYrh8=", "narHash": "sha256-VBESSoJccikdhxh3vp3SQeG7cZXTOulMvVkoSqNDEhs=",
"owner": "Homebrew", "owner": "Homebrew",
"repo": "brew", "repo": "brew",
"rev": "3ecc9eff23feebf1bc73846d74e14a122c93b66f", "rev": "5b90e281d4e0c8fbd6ca4d8358276fb305b8d0bd",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "Homebrew", "owner": "Homebrew",
"ref": "6.0.16", "ref": "6.0.18",
"repo": "brew", "repo": "brew",
"type": "github" "type": "github"
} }
@@ -25,11 +25,11 @@
}, },
"locked": { "locked": {
"dir": "pkgs/firefox-addons", "dir": "pkgs/firefox-addons",
"lastModified": 1786853140, "lastModified": 1787457768,
"narHash": "sha256-O880FlUav75Q5aNlg9znyg/avf1X/W7o/cAtZFLtpWc=", "narHash": "sha256-cbgeu5NTb6DtB+tNs4E6z6K/1XKKM90gVmlkWMJe+gY=",
"owner": "rycee", "owner": "rycee",
"repo": "nur-expressions", "repo": "nur-expressions",
"rev": "ba9568c9c0df6290dc2f34b032ab4cb575e73788", "rev": "25cfc8fdc413d73b3a47e3e86dafcad51cf5c9f9",
"type": "gitlab" "type": "gitlab"
}, },
"original": { "original": {
@@ -135,11 +135,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1784288435, "lastModified": 1787424939,
"narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=", "narHash": "sha256-O2tBn84NNuHrnqNVxx/XqsXwfYvS1YwBh+7CBnbCYsk=",
"owner": "cachix", "owner": "cachix",
"repo": "git-hooks.nix", "repo": "git-hooks.nix",
"rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9", "rev": "809414f0cdadf82cf11b06c2b29ba9b3168b3297",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -155,11 +155,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1786924861, "lastModified": 1787377438,
"narHash": "sha256-hftabkb+73OcGzvwFAjCiQorAhprs9TnU1+FkGO5CIw=", "narHash": "sha256-Sxu1NLTD/Ern6hFGLlZmtKCSct3YQXZI/lls8RE1XeM=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "09ae1b85a6db412d841d60f924b23f881f0d0a38", "rev": "65258d5c65a250189fde2e35f490d15e064c4c62",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -211,11 +211,11 @@
"brew-src": "brew-src" "brew-src": "brew-src"
}, },
"locked": { "locked": {
"lastModified": 1786686423, "lastModified": 1787330919,
"narHash": "sha256-8q3WdB8o3VUI7rOz1OXfioXIaaWbFTAxRJAkWLlfc0s=", "narHash": "sha256-LslMncqN7uOOH5S88WZtO/EVt2HwD8ltUnfyANk+mC0=",
"owner": "zhaofengli", "owner": "zhaofengli",
"repo": "nix-homebrew", "repo": "nix-homebrew",
"rev": "ccabf79a6b9845eb72b51ea1d9c7ce3446350df3", "rev": "b00218e4aec0e5bf07d61a0bb13f842faa582d7b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -231,11 +231,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1786852476, "lastModified": 1787457452,
"narHash": "sha256-IM5CYtf86W4w8eUPpKcY/LpdHElmVBtJhaKnoTKxZEA=", "narHash": "sha256-FJh4esFS3zqNNuKwvN3t6wrJGewqp1AUF9DAEvoKPD8=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-index-database", "repo": "nix-index-database",
"rev": "c7962dc97b45129df8d751bedaf37beb5a17706e", "rev": "c51d5c2ba69c907a34e90c9b6b80cd2b93811745",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -272,11 +272,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1786867632, "lastModified": 1787144466,
"narHash": "sha256-ez+ubZlA1RtdjCB18a6zJ9M4u8qoPDy08EcnsW5M3Xw=", "narHash": "sha256-HHfv2/HkNSKbbSyU9iD/g8lbP6r4tl33sSw1W4rXCk0=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixos-hardware", "repo": "nixos-hardware",
"rev": "ff17823245ab9ff7bcae6acf950bd89cba82c38c", "rev": "0471accf8d0a8210b31d947497d179ecc99e0021",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -308,11 +308,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1786711500, "lastModified": 1787414105,
"narHash": "sha256-QvnceIGTBeDvDd9oCn+GvdsnkquliuwbVgpiRH68qaQ=", "narHash": "sha256-WncT27+3BOkgTaJZLnCsf3LcYf9RXMuR9ONSN4rzQ7s=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "02e08985a27c65ffd33d434eeb2e660a2e4dc84d", "rev": "a9e6d84f9c2f9012f5fe7d964a7851352300e61a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -324,11 +324,11 @@
}, },
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1786862985, "lastModified": 1787360063,
"narHash": "sha256-FBJRXmbGXiSUDvYEbfLYRkckayyZ6SK1UEqhCrIZ2Cs=", "narHash": "sha256-dt4WdcvsA8/RCe+VZZwqU0X+XMM3wBbGCWA0/sFWzGo=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "e5bdc4a41d4c072fe1e3787eaa0320a384741d44", "rev": "2c423e03bbafcff28bfadc6781a4a8257f205cb5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -347,11 +347,11 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1786873773, "lastModified": 1787536726,
"narHash": "sha256-Hj/nkhKDv0aJly1PAUstrhrgEYn1mVSkLIYMh90r/Pc=", "narHash": "sha256-aBh5Yk9tX8ZV4k10BJr2fvTq0/+iWGegaCMUOU7YKas=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixvim", "repo": "nixvim",
"rev": "b397fb9f6950d57355d62bb92457d223464e0115", "rev": "e2c3f9f36326d07340626847543c557e2b95fb50",
"type": "github" "type": "github"
}, },
"original": { "original": {
+16 -1
View File
@@ -287,7 +287,22 @@ in
plugins = with pkgs.tmuxPlugins; [ plugins = with pkgs.tmuxPlugins; [
sensible sensible
vim-tmux-navigator # Ctrl-h/j/k/l across vim splits and tmux panes vim-tmux-navigator # Ctrl-h/j/k/l across vim splits and tmux panes
yank {
# On WSL, tmux-yank pipes the selection to clip.exe, which decodes its
# stdin as the OEM codepage instead of UTF-8 -- an em dash reaches the
# Windows clipboard as three characters. Route through tmux's own
# buffer instead: with set-clipboard on, tmux emits OSC 52 and the
# terminal takes the text as UTF-8. Windows Terminal honours OSC 52;
# iTerm2 does not by default, hence the runtime guard rather than
# overriding pbcopy/xsel on every host. yank.tmux bakes the command
# into its key bindings when it loads, so this must be set first, which
# is what plugin extraConfig gives us.
plugin = yank;
extraConfig = ''
if-shell 'grep -qi microsoft /proc/version 2>/dev/null' \
"set -g @override_copy_command 'tmux load-buffer -w -'"
'';
}
extrakto # prefix+Tab: fzf-grab paths/URLs/text from the pane into the prompt extrakto # prefix+Tab: fzf-grab paths/URLs/text from the pane into the prompt
{ {
# Catppuccin Mocha statusline (v2 API: flavour + window options must be # Catppuccin Mocha statusline (v2 API: flavour + window options must be
+5
View File
@@ -60,6 +60,11 @@
## patch the script ## patch the script
systemd.services.docker-desktop-proxy.script = lib.mkForce ''${config.wsl.wslConf.automount.root}/wsl/docker-desktop/docker-desktop-user-distro proxy --docker-desktop-root ${config.wsl.wslConf.automount.root}/wsl/docker-desktop "C:\Program Files\Docker\Docker\resources"''; systemd.services.docker-desktop-proxy.script = lib.mkForce ''${config.wsl.wslConf.automount.root}/wsl/docker-desktop/docker-desktop-user-distro proxy --docker-desktop-root ${config.wsl.wslConf.automount.root}/wsl/docker-desktop "C:\Program Files\Docker\Docker\resources"'';
# NixOS-WSL's passwordless wheel default only covers `security.sudo`; the
# sudo-rs swap in common-nixos.nix needs it set again. No console login here,
# and no account password anyone knows.
security.sudo-rs.wheelNeedsPassword = false;
features.swayDesktop.enable = false; features.swayDesktop.enable = false;
# NOTE: this user's systemd --user lingering -- so the home-manager renovate # NOTE: this user's systemd --user lingering -- so the home-manager renovate