I'm a solo developer, and this is a short write-up of a small, free, MIT-licensed extension I made: Easy SSH, an SSH terminal that lives inside VS Code and Cursor. Updated for Easy SSH 0.4.0 (Oct 5, 2026).
The itch
Most of my SSH sessions are not "develop on the server" sessions. They're "log in, look at something, grab a file, maybe fix a config" sessions. For that I wanted:
- a list of my servers, including ones behind a bastion
- a normal login shell, not a special file browser
- a way to get a file (or a whole folder) off the box without switching to
scpand retyping the path - a quick way to fix a line in a remote config without leaving the editor
- nothing installed on the server, and no remote editor downloaded when I connect
What it does
Click the Easy SSH icon in the activity bar and you get a home screen in a terminal tab. 0.4.0 redesigned it:
- A Last: line names the connection you used most recently. The list starts on it, so opening Easy SSH and pressing Enter reconnects.
- The table shows each connection's user@host:port, how it signs in (key, password, agent, or "key via bastion" for a jump host) and when you last used it.
- When the terminal is tall enough, the selected connection's details (host, port, sign-in, jump host, start folder) show under the list.
- One line of key hints at the bottom, and a different tip in the prompt each time.
Type / for commands (/new, /edit, /delete, /import, /folder, /quit), or /name to connect to a saved connection by name.
Adding a server
/new used to be a long form. It's now a short wizard: Step 2 of 6, one field per step with a help line under it, and a red message as soon as a value can't work (an empty host, a port that isn't a number from 1 to 65535, a key file that doesn't exist). Esc goes back one step.
The last page shows every value and the matching ssh command, so you can see exactly what will happen. From there, Test connection connects, signs in and opens SFTP without saving. If the password is wrong or the key isn't accepted, you find out now rather than on the first real connect. Then Save, or Enter on any value to change just that field.
/edit opens the same page for a saved connection: pick a field, change it, save. /delete asks in red with the name and host, and "No, keep it" is selected by default.
Colors that follow your theme
Easy SSH now has two palettes, Easy SSH Dark and Easy SSH Light, and it picks one from your VS Code theme. A dark theme gets Dark, a light theme gets Light, and high-contrast themes get the one that matches their brightness. Change the VS Code theme and an open Easy SSH terminal recolors right away. There's no setting to set.
Both palettes draw on VS Code's own terminal background. The purple and pink from the icon are only used for the brand mark, accents and a soft tint on the selected row, and text contrast is at least 4.5:1 on VS Code's default backgrounds.
Connected shells get the palette's cursor and ANSI colors as well, in Easy SSH terminals only. The terminal's own colors come back when the session ends, and easySsh.themeSession turns this off.
The shell and the Ctrl+click menu
Connecting opens your login shell in your home directory. Aliases, vim, less, top and sudo work as they do over ssh. File and folder names in the output are links: Ctrl+click one (Windows/Linux) or Cmd+click it (macOS) and a small menu opens. Its title shows the name and the folder it's in, for example access.log — /home/deploy/logs.
- Files: Download, Open, Rename, Delete.
- Folders: Download (the whole folder, subfolders included), Upload, Rename, Delete.
What each one does:
-
Download is first, so Ctrl+click and then Enter downloads. It opens a save dialog (a folder picker for a folder) that starts in your Downloads folder;
/folderchanges that default. A folder keeps its structure and permission bits. Big transfers show a progress notification with a Cancel button. - Upload: drag files or folders onto the terminal and they land in the current remote directory, as before. To put files into a different folder, Ctrl+click that folder and choose Upload…. If something with the same name already exists, it asks first: Replace, Keep Both, or Skip.
-
Rename and Delete ask before they change anything. Deleting a folder tells you how many files are in it first, for example
Delete folder "logs" and its 128 files?. - Open puts a text file in an editor tab. More on that below.
Names you create with commands (touch notes.md, mv a b, tar xf release.tgz) are clickable as soon as the prompt comes back, without a cd. To change directory, you type cd as in any shell; Tab completes remote paths.
Hovering a name underlines it and lists what you can do with it, for example "Folder logs: download, upload into, rename, delete". Normal mouse selection still works for copying text.
Open a remote file in an editor tab
Added in 0.3.0. Ctrl+click a text file, choose Open, and the file opens in a normal VS Code editor tab with syntax highlighting, search and everything else the editor has. Ctrl+S (Cmd+S on macOS) saves it straight back to the server.
A few details I cared about:
-
Open is only offered for text files. Easy SSH decides by the name first (
.yaml,.log,.conf,.sh,Dockerfile,authorized_keys… are text;.tar.gz,.png,.so… are not). For any other name it reads the first 8 KB: no NUL bytes and valid UTF-8 means text. An archive or a binary gets Download, Rename and Delete only. - Big files ask first. A text file over 5 MB shows its size and asks: Open Anyway, Download, or Cancel. Files over 256 MB aren't opened in the editor.
- Changed on the server? If someone else (or a command in your shell) changed the file after you opened it, saving shows both versions' size and time and asks before overwriting.
- Disconnected? The save fails with a message that says so, and your edits stay in the editor. Reconnect and save again.
- Permissions stay as they were. A save writes a temporary file next to the original with the same permissions, then puts it in place. A symlink stays a symlink, and a file owned by another user is rewritten in place so its owner doesn't change.
It's one file at a time, opened from the shell. It's not a remote workspace with a file explorer.
Sign-in and jump hosts
You can sign in with a password (saved, or asked every time), a private key, or an SSH agent (on Windows, the OpenSSH agent or Pageant). Two-factor prompts are shown in the terminal. You can hop through one or more jump hosts, and /import reads ~/.ssh/config while keeping the ProxyJump chain and Host * defaults. New servers show their host key fingerprint, and Easy SSH connects only after you accept it.
How it knows where you are
This was the fun part. When the shell starts, Easy SSH sends one line that adds a bash PROMPT_COMMAND hook (a zsh precmd function, or a fish prompt event handler). The hook prints $PWD as an OSC 7 escape sequence before every prompt. The extension reads that, so it always knows the remote directory, and it doesn't install anything on the server to do it. The line is sent after the login message, its echo is hidden, and it's kept out of your shell history.
File and directory names are exposed as VS Code terminal links, which is why it's Ctrl+click on Windows/Linux and Cmd+click on macOS, and why normal mouse selection still works. After each command, Easy SSH lists the current folder again over SFTP (once, shortly after the prompt returns), which is how new names become links without a cd. VS Code can keep an old link under a pointer that hasn't moved while the text below it changes (for example after clear && ls), so Easy SSH checks the row when you click: it acts on the name that's there now, or asks you to click again if it can't tell.
The editor tab has an address like easyssh://<connection>/<path>. It reads and saves through the terminal's own SFTP connection, as the user you signed in as.
When Easy SSH can't know the directory, for example after sudo su, it follows the cd commands it can see and otherwise doesn't guess. An upload then asks whether to use the last known directory, your home directory, or a path you type. Transfers always run over SFTP as the user you logged in as, so Easy SSH shows you the sudo mv command to finish the job.
What changed in 0.4.0
- New home screen: the Last line (Enter reconnects), a table with sign-in method and last use, the selected connection's details, and Getting started when the list is empty.
-
/newis a step-by-step wizard with inline checks and a summary page with thesshcommand. - Test connection before you save a new or edited connection.
-
/editopens the summary and changes one field at a time./deleteasks in red. - Easy SSH Dark and Light palettes that follow the VS Code theme and switch live.
- A smaller extension: dead code removed, 213 KB VSIX.
0.3.0 (the day before) made Ctrl+click open an action menu (Download, Open, Rename, Delete) and added editing remote files in an editor tab. The full list is in the changelog.
Limitations (being honest)
- It targets Linux and Unix servers; Windows servers aren't supported. Folder tracking works with bash, zsh and fish.
- Downloads, uploads and Open need SFTP on the server. Without it you still get the terminal, but no file transfers.
- A single upload or folder download is capped at 5000 files, and symbolic links inside folders are skipped.
-
ProxyCommandisn't supported; useProxyJump. - Transfers and saves run as the user you signed in as, even after
sudo su. - Editing is one file at a time, opened from the shell. It's not a remote workspace: no remote file explorer, language servers or debugging. Remote-SSH is the better tool for that.
- It's version 0.4.0 and still young.
Try it
- VS Code Marketplace: https://marketplace.visualstudio.com/items?itemName=easy-ssh.easy-ssh
- Open VSX (Cursor, VSCodium): https://open-vsx.org/extension/easy-ssh/easy-ssh
- Source and issues: https://github.com/dhlptx00/EasySSH
Bug reports and "this broke on my server" stories are the most useful thing you could send me.
If it saves you time, there's a Buy Me a Coffee link. No pressure.
Disclosure: I used AI assistance for parts of the code and this write-up; I reviewed and tested everything myself.








Top comments (0)