A commander-style SFTP client for GNOME — a WinSCP for Linux.
Free and open source. Built for people switching from Windows to Linux.
LinuxSCP is a native GTK4 / libadwaita SFTP client with a dual-pane, keyboard-driven
"commander" layout. It works directly with your ~/.ssh/config — the same aliases,
jump hosts, keys, and agents you already use on the command line — because it drives the
system OpenSSH binary under the hood. It also handles sudo / su - elevation so you
can manage root-owned files, and every transfer is resumable.
No GitHub account or command line needed on Debian, Ubuntu, Linux Mint, Pop!_OS and other Debian-based distributions:
-
Download the package for your computer: x86-64 (most desktops and laptops) or ARM64 (Raspberry Pi and ARM laptops). Not sure? It's almost certainly x86-64.
-
Open the downloaded
.debfile — double-clicking it in your file manager opens the software installer; click Install. Or from a terminal:sudo apt install ~/Downloads/linuxscp_amd64.deb -
Launch LinuxSCP from your applications menu. Updates arrive the same way: download the new
.deband install it over the old one.
The packages work on Debian 13 "Trixie", Ubuntu 24.04 LTS and newer (anything with GTK4 ≥ 4.12 and libadwaita ≥ 1.5). Every release also carries SHA-256 checksums on the releases page.
On other distributions, install the Flatpak or build from source.
- Dual-pane commander UI — local on one side, remote on the other,
Tabto switch, and a..row at the top of each pane to go up a directory. - Tabbed sessions — open as many connections as you like, WinSCP-style: each tab is a full dual-pane session, and the "New Session" button next to the tabs spawns the next one.
- Site manager with folders — organize saved connections in a nested folder tree
(WinSCP-style), created and edited entirely in-app:
~/.ssh/confighosts on the left, saved sites in the middle, and the selected site's details edited inline on the right, with a new site appearing in the list as you type its name. A search box filters the folder tree, the saved sites, and the~/.ssh/confighosts together; sites and whole folders can be dragged between folders. Set the username, override the port, choose password or PEM-key authentication, pick the elevation mode and a landing directory per site. Passwords and key passphrases are stored in the OS keyring (Secret Service / gnome-keyring), never in plain text. - Zero-config connections too — still reads
~/.ssh/config(aliases,ProxyJump,ControlMaster,IdentityFile, agent and FIDO/hardware keys) by using your realssh— and the config file itself can be edited right inside the site manager. - Root file management — connect and elevate with
sudoorsu -, WinSCP-style, without changing anything insshd_config. - Robust transfers — a queue with live progress, speed and ETA; pause, resume and cancel; recursive directory copies; conflict prompts (overwrite / resume / skip). Scanning and copying run in parallel and several files are in flight at once, so large trees start transferring immediately and folders full of small files aren't bottlenecked by per-file round trips.
- Resume across disconnects — interrupted files are staged as
.filepartand continued from their offset on the next try. - Full file management — create folders, rename, delete (recursive), new symlinks, and a right-click context menu with clipboard copy / cut / paste ("Copy to…" and "Move to…" included). A WinSCP-style Properties dialog shows size and disk usage and edits permissions, owner and group — recursively when asked. Remote owners are shown by name, and drag and drop works between panes.
- Transfer notifications — when a transfer finishes, LinuxSCP plays a success chime and posts a GNOME desktop notification. Both are independently toggleable in Preferences.
- Quality of life — splash screen, "open terminal here" (local shell or
sshinto the host), reconnect on drop, and remembered preferences.
Open the Site Manager (the server button in either pane's header, or automatically at launch). From there you can:
- Build a folder tree and drop sites into it; folders nest arbitrarily, and both sites and whole folders can be dragged to reorganize (the Delete key removes whatever is selected).
- Create a site with an explicit host, port, and username — it appears in the site list immediately and is edited in the details panel on the right, WinSCP-style.
- Search across everything at once: saved sites, folders, and
~/.ssh/confighosts. - Edit
~/.ssh/configin-app; the host list reloads on save. - Choose how to authenticate:
- SSH agent / default keys — defer to your agent and
~/.ssh/config(the default). - Password — typed each time, or saved to the keyring and auto-filled.
- Key file (PEM) — pick a private key; an optional passphrase can be saved too.
- SSH agent / default keys — defer to your agent and
- Set a per-site elevation mode (
sudo/su -) and a remote directory to open in.
Secrets live in the OS keyring keyed by an opaque site id; settings.json only records
whether a secret exists, never its value.
| Key | Action | Key | Action |
|---|---|---|---|
Tab |
Switch active pane | F5 |
Copy to other pane |
Enter |
Open directory | F6 |
Move to other pane |
Backspace |
Parent directory | F7 |
New directory |
F2 |
Rename | F8 / Del |
Delete |
F9 |
Properties (permissions, owner, group) | Ctrl+H |
Toggle hidden files |
Ctrl+C / Ctrl+X |
Copy / cut selection | Ctrl+V |
Paste |
Ctrl+R |
Refresh | Ctrl+L |
Edit path |
Ctrl+T |
Open terminal here | Right click | Context menu |
LinuxSCP does not reimplement SSH. Instead it spawns your system ssh and speaks the SFTP
protocol over its pipes:
- Normal connections run
ssh -s <host> sftp— the SFTP subsystem, exactly like thesftpcommand. - Elevated connections allocate a remote PTY, drive the
sudo/supassword prompt, put the PTY into raw mode, and thenexec sftp-server. From that point the PTY carries the binary SFTP protocol as root. - Prompts (passwords, key passphrases, host-key confirmations) are routed from OpenSSH
back into GTK dialogs through a small
SSH_ASKPASShelper and a private unix socket.
flowchart LR
UI["GTK4 UI (main thread)"] <--> Session["Session actors (tokio)"]
Session --> Sftp["russh-sftp client"]
Sftp --> Ssh["ssh (system OpenSSH)"]
Ssh --> Askpass["linuxscp-askpass"]
Askpass --> UI
You need a Rust toolchain and the GTK4 / libadwaita development packages.
# Debian / Ubuntu
sudo apt install libgtk-4-dev libadwaita-1-dev build-essential
# Fedora
sudo dnf install gtk4-devel libadwaita-devel
# Arch
sudo pacman -S gtk4 libadwaita
# Then build the app and askpass helper, then run
cargo build --workspace
cargo run -p linuxscpInstall system-wide (binary, desktop file, icon, metainfo):
sudo make installThe prebuilt packages in the Install section are built on Ubuntu 24.04 by CI.
To build one locally from a release build (no debhelper needed, just dpkg-deb):
make deb # or: ./scripts/build-deb.shThis produces target/deb/linuxscp_<version>_<arch>.deb with the binaries, the
desktop entry, AppStream metainfo, and the app icon rendered at every hicolor
size (16–512 px). Library dependencies are computed automatically with
dpkg-shlibdeps, and openssh-client is added since LinuxSCP drives the system
ssh. Install it with:
sudo apt install ./target/deb/linuxscp_*_amd64.deb # resolves dependencies
# or
sudo dpkg -i ./target/deb/linuxscp_*_amd64.debThe package's postinst refreshes the icon cache and desktop database, so the
penguin icon and "LinuxSCP" launcher show up in the app grid immediately.
flatpak-builder --user --install build build-aux/io.github.theflyingjay.LinuxSCP.jsonThe Flatpak reaches the host's ssh, keys and agent via the host portal, so your
~/.ssh/config continues to work inside the sandbox.
The build runs offline: build-aux/cargo-sources.json pins every crate from
Cargo.lock so flatpak-builder can fetch them up front. After changing
dependencies, run make flatpak-sources to regenerate it — CI fails if it's stale.
Unit tests run anywhere. The end-to-end SFTP tests use a throwaway local sshd:
cargo test # unit tests
./scripts/test-server.sh start # local sshd on 127.0.0.1:2299
cargo test -p linuxscp --test sftp_roundtrip -- --ignored
./scripts/test-server.sh stopscripts/test-server.sh run starts the test server and launches the app pointed at it
(host alias testbox; the fake su password is secret123).
Pull requests are welcome. main only accepts changes through a pull request with a
green CI run, and CI is strict, so run the same checks locally before pushing:
cargo fmt --all
cargo clippy --all-targets -- -D warnings
cargo test --all-targetscargo test --lib alone does not compile the integration tests under linuxscp/tests/,
so signature changes are easy to miss without --all-targets. Changes to Cargo.lock,
linuxscp/src/ssh/, or the CI and release workflows get extra scrutiny; please explain
them in the PR description.
GPL-3.0-or-later. See LICENSE. Free for everyone, forever.

