Skip to main content
Glama
konraddzbik

termdesk

by konraddzbik

TermDesk

Ein plattformübergreifender SSH + SFTP + VNC + RDP-Desktop-Client – Multi-Tab-Terminals, Streaming-Dateiübertragungen und Remote-Desktops (VNC über SSH, plus natives RDP) in einem Fenster.

Electron React TypeScript Tests Coverage License

Status: ausgeliefert – SSH-Terminal, SFTP, VNC über SSH, natives RDP, MCP-Agentenzugriff, SSH-Tunnel-Manager, Flottenautomatisierung, lokale Terminals mit wählbarem Terminalprogramm (Login-Shell / tmux / Zellij / screen / alternative Shells), Prompt Book + geplante Routinen, Einstellungen, Befehls-Palette und Paketierung.


✨ Funktionen

  • 🖥️ Flexible Hosts – SSH-only, VNC-only oder kombinierte Hosts bereits bei der Erstellung. SSH und VNC sind unabhängig voneinander optional. Reine VNC-Hosts unterstützen direkte TCP- oder SSH-getunnelte Verbindungen (mit klarer Fehlermeldung, wenn Sie ohne SSH-Zugangsdaten tunneln möchten). UI-Aktionen, Befehls-Palette und Test-Schaltflächen passen sich dem Host-Typ an.

  • 🖥️ Multi-Tab-SSH-Terminal – xterm.js (WebGL) mit Suche, Kopieren/Einfügen, Größenänderung; viele parallele Sitzungen zum selben oder zu verschiedenen Hosts. Frühe Ausgabe wird gepuffert, bis sich das Terminal verbindet, sodass MOTD/Banner nicht verloren gehen.

  • 📁 SFTP mit Streaming-Übertragungswarteschlange – Remote-Dateibrowser, Drag & Drop (rekursiver Ordner-Upload), Chunk-für-Chunk-Streaming mit konstantem Speicher, Abbrechen/Wiederholen, In-Place-Bearbeitung mit Auto-Upload beim Speichern.

  • 🔒 VNC über SSH – noVNC wird in der App gerendert, über eine Loopback-WebSocket-Bridge geführt, die durch Einmal-Tokens mit 30 s Gültigkeit geschützt ist; Standardtransport ist ein SSH-forwardOut-Tunnel, sodass Port 5900 nie exponiert wird. Direktmodus wird ebenfalls für VNC-only-Hosts unterstützt.

  • 🖥️ RDP – Verbindung zu Windows/RDP-Hosts in der App über einen IronRDP-WASM-Client, der über einen In-Process-RDCleanPath-Proxy geführt wird (gleiche Form wie die VNC-Bridge: Einmal-Token, 30 s Gültigkeit, Origin-Prüfung, TLS-Terminierung), mit Trust-on-first-use-Serverzertifikat-Pinning.

  • 🔐 Verschlüsselte Tresor – Hosts, Gruppen, Snippets und bekannte Hosts in SQLite; Passwörter/Passphrasen werden mit OS-Keychain-gestütztem safeStorage verschlüsselt, sobald sie im Hauptprozess ankommen.

  • 🛡️ Host-Key-Verifizierung – SHA256-Fingerprint-Bestätigungsdialog bei der ersten Verbindung, harte Sperre bei Änderung eines gleichartigen Schlüssels, und eine deutliche laute „möglicher Man-in-the-Middle“-Warnung, wenn ein bekannter Host einen Schlüssel/Typ präsentiert, dem nie vertraut wurde.

  • 🪜 ProxyJump – Multi-Hop-Ketten (user@jump:port,next) über verkettete forwardOut.

  • 🔌 SSH-Tunnel-Manager – lokale (-L)-Portweiterleitungen und dynamische SOCKS5 (-D)-Proxys aus einem Seitenleisten-Panel definieren, speichern und starten/stoppen, mit Live-Statuspunkt + Durchsatz. Nutzt nach Möglichkeit die Verbindung eines offenen Terminals; zerstörungsfrei, eigentümerbezogen, protokolliert. Siehe docs/TUNNELS.md.

  • 🪟 Geteilte Panels – zwei Sitzungen nebeneinander oder übereinander anzeigen (Alt-Klick auf einen Tab oder die Split-Symbolleiste), mit ziehbarem Trenner. Ideal in Kombination mit Multi-Host-Automatisierung für ein Live-Überwachungsraster.

  • 💻 Lokale Terminalsnode-pty-Shell-Tabs auf dem eigenen Rechner, mit gespeicherten Arbeitsverzeichnissen – kein SSH erforderlich. Der pro Host festgelegte Standard-Remote-Pfad wird bei der Verbindung berücksichtigt.

  • 🧩 Terminalprogramm wählen – legen Sie fest, was beim Öffnen eines Terminals läuft (Einstellungen → Allgemein): Ihre Standard-Login-Shell, ein Multiplexer (tmux, Zellij, GNU Screen – überleben Neustarts/Trennungen) oder eine alternative Shell (bash, zsh, fish, PowerShell, Nushell). Nur Programme, die auf Ihrem Rechner erkannt werden, sind auswählbar; die Wahl gilt sowohl für lokale Terminals als auch für SSH-Sitzungen (auf dem Remote ausgeführt, falls vorhanden, sonst eine einfache Shell).

  • 🚀 In externem Terminal öffnen – das aktuelle Verzeichnis an Ihr bevorzugtes GUI-Terminal übergeben – Ghostty, Warp, iTerm2, kitty, Alacritty, WezTerm, GNOME Terminal, Konsole, Windows Terminal – auf Ihrem Rechner erkannt, mit gespeichertem Standard (Einstellungen → Allgemein), über ⌘K oder eine Ein-Klick-Schaltfläche auf jedem lokalen Terminal-Tab.

  • Flottenautomatisierung – ein Snippet oder einen Befehl gleichzeitig auf einer ganzen Gruppe von SSH-Hosts ausführen, mit Live-Streaming-Ausgabe pro Host.

  • 🕘 Aktivitätsprotokoll – eine lokale Zeitleiste von Verbindungen/Trennungen, SFTP/VNC-Öffnungen und Automatisierungsläufen. Nur Metadaten: Token mit Geheimnissen werden geschwärzt, Einträge werden nach 90 Tagen gelöscht.

  • 🎨 Terminal-Farbschemata – integrierte Dracula, Solarized Dark, Gruvbox, One Dark, Nord (plus das Standard-Schema), je nach Präferenz.

  • 🧱 Anpassbare Seitenleiste – jede Sektion der linken Seitenleiste (Hosts, Lokale Terminals, Arbeitsbereiche, Tunnel, Snippets, Prompt Book, Routinen) ein- oder ausblenden, über Einstellungen → Allgemein oder die Schaltfläche Anpassen der Seitenleiste. Ihre Wahl bleibt erhalten; standardmäßig ist alles sichtbar.

  • 🧩 Prompt Book – wiederverwendbare, vorlagenbasierte Prompts für KI-Agenten. Prompts sind reiner Text mit {{variable}}-Platzhaltern (optional {{name:default}} / {{name|description}}); beim Ausführen werden die Werte abgefragt, eine Live-Vorschau angezeigt, und der gerenderte Text wird entweder an das aktive Terminal (SSH oder lokal) gesendet oder in einem KI-Agenten gestartet – Claude Code, Aider, OpenCode, Codex oder Gemini – in einem von Ihnen gewählten Verzeichnis. Die Vorlagenverarbeitung ist reine Substitution (kein eval), und der Prompt wird als einzelnes, in Anführungszeichen gesetztes Argument übergeben, sodass Shell-Metazeichen darin inert sind.

  • 🔁 Routinen – gespeicherte „führe diesen Prompt durch diesen Agenten in diesem Verzeichnis aus“-Jobs, auf Abruf oder nach Zeitplan (Intervall / täglich / cron), jeweils mit eigener Ausführungs-Historie. Routinen laufen, solange TermDesk geöffnet ist; ein während der geschlossenen App verpasster Lauf wird beim nächsten Start einmal nachgeholt, statt jeden verpassten Slot zu überrennen. Unbeaufsichtigte Autonomie ist Opt-in und standardmäßig deaktiviert; gespeicherte Ausführungszusammenfassungen sind geheimnisgeschwärzt.

  • 📋 Snippets – gespeicherte Befehle, die an die aktive Sitzung gesendet werden.

  • ⌨️ Befehls-Palette⌘/Strg+K Fuzzy-Host-Suche + jeder Befehl (Terminals, SFTP, VNC, Automatisierung, Protokolle); drücken Sie ? für das Tastenkürzel-Spickzettel.

  • ⚙️ Einstellungen – Design (dunkel / hell / System, folgt dem Betriebssystem), Terminal-Schriftart + Farbschema, Rechtsklick-Einfügen-Verhalten, SSH-Keepalive; reines JSON, niemals Geheimnisse.

  • 🤖 KI-Agentenzugriff (MCP) – lassen Sie Claude, Cursor, Grok oder einen beliebigen MCP-Client TermDesk nutzen: Hosts auflisten, Befehle ausführen, über eine Flotte ausrollen. Der Agent bekommt Hände, keine Schlüssel – Zugangsdaten bleiben im Hauptprozess, jede Aktion ist pro Host Opt-in + genehmigungspflichtig + live in einem KI-Aktivitäts-Protokoll sichtbar. Standardmäßig deaktiviert. Siehe docs/MCP-INTEGRATION.md.

  • 🏠 Lokal zuerst – Ihre Hosts, Schlüssel und Verlauf verlassen nie Ihren Rechner; kein Pflicht-Cloud-Konto, keine Telemetrie.

Related MCP server: SentryFrogg MCP Server

🏗 Architektur

Die gesamte SSH/SFTP/VNC-Logik befindet sich im Hauptprozess. Der Renderer ist vollständig sandboxed (contextIsolation: true, nodeIntegration: false, sandbox: true) und kommuniziert nur über einen typisierten, Zod-validierten IPC-Vertrag (src/shared/ipc.ts) mit ihm.

flowchart LR
    subgraph R["Renderer (sandboxed, no Node)"]
        UI["React 19 UI<br/>zustand stores"]
        XT["xterm.js<br/>terminal"]
        NV["noVNC<br/>RFB client"]
    end

    subgraph M["Main process"]
        IPC["Typed IPC<br/>Zod-validated contracts"]
        SM["SessionManager<br/>(ssh2: shell, agent,<br/>keys, ProxyJump)"]
        SF["SftpManager +<br/>TransferManager<br/>(streaming queue)"]
        WB["ws-bridge<br/>127.0.0.1, random port,<br/>single-use 30s tokens"]
        VA[("Vault<br/>better-sqlite3 + Drizzle<br/>secrets via safeStorage")]
    end

    RH[("Remote host<br/>sshd · sftp · vncserver")]

    UI <-->|"invoke/handle"| IPC
    XT <-->|"ssh:data:#lt;sessionId#gt; stream"| IPC
    IPC <--> SM
    IPC <--> SF
    SM --- VA
    SF --- SM
    NV -->|"ws://127.0.0.1:#lt;port#gt;/#lt;token#gt;"| WB
    WB -->|"variant B (default):<br/>ssh2 forwardOut → :5900"| SM
    WB -.->|"variant A (opt-in):<br/>direct TCP → :5900"| RH
    SM <-->|"SSH"| RH

Zwei bewusste Ausnahmen von „Geheimnisse bleiben im Hauptprozess“: das gespeicherte VNC-Passwort (für den RFB-Zugangsdaten-Handshake) und das gespeicherte RDP-Passwort (für den IronRDP-Client) werden im Hauptprozess entschlüsselt und an den Renderer zurückgegeben. Keines von beiden ist derzeit an einen offenen Tab gebunden oder ratenbegrenzt – siehe Bekannte Einschränkungen.

🚀 Schnellstart

npm install        # also applies the better-sqlite3 patch + rebuilds native deps
npm run dev        # electron-vite dev server + Electron window, HMR

Erster Start: npm install && npm run dev öffnet eine nutzbare App – es gibt keine Lizenzprüfung, keinen Sitz und kein Konto. Siehe CONTRIBUTING.md für das vollständige Entwicklungssetup, einschließlich des better-sqlite3-ABI-Schritts, den Sie benötigen, bevor npm test ausgeführt werden kann.

Skript

Was es tut

npm run dev

electron-vite-Entwicklungsserver + Electron-Fenster

npm run build

Typprüfung (TS strict) + Produktions-Build nach out/

npm run lint / lint:fix

biome-Check (Format + Lint)

npm test

vitest (Unit + Integration)

npm run test:coverage

vitest mit v8-Abdeckung

npm run dist

Build + electron-builder (dmg / NSIS / AppImage)

npm run dist erzeugt dist/TermDesk-<version>-arm64.dmg auf Apple-Silicon-macOS (verifiziert, dass es startet). Siehe INSTALL.md für Download- und Installationsanweisungen pro Betriebssystem.

🧪 Dev-Testumgebung

Ein einzelner Docker-Container bietet SSH + TigerVNC für lokale Tests – keine echten Server nötig:

npm run test:keys                                  # throwaway SSH keys (untracked)
docker compose -f docker-compose.test.yml up -d

Dienst

Endpunkt

Zugangsdaten

SSH

127.0.0.1:2222

testuser / testpass123, oder die generierten Schlüssel in .test/ (test_key, test_key_enc)

VNC

127.0.0.1:5901 (direkt oder über den SSH-Tunnel – derselbe Container)

testvncpass

E2E-Smoke-Test-Harnesses

Fünf eigenständige End-to-End-Suiten laufen in der echten Electron-App (die ersten vier gegen den Docker-Container; die MCP-Suite benötigt keine externen Dienste). Jede gibt bei Erfolg einen *_OK-Marker aus:

Befehl

Beweist

Verifiziertes Ergebnis

TERMDESK_SMOKE=vault npx electron .

Geheimnisse werden vor dem Speichern mit safeStorage verschlüsselt; kein Klartext in SQLite; nie an den Renderer zurückgegeben

VAULT_SMOKE_OK

TERMDESK_SMOKE=ssh npx electron .

Echte Logins mit Passwort, Schlüssel und Schlüssel + verschlüsselter Passphrase

SSH_SMOKE_OK

TERMDESK_SMOKE=sftp npx electron .

1-GB-Upload + Download mit RSS-Überwachung (Spitze 259 MB – unter dem 300-MB-Budget) und 500-Dateien-Ordner-Upload

SFTP_SMOKE_OK

TERMDESK_SMOKE=vnc npx electron .

RFB-Handshake sowohl direkt als auch über den SSH-Tunnel; gefälschte Token-Verbindungen abgelehnt; Token sind Einmal-Token

VNC_SMOKE_OK

TERMDESK_SMOKE=mcp npx electron .

Token-geschützter MCP-Server startet auf Loopback; ein gefälschtes Bearer-Token wird abgelehnt

MCP_SMOKE_OK

✅ Tests

npm test                # 637 unit/integration tests across 69 files — all green
npm run test:coverage   # v8 line coverage: 36.82% (2340/6355 lines)

Vitest führt Renderer-Tests unter jsdom (Testing Library) und alles andere unter node aus. Die Abdeckung konzentriert sich auf das, was zählt – reine Logik ist hoch, während Prozess-Kleber und UI-Shells von den fünf E2E-Smokes statt von Unit-Tests abgedeckt werden.

  • Hoch (Zeilen): shared 97,1 % — der Zod-IPC-Vertrag, von dem jeder Prozess abhängt — renderer/lib 97,5 %, main/store 81,4 % (db, hosts-repo, settings und snippets-repo bei oder nahe 100 %), ssh-util 100 %, der ~/.ssh/config-Parser und sein Include-Auflöser im hohen 90er-Bereich.

  • Niedrig und stattdessen durch die Smokes abgedeckt: main/ipc-Handler-Kleber 9,8 %, session-manager und sftp-manager/transfer-manager 0 %, vnc-manager und die UI-Hüllen (SftpTab, TerminalView, VncTab, Layout und die Seitenleisten-Panels) niedrig oder null. Dabei handelt es sich um Prozess-Kleber und Electron/DOM-Hüllen; die TERMDESK_SMOKE-Harnesse üben sie Ende-zu-Ende gegen einen echten Server aus. Einstiegspunkte und *-smoke.ts-Dateien sind per Konfiguration von der Abdeckung ausgeschlossen.

Build + Typecheck + Lint sind sauber, und ein gestarteter Dev-Lauf protokolliert null Fehlerzeilen.

⌨️ Tastaturkürzel

Kürzel

Aktion

⌘/Ctrl+K

Befehlspalette (Fuzzy-Hostsuche + Befehle)

⌘/Ctrl+T

Neue Sitzung (öffnet die Palette)

⌘/Ctrl+W

Aktiven Tab schließen

⌘/Ctrl+F

Im Terminal suchen

⌘/Ctrl+Shift+C/V

Kopieren/Einfügen im Terminal

⚙️ Einstellungen

Design (dunkel, hell oder System — folgt der prefers-color-scheme des Betriebssystems), Terminal-Schriftgröße/-familie, SSH-Keepalive-Intervall — gespeichert als einfaches JSON in userData/settings.json (niemals Geheimnisse).

📡 Funktionsdetails

SSH-Terminal

  • Die gesamte ssh2-Logik läuft im Hauptprozess (src/main/ssh/session-manager.ts); der Renderer sieht nur eine typisierte Stream-API. Ausgabeströme auf ssh:data:<sessionId>; frühe Ausgabe wird gepuffert, bis sich das Terminal anhängt.

  • Authentifizierung: Tresor-Passwort (mit keyboard-interactive-Fallback), privater Schlüssel (+ verschlüsselte Passphrase) oder SSH-Agent (SSH_AUTH_SOCK, Windows-OpenSSH-Pipe). Geheimnisse werden nur zum Verbindungszeitpunkt entschlüsselt.

  • Hostschlüssel: Beim ersten Verbinden wird ein SHA256-Fingerabdruck-Genehmigungsdialog angezeigt und in der known_hosts-Tabelle gespeichert; eine Abweichung blockiert die Verbindung hart.

  • ProxyJump-Ketten (user@jump:port,next) über verkettete forwardOut; Keepalive 15 s.

SFTP

  • SFTP-Sitzungen nutzen die aktive SSH-Verbindung eines offenen Terminals zum selben Host wieder (kein zweiter Login) und fallen auf eine dedizierte Verbindung ohne Shell zurück.

  • Übertragungen streamen Stück für Stück (konstanter Speicher — 1 GB unter 300 MB RSS verifiziert) und sind abbrechbar/wiederholbar; Ordner-Drops laden rekursiv mit erhaltener Struktur hoch.

  • Bearbeiten an Ort und Stelle lädt in eine temporäre Datei herunter, öffnet den Betriebssystem-Editor und lädt beim Speichern automatisch hoch.

