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.
github.com/mylilcrowdi/opensftp
Pro version: renemurrell.de/software/opensftp.