Three features today, all building on recent work.

First, commands can now be pinned: true to force them to the top of the recent list when the launcher opens with empty input, regardless of when they were last used. The ordering logic lives in a shared order_recent_keys so the CLI list view and the GUI launcher stay identical: accessed pins first (by recency), then pins that have never been used (in config order, so they surface even with no history), then everything else by recency. Like the other per-command flags it merges across the project/client/global layers and is omitted from serialized YAML when false.

Second, the webview window now behaves sensibly with links that point elsewhere. I capture the configured URL’s origin, and any navigation or target=_blank/window.open to a different http(s) origin is cancelled and handed to the system browser instead — same-origin navigation, and non-http(s) targets like about: or error pages, stay inside the webview. If handing the link to the browser fails, an injected, self-dismissing toast in the corner of the page says so rather than failing silently. This meant adding an origin_of helper to the URL utils.

Third, the tray (the hotkey service) can now own the lifecycle of my WSL assist webserver. A new webserver: config section (enabled, command, distro) drives a “Webserver” submenu in the tray with Enabled / Restart / Open in browser / View logs. When enabled, the tray launches the command inside WSL via bash -lc "exec ..." at startup — first killing any orphan from a previous tray instance that didn’t exit cleanly, since that would still be holding port 3100 and cause an EADDRINUSE. Toggling the menu item flips the config and the tray manages start/stop accordingly.