DoraTerm is a terminal-focused derivative of WaveTerm, an open-source, AI-integrated terminal originally created by Command Line Inc.
DoraTerm adds two flagship features on top of WaveTerm: Remote (connect a client anywhere to your in-network DoraTerm) and dsh attach (SSH back to your DoraTerm and attach to running terminals).
Run DoraTerm on a machine at home or in your office. From a laptop in a coffee shop, on a different continent, or behind a corporate firewall, launch a second DoraTerm client and have it connect into your home instance over the public internet. You see the same windows, tabs, blocks, and live terminal output as if you were sitting in front of the original machine. All state lives on the home machine; the remote client is purely a viewer/controller.
DoraTerm's backend process (dorasrv) ships with an embedded reverse-proxy entry point that listens on TCP port 31577 (configurable). Any DoraTerm client launched with --remote-host <url> skips spawning its own dorasrv and instead forwards all HTTP and WebSocket traffic to the remote entry. A password header guards every request so the listener can be safely exposed to the public internet.
-
Open DoraTerm settings (
Cmd+,/Ctrl+,) or edit~/.config/doraterm/settings.jsondirectly. Add:{ "remote:password": "pick-a-long-random-password", "remote:listenport": 31577, "remote:bindaddr": "127.0.0.1" }remote:password— shared secret. Required. Without it the remote entry stays disabled.remote:listenport— defaults to31577.remote:bindaddr— defaults to127.0.0.1. Keep this loopback unless you have a reason to bind a public interface (the Cloudflare Tunnel below is safer than exposing a public port directly).
-
Restart DoraTerm. The log will show
Server [remote-entry] listening on 127.0.0.1:31577once the listener is up.
Cloudflare Tunnel gives you a free, public HTTPS endpoint without opening any inbound ports on your network. It also handles TLS, so your password stays encrypted in transit.
-
Install cloudflared on the host:
# macOS brew install cloudflared # Linux (Debian/Ubuntu) curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb sudo dpkg -i cloudflared.deb
-
Authenticate and create a tunnel:
cloudflared tunnel login # opens browser, pick your Cloudflare domain cloudflared tunnel create dora # creates a tunnel named "dora"
-
Route a hostname through the tunnel. Replace
dora.tests.comwith a subdomain on a domain you own and have on Cloudflare:cloudflared tunnel route dns dora dora.tests.com
-
Configure the tunnel at
~/.cloudflared/config.yml:tunnel: dora credentials-file: /Users/yourname/.cloudflared/<tunnel-id>.json ingress: - hostname: dora.tests.com service: http://127.0.0.1:31577 - service: http_status:404
-
Run the tunnel:
cloudflared tunnel run dora
To run it as a background service:
sudo cloudflared service install(seecloudflared service --help).
You can also use the quick-and-dirty Quick Tunnel for testing (no domain required, URL changes every restart):
cloudflared tunnel --url http://127.0.0.1:31577-
Install DoraTerm on the remote machine (the laptop you're traveling with).
-
Put the password in the client's local settings (
~/.config/doraterm/settings.jsonon the client machine). The client reads only the password from this file; everything else comes from the host.{ "remote:password": "pick-a-long-random-password" } -
Launch DoraTerm with
--remote-host:# macOS /Applications/Dora.app/Contents/MacOS/Dora --remote-host https://dora.tests.com # Windows "C:\Program Files\Dora\Dora.exe" --remote-host https://dora.tests.com # Linux dora --remote-host https://dora.tests.com
You can also use bare
host:portform when connecting on the same LAN without a tunnel:dora --remote-host 192.168.1.50:31577
The remote client uses a separate userData directory (doraterm-remote-<hash>), so it will not interfere with a local DoraTerm instance running on the same machine. You can keep both side-by-side.
- The remote entry uses a constant-time password comparison and rejects requests with no/wrong password.
- Always use HTTPS (Cloudflare Tunnel, nginx, Caddy, etc.) when exposing the entry to the public internet. Plain HTTP exposes your password to the network.
- Pick a long, high-entropy password. The entry has no rate-limiting; a weak password can be brute-forced.
You start a long-running build, a claude-code session, or a server you'd like to babysit inside a DoraTerm block. Later, you're on another machine, ssh into your dev box, and want to interact with that exact running shell — not just tail -f its log, but type into it as if you were back at the GUI. dsh attach does that.
This is the same mental model as tmux attach or screen -r, but for DoraTerm blocks. The block keeps running in the GUI; your SSH terminal becomes an additional view and input source for the same PTY.
dsh ships with every DoraTerm install. Inside any terminal block in the DoraTerm GUI, dsh is already on the PATH — try dsh version. To use dsh attach from an external terminal (e.g. an SSH session), put it on the system PATH manually:
macOS:
sudo ln -s "/Applications/Dora.app/Contents/Resources/app.asar.unpacked/dist/bin/dsh-*-darwin.$(uname -m | sed 's/x86_64/x64/')" /usr/local/bin/dshOr just add the bin directory to your shell rc:
echo 'export PATH="/Applications/Dora.app/Contents/Resources/app.asar.unpacked/dist/bin:$PATH"' >> ~/.zshrc
# then alias the versioned binary
echo 'alias dsh="dsh-*-darwin.$(uname -m | sed s/x86_64/x64/)"' >> ~/.zshrcThe simplest portable option — copy the right binary directly:
sudo cp /Applications/Dora.app/Contents/Resources/app.asar.unpacked/dist/bin/dsh-*-darwin.arm64 /usr/local/bin/dsh # Apple Silicon
sudo cp /Applications/Dora.app/Contents/Resources/app.asar.unpacked/dist/bin/dsh-*-darwin.x64 /usr/local/bin/dsh # Intel
sudo chmod +x /usr/local/bin/dshLinux:
# Replace path with wherever Dora unpacked (typical: /opt/Dora/resources/app.asar.unpacked/dist/bin or your AppImage extract dir)
sudo cp /opt/Dora/resources/app.asar.unpacked/dist/bin/dsh-*-linux.x64 /usr/local/bin/dsh
sudo chmod +x /usr/local/bin/dshWindows (PowerShell as Administrator):
# Copy the matching binary into a directory already on PATH
Copy-Item "C:\Program Files\Dora\resources\app.asar.unpacked\dist\bin\dsh-*-windows.x64.exe" "C:\Windows\dsh.exe"Verify after installation:
which dsh && dsh versionConnect to your host (over SSH, console, anything), then:
# Interactive picker — lists workspaces → tabs → blocks
dsh attach
# Or attach directly by block ID (shown in the GUI block header)
dsh attach <blockid>You'll see the current screen contents of the chosen block redrawn into your SSH terminal. Type — and the keystrokes are forwarded to the remote PTY. The GUI continues to update simultaneously.
| Key | Action |
|---|---|
Ctrl+A d |
Detach (block keeps running) |
Ctrl+A r |
Force full redraw |
Ctrl+A s |
Resync — rebuild emulator state from a fresh snapshot |
Ctrl+A k |
Pan viewport up (for terminals where Ctrl+Up is taken) |
Ctrl+A j |
Pan viewport down |
Ctrl+Arrow |
Pan viewport in any direction |
Ctrl+A Ctrl+A |
Send a literal Ctrl+A to the remote shell |
DoraTerm blocks have a fixed terminal size (set by the GUI window). If you attach from a smaller terminal (e.g. an 80-column SSH session attached to a 220-column block running Claude Code), the local view is a window onto the remote terminal — use Ctrl+Arrow to pan it around without resizing the remote PTY.
This project is a fork of WaveTerm, developed and maintained independently. We are grateful to Command Line Inc. and all WaveTerm contributors for building the foundation that DoraTerm is built upon.
DoraTerm focuses specifically on the terminal experience:
- Trimmed: Non-terminal features present in WaveTerm have been removed to keep the application lean and focused on core terminal use cases.
- Attach: Added the ability to attach to existing terminal sessions, making it easy to reconnect to running processes.
- Remote: Enhanced remote terminal capabilities for seamless work across machines.
These changes reflect our opinionated view that a terminal should excel at being a terminal, while remaining open to integration with other tools through the existing extension mechanisms inherited from WaveTerm.
WaveTerm was created and is maintained by Command Line Inc., with contributions from the open-source community. DoraTerm would not exist without their work. We thank them for building and open-sourcing WaveTerm under the Apache 2.0 license.
For the original project, visit github.com/wavetermdev/waveterm.
DoraTerm is licensed under the Apache License, Version 2.0, as is the original WaveTerm. See LICENSE for the full license text.
Copyright notices for the original WaveTerm codebase are retained in NOTICE.