Install
Run this in a terminal:
$ curl -fsSL https://nakulv.com/drawer/install.sh | sh The script:
- picks the right build for your system;
- downloads it from the official GitHub release (opens in a new tab);
- checks its SHA-256 checksum and refuses to install on a mismatch;
- puts the binary in
~/.local/bin, without sudo.
It's a short shell script, and you can read it before you run it (opens in a new tab).
Requirements
- Linux or macOS, on x86_64 or ARM64 (Apple Silicon, Raspberry Pi 4 and newer).
- The OpenSSH client,
ssh. It's already there on almost every system. - A Nerd Font (opens in a new tab) in your terminal for the file icons. Without one, set
DRAWER_NO_ICONS=1.
Other ways to install
Install to a different folder:
$ curl -fsSL https://nakulv.com/drawer/install.sh | DRAWER_INSTALL_DIR=/usr/local/bin sh Build it with Cargo (Rust 1.88 or newer):
$ cargo install --locked --git https://github.com/nvrma/drawer Quick start
- Run
drawer. The first launch shows a short welcome tour that checks your setup. - Your machines from
~/.ssh/configare listed on the left. If you have none yet, press a to add one. - Select a machine and press Enter. If ssh asks you to confirm a new host's fingerprint or for a password, answer in the middle pane, just as you would with plain
ssh. - Press Alt+3 to jump to the machine's files. Open folders with Enter, go back with h, and press d to download to your
~/Downloadsfolder.
┍━ W E L C O M E ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ │ │ │ │ │ ┌────────────────────┐ │ │ │ ┌────────────────┐ │ │ │ │ │ ━━ │ │ ██ │ │ │ └────────────────┘ │ ▄▄▄██ ██▄▀▀ ▄▀▀▀▄ ██ ██ ▄▀▀▀▄ ██▄▀▀ │ │ ┌─┴────────────────────┴─┐ ██ ██ ██ ▄▄▄██ ██ █ ██ ██▀▀▀ ██ │ │ │ ▌ homelab │ ▀█▄▄██ ██ ▀▄▄██ ▀█▀ ▀█▀ ▀█▄▄▄ ██ │ │ │ ▌ nas │ │ │ │ ━━ │ │ │ └─┬────────────────────┬─┘ Your machines, one keystroke away. │ │ │ ┌────────────────┐ │ │ │ │ │ ━━ │ │ Pick a machine, work in its shell, │ │ │ └────────────────┘ │ and pull files down with one key. │ │ └────────────────────┘ │ │ │ │ │ │ ● ○ ○ → next esc skip │ └──────────────────────────────────────────────────────────────────────────┘
The welcome tour. Run drawer --welcome to see it again.
The screen
drawer is one screen with three panes. The pane you're in has a coloured top edge. Each machine keeps one colour everywhere it appears, so you always know which box you're looking at.
- Machines (left): every host in your ssh config, with its address and a dot for its state: green for connected, a ring while connecting, a red cross if it couldn't connect. If a background session drops, its entry says so until you look at it.
- Shell (middle): a full terminal on the selected machine. Colours,
vim,htopandtmuxall work. Switching to another machine keeps this one connected. - Files (right): the same machine's files, folders first. A downloaded file is marked with the day you took it, like a library date stamp.
Keys you can press right now are shown in yellow at the bottom of the screen. Press ? for the full list.
Keys
| Where | Key | Does |
|---|---|---|
| anywhere | Alt+1 · Alt+2 · Alt+3 | Focus machines, shell, files |
| anywhere | Alt+q | Quit |
| outside the shell | Tab · ? | Next pane · all keys |
| machines | Enter · j k | Connect or switch · move |
| machines | a · e · D | Add · edit · delete a machine |
| machines | / | Search by name or address |
| machines | K | Copy your SSH key to the machine |
| machines | x · r | Close the session · reload config |
| shell | Shift+PgUp · Shift+PgDn | Scroll back |
| files | Enter · h · ~ | Open folder · go up · go home |
| files | d then y | Download the file or folder |
| files | u | Upload a file or folder |
| files | . · r | Show hidden files · refresh |
In the shell every key goes to the remote machine except the Alt shortcuts, so Ctrl+C and Tab behave normally. drawer leaves the mouse alone, so selecting and copying text in your terminal works as usual.
Machines
drawer has no list of its own. It reads ~/.ssh/config and every file that config pulls in with Include.
A machine you add in drawer works in ssh, scp and rsync too, and the other way round.
Add a machine
Press a. Fill in a short Name and the Address. User, Port and Key file are optional. Save with Ctrl+S. The form shows which file it will write to before you save: the file that already holds most of your machines.
# what drawer writes
Host proxmox
HostName 192.168.1.11
User root Edit or delete
e edits the selected machine. Only HostName, User, Port and IdentityFile change; your comments and other settings stay exactly as they were. D deletes it, after a confirmation that names the file. Only y confirms.
Your config is safe. Every field is checked, so a value can't sneak in extra ssh options. Dotfiles that are
symlinks stay symlinks. Files are replaced in one atomic step with their permissions kept, the previous version is saved next
to them as .drawer.bak, and nothing is written if the file changed while you were editing.
Search
Press / and type part of a name or address. Enter connects to the match, Esc clears the search.
Files
The files pane opens in the machine's home folder once you're connected. It reuses the shell's connection, so there's no second login.
Download
Select a file or a folder and press d. A slip shows what will be saved and where; press y to start. A progress card shows speed and time left. Press Esc to keep working while it runs, or c to cancel.
Upload
Open the folder you want on the machine and press u. Type the path of a file or folder on your computer; Tab completes it. Press Enter to upload.
- Nothing is overwritten on either side. A second copy is saved as
name (1).ext. - Remote file names are cleaned up before they touch your disk, so a file can't escape your Downloads folder.
- Unfinished downloads stay hidden until they're complete, and a cancelled transfer removes what it started.
- Symlinks inside folders are skipped, never followed.
Passwordless login
Typing a password on every connect is slower and less safe than using an SSH key. Connect to a machine once with its password, then press K in the machines pane. drawer adds your public key to that machine over the connection that's already open. If the key is already there, nothing changes. From then on, logging in doesn't ask for a password.
Don't have a key yet? Create one first:
$ ssh-keygen -t ed25519 Security
drawer is designed so that it never has to be trusted with your secrets.
- Your own OpenSSH connects. drawer runs the
sshclient you already have, so host keys are checked againstknown_hosts. New fingerprints are shown for you to confirm, and a changed host key makes ssh refuse to connect. Keys,ssh-agent,ProxyJumpandMatchall behave exactly as they do in plain ssh, and there's no setting that skips the checks. - Passwords never touch drawer. You type them into ssh's own prompt. drawer doesn't read, store or log them.
- The shared connection is private. Its control socket lives in a folder only you can open, and the file browser runs in batch mode, so it can never prompt you.
- The remote side can't take over your terminal. Shell output is drawn by a terminal emulator inside drawer, and file names are shown with control characters replaced.
- The install is verified. The installer checks the release checksum and installs nothing on a mismatch.
Found a problem? Please report it privately; see the security policy (opens in a new tab).
Configuration
drawer has no settings file of its own. Your ssh config is the configuration. A few things can be changed from the command line:
| Option | Effect |
|---|---|
drawer --welcome | Show the welcome tour again |
drawer --version | Print the version |
DRAWER_CONFIG=file | Use another ssh config file, like ssh -F |
DRAWER_NO_ICONS=1 | Plain symbols instead of Nerd Font icons |
drawer uses your terminal's own colour palette, so it matches whatever theme you use and changes with it. Downloads go to your system's Downloads folder.
Update and uninstall
To update, run the install command again. It always fetches the latest release.
$ curl -fsSL https://nakulv.com/drawer/install.sh | sh To uninstall, delete the binary and the small marker file the welcome tour leaves behind:
$ rm ~/.local/bin/drawer
$ rm -r ~/.config/drawer Your ssh config isn't touched by uninstalling.
FAQ
Does it work with jump hosts, ssh-agent and hardware keys?
Yes. drawer runs your real ssh, so everything your config and agent support works the same way.
Where do machines I add get saved?
In the config file that already holds most of your machines, and the form shows the path before you save. If you have none yet, they go to ~/.ssh/config.d/drawer.conf when your config includes that folder, otherwise to ~/.ssh/config.
Does it run on Windows?
Not natively. drawer targets Linux and macOS; it may work inside WSL.
Can I open several machines at once?
Yes. Each machine keeps its own session; select another machine and press Enter, and the others stay connected.
Where's the source?
On GitHub (opens in a new tab), under the MIT license. Bug reports and pull requests are welcome.