Termote
Remote control CLI tools (Claude Code, GitHub Copilot, any terminal) from mobile/desktop via PWA
Install / Use
/learn @lamngockhuong/TermoteQuality Score
Category
Development & EngineeringSupported Platforms
README
Remote control CLI tools (Claude Code, GitHub Copilot, any terminal) from mobile/desktop via PWA.
Termote = Terminal + Remote
Features
- Session switching: Multiple tmux sessions with create/edit/delete
- Mobile-friendly: Virtual keyboard toolbar (Tab/Ctrl/Shift/arrows, expandable)
- Gesture support: Swipe for Ctrl+C, Tab, history navigation
- PWA: Installable to homescreen, offline-capable
- Persistent sessions: tmux keeps sessions alive
- Collapsible sidebar: Desktop UI with toggleable session sidebar
- Fullscreen mode: Immersive terminal experience
- Config persistence: Auto-save installation settings with AES-256 encrypted password
Screenshots
<p align="center"> <img src="docs/images/screenshots/mobile-terminal.png" alt="Mobile Terminal" width="280" /> <img src="docs/images/screenshots/mobile-sidebar.png" alt="Session Sidebar" width="280" /> </p>Architecture
flowchart TB
subgraph Client["Client (Mobile/Desktop)"]
PWA["PWA - React + TypeScript"]
Gestures["Gesture Controls"]
Keyboard["Virtual Keyboard"]
end
subgraph Server["tmux-api Server :7680"]
Static["Static Files"]
Proxy["WebSocket Proxy"]
API["REST API /api/tmux/*"]
Auth["Basic Auth"]
end
subgraph Backend["Backend Services"]
ttyd["ttyd :7681"]
tmux["tmux"]
Shell["Shell"]
Tools["CLI Tools"]
end
Gestures --> PWA
Keyboard --> PWA
PWA --> Static
PWA <--> Proxy
PWA --> API
Auth -.-> Static & Proxy & API
Proxy <--> ttyd
API --> tmux
ttyd --> tmux --> Shell --> Tools
Quick Start
📖 New to Termote? Check out the Getting Started Guide for a complete walkthrough with examples.
./scripts/termote.sh # Interactive menu
./scripts/termote.sh install container # Container mode (docker/podman)
./scripts/termote.sh install native # Native mode (host tools)
./scripts/termote.sh link # Create 'termote' global command
make test # Run tests
After
link, usetermotefrom anywhere:termote health,termote install native --lan
Tip: Install gum for enhanced interactive menus (optional, bash fallback available)
Installation
One-liner (recommended)
macOS/Linux:
# Download and prompt before install (defaults to native mode)
curl -fsSL https://raw.githubusercontent.com/lamngockhuong/termote/main/scripts/get.sh | bash
# Auto-install without prompt
curl -fsSL .../get.sh | bash -s -- --yes
# Download only (no install)
curl -fsSL .../get.sh | bash -s -- --download-only
# Auto-update with saved config
curl -fsSL .../get.sh | bash -s -- --update
# Install specific version
curl -fsSL .../get.sh | bash -s -- --version 0.0.4
# With explicit mode and options
curl -fsSL .../get.sh | bash -s -- --yes --container --lan
curl -fsSL .../get.sh | bash -s -- --yes --native --tailscale myhost
# Force new password (ignore saved config)
curl -fsSL .../get.sh | bash -s -- --yes --container --fresh
Windows (PowerShell):
Note: If script execution is disabled on your system, run this first:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
# Download and prompt before install (defaults to native mode)
irm https://raw.githubusercontent.com/lamngockhuong/termote/main/scripts/get.ps1 | iex
# Auto-install without prompt
$env:TERMOTE_AUTO_YES = "true"; irm .../get.ps1 | iex
# With explicit mode
$env:TERMOTE_MODE = "container"; irm .../get.ps1 | iex
# Auto-update with saved config
$env:TERMOTE_UPDATE = "true"; irm .../get.ps1 | iex
Docker
# All-in-one (auto-generates credentials, check logs: docker logs termote)
docker run -d --name termote -p 7680:7680 ghcr.io/lamngockhuong/termote:latest
# With custom credentials
docker run -d --name termote -p 7680:7680 \
-e TERMOTE_USER=admin -e TERMOTE_PASS=secret \
ghcr.io/lamngockhuong/termote:latest
# Without auth (local dev only)
docker run -d --name termote -p 7680:7680 \
-e NO_AUTH=true \
ghcr.io/lamngockhuong/termote:latest
# With volume for persistence
docker run -d --name termote -p 7680:7680 \
-v termote-data:/home/termote \
ghcr.io/lamngockhuong/termote:latest
# Mount custom workspace directory
docker run -d --name termote -p 7680:7680 \
-v ~/projects:/workspace \
ghcr.io/lamngockhuong/termote:latest
# With Tailscale HTTPS (requires Tailscale on host)
docker run -d --name termote -p 7680:7680 \
-e TERMOTE_USER=admin -e TERMOTE_PASS=secret \
ghcr.io/lamngockhuong/termote:latest
sudo tailscale serve --bg --https=443 http://127.0.0.1:7680
# Access at: https://your-hostname.tailnet-name.ts.net
From Release
# Download latest release
VERSION=$(curl -s https://api.github.com/repos/lamngockhuong/termote/releases/latest | grep tag_name | cut -d '"' -f4)
wget https://github.com/lamngockhuong/termote/releases/download/${VERSION}/termote-${VERSION}.tar.gz
tar xzf termote-${VERSION}.tar.gz
cd termote-${VERSION#v}
# Install (interactive menu or with mode)
./scripts/termote.sh install
./scripts/termote.sh install container
From Source
git clone https://github.com/lamngockhuong/termote.git
cd termote
./scripts/termote.sh install container
Note:
termote.shis the unified CLI supportinginstall(builds from source, uses pre-built artifacts when available),uninstall, andhealthcommands.
Deployment Modes
flowchart LR
subgraph Container["Container Mode"]
direction TB
C1["Docker/Podman"] --> C2["tmux-api :7680"] --> C3["ttyd :7681"] --> C4["tmux"]
end
subgraph Native["Native Mode"]
direction TB
N1["Host System"] --> N2["tmux-api :7680"] --> N3["ttyd :7681"] --> N4["tmux + Host Tools"]
end
User["User"] --> Container & Native
| Mode | Description | Use Case | Platform |
| ------------- | -------------- | ------------------------------- | ------------ |
| --container | Container mode | Simple deployment, isolated env | macOS, Linux |
| --native | All native | Host tool access (claude, gh) | macOS, Linux |
Options
| Flag | Description |
| --------------------------- | ----------------------------------------------- |
| --lan | Expose to LAN (default: localhost only) |
| --tailscale <host[:port]> | Enable Tailscale HTTPS |
| --no-auth | Disable basic authentication |
| --port <port> | Host port (default: 7680, Windows: 7690) |
| --fresh | Force new password prompt (ignore saved config) |
| --update | Auto-update with saved config |
| --version <ver> | Install specific version (with or without v) |
| Environment Variable | Description |
| -------------------- | ------------------------------------------------ |
| WORKSPACE | Host directory to mount (default: ./workspace) |
| TERMOTE_USER | Basic auth username (default: auto-generated) |
| TERMOTE_PASS | Basic auth password (default: auto-generated) |
| NO_AUTH | Set to true to disable authentication |
Container Mode (recommended for simplicity)
Scripts auto-detect podman or docker — both work identically.
./scripts/termote.sh install container # localhost with basic auth
./scripts/termote.sh install container --no-auth # localhost without auth
./scripts/termote.sh install container --lan # LAN accessible
# Access: http://localhost:7680
# Custom workspace directory (mounted to /workspace in container)
WORKSPACE=~/projects ./scripts/termote.sh install container
WORKSPACE=/path/to/code make install-container
Security note: Avoid mounting
$HOMEdirectly — sensitive directories like.ssh,.gnupgwill be accessible in container. Mount specific project directories instead.
Native (recommended for host binary access)
Use when you need access to host bina
Related Skills
node-connect
346.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
