DuProcess 3224a9c699
ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / windows-client (push) Has been cancelled
ci / package-release (linux-x86_64, ubuntu-latest) (push) Has been cancelled
ci / package-release (macos-aarch64, macos-14) (push) Has been cancelled
ci / package-release (macos-x86_64, macos-13) (push) Has been cancelled
ci / package-release (windows-x86_64, windows-latest) (push) Has been cancelled
ci / remote-bench (push) Has been cancelled
Fix Dosh stdio proxy for VS Code
2026-07-01 09:58:26 -04:00
2026-06-30 19:21:28 -04:00
2026-06-21 11:21:05 -04:00
2026-07-01 09:58:26 -04:00
2026-06-28 09:31:06 -04:00
2026-06-28 09:31:06 -04:00
2026-06-30 19:42:45 -04:00

Dosh

Dosh is an encrypted remote terminal for fast reconnecting shells. It is meant to replace Mosh and day-to-day interactive SSH sessions.

It runs a dosh-server on the remote machine and a dosh client locally. The first setup can use SSH. After that, Dosh can attach over encrypted UDP with cached credentials, keep terminal sessions alive, reconnect after network changes, and forward TCP ports. It also includes native encrypted file copy over the Dosh stream layer.

Support

  • Client: macOS, Linux, Windows
  • Server: Unix-like systems with PTYs
  • Windows: client only
  • UDP port: one configured server port, default 50000

Dosh does not implement SFTP, X11 forwarding, or a Windows server. Windows is client-only.

Install

Server and client on Unix/macOS:

curl -fsSL https://git.palav.dev/Palav/dosh/raw/branch/main/install.sh | sh -s -- both --repo https://git.palav.dev/Palav/dosh.git --port 50000

Client only on Unix/macOS:

curl -fsSL https://git.palav.dev/Palav/dosh/raw/branch/main/install.sh | sh -s -- client --repo https://git.palav.dev/Palav/dosh.git

Windows client:

irm https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1 | iex

Commands

dosh setup HOST          # import SSH config and trust the Dosh host key
dosh HOST                # connect
dosh HOST COMMAND        # connect and run a command
dosh exec HOST COMMAND   # run a non-interactive remote command
dosh cp SRC DST          # copy files; use host:path for a remote side
dosh ls host:path        # list a remote path
dosh cat host:path       # print a remote file
dosh mkdir host:path     # create a remote directory
dosh rm [-r] host:path   # remove a remote file or directory
dosh update              # update Dosh
dosh status HOST         # show remote tmux sessions and Dosh service status
dosh restart HOST        # restart dosh-server and show service status
dosh doctor HOST         # check config and connectivity
dosh recover HOST        # clear cached attach state and re-check
dosh proxy-stdio HOST 127.0.0.1 22
dosh vscode HOST [PATH]  # configure/open VS Code Remote-SSH through Dosh

Examples:

dosh server
dosh server tm
dosh exec server 'uname -a'
dosh cp file.txt server:tmp/file.txt
dosh cp -r server:Projects/app ./app
dosh cp -r server:Projects/app backup:app
dosh ls server:Projects
dosh cat server:tmp/file.txt
dosh forward server -L 8080:127.0.0.1:80
dosh forward server -D 1080
dosh forward server -R 2222:127.0.0.1:22
dosh proxy-stdio server 127.0.0.1 22
dosh vscode server /home/me/project

Agent forwarding is opt-in with -A and must be enabled on the server. File copy is enabled by allow_file_transfer = true on the server.

VS Code

Dosh can carry VS Code Remote-SSH without replacing VS Code's SSH workflow.

dosh vscode setup server
dosh vscode server /home/me/project

This writes a managed SSH config entry using:

ProxyCommand dosh proxy-stdio server %h %p

VS Code still uses Remote-SSH and the normal remote VS Code Server. Dosh carries the SSH byte stream over its encrypted reconnecting transport.

The optional extension in vscode-extension/ provides the same setup from the Command Palette.

Library

Dosh can also be used as a Rust transport for application protocols that need encrypted streams, roaming, reconnect behavior, keepalives, retransmission, flow control, and in-order delivery.

Use dosh::client::DoshClient and dosh::server::DoshServer for the complete native-auth path. Use dosh::transport::DoshTransport or StreamMux only when you already have your own session/auth layer.

Client-side SDK:

let client = dosh::client::DoshClient::load()?;
let mut dosh = client
    .connect("server")
    .service("myapp")
    .connect()
    .await?
    .into_transport();

let stream = dosh.open_service("myapp").await?;
dosh.send(stream, b"hello").await?;

Server-side SDK:

let config = dosh::server::DoshServerConfig::default()
    .service("myapp")?;
let mut server = dosh::server::DoshServer::bind(config).await?;

loop {
    match server.recv().await? {
        dosh::server::DoshServerEvent::Accepted(client) => {
            eprintln!("accepted {:?}", client.conn_id);
        }
        dosh::server::DoshServerEvent::Session { conn_id, event } => {
            if let dosh::transport::SessionEvent::Stream(
                dosh::transport::TransportEvent::Open(open)
            ) = event {
                server.accept_stream(conn_id, open.stream_id).await?;
            }
        }
        dosh::server::DoshServerEvent::Ignored => {}
    }
}

The server runtime owns UDP reads and demuxes packets by connection id, so multiple clients can share one Dosh port without per-session readers racing.

Runnable SDK examples live in examples/sdk_echo_server.rs and examples/sdk_echo_client.rs.

Config

~/.config/dosh/client.toml
~/.config/dosh/hosts.toml
~/.config/dosh/server.toml

Common client settings:

default_session = "new"
auth_preference = "native,ssh"
predict = true
cache_attach_tickets = true
disconnect_status = true
S
Description
Dosh dormant shell: SSH-speed Rust remote terminal attach over encrypted UDP
Readme 13 MiB
v0.1.17 Latest
2026-07-03 20:35:22 +00:00
Languages
Rust 94.5%
Shell 3.7%
PowerShell 1.1%
JavaScript 0.4%
Makefile 0.2%