Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ ENV/
.venv*/
.uv-cache*/
.task*/
.test-run.tmp/
.worktrees/

# Python cache
__pycache__/
Expand Down
18 changes: 10 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
WebSSH is a secure, self-hosted workspace for SSH terminals and SFTP file operations in the browser. It is built for homelabs, server administration, and teams that want browser-based access without handing connection data to a hosted control plane. It is multi-user from the ground up, with separate accounts and per-user saved connections, keys, and settings. Browser dependencies are vendored locally, and WebSSH does not include telemetry.

<p align="center">
<img src="assets/webssh-demo.gif" alt="WebSSH tour showing saved profiles, live terminals, split panes, broadcast input, commands, and SFTP tools" width="1100">
<img src="assets/webssh-demo.gif" alt="WebSSH tour showing Quick Connect, live terminals, split panes, commands, and the source-first SFTP workspace" width="1100">
</p>

## Features
Expand All @@ -82,7 +82,7 @@ WebSSH is a secure, self-hosted workspace for SSH terminals and SFTP file operat
- **Persistent Session Names** - Custom tab names are retained for persistent sessions across browsers
- **Configurable Scrollback** - Set 50 to 10,000 terminal lines and navigate them with the custom scrollbar
- **Copy/Paste** - `Ctrl+C` copies selected terminal text but still sends an interrupt when nothing is selected; `Ctrl+V` pastes (`Cmd+C` / `Cmd+V` on macOS)
- **Keyboard Shortcuts** - Ctrl+K command palette, Ctrl+F search, Ctrl+19 tab switching
- **Keyboard Shortcuts** - Ctrl+K command palette, Ctrl+F search, Ctrl+1-9 tab switching
- **Terminal Search** - Regex or plain-text in-terminal search (Ctrl+F)
- **Save Transcript** - Download the session output as a text file
- **Recent Connections** - Quick reconnect from your connection history
Expand All @@ -103,21 +103,23 @@ WebSSH is a secure, self-hosted workspace for SSH terminals and SFTP file operat

### File Manager (SFTP)
- **Active-Session Split** - In the single-terminal layout, open a compact SFTP browser that automatically follows the active SSH session
- **Dual-Pane Browser** - Side-by-side file browsing
- **Drag & Drop** - Transfer files between local and remote
- **Source-First Workspace** - Open active SSH sessions, saved SSH hosts, or a new SFTP quick connection from one consistent source launcher
- **One or Two File Areas** - Use the full workspace for one source or switch to a side-by-side layout for remote-to-remote work
- **Independent Source Tabs** - Keep multiple remote locations open without duplicating a source from the right side on the left
- **Drag & Drop Uploads** - Upload browser files and folders directly into the selected remote directory
- **Server-to-Server** - Direct transfer between SSH hosts
- **Batch Operations** - Multi-select for bulk actions
- **Batch Operations** - Select individual items or all visible items for bulk download, transfer, and delete actions
- **Context Menu** - Right-click for quick actions
- **File Preview** - Inline preview for images and code (syntax-highlighted), with log tail mode
- **Folder Download as ZIP** - Download entire directories as a ZIP archive
- **Quick Connect** - Browse files over SFTP without opening a terminal session
- **Local Filesystem Source** - Use your browser's local files as a transfer source
- **Saved Hosts and Quick Connect** - Reuse saved profiles or browse over SFTP without opening a terminal session
- **SMB Integration Path** - The source launcher reserves a disabled, clearly labeled `Coming soon` action for creating an SMB share; SMB connections are not active yet
- **Transfer Queue** - Progress tracking with conflict resolution (skip / overwrite / apply to all)
- **Efficient Binary Transfer** - Raw binary streaming (~33% smaller than base64)
- **Inline Editor** - Edit text files directly in the browser and save back over SFTP

<p align="center">
<img src="assets/filemanager.png" alt="File Manager" width="700">
<img src="assets/filemanager.png" alt="Source-first SFTP File Manager with independent tabs and two remote file areas" width="1100">
</p>

<p align="center">
Expand Down
Binary file modified assets/commandlibrary.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/connection-options.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/connection-panel.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/file-editing.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/filemanager.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/keys.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/mobile.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/multi.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/session-diagnostics.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/session-workspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/themes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/webssh-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 45 additions & 3 deletions static/css/session-workspace.css
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@
.fm-embedded-mode #fmPaneTabs,
.fm-embedded-mode #fmTransfer,
.fm-embedded-mode #fmLeftPane > .fm-pane-header,
.fm-embedded-mode #fmLeftPane > .fm-source-identity,
.fm-embedded-mode #fmLeftPane > .fm-pane-toolbar,
.fm-embedded-mode #fmLeftPane > .fm-file-list-header,
.fm-embedded-mode .fm-transfer-rail,
.fm-embedded-mode #fmMobileUpload {
display: none !important;
}
Expand All @@ -140,17 +144,55 @@
}

.fm-embedded-mode .fm-toolbar {
flex-wrap: wrap;
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 8px;
padding: 8px;
}

.fm-embedded-mode .fm-toolbar-left,
.fm-embedded-mode .fm-toolbar-right {
flex: 1 1 auto;
width: 100%;
min-width: 0;
}

.fm-embedded-mode .fm-toolbar-right {
justify-content: flex-end;
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 4px;
}

.fm-embedded-mode .fm-toolbar-right .btn {
min-width: 0;
justify-content: center;
padding-inline: 6px;
}

.fm-embedded-mode .fm-toolbar-right .btn-text {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}

.fm-embedded-mode .fm-file-item {
grid-template-columns: 24px 22px minmax(0, 1fr) auto;
min-height: 42px;
padding: 6px 10px;
}

.fm-embedded-mode .fm-file-modified,
.fm-embedded-mode .fm-file-permissions {
display: none;
}

.fm-embedded-mode .fm-file-size {
white-space: nowrap;
}

.notepad-panel {
Expand Down
Loading
Loading