Keyboard-driven TUI browser for remote SSH/SFTP downloads
Project description
SCP Browser TUI
scp-browser-tui is a keyboard-driven terminal file browser for downloading files from remote Linux systems over SSH/SFTP. It uses Textual for the interface, Paramiko for SSH/SFTP operations, and keyring for password storage when available.
Features
- Connection screen for creating, editing, deleting, and reusing saved profiles
- Password and SSH key authentication with keyring-backed secret storage where available
- Two-pane local and remote file browser with keyboard navigation
- Live preview panel for the currently highlighted local or remote item
- File metadata display: name, type, size, modified time
- Download of files and directories
- Upload of local files and directories into the current remote folder
- Queued upload and download progress with overall progress feedback
- Safe remote rename, move, mkdir, and delete operations
- Auto-rename handling for local and remote name conflicts
- Local and remote pane filtering
- Hidden-file toggle and sort cycling
- Per-profile last visited remote path and default local download directory
Screenshots
Connection Screen
Connection Screen Variant
File Browser
Project Layout
ftransfer/
├── CHANGELOG.md
├── README.md
├── requirements.txt
├── pyproject.toml
├── ftransfer.cmd
├── ftransfer.ps1
├── examples/
│ └── profiles.example.json
└── src/
└── scp_browser/
├── __init__.py
├── __main__.py
├── app.py
├── config.py
├── download_manager.py
├── models.py
├── profile_manager.py
├── secrets.py
├── ssh_client.py
└── screens.py
Installation
- Create and activate a virtual environment.
- Install dependencies:
pip install -r requirements.txt
To install the ftransfer command:
pip install -e .
One-Command Install
Recommended with pipx:
pipx install git+https://github.com/patchharris/ftransfer.git
Fallback with pip:
pip install "scp-browser-tui @ git+https://github.com/patchharris/ftransfer.git"
Run
From the project root:
PYTHONPATH=src python -m scp_browser
Windows PowerShell:
$env:PYTHONPATH="src"
python -m scp_browser
Linux / macOS:
export PYTHONPATH=src
python -m scp_browser
After pip install -e ., you can launch it directly with:
ftransfer
From this repo folder on Windows, you can also use:
.\ftransfer.ps1
Linux example:
git clone https://github.com/patchharris/ftransfer.git
cd ftransfer
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
ftransfer
Keyboard Shortcuts
Connection screen
Tab/Shift+Tab: move between fieldsCtrl+S: save profileCtrl+N: clear form for a new profileDelete: delete selected profileF5: connect with current form valuesEnter: submit a form field and connectF1: open the in-app changelog/about screenq: quit
Connection form notes:
- Use the
Password/SSH Keytoggle buttons to choose auth mode passwordfield is also used for an SSH key passphrasekey pathis required when auth type iskey
Browser screen
Tab: switch between local and remote panesEnter: open selected directory in the active paneBackspaceorh: go to parent directory in the active panep: toggle the preview panel/: set or clear a filter for the active paner: refresh both panes.: toggle hidden filess: cycle sort orderF1: open the in-app changelog/about screenq: disconnect and return to the connection screen
Remote pane actions
Space: toggle multi-selectd: download selected items, or current item if none are markedm: create a remote directory in the current remote folderv: move the selected remote item to a new name or pathn: rename selected remote itemx: delete selected remote item
Delete confirmation:
- file delete: type
yand pressEnter - directory delete: type
deleteand pressEnter
Local pane actions
u: upload selected local file or directory into the current remote folder
Preview panel:
- Updates automatically as you move through either pane
- Shows metadata for files and directories
- Shows a small text preview for UTF-8 text files
- Marks binary files and truncated previews clearly
Profiles and Secrets
Profiles are stored as JSON in the per-user config directory:
- Linux:
~/.config/scp-browser-tui/profiles.json - Windows:
%APPDATA%\scp-browser-tui\profiles.json
Passwords are not written into profiles.json. The app stores them in the system keyring under the scp-browser-tui service name when the keyring backend is available. If keyring is unavailable, the password field remains session-only and the secret handling is isolated in src/scp_browser/secrets.py.
Example Profile File
See examples/profiles.example.json.
Notes
- The app uses SFTP for directory browsing and downloads. It does not shell out to
scp. - It targets Python 3.11+.
- The browser is now two-pane: local on the left, remote on the right.
- If a destination name already exists, uploads and downloads auto-rename rather than prompting.
- Transfers now run through a file queue and show overall progress across multi-file operations.
Future Enhancements
- Search within the current directory
- Remote folder bookmarks
- Local destination picker with bookmarks/history
- Host key verification management UI
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scp_browser_tui-0.2.1.tar.gz.
File metadata
- Download URL: scp_browser_tui-0.2.1.tar.gz
- Upload date:
- Size: 22.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
887c1b13763a8ceadc6d51bd84c1cf19dc450d8601b7d13a05156cbdefcf5ee5
|
|
| MD5 |
7c9ea29c97e02de7e2ee813d76e2e1ee
|
|
| BLAKE2b-256 |
8b9c31c6d58d7f56483c881c08c57be4171adb7ed714e6a54f41f74f5e13f17c
|
Provenance
The following attestation bundles were made for scp_browser_tui-0.2.1.tar.gz:
Publisher:
publish.yml on patchharris/ftransfer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scp_browser_tui-0.2.1.tar.gz -
Subject digest:
887c1b13763a8ceadc6d51bd84c1cf19dc450d8601b7d13a05156cbdefcf5ee5 - Sigstore transparency entry: 1191242650
- Sigstore integration time:
-
Permalink:
patchharris/ftransfer@32dc27b70c3cc0a4782eb4b4873b41e04871e11e -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/patchharris
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@32dc27b70c3cc0a4782eb4b4873b41e04871e11e -
Trigger Event:
release
-
Statement type:
File details
Details for the file scp_browser_tui-0.2.1-py3-none-any.whl.
File metadata
- Download URL: scp_browser_tui-0.2.1-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14e8e91ebc0155ebdf41f7e3a8d7b408633a269500bce8afddb334aa9b2c3c71
|
|
| MD5 |
0e8d212aa57fc3f48a63052231b45767
|
|
| BLAKE2b-256 |
d7929291d3d6ba4af1b95efe1f0d30e7d28bb4232cf9c736cc6fa49dfe5b3158
|
Provenance
The following attestation bundles were made for scp_browser_tui-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on patchharris/ftransfer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scp_browser_tui-0.2.1-py3-none-any.whl -
Subject digest:
14e8e91ebc0155ebdf41f7e3a8d7b408633a269500bce8afddb334aa9b2c3c71 - Sigstore transparency entry: 1191242664
- Sigstore integration time:
-
Permalink:
patchharris/ftransfer@32dc27b70c3cc0a4782eb4b4873b41e04871e11e -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/patchharris
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@32dc27b70c3cc0a4782eb4b4873b41e04871e11e -
Trigger Event:
release
-
Statement type: