CLI-Tools (Claude Code, GitHub Copilot, jedes Terminal) per PWA von Mobilgeräten/Desktop fernsteuern.
> **Termote** = Terminal + Remote
>
> 🇬🇧 [English](README.md) | 🇻🇳 [Tiếng Việt](README.vi.md) | 🇨🇳 [简体中文](README.zh-CN.md) | 🇯🇵 [日本語](README.ja.md) | 🇰🇷 [한국어](README.ko.md) | 🇪🇸 [Español](README.es.md) | 🇧🇷 [Português (BR)](README.pt-BR.md) | 🇫🇷 [Français](README.fr.md) | 🇷🇺 [Русский](README.ru.md) | 🇮🇩 [Bahasa Indonesia](README.id.md)
## Funktionen
- **Session-Wechsel**: Mehrere tmux-Sessions mit Erstellen/Bearbeiten/Löschen
- **Session-Tabs**: Horizontale Tab-Leiste zum schnellen Fensterwechsel
- **Mobilfreundlich**: Virtuelle Tastatur-Toolbar (Tab/Ctrl/Shift/Pfeiltasten, erweiterbar)
- **Gestenunterstützung**: Wischen für Ctrl+C, Tab, Verlaufsnavigation
- **Befehlsverlauf**: Zuvor gesendete Befehle mit Suche abrufen
- **Schnellaktionen**: Schwebendes Menü für häufige Operationen (clear, cancel, exit)
- **Verbindungsanzeige**: Echtzeit-Serverstatus mit automatischer Trennungserkennung
- **Update-Prüfung**: Automatische Benachrichtigung über neue Versionen von GitHub Releases
- **PWA**: Auf dem Homescreen installierbar, offline-fähig
- **Persistente Sessions**: tmux hält Sessions am Leben
- **Einklappbare Seitenleiste**: Desktop-Oberfläche mit ein-/ausschaltbarer Session-Seitenleiste
- **Vollbildmodus**: Immersives Terminal-Erlebnis
- **Konfigurationsspeicherung**: Automatische Speicherung der Installationseinstellungen mit AES-256-verschlüsseltem Passwort
## Screenshots
## Architektur
```mermaid
flowchart TB
subgraph Client["Client (Mobil/Desktop)"]
PWA["PWA - React + TypeScript"]
Gestures["Gestensteuerung"]
Keyboard["Virtuelle Tastatur"]
end
subgraph Server["tmux-api Server :7680"]
Static["Statische Dateien"]
Proxy["WebSocket Proxy"]
API["REST API /api/tmux/*"]
Auth["Basic Auth"]
end
subgraph Backend["Backend-Dienste"]
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
```
## Schnellstart
> 📖 **Neu bei Termote?** Schau dir die [Erste-Schritte-Anleitung](docs/getting-started.md) für eine vollständige Anleitung mit Beispielen an.
```bash
./scripts/termote.sh # Interaktives Menü
./scripts/termote.sh install container # Container-Modus (docker/podman)
./scripts/termote.sh install native # Native-Modus (Host-Tools)
./scripts/termote.sh link # Globalen Befehl 'termote' erstellen
make test # Tests ausführen
```
> Nach `link` kann `termote` überall verwendet werden: `termote health`, `termote install native --lan`
>
> **Tipp**: Installiere [gum](https://github.com/charmbracelet/gum) für verbesserte interaktive Menüs (optional, Bash-Fallback verfügbar)
## Installation
### Einzeiler (empfohlen)
**macOS/Linux:**
```bash
# Herunterladen und vor der Installation fragen (Standard: Native-Modus)
curl -fsSL https://raw.githubusercontent.com/lamngockhuong/termote/main/scripts/get.sh | bash
# Automatisch ohne Nachfrage installieren
curl -fsSL .../get.sh | bash -s -- --yes
# Nur herunterladen (nicht installieren)
curl -fsSL .../get.sh | bash -s -- --download-only
# Automatisch mit gespeicherter Konfiguration aktualisieren
curl -fsSL .../get.sh | bash -s -- --update
# Bestimmte Version installieren
curl -fsSL .../get.sh | bash -s -- --version 0.0.4
# Mit explizitem Modus und Optionen
curl -fsSL .../get.sh | bash -s -- --yes --container --lan
curl -fsSL .../get.sh | bash -s -- --yes --native --tailscale myhost
# Neues Passwort erzwingen (gespeicherte Konfiguration ignorieren)
curl -fsSL .../get.sh | bash -s -- --yes --container --fresh
```
**Windows (PowerShell):**
> **Hinweis:** Falls die Skriptausführung auf Ihrem System deaktiviert ist, führen Sie zuerst Folgendes aus:
>
> ```powershell
> Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
> ```
```powershell
# Herunterladen und vor der Installation fragen (Standard: Native-Modus)
irm https://raw.githubusercontent.com/lamngockhuong/termote/main/scripts/get.ps1 | iex
# Automatisch ohne Nachfrage installieren
$env:TERMOTE_AUTO_YES = "true"; irm .../get.ps1 | iex
# Mit explizitem Modus
$env:TERMOTE_MODE = "container"; irm .../get.ps1 | iex
# Automatisch mit gespeicherter Konfiguration aktualisieren
$env:TERMOTE_UPDATE = "true"; irm .../get.ps1 | iex
```
### Docker
```bash
# Alles-in-einem (Zugangsdaten werden automatisch generiert, Logs prüfen: docker logs termote)
docker run -d --name termote -p 7680:7680 ghcr.io/lamngockhuong/termote:latest
# Mit benutzerdefinierten Zugangsdaten
docker run -d --name termote -p 7680:7680 \
-e TERMOTE_USER=admin -e TERMOTE_PASS=secret \
ghcr.io/lamngockhuong/termote:latest
# Ohne Authentifizierung (nur für lokale Entwicklung)
docker run -d --name termote -p 7680:7680 \
-e NO_AUTH=true \
ghcr.io/lamngockhuong/termote:latest
# Mit Volume für Persistenz
docker run -d --name termote -p 7680:7680 \
-v termote-data:/home/termote \
ghcr.io/lamngockhuong/termote:latest
# Benutzerdefiniertes Workspace-Verzeichnis einbinden
docker run -d --name termote -p 7680:7680 \
-v ~/projects:/workspace \
ghcr.io/lamngockhuong/termote:latest
# Mit Tailscale HTTPS (erfordert Tailscale auf dem 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
# Zugriff unter: https://your-hostname.tailnet-name.ts.net
```
### Vom Release
```bash
# Neuestes Release herunterladen
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}
# Installieren (interaktives Menü oder mit Modus)
./scripts/termote.sh install
./scripts/termote.sh install container
```
### Vom Quellcode
```bash
git clone https://github.com/lamngockhuong/termote.git
cd termote
./scripts/termote.sh install container
```
> **Hinweis**: `termote.sh` ist das einheitliche CLI mit Unterstützung für `install` (baut aus Quellcode, verwendet vorgefertigte Artefakte wenn verfügbar), `uninstall` und `health`.
## Bereitstellungsmodi
```mermaid
flowchart LR
subgraph Container["Container-Modus"]
direction TB
C1["Docker/Podman"] --> C2["tmux-api :7680"] --> C3["ttyd :7681"] --> C4["tmux"]
end
subgraph Native["Native-Modus"]
direction TB
N1["Hostsystem"] --> N2["tmux-api :7680"] --> N3["ttyd :7681"] --> N4["tmux + Host-Tools"]
end
User["Benutzer"] --> Container & Native
```
| Modus | Beschreibung | Anwendungsfall | Plattform |
| ------------- | --------------- | ------------------------------------------- | ------------ |
| `--container` | Container-Modus | Einfache Bereitstellung, isolierte Umgebung | macOS, Linux |
| `--native` | Alles nativ | Zugriff auf Host-Tools (claude, gh) | macOS, Linux |
### Optionen
| Flag | Beschreibung |
| --------------------------- | ---------------------------------------------------------- |
| `--lan` | Im LAN freigeben (Standard: nur localhost) |
| `--tailscale ` | Tailscale HTTPS aktivieren |
| `--no-auth` | Basis-Authentifizierung deaktivieren |
| `--port ` | Host-Port (Standard: 7680, Windows: 7690) |
| `--fresh` | Neues Passwort erzwingen (gespeicherte Konfig. ignorieren) |
| `--update` | Automatisch mit gespeicherter Konfig. aktualisieren |
| `--version ` | Bestimmte Version installieren (mit oder ohne `v`) |
| Umgebungsvariable | Beschreibung |
| ----------------- | -------------------------------------------------------------------- |
| `WORKSPACE` | Host-Verzeichnis zum Einbinden (Standard: `./workspace`) |
| `TERMOTE_USER` | Benutzername für Authentifizierung (Standard: automatisch generiert) |
| `TERMOTE_PASS` | Passwort für Authentifizierung (Standard: automatisch generiert) |
| `NO_AUTH` | Auf `true` setzen, um Authentifizierung zu deaktivieren |
### Container-Modus (empfohlen für Einfachheit)
Skripte erkennen automatisch `podman` oder `docker` -- beide funktionieren identisch.
```bash
./scripts/termote.sh install container # localhost mit Basic Auth
./scripts/termote.sh install container --no-auth # localhost ohne Auth
./scripts/termote.sh install container --lan # LAN-Zugriff
# Zugriff: http://localhost:7680
# Benutzerdefiniertes Workspace-Verzeichnis (wird als /workspace im Container eingebunden)
WORKSPACE=~/projects ./scripts/termote.sh install container
WORKSPACE=/path/to/code make install-container
```
> **Sicherheitshinweis**: Vermeiden Sie es, `$HOME` direkt einzubinden -- sensible Verzeichnisse wie `.ssh`, `.gnupg` wären im Container zugänglich. Binden Sie stattdessen spezifische Projektverzeichnisse ein.
### Native (empfohlen für Host-Binary-Zugriff)
Verwenden, wenn Zugriff auf Host-Binaries benötigt wird (claude, git, usw.):
```bash
# Linux
sudo apt install ttyd tmux
# Oder: sudo snap install ttyd
./scripts/termote.sh install native
# macOS
brew install ttyd tmux go
./scripts/termote.sh install native
# Zugriff: http://localhost:7680
```
### Mit Tailscale HTTPS (alle Modi)
Verwendet `tailscale serve` für automatisches HTTPS (keine manuelle Zertifikatsverwaltung):
```bash
# Nur Tailscale (Standard-Port 443)
./scripts/termote.sh install container --tailscale myhost.ts.net
# Benutzerdefinierter Port
./scripts/termote.sh install native --tailscale myhost.ts.net:8765
# Tailscale + LAN-Zugriff
./scripts/termote.sh install container --tailscale myhost.ts.net --lan
# Zugriff: https://myhost.ts.net (oder :8765 für benutzerdefinierten Port)
```
### Deinstallation
```bash
./scripts/termote.sh uninstall container # Container-Modus
./scripts/termote.sh uninstall native # Native-Modus
./scripts/termote.sh uninstall all # Alles
```
### Aktualisierung
```bash
# Option 1: Automatisch mit gespeicherter Konfiguration aktualisieren
curl -fsSL .../get.sh | bash -s -- --update
# Option 2: Einzeiler erneut ausführen (vergleicht Versionen, fragt vor Installation)
curl -fsSL .../get.sh | bash
# Option 3: Manuell aktualisieren
./scripts/termote.sh uninstall [container|native]
git pull origin main # Falls vom Quellcode installiert
./scripts/termote.sh install [container|native] [--lan] [--tailscale ...]
```
## Plattformunterstützung
| Plattform | Container | Native | CLI-Skript |
| --------- | ----------------- | ----------------- | ----------- |
| Linux | ✓ | ✓ | termote.sh |
| macOS | ✓ | ✓ | termote.sh |
| Windows | ⚠️ (experimentell) | ⚠️ (experimentell) | termote.ps1 |
> **⚠️ Windows-Unterstützung (Experimentell)**: Die Windows-Unterstützung befindet sich derzeit in einem frühen Stadium und erfordert weitere Tests. Der Container-Modus erfordert Docker Desktop, der Native-Modus erfordert psmux. Bitte melden Sie Probleme auf GitHub.
### Windows Native-Modus
Der Windows Native-Modus verwendet [psmux](https://github.com/psmux/psmux) (tmux-kompatibler Terminal-Multiplexer für Windows):
```powershell
# psmux installieren
winget install psmux
# Termote ausführen
.\scripts\termote.ps1 install native
.\scripts\termote.ps1 install container # Oder Container-Modus mit Docker Desktop
```
> Standardmäßig lädt `install native` den [Fork/MSVC-ttyd-Build](https://github.com/lamngockhuong/ttyd/releases) herunter (funktioniert unter dem neuesten Windows); mit `-Ttyd official` wird stattdessen der Upstream-Build von tsl0922/ttyd verwendet.
## Mobile Nutzung
| Aktion | Geste |
| ---------------------- | --------------------------- |
| Abbrechen/Unterbrechen | Nach links wischen (Ctrl+C) |
| Tab-Vervollständigung | Nach rechts wischen |
| Verlauf hoch | Nach oben wischen |
| Verlauf runter | Nach unten wischen |
| Einfügen | Lange drücken |
| Schriftgröße | Zusammen-/Auseinanderziehen |
Die virtuelle Toolbar bietet: Tab, Esc, Ctrl, Shift, Pfeiltasten und gängige Tastenkombinationen. Unterstützt Ctrl+Shift-Kombinationen (Einfügen, Kopieren). Wechsel zwischen minimal und erweitert für zusätzliche Tasten (Home, End, Delete, usw.).
## Projektstruktur
```
termote/
├── Makefile # Build-/Test-/Deploy-Befehle
├── Dockerfile # Docker-Modus (tmux-api + ttyd)
├── docker-compose.yml
├── entrypoint.sh # Docker-Entrypoint
├── docs/ # Dokumentation
│ └── images/screenshots/ # App-Screenshots
├── pwa/ # React PWA
│ └── src/
│ ├── components/
│ ├── contexts/
│ ├── hooks/
│ ├── types/
│ └── utils/
├── tmux-api/ # Go-Server
│ ├── main.go # Einstiegspunkt
│ ├── serve.go # Server (PWA, Proxy, Auth)
│ └── tmux.go # tmux API-Handler
├── scripts/
│ ├── termote.sh # Unix CLI (install/uninstall/health)
│ ├── termote.ps1 # Windows PowerShell CLI
│ ├── get.sh # Unix Online-Installer (curl | bash)
│ └── get.ps1 # Windows Online-Installer (irm | iex)
├── tests/ # Testsuite
│ ├── test-termote.sh
│ ├── test-termote.ps1 # Windows-Tests
│ ├── test-get.sh
│ └── test-entrypoints.sh
└── website/ # Astro Starlight Docs-Seite
└── src/content/docs/ # MDX-Dokumentation
```
## Entwicklung
```bash
make build # PWA und tmux-api bauen
make test # Alle Tests ausführen
make health # Service-Health prüfen
make clean # Container stoppen
# E2E-Tests (erfordert laufenden Server)
./scripts/termote.sh install container # Zuerst Server starten
pnpm --filter termote test:e2e # Playwright-Tests ausführen
pnpm --filter termote test:e2e:ui # Mit UI-Debugger ausführen
```
**Manuelles Testen:** Siehe [Selbsttest-Checkliste](docs/self-test-checklist.md)
## Fehlerbehebung
### Session bleibt nicht erhalten
- tmux prüfen: `tmux ls`
- Sicherstellen, dass ttyd das Flag `-A` verwendet (attach-or-create)
### WebSocket-Fehler
- tmux-api-Logs prüfen: `docker logs termote`
- Sicherstellen, dass ttyd auf Port 7681 läuft
### Probleme mit der mobilen Tastatur
- Sicherstellen, dass das Viewport-Meta-Tag vorhanden ist
- Auf einem echten Gerät testen, nicht im Emulator
### Native-Modus: Prozesse starten nicht
```bash
ps aux | grep ttyd # Prüfen, ob ttyd läuft
ps aux | grep tmux-api # Prüfen, ob tmux-api läuft
lsof -i :7680 # Sicherstellen, dass der Port belegt ist
```
## Sicherheitshinweise
- **Standard: nur localhost** - nicht im LAN erreichbar, es sei denn das Flag `--lan` wird verwendet
- **Basic Auth standardmäßig aktiviert** - `--no-auth` verwenden, um für lokale Entwicklung zu deaktivieren
- **Integrierter Brute-Force-Schutz** - Rate-Limiting (5 Versuche/Min. pro IP)
- HTTPS (Tailscale) für Produktion verwenden
- Auf vertrauenswürdige Netzwerke/VPN beschränken
## Andere Projekte
| Projekt | Beschreibung |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| [GitHub Flex](https://github.com/lamngockhuong/github-flex) | Cross-Browser-Erweiterung (Chrome & Firefox), die die GitHub-Oberfläche mit Produktivitätsfunktionen erweitert |
| [TabRest](https://github.com/lamngockhuong/tabrest) | Chrome-Erweiterung, die inaktive Tabs automatisch entlädt, um Speicher freizugeben |
| [Specpin](https://github.com/lamngockhuong/specpin) | Heftet lebende, Git-versionierte Business-Spezifikationen an die Elemente deiner laufenden Web-UI (Browser-Erweiterung + Go-Sidecar) |
## Lizenz
MIT