v0.6.0 · stable
etrans · SSH & SFTP

Your Mac on the left,
the server on the right.

etrans is an SSH and SFTP client for macOS, written in Rust and drawn with GPUI — the framework Zed is drawn with. Two panes and the transfers underneath, the way Transmit laid it out: drag between them and whole folders go across with real progress. A dropped connection comes back by itself and the transfers carry on where they stopped. A terminal on the server is one key away, and jump hosts, port forwarding and host certificates are there when you need them.

Free, every feature, no licence. macOS 11 or later on Apple silicon, signed with a Developer ID and notarized by Apple, so it opens without warnings.

deploy@web-1 via bastion
/ Users › kh › site
assets —
build —
index.html 4 KB
app.css 38 KB
app.js 210 KB
/ var › www › site
assets —
releases —
index.html 4 KB
.env 1 KB
app.css 36 KB
Transfers
↑
build31 MB of 48 MB — 12 MB/s
↓ backup.sql — done, picked up 220 MB where it stopped
Download · v0.6.0

Download for macOS

One disk image. Open it, drag etrans to Applications. The build is signed with a Developer ID and notarized by Apple, so Gatekeeper lets it through without a warning — and the checksum is beside it so you can check what you got. After that, etrans keeps itself up to date.

macOS · Apple Silicon

DMG

etrans-0.6.0-arm64.dmg

7.6 MB

sha256 38e4d14f2397ec8fa3bd2efef819b319d766ef94e06dafb0cb61af18e0c4b4e5

Apple silicon, macOS 11 or later. That is what etrans is built and tested on, so no Intel build is offered.

S.01 — What it does

Files go across,
even when the connection doesn't stay.

Every file is written to a hidden partial copy beside the real one, named for the size and date of what it is a copy of, and only takes the real one's place when it is whole. A file that fails part way is tried again from where it stopped. When the link itself goes — Wi-Fi, a sleeping lid, a server restart — etrans notices, gets it back on its own, and the transfers carry on from their partial files. Nothing that looks finished ever is not.

Two panes and the transfers underneath

This Mac on the left, the server on the right. Drag between them, drop from Finder onto the server, or send the selection across with ⇧⌘→ and ⇧⌘←. Sorting, hidden files, back and forward, path crumbs, Go to Folder, rename, new folder and delete — local deletes go to the Trash.

Finder's habits, on both sides

The space bar shows the selection in Quick Look, files on the server too (up to 64 MB, downloaded first), and the panel follows the arrow keys. ⌘C and ⌘V work between the panes and with Finder: pasted on the server it uploads, on the Mac it downloads, within one side it copies — on the server with its own cp. Drag files out to Finder and those on the server are downloaded where they land. ⌘F filters the folder, typing a name selects it, ⌥⌘N makes a new file. Nothing is ever replaced by a rename, a move or a paste, and a delete on the Mac goes to the system Trash, with Put Back.

Whole folders, with progress that is real

A folder is planned before anything moves, so the total, the speed and the time left are true from the start. Several transfers run side by side, each can be stopped, and modification times are kept. A file that is already there asks: Replace, Skip or Keep Both — once, or for the rest.

Transfers that survive interruptions

A file that fails part way is tried again from where it stopped. What is left after that is kept, and Retry — or Retry All once the connection is back — carries on from there instead of starting over. Stopping a transfer yourself deletes its partial file.

The connection comes back on its own

A link that closes is noticed in two seconds; one that goes silent, as links do across sleep, is found by a small request every sixteen. etrans gets it back with growing pauses between attempts, keeps the server pane in its folder, starts the forwards again, and stops trying when the server refuses the login or the host key.

Edit in place

Open a file on the server and it opens in its own app on your Mac. Every time you save it there, etrans uploads it again — the reason most people keep a Transmit around. When the connection drops and etrans gets it back, later saves go up over the new connection; a save made while it is down fails in the drawer, and Retry sends it once the connection is back. Before 0.5.1 every save after a reconnect failed, because the upload kept using the connection the file was opened on.

Servers, searched and grouped

Saved servers are cards under the groups you give them. The quick-connect field searches them as you type; the arrow keys choose and return connects, or connects to what you typed when nothing saved matches. Import the hosts in ~/.ssh/config and your Transmit favorites in one click — where to connect, never a password.

Every way in

The SSH agent, the keys in ~/.ssh — Choose… lists them with their type — a key file anywhere, a password, or one-time codes. Passwords and passphrases go into the login Keychain, never into a file. ~/.ssh/config aliases work as ssh reads them: HostName, User, Port, IdentityFile.

