Skip to content

HopperShell/ferry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

90 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ferry

Secure file transfer, terminal style.

ferry-demo.mp4

Ferry is a terminal-based file transfer tool built for engineers who live in the terminal. Dual-pane file browser (local + remote) over SSH or S3, with vim-style keybindings, visual directory sync, and remote file editing — all without leaving the command line.

Features

  • Dual-pane browser — Local and remote side by side
  • Full SSH config support — ssh-agent, ProxyJump, encrypted keys, ~/.ssh/config includes
  • Visual sync/diff — Compare directories, selective push/pull
  • Remote file editing$EDITOR with shadow copy and conflict detection
  • Resumable transfers — Interrupted transfers pick up where they left off, failed transfers retry automatically
  • Transfer progress — Speed, ETA, concurrent workers
  • Overwrite protection — Confirms before overwriting existing files
  • Sortable file list — Sort by name, size, or date; selection size totals
  • S3 support — Browse and transfer files to/from Amazon S3 buckets
  • Fuzzy connection picker — Search your ~/.ssh/config hosts and S3 buckets
  • Vim keybindings — With arrow key support for the rest of us
  • rsync integration — Fast delta transfers when available

Install

From source

go install github.com/HopperShell/ferry/cmd/ferry@latest

Make sure $GOPATH/bin (usually ~/go/bin) is in your PATH. Add this to your shell rc file (~/.bashrc, ~/.zshrc, etc.):

export PATH="$HOME/go/bin:$PATH"

Then restart your shell or run source ~/.zshrc (or whichever rc file you use).

Binary releases

Download a prebuilt binary from the Releases page.

Quick Start

# Install
go install github.com/HopperShell/ferry/cmd/ferry@latest

# Connect to a host (or just run `ferry` to pick from ~/.ssh/config)
ferry myhost

Once connected you'll see two panes — local files on the left, remote on the right.

  1. Navigatej/k to move, l to open a directory, h to go back
  2. Select filesSpace to select, V for range select
  3. Copy acrossyy to yank, Tab to switch panes, p to paste
  4. Sync directoriesS to compare and selectively push/pull
  5. Edit remote filese opens in $EDITOR with conflict detection

Press ? for the full keybinding reference.

Usage

ferry                     # Launch connection picker
ferry myhost              # Connect to SSH host
ferry user@host           # Connect with explicit user
ferry user@host:port      # Connect with user and port
ferry s3://my-bucket      # Connect to S3 bucket
ferry s3://my-bucket/path # Connect to S3 bucket at prefix

Keybindings

Navigation

Key Action
j / Down Move cursor down
k / Up Move cursor up
h / Left / Backspace Go to parent directory
l / Right / Enter Open directory or file
gg Go to top
G Go to bottom
Ctrl+d Page down
Ctrl+u Page up
Tab Switch active pane
/ Search / filter
Ctrl+f Recursive find
H Toggle hidden files
s Cycle sort (name → size → date)

File Operations

Key Action
Space Toggle file selection
V Range select
yy Yank (mark for copy)
p Paste yanked files to current pane
m Move selected to current pane
dd Delete (with confirmation)
r Rename
e Edit file (remote editing if remote pane)
D Create directory

Views

Key Action
S Enter sync/diff view
M+/ Mirror push/pull (in sync view)
i Toggle file info panel
t Toggle transfer queue
? Help overlay
R Reconnect
Esc Close overlay / cancel
q / Ctrl+c Quit

S3 Support

Ferry can browse and transfer files to/from Amazon S3 buckets:

ferry s3://my-bucket           # Connect to S3 bucket
ferry s3://my-bucket/prefix    # Connect to specific prefix

Uses the standard AWS credential chain (environment variables, ~/.aws/credentials, IAM roles). S3 buckets also appear in the connection picker when AWS credentials are detected.

All features work with S3: browse, upload/download, sync/diff, rename, delete, mkdir, and remote editing.

How It Works

Ferry connects over SSH/SFTP or S3 using your existing config. Files transfer through a concurrent engine with progress tracking. For directory sync, it compares file trees by size and modification time, then lets you selectively push or pull changes — or use rsync for SSH connections.

Interrupted transfers are resumable: completed files are detected by matching size and mtime and skipped on retry. Failed transfers retry automatically (up to 2 times) to handle transient network issues. Writes use atomic temp files (.ferry-tmp → rename) so partial transfers are never mistaken for complete ones. Pasting into a directory with existing files prompts for overwrite confirmation.

ferry vs termscp

ferry termscp
Interface Dual-pane (local + remote) Single-pane with tab switching
Navigation Vim keybindings + arrows Arrow keys only
SSH config Full support (ProxyJump, agent, includes) Basic support
Directory sync Visual diff with selective transfer No
Remote editing $EDITOR with conflict detection Basic remote edit
Resume transfers Yes (skip completed files, auto-retry) No
Overwrite protection Yes (confirms before overwriting) No
rsync integration Yes No

Built With

License

MIT

About

A terminal-based dual-pane file manager for transferring files over SSH. Browse local and remote filesystems side by side with vim keybindings, sync directories, edit remote files, and transfer with resume and progress tracking — all over a single SFTP connection.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages