Every developer who works with remote servers eventually runs into the same problem: the good SFTP clients are either Windows-only, unmaintained, or commercial.
I got tired of context-switching between tools. So I built one.
openSFTP is a dual-pane SFTP client written in Python and PySide6. It’s MIT licensed, cross-platform (Linux, macOS, Windows), and has 924 tests. This is the story of how and why.
The problem with existing tools
The landscape is surprisingly barren for 2026:
- WinSCP. Still the gold standard, but Windows-only. If you live in Linux or switch between machines, you’re out.
- FileZilla. Works everywhere, but the UI hasn’t changed since 2005 and recent versions bundle adware in the installer.
- Cyberduck. Clean, but macOS/Windows only and the CLI version costs money.
- Commercial tools. Transmit, ForkLift, etc. are great but $30-50/year for something this basic feels wrong.
None of them are open source in a way that lets you actually contribute and improve them.
Why Python and PySide6?
I wanted something I could ship fast and maintain long-term. Python was the obvious choice. Paramiko handles SSH/SFTP natively, and the ecosystem is mature.
For the UI layer, PySide6 is the official Qt binding for Python. It gets you native-feeling widgets on all three platforms, GPU-accelerated rendering, and a proper event loop. The alternative would have been Electron, but a 150MB download for a file transfer client is absurd.
Architecture
The core of openSFTP is a session-based connection model. Each server connection lives in its own thread, with a paramiko SFTPClient managed by a connection pool.
The dual-pane layout mirrors tools like Midnight Commander: left panel is local, right panel is remote. Operations happen in both directions with full progress tracking.
Key components:
- Session manager: handles connect/disconnect, keepalive, reconnection on drop
- Transfer engine: chunked uploads/downloads with pause/resume support
- Sync engine: compares local and remote trees, shows diffs, runs selective sync
- Theme system: swap color schemes without restart, persists across sessions
What 924 tests actually means
When I say 924 tests, I mean real tests: unit tests for the transfer logic, integration tests against a local SFTP server (using sftpretty), and UI tests via pytest-qt.
The integration test suite spins up an actual SSH server in a Docker container and runs every operation against it: upload, download, delete, rename, chmod, sync. If something breaks, I know within seconds.
The business model
openSFTP is MIT licensed. The core is free, forever, with no restrictions.
There’s a Pro tier at $19 one-time that unlocks:
- Session groups and color tagging
- Custom keyboard shortcuts
- Priority support
The pricing is intentional. I want people to actually pay for it, which means it needs to be cheap enough that it’s not a decision. $19 is a one-time payment. No subscription, no upsell, no bullshit.
What’s next
The roadmap is public. The things I care most about:
- SSH tunnel support: jump host / bastion server connections
- S3 backend: treat S3 buckets as a file panel, same UX
- Plugin system: custom transfer hooks, post-upload scripts
If any of these matter to you, star the repo. It helps me prioritize.
Download
openSFTP is available on GitHub. MIT license, no telemetry, no bundled anything.
Pro version: renemurrell.de/software/opensftp.