# Ferry
A modern, native SFTP client — built on Tauri 2 and Next.js.
Ferry is a lightweight desktop SFTP client with a dual-pane file manager,
drag-and-drop transfers, and a real Rust backend talking SFTP over libssh2 —
no Electron, no bundled browser runtime.
## Features
- **Dual-pane browser** — local and remote file systems side by side, with
breadcrumb navigation, search (including inside subfolders), column sorting,
and a right-click context menu for the usual file operations.
- **Drag and drop** — drag files between panes to upload/download, or drop
files in from the OS file manager directly onto the remote pane.
- **Keyboard shortcuts** — F2 rename, Delete/Backspace delete, Cmd+A select all,
Escape clear selection, Cmd+Shift+N new folder, Enter navigate into folder,
Cmd+R refresh.
- **Transfer queue** — uploads and downloads run through a per-connection
queue with live progress, pause/resume, cancel, and a per-transfer bandwidth
sparkline.
- **Connection profiles** — save servers with name, color, and favorite
status. Passwords and key passphrases are stored in the OS keychain
(Keychain / Credential Manager / Secret Service), never in plain text.
- **Integrated text editor** — preview and edit remote or local text files
with syntax highlighting (JS/TS, Python, Rust, CSS, HTML, JSON, Markdown,
XML, and more). Edits save back over SFTP in one click.
- **File preview** — quick look at text and image files without leaving
the app.
- **Settings** — show/hide dotfiles, toggle transfer completion notifications,
switch language and theme.
- **Light and dark themes**, matching your OS by default.
## Tech stack
| Layer | Tech |
|----------|------|
| Backend | Rust, [Tauri 2](https://tauri.app), [ssh2](https://docs.rs/ssh2) (libssh2, vendored OpenSSL) |
| Frontend | [Next.js](https://nextjs.org) (App Router, static export), TypeScript |
| Styling | Tailwind CSS v4 |
| State | Zustand |
| Animation| GSAP |
| Editor | CodeMirror 6 |
## Getting started
### Prerequisites
- [pnpm](https://pnpm.io)
- [Rust](https://www.rust-lang.org/tools/install) + Cargo
- `perl` (needed to build vendored OpenSSL on first compile)
### Install
```bash
pnpm install
```
### Run in development
```bash
pnpm tauri dev # full desktop app, hot reload
```
Or, for frontend-only work without the Tauri window:
```bash
pnpm dev # Next.js dev server at localhost:3000
```
### Build a release bundle
```bash
pnpm build # Next.js static export -> ./out
pnpm tauri build # native .app/.dmg/.exe/etc.
```
### Checks
```bash
pnpm lint # eslint
npx tsc --noEmit # type-check
cd src-tauri && cargo check # Rust compile check
```
## Project structure
```
src/ Next.js frontend
components/ browser, connection, transfers, preview, editor UI
lib/ Tauri command wrappers, Zustand stores, helpers
src-tauri/src/ Rust backend
sftp/ SFTP session + commands (ssh2/libssh2)
localfs/ local filesystem commands
store/ connection profiles + keychain secrets
transfers/ upload/download queue
```
See [`CLAUDE.md`](./CLAUDE.md) for a deeper architecture walkthrough.