Important
Upgrading from an earlier version of OmniSSHAgent?
OmniSSHAgent has been redesigned around a separation between SSH agent backends and Windows client interfaces. Its role, configuration, and WSL integration have changed. Before upgrading, read Why OmniSSHAgent Is Being Redesigned and follow the legacy migration guide.
OmniSSHAgent reduces the fragmented SSH agent environment on Windows.
Windows applications use several incompatible SSH agent interfaces. Native OpenSSH clients use a Windows Named Pipe, PuTTY-family applications use the Pageant protocol, and Git for Windows, MSYS2, and Cygwin use a Cygwin-compatible socket format.
OmniSSHAgent connects these Windows client interfaces to a selected SSH agent backend. Windows OpenSSH remains the default backend. An optional embedded backend can instead keep keys only in OmniSSHAgent process memory. OmniSSHAgent runs as a Windows 11 notification-area application and never persists private keys or decryption passphrases.
With the default windows-openssh backend, the Windows OpenSSH Authentication
Agent remains responsible for private key storage and signing operations.
OmniSSHAgent opens \\.\pipe\openssh-ssh-agent for each request and exposes two
optional compatibility interfaces:
- Pageant for PuTTY, WinSCP, TortoiseGit, and other Pageant-compatible clients
- Cygwin/MSYS2 for Git for Windows, MSYS2, and Cygwin clients
With backend.type = "embedded", OmniSSHAgent owns the standard OpenSSH Named
Pipe and connects OpenSSH, Pageant, and Cygwin/MSYS2 clients to one ephemeral
in-memory keyring. Keys are lost when OmniSSHAgent exits and are not reloaded
automatically.
OmniSSHAgent does not manage WSL2 transport. WSL integration is provided separately by Pipeferry, which connects a Unix Domain Socket in WSL2 to the same Windows OpenSSH Named Pipe. The pipe may be owned by an external backend or by OmniSSHAgent in embedded mode.
OmniSSHAgent is intentionally focused on compatibility rather than key management.
- Use the Windows OpenSSH Authentication Agent as the default backend
- Avoid replacing or disabling the Windows standard SSH agent by default
- Make existing Pageant and Cygwin/MSYS2 clients use the same backend keys
- Keep Pageant and Cygwin/MSYS2 failures isolated from each other
- Recover automatically after the backend agent is restarted
- Never persist private keys or decryption passphrases
- Never log SSH agent payloads or signing data
- Keep WSL2 transport independent through Pipeferry
- Remain a small Windows-native notification-area application
For the background and rationale behind this redesign, see Why OmniSSHAgent Is Being Redesigned.
- Windows 11
- x86-64 or ARM64
- Windows OpenSSH Authentication Agent when using the default backend
Windows 10, macOS, Linux, and WSL1 are not supported by the current MVP.
Start the Windows OpenSSH Authentication Agent and add your keys before using OmniSSHAgent.
Open PowerShell as Administrator and configure the service:
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agentCheck the service and add a key:
Get-Service ssh-agent
ssh-add
ssh-add -lOmniSSHAgent connects to \\.\pipe\openssh-ssh-agent for each individual
request. If the OpenSSH agent is stopped and later restarted, OmniSSHAgent can
recover without being restarted.
Use the embedded backend when keys should exist only for the lifetime of the
OmniSSHAgent process. Set the backend type in Settings or in config.toml:
[backend]
type = "embedded"Embedded mode exposes \\.\pipe\openssh-ssh-agent. If the Windows OpenSSH
Authentication Agent or another agent already owns that pipe, the OpenSSH
interface fails and OmniSSHAgent reports Degraded; Pageant and Cygwin/MSYS2
can continue running. OmniSSHAgent never stops or disables the Windows service
automatically.
To release the standard pipe, open PowerShell as Administrator and explicitly stop the Windows service before starting OmniSSHAgent in embedded mode:
Stop-Service ssh-agentKeys can then be added through ssh-add,
KeePassXC's SSH Agent integration,
or Manage keys. Lifetime constraints are supported. Confirm-before-use is
rejected because this release has no confirmation UI.
Open Windows PowerShell or PowerShell 7. Do not use Command Prompt or Git Bash for the installer command.
Confirm the current shell:
(Get-Process -Id $PID).ProcessNameThe command must return powershell or pwsh.
Install OmniSSHAgent:
irm https://raw.githubusercontent.com/masahide/OmniSSHAgent/main/install.ps1 | iexAdministrator privileges are not required. The installer:
- Downloads the latest Windows x86-64 or ARM64 release for this machine
- Verifies its SHA-256 checksum
- Installs it under
%LOCALAPPDATA%\Programs\OmniSSHAgent - Creates a Start menu shortcut
- Starts the notification-area application
Run the same command again to update. The installer asks a running OmniSSHAgent process to shut down cleanly, replaces the executable, and starts the new version.
The first run creates:
%APPDATA%\OmniSSHAgent\config.toml
The notification-area menu provides:
- Current application state
- Settings
- Pageant interface enable or disable setting
- Cygwin/MSYS2 interface enable or disable setting
- Start with Windows setting
- Open configuration
- Open configuration directory
- Open log directory
- Quit
Settings opens a native dialog for the same options as config.toml, plus
Manage keys to add or remove keys in the selected SSH agent backend.
Interface and backend changes apply after OmniSSHAgent is restarted. Adding a
key asks for the passphrase if the file is encrypted; neither the passphrase nor
the private-key path is stored. In embedded mode, the loaded key is retained
only in process memory.
The Start with Windows setting registers OmniSSHAgent for the current user and does not require administrator privileges.
Changes made directly to config.toml take effect after OmniSSHAgent is
restarted. Pageant and Cygwin/MSYS2 enable settings can also be changed from the
notification-area menu or the Settings dialog.
Start OmniSSHAgent before launching applications that expect Pageant.
Supported examples include:
- PuTTY
- WinSCP
- TortoiseGit
These applications can use keys loaded in the selected backend through OmniSSHAgent's Pageant compatibility interface.
Only one application can own the Pageant window class. Stop another Pageant implementation if it conflicts with OmniSSHAgent.
OmniSSHAgent creates a Cygwin-compatible socket descriptor. The default Windows path is:
%USERPROFILE%\.ssh\omnisshagent-cygwin.sock
In Git Bash or MSYS2, set SSH_AUTH_SOCK to its Unix-style path:
export SSH_AUTH_SOCK="$(cygpath -u "$USERPROFILE/.ssh/omnisshagent-cygwin.sock")"
ssh-add -lAdd the export command to the appropriate shell startup file when you want it
to apply to new shells automatically.
OmniSSHAgent no longer includes WSL proxy commands, WSL Unix Domain Socket management, or PowerShell Named Pipe proxy scripts.
Use Pipeferry for WSL2:
curl -fsSL https://raw.githubusercontent.com/masahide/pipeferry/main/install-ssh-agent.sh | shPipeferry installs a systemd user service in WSL2 and provides shell environment
files for SSH_AUTH_SOCK.
See the complete setup and diagnostics guide:
The default configuration file is:
%APPDATA%\OmniSSHAgent\config.toml
Default configuration:
version = 1
[backend]
type = "windows-openssh"
pipe = "openssh-ssh-agent"
connect_timeout = "5s"
[interfaces.pageant]
enabled = true
[interfaces.cygwin]
enabled = true
socket_path = ""
[tray]
show_sign_notifications = false
[logging]
level = "info"Unknown fields and unsupported configuration versions are rejected instead of being silently ignored.
For embedded mode, only type needs to change. Existing pipe and
connect_timeout values may remain in the file; they are ignored while the
embedded backend is selected.
See configuration for all available settings.
The console executable provides diagnostic commands:
OmniSSHAgent-console.exe version
OmniSSHAgent-console.exe config-path
OmniSSHAgent-console.exe check-config
OmniSSHAgent-console.exe check-config --config C:\path\to\config.tomlLogs are written under:
%LOCALAPPDATA%\OmniSSHAgent\logs
See testing and troubleshooting for service checks, socket checks, Pageant conflicts, and log interpretation.
OmniSSHAgent reports one of the following states in the notification area.
The configuration is valid and all enabled compatibility interfaces started successfully.
The configuration is valid, but one compatibility interface could not start. For example, another Pageant implementation may already own the Pageant window class, or another agent may own the standard OpenSSH Named Pipe in embedded mode, while unrelated interfaces remain usable.
The configuration file is invalid. Compatibility interfaces are not started, but the notification-area menu remains available so the configuration and logs can be opened.
OmniSSHAgent does not provide a persistent key store.
- With an external backend, keys and signing remain in that backend
- With the embedded backend, loaded keys exist only in OmniSSHAgent process memory and are discarded on exit
- Private-key paths and decryption passphrases are not persisted
- SSH agent request and signing payloads are not written to logs
- The embedded OpenSSH Named Pipe grants access only to SYSTEM and the current Windows user
- The Cygwin-compatible TCP listener binds only to
127.0.0.1 - Cygwin connections require the socket descriptor nonce handshake
- Pageant shared-memory sizes and SSH agent message lengths are validated
- Interfaces are isolated so one listener failure does not stop unrelated ones
Go 1.25.6 is required.
go build -trimpath -o OmniSSHAgent-console.exe ./cmd/omnisshagent
go build -trimpath -ldflags="-H=windowsgui" -o OmniSSHAgent.exe ./cmd/omnisshagent
.\OmniSSHAgent.exeSee development for repository structure, tests, and Windows-specific implementation notes.
Open Windows PowerShell or PowerShell 7 and confirm the current shell:
(Get-Process -Id $PID).ProcessNameThen run:
irm https://raw.githubusercontent.com/masahide/OmniSSHAgent/main/uninstall.ps1 | iexThe uninstaller:
- Stops an installed OmniSSHAgent process
- Removes its Start with Windows registration
- Removes the installed application
Configuration and logs are retained. Remove these directories manually when they are no longer needed:
%APPDATA%\OmniSSHAgent
%LOCALAPPDATA%\OmniSSHAgent
Earlier OmniSSHAgent versions could load private key files directly, store passphrases in Windows Credential Manager, replace the Windows OpenSSH Named Pipe, and provide WSL proxy functionality.
The redesigned version separates selectable backends from Windows client interfaces and delegates WSL2 integration to Pipeferry. The optional embedded backend is ephemeral and does not restore legacy settings, passphrase storage, or automatic key reload.
Before upgrading, read:
The current application does not provide:
- Persistent private-key or passphrase storage
- Automatic key reload after restarting the embedded backend
- Confirm-before-use handling in the embedded backend
- Configuration hot reload
- Automatic updates inside the application
- Authenticode signing
- Log retention or size-based cleanup
- Windows 10 support