captains-deck.com ~/guides/sftp G.03.A · 6 min read ↑ updated 2026-01-28 --:--:--
Intermediate G.03.A 6 min read Pro feature

Remote servers, local reflexes.

A remote pane behaves exactly like a local one. F5 still copies. F6 still moves. F9 still diffs. Tab still switches panes. The only difference is the wifi icon next to the path.

SFTP connection dialog showing host, user, key path, and saved connections
Cmd+K — fill in host, user, and either a password or key path. Save to Keychain.

Connecting

Press Cmd+K (or Go → Connect to SFTP Server…) and pick SFTP / SSH. Fill in:

  • Hostexample.com or IP
  • Port — defaults to 22
  • Username
  • Initial path — optional starting directory

Captain’s Deck reads ~/.ssh/config automatically — host aliases, ProxyJump, IdentityFile, all of it.

Authentication

Three modes, in order of preference:

  1. Public key~/.ssh/id_ed25519 by default; pick a different key in the dialog. Works with macOS Keychain & ssh-agent.
  2. Password — stored in your Keychain on opt-in.
  3. Keyboard-interactive — for 2FA prompts (Duo, YubiKey, Google Authenticator).
If you use 1Password’s SSH agent, Captain’s Deck picks it up automatically when SSH_AUTH_SOCK is set in your environment.

Working with remote files

Once connected, the pane header shows a coloured pill labelled SFTP followed by the host (or your saved nickname). Every keystroke works the same as on a local pane:

  • F5 copies local → remote (or remote → local — direction follows the pane layout)
  • F6 moves between any two panes — local↔remote, remote↔remote
  • F9 diffs across the network
  • F8 deletes via SFTP

The active pane’s terminal switches to an SSH session into that host.

Sync browsing

This is the WinSCP feature people miss most when they switch — and Captain’s Deck has it. Press Cmd+Option+Y (or pick View → Sync Browsing) and the panes start mirroring each other’s navigation.

What makes the implementation a bit nicer: it works on relative deltas, not absolute paths. When you toggle it on, Captain’s Deck captures both panes’ current paths as anchors. Whatever you do in one pane — cd into a subdirectory, go up, jump several levels — the same relative motion replays in the other pane.

So you can sync a local checkout at /Users/me/projects/myapp/src with the remote deploy at /var/www/myapp/src. Walk into controllers/, both sides walk into controllers/. Walk back to the project root, both sides walk back. Different absolute paths, different filesystems, doesn’t matter.

Sync browsing stops gracefully if a relative motion would walk above the other pane’s root. Toggle it off with Cmd+Option+Y again to navigate the panes independently.

Pair it with F9 (visual diff between panes) for an easy “does my local match what’s deployed?” loop without ever leaving the file manager.

Editing remote files

The fastest workflow today: copy the file to the local pane (F5), edit it locally, then copy it back. With sync browsing on the two panes stay aligned automatically, so the round-trip is just two F5s separated by however long you spend in your editor.

Auto-download + auto-upload-on-save edit-in-place is on the roadmap, not yet shipped — we don’t want to fake it in the docs.

Speed & cancellation

  • Cancel — pressing Cancel in the progress dialog actually terminates the underlying scp/ssh process and (for new files) cleans up any partial bytes on the destination.
  • Live progress — the dialog shows real bytes-transferred and transfer speed for key-auth uploads. Password-auth uses an indeterminate animation because scp’s percentage output doesn’t flow reliably through expect’s pty.
  • Server-side archive extraction — extracting a remote zip/tar/etc. runs the unpacker on the server (parallelised across multiple archives) instead of streaming bytes back to your Mac and re-uploading them.

Connection pooling, byte-accurate resume, and per-operation bandwidth caps are on the roadmap but not yet shipped — see the changelog for status.

Security

Stored credentials live in your macOS Keychain — never in plaintext on disk. Host keys follow the standard OpenSSH known_hosts contract: any change is surfaced as a blocking warning before a single byte transfers.

Tweaks

Theme
Motion