Host keys checked as OpenSSH checks them

etrans reads ~/.ssh/known_hosts the way ssh does: wildcards, ! negation, hashed names, @revoked. A first visit shows the fingerprint; a changed or revoked key refuses to connect and says which line to look at.

Host certificates

An @cert-authority line trusts a CA for the hosts it names. A certificate is asked for only when a CA covers the host, and accepted only when that CA signed it, as a host certificate, for this host, and in date. From any other CA it is only a key, checked as one.

Jump hosts

Reach a server through a bastion, or a chain of them: a saved server's name or user@host:port, or ProxyJump from ~/.ssh/config. Each hop has its own host key check and login, as ssh -J does. A bastion that refuses forwarding says so, in those words.

Port forwarding

Local (-L), remote (-R) and a SOCKS5 proxy (-D), from the tunnel sheet, the command line or LocalForward in ~/.ssh/config. A forward saved with a server starts every time it connects, and each one shows what is open through it and the bytes each way.

A terminal on the server

⌘T opens a shell in its own window — or Open in Terminal starts one in the folder you are looking at. Alacritty's emulator underneath: colours, full-screen programs, mouse selection, scrollback, bracketed paste and input methods, so æøå type as they should.

Get Info

Kind, size — a folder is counted, as Finder does — modified, where a link points, owner and group by name, and permissions as checkboxes or octal. For several items at once, or a folder and everything in it; a folder's permissions are only rewritten when you changed them.

Right-click menus that match the keys

On files, folders, empty space and server cards. Every item a pane can do is sent to the pane as the same action its key sends, and the shortcut beside it is read from the keymap — the menu and the keyboard cannot disagree.

Settings that apply at once

Light, dark or as the system; the terminal's font and size; where the local pane opens; how many transfers run together, what to do when a file is there, and how many times to try again. ⌘, and every window follows.

sftp:// links and the command line

etrans offers itself for sftp:// and ssh:// links, path included, without taking them from whatever handles them now. From a shell: etrans sftp://user@host -J bastion -L 5432:db:5432, the way ssh takes them.

Updates that check before they swap

Once a day etrans asks elyracode.com for one small file naming the newest version. Install downloads it and checks it matches its published SHA-256, is signed with etrans's Developer ID and is the version the feed named — then moves the old app aside, not over. Nothing restarts until you choose Relaunch.

No telemetry, no accounts

No analytics, no crash reporting, no sign-in. The only request etrans makes on its own behalf is that daily update check, which carries nothing about you or your servers — and it can be turned off. Servers and settings live in two JSON files on your Mac; secrets in Keychain.

S.02 — Worth knowing

SSH as ssh does it.
A window around it.

01

Your ~/.ssh is the source of truth

etrans does not keep a second list of host keys. It reads and writes the same known_hosts ssh uses, follows the same config, and takes the same -J, -L, -R and -D. A server you trust in Terminal is a server etrans trusts, and the other way round.

02

A partial file knows what it is a part of

The hidden copy a transfer writes is named for the size and modification time of its source. When the source changes, the name does too, so an interrupted copy is only ever continued with the file it started from — never stitched onto a newer one.

03

Native, drawn with Metal

No Electron and no web view. etrans is one Rust binary: GPUI draws the window with Metal, russh and russh-sftp speak SSH and SFTP, and the terminal is alacritty's emulator. The app is about 14 MB and the disk image 6.

S.03 — Price & privacy

Free.
No licence, no account, no reminder.

etrans costs nothing and asks for nothing: there is no licence key, no checkout and no sign-in. Every feature on this page is in the download.

Developed by Wirelabs AS in Norway. The About sheet (etrans → About etrans) shows the version you are running, this page, and the update status.

Sends
Nothing of its own, beyond one daily request for latest.json that carries nothing about you. Turn it off in Settings and etrans asks nothing at all.
Stores
On your Mac, and nowhere else: servers and settings in two JSON files, passwords and passphrases in the login Keychain, host keys in your own known_hosts.
Installs
Only what it has checked: the published checksum, etrans's Developer ID signature and the version. A download that fails any of them is not installed, and the strip says why.
Colophon — Get the client

Drag it across.
It gets there.

Download etrans, bring your servers over from ~/.ssh/config or Transmit, and drag a folder to the server — then close the lid halfway through and watch it carry on.

etrans · v0.6.0 Built in Norway · MMXXVI