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.

Session architecture: local, auth layer, remote server, file and sync channels

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:

  1. SSH tunnel support: jump host / bastion server connections
  2. S3 backend: treat S3 buckets as a file panel, same UX
  3. 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.