VNC

  • noVNC rendert im Renderer; es spricht WebSocket zu einer Brücke im Hauptprozess, die an 127.0.0.1 auf einem zufälligen Port gebunden ist. Jede Verbindung erfordert ein Einmal-Token mit 30 s Gültigkeit — andere lokale Prozesse können die Brücke nicht mitbenutzen (daher ws://127.0.0.1:* in der CSP).

  • Standardtransport ist ein SSH-forwardOut-Kanal (Variante B — Port 5900 wird nie exponiert), der eine aktive Terminalverbindung zum Host wiederverwendet, wenn eine vorhanden ist; einfaches TCP (Variante A) ist pro Host optional.

  • Die gespeicherten VNC- und RDP-Passwörter werden im Hauptprozess entschlüsselt und für die jeweiligen Clients an den Renderer zurückgegeben — die beiden dokumentierten Ausnahmen von „Geheimnisse bleiben im Hauptprozess".

  • Symbolleiste: lokale Skalierung / Remote-Größenänderung umschalten, Zwischenablage einfügen, Strg+Alt+Entf, Vollbild, Neuverbinden (jedes Neuverbinden stellt ein frisches Token + Tunnel bereit).

Tresor

  • Hosts, Gruppen, Snippets und known_hosts liegen in SQLite (better-sqlite3 + Drizzle) im userData-Verzeichnis der App.

  • Passwörter/Passphrasen werden mit safeStorage (Betriebssystem-Schlüsselbundschlüssel) im Hauptprozess verschlüsselt, sobald sie eintreffen; nur Chiffrat-Blobs berühren die Datenbank, und Geheimnisse werden nie an den Renderer zurückgesendet.

  • Der ~/.ssh/config-Import parst Host/HostName/Port/User/IdentityFile/ProxyJump, löst Include-Direktiven auf (Tilde-/relative/absolute Pfade und Globs, mit Zyklus-/Tiefen-/Größen-Schutz) und führt Host */Wildcard-Standardwerte mit OpenSSH-Erste-gewonnene-gewinnt-Reihenfolge zu konkreten Hosts zusammen.

🔐 Sicherheits-Checkliste

  • contextIsolation: true, nodeIntegration: false, sandbox: true — der Renderer und Preload berühren nie Node.

  • Strenge CSP über Meta-Tag: script-src 'self', kein unsafe-eval, kein Remote-Modul; connect-src erlaubt nur 'self' und Loopback-WebSockets (die token-gesteuerte VNC-Brücke). Nur-Entwicklung-Lockerung erfolgt über ein Vite-Plugin, das bei Abweichung laut scheitert.

  • webSecurity: true; Navigation ursprungsgeprüft; window.open verweigert (externes https: → Systembrowser); <webview> blockiert; Berechtigungsanfragen standardmäßig verweigert.

  • Jede IPC-Nutzlast wird mit Zod validiert (src/shared/ipc.ts ist der einzige Vertrag); Aufrufergebnisse sind Ende-zu-Ende über IpcInvokeMap typisiert.

  • Geheimnisse (SSH-/VNC-Passwörter, Schlüssel-Passphrasen) werden mit safeStorage im Hauptprozess verschlüsselt, sobald sie eintreffen; nur Chiffrat wird persistiert; Entschlüsselung erfolgt zum Verbindungszeitpunkt und Referenzen werden sofort verworfen. Verifiziert durch TERMDESK_SMOKE=vault. Zwei dokumentierte Ausnahmen: Die VNC- und RDP-Passwörter gelangen für ihre Protokoll-Clients in den Renderer (siehe Bekannte Einschränkungen).

  • Fehler, die IPC überqueren, werden bereinigt (nur erste Zeile, keine Stacks/Pfade); Geheimnisse werden nie protokolliert.

  • Sitzungen, SFTP-Handles, Übertragungen und Hostschlüssel-Aufforderungen sind auf die WebContents beschränkt, die sie erstellt haben, und werden abgeräumt, wenn diese zerstört wird.

  • Hostschlüssel: SHA256-Fingerabdruck-Genehmigung beim ersten Verbinden, harte Blockierung bei Abweichung — für das endgültige Ziel und jeden ProxyJump-Hop.

  • Aktivitätsprotokoll ist nur Metadaten: Betriebssystem-Benutzername, geheimnistragende Befehls-Tokens redigiert, 90-Tage-Bereinigung.

  • Optionales Master-Passwort (Argon2id-abgeleitete zweite Verschlüsselungsebene) — verschoben, als zukünftige Erweiterung erfasst.

Siehe SECURITY.md für das vollständige Sicherheitsmodell, die bekannten Einschränkungen und die Richtlinie zur Offenlegung von Schwachstellen.

📂 Projektstruktur

src/
  main/                  # Electron main process — all SSH/SFTP/VNC logic lives here
    ipc/                 # IPC handlers per domain (ssh, sftp, vnc, hosts, …)
    ssh/                 # session-manager, ssh-config-parser, ssh-util (+ smoke)
    sftp/                # sftp-manager, transfer-manager, edit-watch (+ smoke)
    vnc/                 # ws-bridge, vnc-manager (+ smoke)
    store/               # Drizzle + better-sqlite3, secrets (safeStorage), settings
  preload/               # contextBridge — typed, minimal API surface (window.api)
  renderer/              # React UI (no Node access)
    components/{layout,hosts,terminal,sftp,vnc,snippets,ui}/
    hooks/  stores/  lib/
  shared/                # IPC channel contracts + Zod schemas shared by all processes

🗺 Bekannte Einschränkungen / Roadmap

  • Master-Passwort — optionale Argon2id-abgeleitete zweite Verschlüsselungsebene über dem Tresor; verschoben.

  • Playwright-Smoke-Test (App starten → Host hinzufügen → Mock-Verbindung) — verschoben; die fünf TERMDESK_SMOKE-Harnesse decken e2e heute ab.

  • ~/.ssh/config-ImportMatch-Blöcke und Token-Expansion (%h/%p) werden noch übersprungen; Cloud-Provider-Inventarimport (AWS/GCP) ist nicht implementiert.

Siehe SECURITY.md für die Härtungs-Roadmap.

🔧 Hinweise zu nativen Modulen

  • better-sqlite3 benötigt einen Quell-Patch, um gegen Electrons V8 zu kompilieren (noch keine Upstream-Prebuilds) — wird automatisch über patch-package bei npm install angewendet (patches/better-sqlite3+12.10.0.patch).

  • cpu-features (optionale native ssh2-Abhängigkeit) wird in package.json auf noop2 überschrieben, um einen unnötigen nativen Build zu vermeiden; ssh2 fällt auf seinen reinen JS-Pfad zurück.

🤝 Mitwirken

Issues und Pull Requests sind willkommen. CONTRIBUTING.md enthält das Entwicklungssetup — einschließlich der beiden nativen Modul-Fallen, die dir sonst einen Nachmittag kosten — die Invarianten, die neuer Code einhalten muss, und die Pre-PR-Checkliste. Beiträge sind inbound=outbound MIT: kein CLA, keine Urheberrechtsabtretung.

Die Teilnahme unterliegt dem Code of Conduct. Sicherheitsprobleme laufen über den privaten Kanal in SECURITY.md, niemals über ein öffentliches Issue.

📄 Lizenz

Der Quellcode in diesem Repository ist unter der MIT-Lizenz veröffentlicht — siehe LICENSE. Du darfst ihn verwenden, modifizieren und weiterverbreiten, auch kommerziell, solange der Urheberrechtshinweis und der Lizenztext mitgeführt werden.

Die vorgebauten Installer auf der Releases-Seite sind zusätzlich durch EULA.txt abgedeckt, das diese Binärdateien regelt; ein Build, den du selbst aus diesem Quellcode erstellst, unterliegt ausschließlich LICENSE.

Es gibt keine Lizenzprüfung, Sitzungsaktivierung oder Konto in diesem Client: das kommerzielle Lizenzierungssubsystem wurde entfernt, als der Quellcode veröffentlicht wurde, sodass das, was du aus diesem Repository baust, die gesamte Anwendung ist.

Diese Grenze wird im Code durchgesetzt, nicht nur hier beschrieben: die EULA-Aufforderung beim ersten Start wird nur in die eigenen Release-Builds des Projekts kompiliert, sodass ein npm run dist eines Forks, ein Distro-Paket oder dein eigener Installer sie nie anzeigt.

Drittanbieter-Abhängigkeiten behalten ihre eigenen Lizenzen, aufgelistet in THIRD-PARTY-NOTICES.md. Eine davon trägt eine Verpflichtung, die erwähnenswert ist: @novnc/novnc ist MPL-2.0 und dieses Repository patcht es (patches/@novnc+novnc+1.7.0.patch), sodass diese Modifikation hier unter MPL-2.0 zusammen mit dem restlichen Quellcode veröffentlicht wird.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables SSH interactive session management through MCP, supporting commands, menus, and session lifecycle operations.
    1
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that provides SSH tools (read-only probes and arbitrary exec) to a fleet of hosts outside Kubernetes, with an inventory-based allowlist and key-based authentication.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/konraddzbik/termdesk'

If you have feedback or need assistance with the MCP directory API, please join our Discord server