A modern, responsive web-based SSH and SFTP terminal client built with Node.js, Express, and xterm.js. Designed for the AI coding workflow β featuring tab flash notifications that alert you when AI tools like OpenCode or Claude are waiting for your input, so you never miss a prompt while multitasking. Also features excellent TUI support, tabbed sessions, bookmarks, and mobile-friendly design.
- π SSH Terminal - Full xterm.js emulation with TUI support (vim, nano, htop, tmux)
- π SFTP Browser - File manager interface with upload/download
- π€ AI Attention Alerts - Tab flash notifications when AI tools (OpenCode, Claude) need your input
- ποΈ Tabbed Interface - Multiple concurrent sessions
- π Bookmarks - Save connection details for quick access
- π Password Protection - Optional password lock for app access
- β¨οΈ Mobile-Friendly - Special keys popup for mobile devices
- π¨ Modern UI - GitHub-inspired dark theme, fully responsive
# Install globally
npm install -g @lethevimlet/sshift
# Start the server
sshiftThe application will be available at https://localhost:8022
Full documentation is available at GitHub Pages.
- Installation - Detailed installation options
- Docker - Docker deployment and usage
- Configuration - Configuration files and options
- Plugins - AI attention alerts and plugin system
- API Reference - Socket.IO events and API
- Testing - Running and writing tests
- Contributing - How to contribute
The recommended way to install sshift - automatically handles updates and autostart configuration:
Linux/macOS:
curl -fsSL https://raw.githubusercontent.com/lethevimlet/sshift/main/sshift-install.sh | bashWindows (PowerShell):
Set-ExecutionPolicy Bypass -Scope Process
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/lethevimlet/sshift/main/sshift-install.ps1" -UseBasicParsing).ContentNote: The Windows installer requires PowerShell to be run as Administrator for npm global installations.
The installer will:
- Install Node.js 20+ if not present
- Install sshift globally via npm
- Start sshift after installation
- Configure autostart (optional, systemd on Linux, launchd on macOS, Task Scheduler on Windows)
- Create config at
~/.local/share/sshift/.env/config.jsonwith HTTPS enabled - Print summary with HTTPS access links
docker run -d -p 8022:8022 --name sshift ghcr.io/lethevimlet/sshift:latest
# Or with docker-compose
curl -O https://raw.githubusercontent.com/lethevimlet/sshift/main/docker/docker-compose.yml
docker-compose up -dSee Docker README for detailed instructions.
npm install -g @lethevimlet/sshift
sshiftgit clone https://github.com/lethevimlet/sshift.git
cd sshift
npm install
npm startSSHIFT uses a priority-based configuration system. Config files are searched in order; the first match wins.
| Priority | Path | Notes |
|---|---|---|
| 1 | ~/.local/share/sshift/.env/config.json |
Primary user install location |
| 2 | ~/.local/share/bin/.env/config.json |
Alternative install location |
| 3 | ~/.local/share/sshift/config.json |
User install (no .env subdir) |
| 4 | ~/.local/share/bin/config.json |
Alternative location (no .env subdir) |
| 5 | <PACKAGE_DIR>/.env/config.json |
NPM package directory |
| 6 | <PACKAGE_DIR>/config.json |
NPM package root (fallback) |
--portCLI argument (highest priority)PORTenvironment variableconfig.jsondevPort(whenNODE_ENV=developmentor--dev)config.jsonport(production)- Default: 8022 (production), 3000 (development)
--bindCLI argumentBINDenvironment variableconfig.jsonbindsetting- Default:
0.0.0.0
See Configuration for details.
When accessing sshift from a LAN IP (e.g., https://192.168.1.50:8022), browsers show "Not Secure" warnings because the self-signed certificate is untrusted. This also blocks PWA installation.
- Go to
chrome://flags/#unsafely-treat-insecure-origin-as-secure - Enter your LAN URL:
https://192.168.1.50:8022 - Set to Enabled β Relaunch
Generate a cert for your LAN IP and configure sshift to use it:
{
"enableHttps": true,
"certPath": "/path/to/sshift-lan-cert.pem",
"keyPath": "/path/to/sshift-lan-key.pem"
}Then add the certificate to your device's trusted root store. See Configuration > HTTPS on Local Network for full instructions including nginx reverse proxy and mDNS options.
SSHIFT includes built-in plugins that detect when AI coding tools are waiting for user input and flash the browser tab to get your attention β perfect for when you're multitasking across tabs.
Detects when OpenCode is waiting for input by tracking its spinner characters (β¬ β β£) and prompt patterns. When the spinner stops or a prompt appears, the tab flashes.
Detects when Claude Code is waiting for input by tracking its spinner characters (β β β Ή braille patterns, Β·β’β³βΆβ»β½) and prompt patterns like "β―", "Do you want", "Allow", and "Esc to cancel".
Add plugins to your config.json:
{
"plugins": [
{
"name": "opencode-attention",
"enabled": true,
"config": {
"debounceMs": 300,
"flashDuration": 0,
"idleThreshold": 3000
}
},
{
"name": "claude-attention",
"enabled": true,
"config": {
"debounceMs": 300,
"flashDuration": 0,
"idleThreshold": 3000,
"cooldownMs": 1000
}
}
]
}See Configuration > Plugins for full details.
Backend: Node.js, Express, Socket.IO, ssh2
Frontend: xterm.js, xterm addons
Development: ESLint, Puppeteer
Contributions are welcome! See Contributing for guidelines.
MIT License - see LICENSE for details.
- xterm.js - Terminal emulator for the web
- ssh2 - SSH2 client and server modules
- Socket.IO - Real-time bidirectional event-based communication
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Made with β€οΈ by the SSHIFT Team



