| Index | index by Group | index by Distribution | index by Vendor | index by creation date | index by Name | Mirrors | Help | Search |
| Name: termscp | Distribution: openSUSE Tumbleweed |
| Version: 1.1.1 | Vendor: openSUSE |
| Release: 1.2 | Build date: Tue Jun 9 07:09:39 2026 |
| Group: Unspecified | Build host: reproducible |
| Size: 37227608 | Source RPM: termscp-1.1.1-1.2.src.rpm |
| Packager: http://bugs.opensuse.org | |
| Url: https://github.com/veeso/termscp | |
| Summary: Feature rich terminal UI file transfer and explorer | |
Termscp is a feature rich terminal file transfer and explorer, with support for SCP/SFTP/FTP/Kube/S3/WebDAV. So basically is a terminal utility with an TUI to connect to a remote server to retrieve and upload files and to interact with the local file system. It is Linux, MacOS, FreeBSD, NetBSD and Windows compatible.
MIT
* Tue Jun 09 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- Update to version 1.1.1:
* Fixed
- build: drop vergen-git2 build dependency
vergen-git2 reads git metadata at build time, but the
crates.io source tarball ships no .git, so the published
1.1.0 fails on cargo install. crates.io versions are
immutable (no overwrite) and Chocolatey's moderation queue
blocks a fast re-push, so a clean 1.1.1 without vergen is the
only fix.
- Update to version 1.1.0:
* Added
- new website
- install: add Windows PowerShell installer and copy buttons on site
Add install.ps1 mirroring install.sh for Windows: arch
detection, release zip download, binary extraction, user PATH
update.
- copy install.ps1 to site public/ at build time
(copy-install.mjs)
- serve /install.ps1 with text/plain Content-Type
(vercel.json)
- add PowerShell one-liner to install page and README
- bump install.ps1 default version in bump_version.sh
- add CopyButton component next to every install command line
- config: move config dir to ~/.config/termscp on macOS and
%USERPROFILE%.termscp on Windows
Resolve the config directory through a single per-platform
config_dir() function instead of relying on dirs::config_dir
everywhere:
- macOS: ~/.config/termscp (was ~/Library/Application
Support/termscp)
- Windows: %USERPROFILE%.termscp (was roaming
%APPDATA%\termscp)
- Linux/other: /termscp (unchanged)
Existing users are migrated automatically on first run: when
the new directory is absent and the legacy location exists,
the whole config directory is moved to the new path. The
cache directory stays at the platform-native location.
* Changed
- site: type-safe i18n keys derived from en
- site: drop in-site manual, link to external docs.termscp.rs
- site: english-only, remove i18n machinery
* Fixed
- install: quote vars, fix set -e cargo check and rustup tmpfile cleanup
- silence SC3043 by declaring dash dialect (local is
supported)
- quote unquoted vars (SC2086/SC1090)
- fix set -e aborting arch install before cargo check
- fix install_cargo removing unset $archive instead of
$rustup
- make brew upgrade fallback a real if-then-else (SC2015)
- drop leftover starship BASE_URL and debug echo $1
- progress: rework transfer progress panel (#424)
Migrate the transfer progress UI to tuirealm 4, where the
stdlib ProgressBar widget was dropped, by rebuilding the
dual-bar panel on top of Gauge.
- Restore the unified two-bar look: the full bar (top) and
partial bar (bottom) draw joined borders so they read as a
single panel; a single file shows one fully-bordered bar.
- Redraw on every file boundary in the send/recv queue loops
so the full bar's (N/total) counter advances even for small
files that finish within one in-loop redraw interval.
- Track progress with a single TransferProgress (exact file
count from the pre-scan, lazy partial/full computation) and
consolidate the theme progress-bar fields.
- progress: equalize dual progress bar heights
The bottom (partial) bar carried a block title (the current
filename), which forces a 1-row top inset in ratatui's
Block::inner even though its top border is dropped to join
the seam with the full bar. That left the partial bar with
one inner row while the full bar kept two, so the two gauges
rendered at unequal heights.
- Move the filename from the partial bar's title into its
gauge label.
- Skip setting an empty title so no phantom top-positioned
title triggers the inset.
- Put the panel title on the top (full) bar for multi-file
transfers.
- Bump the two-bar popup height to fit the joined panel.
Also bump Cargo.lock and adapt the embedded terminal to the
new vt100 screen_mut() API.
- copy: prevent emptying file when copy destination is empty
(#421)
An empty copy destination resolved to the source file's own
path, so std::fs::copy truncated the original file to 0
bytes.
- localhost::copy now refuses to copy a file onto itself,
returning an error instead of truncating it (root cause).
- action_copy treats an empty/whitespace destination as a
cancel.
- transfer: enqueue full destination path instead of directory
Queued transfers stored only the destination directory as the
target path. Downstream upload logic treats the queued
destination as the full file path and passes it straight to
create_file, so transfers failed with a Failure error when
the remote target resolved to a directory. Append each
entry's file name to the destination directory at enqueue
time in both enqueue_file and enqueue_all, matching the
single-file transfer path which already builds the full
target path.
* Mon Apr 20 2026 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- Update to version 1.0.0:
* Added
- rework TransferProgress to track bytes with lazy estimation
- replace dual progress bar components with single TransferProgressBar
- simplify progress bar layout to single component
- update progress bar display for new unified data model
- update transfer loop to use unified TransferProgress
- consolidate theme progress bar fields into single transfer_progress_bar
* CI
- Codeberg mirroring
- run test workflows once
- check fmt with nightly toolchain
- add linux and windows aarch64 build targets
* Changed
- FileTransferActivity pane-agnostic dispatch (#386)
Comprehensive design for incremental refactoring of the
13k-line FileTransferActivity god-struct using a unified Pane
abstraction. Detailed step-by-step plan covering 6 phases:
split monoliths, error handling, Pane struct, action dedup,
session split, view reorg. Extract 26 popup components from
the monolithic 1,868-line popups.rs into 20 individual files
under popups/. Each file contains one or two related
components with their own imports. The popups.rs module file
now contains only module declarations and re-exports.
Replace 8 panic!() calls with error!() logging and early
returns/fallthrough. These panics documented invariants
(e.g. "this tab can't do X") but would crash the app if
somehow triggered. Error logging is safer and more resilient.
Replace raw FileExplorer fields in Browser with Pane structs
that bundle the explorer and connected state. Move
host_bridge_connected and remote_connected from
FileTransferActivity into the panes. Add navigation API
(fs_pane, opposite_pane, is_find_tab) for future unification
tasks. Rename private get_selected_file to
get_selected_file_by_id and add three new unified methods
(get_selected_entries, get_selected_file, is_selected_one)
that dispatch based on self.browser.tab(). Old per-tab
methods are kept for now until their callers are migrated in
subsequent tasks. Collapse local/remote action method pairs
(mkdir, delete, symlink, chmod, rename, copy) into unified
methods that branch internally on is_local_tab(). This halves
the number of action methods and simplifies the update.rs
dispatch logic. Also unifies ShowFileInfoPopup and
ShowChmodPopup dispatching to use get_selected_entries().
Move host_bridge and client filesystem fields from
FileTransferActivity into the Pane struct, enabling
tab-agnostic dispatch via fs_pane()/ fs_pane_mut(). This
eliminates most is_local_tab() branching across 15+ action
files.
Key changes:
- Add fs: Box<dyn HostBridge> to Pane, remove from
FileTransferActivity
- Replace per-side method pairs with unified pane-dispatched
methods
- Unify navigation (changedir, reload, scan, file_exists,
has_file_changed)
- Replace 147-line popup if/else chain with data-driven
priority table
- Replace assert!/panic!/unreachable! with proper error
handling
- Fix typo "filetransfer_activiy" across ~29 files
- Add unit tests for Pane
Net result: -473 lines, single code path for most file
operations.
- replace lazy_static with std::sync::LazyLock
- migrate from mod.rs to named module files
- split parser internals into focused modules
- split auth form components by protocol
- split auth update handlers by context
- split auth view helpers by responsibility
* Documentation
- date
- add core module and API documentation
- document core host and ssh modules
- document parser and file transfer params
- complete remaining core module docs
- document ssh key storage API
* Fixed
- replace panics reachable from user input with proper error
handling
- replace assert! calls in UI activities with graceful error
handling
- correct typos in BadSytax and theme_provider log messages
- replace magic-crypt with aes-gcm for bookmark encryption
- magic-crypt has known vulnerabilities. Replace it with
aes-gcm for new
- encryption (authenticated, with random nonces) while
keeping a legacy
- AES-128-CBC decryption path to transparently handle
existing bookmarks.
- replace recursive byte-counting with entry-based transfer
progress (#395)
- fix: replace recursive byte-counting with entry-based transfer progress
Replace the expensive recursive get_total_transfer_size
pre-calculation with a lightweight entry-based counter
(TransferProgress) for the overall progress bar. This
avoids deep list_dir traversals before transfers begin,
which could cause FTP idle-timeout disconnections on large
directory trees.
The per-file byte-level progress bar (ProgressStates)
remains unchanged. Bytes are still tracked via
TransferStates::add_bytes for notification threshold logic.
- return after empty terminal prompt
- resolve . and .. in terminal cd and prevent panic in path
elide
absolutize now lexically normalizes paths so cd ..
navigates to the parent directory instead of appending ..
literally. Also guard against file_name() returning None in
fmt_path_elide_ex, which caused a panic on paths containing
unresolved .. components.
- pass full command string to exec, not just the first word
The Exec arm of Command::from_str only captured the first
whitespace-delimited token, silently dropping all
arguments. Now passes the entire input string so e.g. ls
- la /tmp works.
- sync browsing when entering a directory from filtered/fuzzy
view stabilize core error handling
- Remove production panic and unwrap paths from core modules.
- Propagate bookmark encryption failures, harden file watcher
and temp mapped file handling, and clean up dead code in
shared utilities.
- normalize localhost relative path checks
- use time-based redraw interval instead of progress-delta
threshold
The old 1% progress threshold caused the UI to appear frozen
on large files (e.g. 1GB) because many read/write iterations
passed between redraws. Switching to a 100ms time-based
interval ensures consistent UI responsiveness regardless of
file size.
- render progress bar immediately after mounting
Call self.view() right after mount_progress_bar() at all 6
call sites so the bar is visible on screen before the
transfer loop begins.
- filter self-references and dot entries from remote directory
listings
Some non-compliant FTP servers (e.g. LiteSpeed) include a
self-reference to the listed directory in the LIST response,
causing the current folder to appear as a duplicate entry in
the explorer.
* Miscellaneous
- Use apt to install termscp on debian base to prevent broken
deps
- Copilot is so dumb
- Install with apt if installed
- WTF CTRL SAVE DOESNT FUCKING WORK
- funding
- add centralized lint configuration to Cargo.toml
- 1.0.0 version into manifests
- format toml
- add fmt+clippy convention to CLAUDE.md and apply nightly fmt
- enable safe clippy pedantic lints
* Performance
- use sort_by_cached_key to avoid repeated lowercase
allocations in file sorting
* Testing
- add parser and bookmark regression coverage
- extend config and explorer regression coverage
- extend system regression coverage
* Build
- removed hostname, use whoami instead
- whoami provides hostname function, so we don't need the
hostname dependency, since whoami is also being used for
getting the username
- replaced libssh with russh for remotefs-ssh
- replace version-compare crate with semver
- remotefs-ssh 0.8.1
- remotefs-ssh 0.8.2
- this version removes any usage of sh commands from the sftp
backend and only uses pure protocol functions
- migrate to tui-realm 4.0
- Upgrade tuirealm (3.x -> 4.0.0), tui-realm-stdlib (3 -> 4),
tui-term (0.2 -> 0.3). Apply all breaking changes from the
4.0 migration guide across the termscp UI.
Key changes:
- Root-level re-exports removed; imports moved to
module-qualified paths (tuirealm::application,
::component, ::event, ::props, ::state, ::subscription,
::listener, ::ratatui). Same for stdlib component types
(tui_realm_stdlib::components::*).
- MockComponent trait renamed to Component; old Component
trait renamed to AppComponent. #[derive(MockComponent)]
is now #[derive(Component)]. Component::on now takes
&Event<_>.
- TextSpan replaced with SpanStatic/LineStatic/TextStatic
(ratatui-based); tuple (String, Alignment) titles
replaced with the new Title builder; Alignment split into
- HorizontalAlignment/VerticalAlignment; stdlib components
use .alignment_horizontal instead of .alignment.
- State::One/PropPayload::One -> Single. CmdResult::None ->
NoChange. Props::get_or removed; Props::get now returns a
borrowed Option<&AttrValue> (call sites switched to
.and_then(AttrValue::as_*)). Component::query returns
Option<QueryResult<'a>>.
- Attribute::HighlightedColor -> HighlightStyle (a full
Style). .highlighted_* helpers renamed to .highlight_*.
- PollStrategy::UpTo(n) now requires a Duration; tick
timeout moved from EventListenerCfg::poll_timeout into
PollStrategy.
- TerminalBridge removed; Context now holds
CrosstermTerminalAdapter directly and enables raw mode +
alternate screen explicitly. The TerminalAdapter trait is
imported where its methods are used.
- Update trait removed; activity update methods are plain
inherent functions.
- ProgressBar replaced by stdlib Gauge. Paragraph .wrap
renamed to .wrap_trim; .text now takes an Into<Text>.
Stdlib List row items are now individual lines (Vec<Span>
per row) rather than a Table of spans; custom
FileList/Log convert between the two models.
- Radio builders drop .foreground(color) so unselected
items render with the terminal default foreground, and
set
highlight_style(Style::default().fg(color).add_modifier(REVERSED))
so the selected entry is visibly highlighted only with
the theme color.
- Custom FileList keeps the selected row highlighted with
the full highlight style when focused and falls back to a
foreground-only style when unfocused.
- Theme loading is now backwards compatible: Theme uses a
custom Deserialize through an intermediate ThemeFile with
optional fields, so missing keys, unknown values or
legacy aliases (transfer_progress_bar_full/_partial) fall
back to defaults on a per-field basis instead of failing
the whole load.
- upgrade remotefs-ssh to 0.8.3
* Sun Dec 21 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- Update to version 0.19.1:
* fix: Updated dependencies to allow build on NetBSD
* Wed Nov 12 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- Update to version 0.19.0:
- Issue 297: Added <CTRL+S> keybinding to get the total size of
selected paths.
- Issue 331: Added new import-ssh-hosts CLI subcommand to
import all the hosts from the ssh config as bookmarks.
- Issue 335: Changed file overwrite behaviour
- Now the user can choose for each file whether to overwrite,
skip or overwrite all/skip all.
- Issue 354:
- Removed error popup message if failed to check for updates.
- Prevent long timeouts when checking for updates if the
network is down or the DNS is not working.
- Issue 356: Fixed SSH auth issue not trying with the password
if any RSA key was found.
- Issue 334: SMB support for MacOS with vendored build of
libsmbclient.
- Issue 337: Migrated to libssh.org on Linux and MacOS for
better ssh agent support.
- Issue 361: Report a message while calculating total size of
files to transfer.
* Wed Jun 11 2025 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- Update to version 0.18.0:
* An Embedded shell for termscp:
- Issue 340: Replaced the Exec popup with a fully functional
terminal emulator embedded thanks to A-Kenji's tui-term.
- Command History
- Support for cd and exit commands as well.
- Exit just closes the terminal emulator.
* Issue 345: Default keys are used from ~/.ssh directory if no
keys are resolved for the host.
* Updated dependencies and updated the Rust edition to 2024
* Sun Mar 23 2025 opensuse_buildservice@ojkastl.de
- Update to version 0.17.0:
* Queuing transfers:
- the logic of selecting files has been extended!
- From now on selecting file will put the files into a transfer
queue, which is shown on the bottom panel.
- When a file is selected the file is added to the queue with a
destination path, which is the current other explorer path at
the moment of selection.
- It is possible to navigate to the transfer queue by using P
and pressing ENTER or DELETE on a file will remove it from
the transfer queue.
- Other commands will work as well on the transfer queue, like
COPY, MOVE, DELETE, RENAME.
* issue 308: added --wno-keyring flag to disable keyring
* issue 316: Local directory path is not switching to what's
specified in the bookmark. Now the local directory path is
correctly set following this hierarchy:
- Local directory path specified for the host bridge
- Local directory path specified in the bookmark
- Working directory
* issue 317: the return value of --version should be 0
* issue 319: fixed a crash when the local directory specified in
the auth form does not exist
* issue 327: fixed a panic when trying to go up from local
directory on localhost in the auth form
* issue 330: add suppaftp/pavao/kube to allowed logs
* Dependencies:
- argh to 0.1.13
- bytesize to 2
- dirs to 6
- magic-crypt to 4
- notify to 8
- ssh2-config to 0.4
- remotefs-ssh to 0.6
- rust edition to 2024
- drop patches that were included upstream
* 7dba691ccc001aa720d0ecf1642dda94219a2d21.patch
* 099e2154bae9a954aab0569bf048c4d9ae71049e.patch
* Wed Nov 13 2024 opensuse_buildservice@ojkastl.de
- Update to version 0.16.1:
* fix: 0.16.1
* fix: gg rust 1.82 for introducing a nice breaking change in
config which was not mentioned in changelog
* fix: cfg unix forbidden in rust .82
- add patches to fix build issues:
* 099e2154bae9a954aab0569bf048c4d9ae71049e.patch
* 7dba691ccc001aa720d0ecf1642dda94219a2d21.patch
* Tue Oct 15 2024 opensuse_buildservice@ojkastl.de
- Update to version 0.16.0:
* fix: tiny ui issue
* fix: 0.16
* feat: Show `..` directory before all the others in the explorer
to navigate to the parent dir (#301)
* fix: issue 292 New version alert was not displayed due to a
semver regex issue. (#300)
* fix: tuirealm 2.x (#299)
* fix: users from lock
* fix: vergen (#296)
* fix: Use `uzers` instead of the dead package `users` which has
several vulnerabilities (#295)
* 285 feature request multi host (#293)
* feat: version 0.16
* Fri Oct 04 2024 opensuse_buildservice@ojkastl.de
- Update to version 0.15.0:
* fix: include build.rs
* fix: readme
* fix: ci
* fix: github ci is stable and reliable (one worker broken each 2
weeks)
* fix: set date
* 280 feature request go to path auto completion (#287)
* fix: `isolated-tests` feature to run tests for releasing on
distributions which run in isolated environments (#286)
* feat: it is now possible to cancel find command; show find
progress (#284)
* 249 feature request better search results (#282)
* fix: popup texts
* fix: issue 277 Fix a bug in the configuration page, which
caused being stuck if the added SSH key was empty
* fix: don't clear screen after terminating termscp
* feat: Pods and container explorer for Kube protocol (#281)
* fix: bump vers
* fix: notify 6
* fix: keyring test not passing macos
* fix: bump vers
* feat: init 0.15
* fix: dbus deveL
* fix: tokio rt builder
- drop patch dfe58e6147f66b4c0c74874c954e7d101b3bf026.patch
* Mon Jul 22 2024 opensuse_buildservice@ojkastl.de
- add patch dfe58e6147f66b4c0c74874c954e7d101b3bf026.patch to fix
build errors due to tokio rt builder
https://github.com/veeso/termscp/commit/dfe58e6147f66b4c0c74874c954e7d101b3bf026
* Fri Jul 19 2024 Johannes Kastl <opensuse_buildservice@ojkastl.de>
- new package termscp: feature rich terminal UI file transfer and
explorer with support for SCP/SFTP/FTP/S3/SMB
/usr/bin/termscp
Generated by rpm2html 1.8.1
Fabrice Bellet, Sun Aug 2 05:00:51 2026