FlooTransfer
An FTP/FTPS/SFTP client that lives inside VS Code. I wanted to make a better FTP/SFTP VS Code exension than what's currently out there and that had all the features I wanted.
What it does
- Remote Files tree — browse, download, rename, delete, and set permissions
(octal; SFTP always, not every FTP server) on the server.
- Local Files tree next to it, mirroring the connection's local folder.
Upload from here, or drag files between the two trees to upload/download (drop
on a folder to land them there). Dragging within one tree moves the file and
keeps the other side in sync. Folders go recursively.
- Transfer a file from anywhere — the Explorer, the editor tab, the editor
right-click menu, or a keybinding. Works on images and other binary files too,
not just text.
- Multiple connections per project — e.g.
Preview and Live pointed at the
same folder. If more than one matches you're asked which to use, then it's
cached for the session. Switch Connection on the tree flips which one is
active, and transfers auto-follow whichever connection they used.
- Activities panel (down by the Terminal) logs every transfer with progress
bars, pops open on errors, and lets you cancel something mid-transfer.
- Auto-connect — transfer something without being connected and it just asks
for credentials there and then.
Setup
Run FlooTransfer: Add Connection for This Project and it'll walk you through it,
or edit connections.json yourself:
[
{
"name": "Preview",
"protocol": "ftp",
"host": "preview.example.com",
"localRoot": "/Users/you/projects/my-site",
"remoteRoot": "/public_html"
},
{
"name": "Live",
"protocol": "sftp",
"host": "example.com",
"authMethod": "key",
"privateKeyPath": "/Users/you/.ssh/id_ed25519",
"localRoot": "/Users/you/projects/my-site",
"remoteRoot": "/var/www/my-site"
}
]
| Field |
Notes |
name |
Required. Shown when picking a connection; must be unique (it's the cache key). |
protocol |
ftp or sftp (default ftp). FTPS is ftp + "secure": true. |
host |
Required. |
port |
Default 21 for FTP, 22 for SFTP. |
secure |
FTP only — use explicit TLS. |
authMethod |
SFTP only — password (default) or key. |
privateKeyPath |
For authMethod: "key" — absolute path to the key. Passphrase asked each session, never stored. |
localRoot |
Absolute path to the local project. Leave unset to pick manually each time. |
remoteRoot |
Directory shown as the tree root. Default /. |
rememberPassword |
See below. Off by default. |
atomicUploads |
See below. Off by default. |
Then hit FlooTransfer: Connect, or just start transferring — it asks for
credentials the first time each connection is used.
Remembering a password
By default nothing is stored. Passwords stay in memory for the session
(flooTransfer.sessionDurationMinutes) and are asked for again after that. If that
gets old, set "rememberPassword": true on a connection (or say yes when the
add-connection command asks). After the next successful login the password goes
into your OS keychain and future connects skip the prompt.
Worth understanding the trade: once it's remembered, the password isn't a gate
any more. Anyone on your unlocked machine can reach that server. Same deal as
"remember me" anywhere else, which is fine if you trust the machine and lock your screen. FlooTransfer: Forget Saved Password for Connection
clears a stored one.
On Linux this needs a Secret Service provider running (most desktops have one,
headless/Remote-SSH usually don't). Without it, it quietly falls back to asking
every time.
Atomic uploads
Normally an upload writes straight to the real filename as bytes arrive, so a
file that's already live can be served half-written for a second. With atomic
uploads the file goes to a temp name first and is renamed into place once it's
fully there. A rename is instant, so the real filename only ever points at a
complete old or complete new version.
- Per connection:
"atomicUploads": true applies it to every upload on that
connection, including each file in a folder upload. Each file is safe on its
own, but a multi-file upload still swaps them in one at a time.
- Batch: for a set of files that should go live together use
FlooTransfer: Add to Atomic Upload Batch (right-click, or the keybinding on the
active tab), review the list in the Atomic Upload
Batch view, then FlooTransfer: Upload Atomic Batch. Everything uploads to temp
names and only gets renamed into place once all uploads finish, back to back.
So the "half new, half old" window is a fraction of a second instead of the
whole upload.
Caveat: not every FTP server allows renaming over an existing file. SFTP almost
always does (FlooTransfer uses posix-rename@openssh.com). If the rename fails you
get an error saying the upload succeeded and where the temp file is.
Keyboard shortcuts
| Action |
Shortcut |
| Upload |
Cmd/Ctrl+Shift+S |
| Download |
Cmd/Ctrl+Alt+D |
| Rename on remote |
Cmd/Ctrl+Alt+R |
| Delete from remote |
Cmd/Ctrl+Alt+Backspace |
| Add to atomic upload batch |
Cmd/Ctrl+Alt+B |
| Upload atomic batch |
Cmd/Ctrl+Shift+Alt+B |
Rebind them in Preferences: Open Keyboard Shortcuts if they clash with
anything.
Settings
| Setting |
Default |
Notes |
flooTransfer.sessionDurationMinutes |
60 |
Minutes an entered password stays in memory. 0 = whole session. |
flooTransfer.progressBarColor |
#007ACC |
Any CSS color. |
flooTransfer.activitiesSortOrder |
newestFirst |
newestFirst or oldestFirst. |
flooTransfer.remoteSortDirection |
ascending |
Name sort in both trees. Folders always above files. |
Limitations
- Credentials live in memory for the session only, unless you opt in to
remembering a password.
- SFTP host keys aren't checked against a known-hosts store. No prompt for an
unrecognized server.
- Downloading from the Remote Files tree needs
localRoot set on the connection.
- Atomic uploads protect each file, not a whole multi-file deploy as one instant
switch. Also the rename step isn't supported by every FTP server.