Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
225ae7e
feat(sftp): drag files between panes and show file times
Sep 30, 2026
3faaaf7
docs(changelog): note sftp drag and drop and file times
Sep 30, 2026
cafdd09
feat(sftp): transfer folders recursively by drag and drop
Oct 1, 2026
4a2d2aa
docs(changelog): note folder drag and drop
Oct 1, 2026
c2b45c7
refactor(sftp): drop the created time and stat_local_paths
timhartmann7 Oct 1, 2026
d576e8d
fix(core): keep folder downloads inside the destination
timhartmann7 Oct 1, 2026
1635d21
fix(core): skip and report what a folder transfer leaves out
timhartmann7 Oct 1, 2026
ce7f29e
feat(core): cancel a running transfer
timhartmann7 Oct 1, 2026
6211298
fix(core): keep permission bits on transfer
timhartmann7 Oct 1, 2026
61c834d
feat(core): tick progress once a transfer has been planned
timhartmann7 Oct 1, 2026
6f6a502
docs(gui): say that transfers take folders
timhartmann7 Oct 1, 2026
49c1e46
feat(gui): cancel a tab's transfer with sftp_cancel
timhartmann7 Oct 1, 2026
dae9c3f
docs(gui): the transfer wrappers take folders too
timhartmann7 Oct 1, 2026
7c8088e
feat(gui): cancel a transfer from its progress strip
timhartmann7 Oct 1, 2026
1fa9942
feat(gui): show a transfer as preparing until its first tick
timhartmann7 Oct 1, 2026
5f59848
fix(gui): show a pane loading while its listing waits on a transfer
timhartmann7 Oct 1, 2026
e7308ab
refactor(gui): drop markedTransferable, which filtered nothing
timhartmann7 Oct 1, 2026
f8f0397
fix(gui): keep a pane drag to the active tab and off stray clicks
timhartmann7 Oct 1, 2026
4dad18a
fix(gui): read OS drop positions in each webview's own pixels
timhartmann7 Oct 1, 2026
b74659f
feat(gui): ask before a transfer replaces what is already there
timhartmann7 Oct 1, 2026
9d73e1d
fix(gui): keep file dates on one line
timhartmann7 Oct 1, 2026
5acff7f
test(gui): closing a tab mid-transfer closes its session
timhartmann7 Oct 1, 2026
68f2ef5
fix(gui): scale OS drops by the window when WebKitGTK renders at 1x
timhartmann7 Oct 2, 2026
c342d94
fix(gui): keep a batch's real error when the rest is cancelled
timhartmann7 Oct 2, 2026
9db31c3
fix(gui): let a local folder opened mid-transfer finish listing
timhartmann7 Oct 2, 2026
c0f3216
fix(gui): drop a Replace prompt when its tab is hidden
timhartmann7 Oct 2, 2026
74db503
fix(tui): line up file dates on folder rows and wide names
timhartmann7 Oct 2, 2026
455e170
fix(tui): report a paste's failure after the rest of it lands
timhartmann7 Oct 2, 2026
ac7cbeb
fix(tui): refuse a paste while no host is connected
timhartmann7 Oct 2, 2026
7fb589d
fix(tui): send a batch of SFTP operations one at a time
timhartmann7 Oct 2, 2026
1df8661
feat(tui): cancel a running transfer with Esc
timhartmann7 Oct 2, 2026
11aaa23
docs(changelog): note folder transfers, pane drag and file dates
timhartmann7 Oct 2, 2026
7c0d683
fix(core): let the next transfer replace a read-only copy
timhartmann7 Oct 2, 2026
d979eb8
fix(core): count a folder a server will not chmod as created
timhartmann7 Oct 2, 2026
fb9eba8
fix(core): refuse a download whose own name splits on Windows
timhartmann7 Oct 2, 2026
9c03d70
fix(core): stop a transfer stuck in a listing that never ends
timhartmann7 Oct 2, 2026
387fedd
fix(core): spare a local file a cancel reaches before its first byte
timhartmann7 Oct 2, 2026
4c1de70
fix(core): keep a server's made-up sizes from overflowing the total
timhartmann7 Oct 2, 2026
b5b86a5
fix(tui): keep the transfer gauge at 100% when a file grows
timhartmann7 Oct 2, 2026
6509404
fix(gui): refuse a listed name that is not one plain name
timhartmann7 Oct 2, 2026
1c18bcf
fix(gui): refuse two items that would land on one name
timhartmann7 Oct 2, 2026
f7fe939
fix(gui): ask before replacing a name macOS spells another way
timhartmann7 Oct 2, 2026
4b71c5a
fix(gui): refuse a dropped share or volume root like a drive
timhartmann7 Oct 2, 2026
58b73d4
fix(core): stop a stalled transfer at once and drop its partial file
timhartmann7 Oct 2, 2026
f5b0a35
Merge branch 'main' into feat-drag-n-drop-sftp
timhartmann7 Oct 8, 2026
024ada2
Merge branch 'main' into feat-drag-n-drop-sftp
timhartmann7 Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ Versions follow [Semantic Versioning](https://semver.org/).
### Features
- **Settings shows the installed version.** On Windows and Linux the desktop app showed its version nowhere. Settings now ends with it, and it can be copied into a bug report.
- **Group and arrange hosts on the dashboard.** With many hosts the dashboard was one long grid in config order. Both apps now group it with `g`: each host goes under its first tag, untagged hosts last. In the desktop app, View options also sorts the cards by name or status, sections fold from their header, and a card's handle drags it, or moves it with the arrow keys, into an order of your own that is kept across restarts.
- **Drag files and folders between the SFTP panes, or onto the remote pane from your file manager.** In the desktop app, dragging a row to the other pane uploads or downloads it into the folder row it is dropped on, or else into the folder on show, and dragging a ticked row takes every ticked row along. Files and folders dropped from Explorer, Finder or a Linux file manager onto the remote pane upload to it. Escape cancels a drag.
- **Both apps transfer whole folders.** Upload and Download in the desktop app, and copy and paste in the terminal app, take a folder with everything in it, merge it into a folder of the same name and replace files that clash, and the desktop app asks first when the folder on show already has those names. Files and folders keep their permission bits, so scripts stay executable, and a copy stays writable for you so the next transfer can replace it; symbolic links and special files are skipped, and the transfer ends by saying how many items were skipped or failed and why the first one was. Cancel in the desktop app's progress strip, closing its tab, or Esc in the terminal app stops a transfer and removes the file it was part way through.
- **The file panes show when each file was last changed.** The desktop app's panes gain a Modified column, with the full date and time on hover, once the window is wide enough. The terminal app's file manager shows the time at the end of each row when its panel is wide enough.

### Bug Fixes
- **Security: a server that offers a host key of another type than the one saved for it is refused.** OmnySSH compared the offered key only with saved keys of the same type. A host saved with its Ed25519 key that suddenly offered only an RSA or ECDSA key was therefore taken for a new host: the key was saved and the login went ahead, password included, and the dashboard did this in the background without anyone connecting. Someone intercepting the connection could get past the saved key this way. Like `ssh`, OmnySSH now refuses any key that matches none of those saved for the host, whatever its type, and says which type is saved. A server that really dropped the type of key it was saved with needs its old key removed once, as `ssh` also asks.
Expand All @@ -27,6 +30,9 @@ Versions follow [Semantic Versioning](https://semver.org/).
- **A snippet with the same tag twice no longer empties the Snippets screen.** Tags typed as `db, db` in a snippet form, or written so into `snippets.toml`, left the desktop app's Snippets screen blank, so the snippet could not even be opened to fix it. The Run dialog broke the same way when two hosts share a name, as two `Host` blocks with one name in `~/.ssh/config` give. It now lists that name once, for the host a run goes to. The host picker and the command palette listed such a name twice, and either row opened the first host; they now list it once too.
- **Sizes in the terminal app's file manager stay in their column next to wide file names.** A name with Chinese, Japanese or Korean characters or emoji, which take two cells each, pushed its size past the panel's edge, so a 14-byte file read `1`. Names are now padded and cut by the cells they take.
- **Closing the host picker with Esc gives the keyboard back to the terminal.** In the desktop app, clicking SFTP or Terminal in the sidebar over an open terminal and then pressing Esc left the keyboard on the sidebar, so typing reached nothing until you clicked in the terminal. The command palette's sidebar button had the same problem, and so did clicking the terminal's own tab. A terminal that finishes connecting while the palette is open, or comes into view just as a passphrase prompt opens, no longer takes the keyboard from it.
- **Pasting a folder in the terminal app copies it instead of leaving an empty file.** The file manager handed a folder to the transfer as if it were a file, so the paste failed after creating an empty file of that name on the other side.
- **A paste or delete of more than 64 items in the terminal app handles them all.** They went to the SFTP queue at once, and whatever did not fit in its 64 places was dropped without a word while the app kept waiting for it. They now go one at a time.
- **The terminal app no longer crashes when a file grows while it is copied.** A log still being written to could end up larger than when its transfer started, which took the progress bar past 100% and brought the app down.

---

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Cards for every host with CPU, RAM and disk bars, uptime, OS version, top proces
Full PTY sessions in tabs. Open as many servers as you need, switch between them from the sidebar, and keep them running while you work in the dashboard.

### Two panel SFTP
Local on the left, remote on the right. Tick the files you want and move them across, watch the progress bar, select many at once. Nobody remembers `scp -r` syntax anyway.
Local on the left, remote on the right. Tick the files and folders you want and move them across, or just drag them from one side to the other, or straight from your file manager onto the server. Watch the progress bar, select many at once, see when each file was last changed. Nobody remembers `scp -r` syntax anyway.

### Snippets
Save the commands you paste every week. Pick a snippet, tick the hosts to send it to, and it runs on all of them at once. Snippets take parameters, so `sudo systemctl restart {{service}}` asks you for the name.
Expand Down
Loading
Loading