File transfers, without leaving the keyboard.

A simple, keyboard-driven TUI client for FTP, FTPS and SFTP, inspired by lazygit. If you live in the terminal and keep switching to a GUI just to move files, this is for you.

Other
Download

Binaries for Linux, macOS and Windows, x86-64 and arm64. No Go toolchain needed. For an archive, put lazyftp on your PATH. Anything else is on the releases page.

From the shell: lazyftp opens its connection dialog, SFTP, host, port, user and key are filled in, it connects, two local files are marked and uploaded, and a remote file is downloaded

From the shell to a transfer: filling in the connection dialog for SFTP, marking two local files to upload, then downloading one from the server.

One client, three protocols.

FTPDefault port 21.
FTPSDefault port 21. Certificates are verified; a self-signed one is refused.
SFTPDefault port 22.

Flags

--verboseShow the FTP control dialogue in the Log panel
--log-file <path>Write the log to a file as well
--no-nerd-fontsPlain Unicode symbols instead of Nerd Font icons
--highlight-diffMark files that differ between Local and Remote
-i, --identity <path>SFTP private key to try first
--protocol <ftp|ftps|sftp>Protocol, when the destination has no scheme
--versionPrint the version and exit

Connection failing?

Put the whole exchange in a file you can attach to an issue. Passwords are masked.

lazyftp --verbose --log-file lazyftp.log

Verbose lines are marked DEBUG. For FTP and FTPS they are the raw control dialogue; SFTP has no equivalent, so you get one line per request instead.

FTPS refused and the credentials are right? The server most likely does not offer TLS. Connect over FTP instead.

Connect your way.

From the command line

lazyftpOpens the connection dialog
lazyftp nasA favorite, or a Host from ~/.ssh/config
lazyftp ana@nas.lanuser@host: FTP unless the port or scheme says otherwise
lazyftp ana@nas.lan:22Port 22 means SFTP, 990 means FTPS
lazyftp sftp://ana@nas.lan:2222The scheme is explicit: ftp, ftps or sftp
lazyftp -i ~/.ssh/work sftp://nasA private key for this connection

A destination connects at once when nothing more is needed: a stored password, or SFTP with an agent or key. Otherwise the connection dialog opens filled in. The password is never accepted on the command line, so it stays out of your shell history: user:pass@host is refused. A saved name wins over a host of the same name. Flags go before the destination.

In the connection dialog (Ctrl+L)

ProtoFTP, FTPS or SFTP. Cycle with ← / →
Host, User, PassServer, username and password
PortLeave empty for the default: 21 for FTP and FTPS, 22 for SFTP
KeyOptional, SFTP only: path to a private key (~ works). Tried before the agent and the default keys. If it is encrypted, type its passphrase in Pass

Enter connects. Esc closes the dialog, or gives up on an attempt that is taking too long. SFTP uses the ssh-agent, key files and verified host keys, and reopens the session if the server drops it. FTPS certificates are verified, so a self-signed one is refused.

Saved connections

FavoritesCtrl+S saves host, user, port and protocol under a name. Ctrl+O lists them: Enter connects, e edits, d deletes
RecentCtrl+R lists the last ten, most recent first. Passwords are never remembered
~/.ssh/configEvery concrete Host shows up in the Ctrl+O list, tagged ssh, with its HostName, User, Port and IdentityFile. Read only. ProxyJump, ProxyCommand and Match are not supported

Passwords are never written to the config file. While saving, Tab toggles “remember password”, which stores it in the system keyring (Secret Service, Keychain or Credential Manager).

Three keystrokes to move a file.

  1. Navigate

    Move with j / k or the arrows. Enter opens a directory, - goes up.

  2. Mark

    Press Space on as many files or directories as you like for a batch transfer.

  3. Transfer

    Press t. In the local panel it uploads; in the remote panel it downloads.

Keybindings

Global

Open the connection dialogCtrl+L
Switch panel within the current groupTab
Switch between Local/Remote and Log/ProcessesShift+Tab
Upload / download marked filesU / D
DisconnectCtrl+X
Help screen?
Quitq / Q

Panels

Move downj / ↓
Move upk / ↑
Open directory, or show file size and timel / Enter
Go up one levelh / - / Backspace
Mark / unmarkSpace
Transfert
Refresh listingr
Cycle sort column / reverses / S
RenameF2
Delete (asks first)d
New directoryCtrl+N
Show hidden filesCtrl+H
Fuzzy filter/
Jump to path:

Connection dialog

Next fieldTab
Previous fieldShift+Tab
Change protocol← / →
ConnectEnter
Save / open favoritesCtrl+S / Ctrl+O
Recent connectionsCtrl+R
Close or abandonEsc

Log & Processes

Scroll downj / ↓
Scroll upk / ↑
Page upb / PgUp
Page downf / PgDn
Switch between Log and ProcessesTab

What you get

FTP, FTPS and SFTP support
SFTP with the ssh-agent, key files and verified host keys; a dropped session reopens itself
Favorites, recent connections and the servers in ~/.ssh/config; passwords only in the system keyring
Connect from the command line: lazyftp user@host, or a saved name
Dual-pane layout, local and remote side by side, responsive down to an 80x24 terminal
File size and modification date, sortable by name, size or date, with the exact byte count and full timestamp a keystroke away
Fuzzy filtering and jump-to-path
Create, rename and delete files and directories, on either panel
Hidden (dot) files hidden by default, with a per-panel toggle
--highlight-diff marks entries that differ between Local and Remote
Color themes from a file, with Catppuccin Mocha and Latte built in
Real-time transfer progress with direction indicators, including recursive directory upload and download
Multiple file selection and batch transfers, with direction-independent U / D shortcuts
Keyboard-driven navigation, vim-style and arrows
A help screen (?) and a context-aware hints bar
Scrollable transfer and connection log, and a scrollable process list

Built with Bubble Tea, Bubbles and Lip Gloss.

Colors from a file.

Pick a theme

A theme is a TOML file in a themes directory next to config.toml (~/.config/lazyftp/themes/ on Linux). Pick one by name in config.toml, without the extension, and restart. Catppuccin Mocha and Latte are built in; a file of the same name in your themes directory replaces them.

theme = "catppuccin-mocha"

Make your own

Adding a theme is adding a file, no code involved. It has a [dark] and a [light] table, used according to your terminal’s background, and each names any of the 13 tokens as #RGB or #RRGGBB. A token you leave out keeps the built-in color. default.toml lists every token and what it colors, and borland.toml is a complete example. A theme that cannot be loaded is explained on the console, and lazyftp starts with the default colors. NO_COLOR wins over any theme.

lazyftp in the catppuccin-mocha theme: dark lilac and blue panels with green progress bars
catppuccin-mocha, built in
lazyftp in the borland theme: Turbo Pascal blue background with cyan borders and yellow highlights
borland, the example theme in docs/themes

Roadmap

v0.1.2FTP connectivity and stability
v0.2.xTUI overhaul: responsive layout, sort / filter / jump, help screen
v0.3.xFile operations: rename, delete, create directories
v0.4.1Latest. Favorites, history, SSH keys, themes
v0.5.0Next. Transfer queue and permissions
v1.0.0Stable config format and key bindings

Install

go install github.com/MawCeron/lazyftp@latest
Download binary

go install

go install github.com/MawCeron/lazyftp@latest

From source

git clone https://github.com/MawCeron/lazyftp.git
cd lazyftp && go build -o lazyftp .