selbst gehostet · Ende zu Ende verschlüsselt

Deine Server.
Deine Schlüssel.
Ein Server, der nichts weiß.

tessera ist ein SSH- und SFTP-Client, der Hosts, Snippets und Schlüssel zwischen deinen Geräten abgleicht — verschlüsselt auf dem Gerät, entschlüsselt auf dem Gerät. Dazwischen liegt nur Ciphertext. Kein Master-Passwort, kein fremdes Konto, keine Telemetrie.

975 automatische Tests Windows und Android auch ohne Server nutzbar

web-01 db-primary jump-fra
deploy › root › postgres

Das Versprechen

Der Server sieht niemals Klartext

Nicht „wir schauen nicht hin“, sondern „wir können nicht“. Es gibt keinen Endpunkt, der etwas entschlüsselt, und keinen Schlüssel, der jemals das Gerät verlässt.

auf deinem Gerät

host: "db-primary"
user: "deploy"
addr: "10.4.0.12:22"
key: "ed25519-prod"
jump: "jump-fra"
env: { STAGE: "prod" }

in der Datenbank des Servers

7f3a91c2e0b4d85a1c6f20be97d3140a8e5b7c2d9f01a4e6 3b8d5027ce194fa6b0d73e8295c14607fa2b93de5081c7e4 a6013f9b7d2c48e50a9f16bd3e720c85419d6fa03b28ce7d 05c8b2f47a1e693d0fb85c27ae4130d96e2b7f8a4c150d3b

Was der Server bekommt

Ciphertext. Ein Blob je Datensatz, gebunden an ID, Typ und Epoch.
Metadaten für den Delta-Sync. ID, Typ, Epoch, Uhr, Sequenznummer, Zeitstempel.
Öffentliche Geräteschlüssel. Und den Namen, den du dem Gerät gegeben hast.

Was er nie bekommt

Hostnamen, Benutzer, Passwörter. Sie stehen im Klartext nur auf deinen Geräten.
Private SSH-Schlüssel. Sie gehen nur Ende-zu-Ende-verschlüsselt über die Leitung — und wahlweise gar nicht.
Den Vault Key. Er liegt im Secure Storage deiner Geräte und im Wiederherstellungscode. Sonst nirgends.

Vollständiges Bedrohungsmodell lesen →

Was drin ist

Ein Werkzeug, das die Arbeit kennt

Jede Entscheidung in tessera hat einen Grund, und der steht in der Doku. Nichts davon ist eine Funktionsliste zum Abhaken.

Terminal mit Verstand

Strg+C kopiert, wenn etwas markiert ist, und bricht ab, wenn nicht. Kopiert wird ohne Rand: Die Auffüllung, mit der ein Terminal jede Zeile bis zum Rand ausfüllt, bleibt draußen. Rechtsklick fügt ein wie in PuTTY. Eingefügter Text wird von Steuerzeichen befreit — Paste-Injection ist ein realer Angriffsweg.

Windows im selben Fenster

Remote Desktop als zweiter Verbindungstyp: dieselbe Hostliste, dieselben Zugänge, dieselbe Verschlüsselung. Die Auflösung folgt dem Fenster, damit nichts umgerechnet werden muss — und ein Rechner hinter einem Linux-Server ist über denselben Sprunghost erreichbar wie eine SSH-Sitzung. Die Zwischenablage geht in beide Richtungen, mit Text, Dateien und ganzen Ordnern.

Snippets, die wissen, wo sie gelten

Gebunden an einen Host, eine Gruppe, ein Tag — oder an nichts. Drei Buchstaben in der Palette genügen. Platzhalter werden vor dem Ausführen abgefragt und geshell-quotet: aus wildfly; reboot wird ein Argument, kein zweiter Befehl.

Schlüsselbund

ed25519 erzeugen, auf mehrere Hosts ausrollen, wieder austragen. Wiederholbar: zweimal ausgeführt steht die Zeile einmal da.

Dateien in zwei Spalten

Links dieses Gerät, rechts der Host — als eigener Reiter neben der Shell oder in der Spalte daneben. Links geht auch ein zweiter Server: kopiert wird dann direkt zwischen beiden. Ziehen und Ablegen in beide Richtungen, bis in den Explorer hinein. Häufige Ordner liegen als Lesezeichen bereit — lokal und je Server. Übertragen wird nacheinander, geschrieben erst in .tessera-part und dann umbenannt.

Weiterleitung und Sprunghost

-L, -R, -D wie bei OpenSSH, am Host hinterlegt. Ketten über mehrere Sprunghosts sind erlaubt, Ringe werden abgefangen.

Updates mit Unterschrift

tessera sieht beim Start nach, ob es eine neue Fassung gibt — eine Anfrage, ohne Kennung. Ein Klick lädt sie und setzt sie ein. Unter Windows nur mit gültiger minisign-Signatur, unter Android prüft das System den Schlüssel. Abschaltbar.

Hosts, Gruppen, Tags

Gruppen liegen ineinander, zugeordnet wird mit der Maus. Eine Gruppe unter ihre eigene Untergruppe zu ziehen leuchtet gar nicht erst auf. Import aus OpenSSH-Config und PuTTY inklusive.

Benutzerwechsel, den man sieht

Strg+Umschalt+U holt die Benutzerliste vom Host und wechselt in eine Untershell. Ein Band über dem Terminal zeigt, als wer du gerade arbeitest — und nimmt dafür Platz weg, statt sich darüberzulegen.

Der Klassiker

Strg+C kopiert. Und bricht ab. Beides richtig.

In jedem anderen Programm kopiert diese Taste, im Terminal sendet sie SIGINT. tessera entscheidet über den Selektionszustand. Probier es aus — links drücken, rechts steht, was wirklich hinausgeht.

Der Zustandsautomat ist eine reine Funktion und hat eine eigene Regressionssuite. Die Kürzel, die readline gehören — Strg+A, Strg+K, Strg+U — werden nie umbelegt. Und was kopiert wird, wird vorher beschnitten: Leerraum am Zeilenende stammt aus der Auffüllung des Terminals und nicht aus dem Text. Ganze Tabelle in der Doku →

Was auf die Leitung geht

Kopplung

Zwei Hälften, die zueinander passen

Eine tessera hospitalis war ein Token, das in zwei Hälften gebrochen wurde — zusammengefügt bewiesen die Bruchkanten die Identität. Genau das tut die Gerätekopplung: sechs Ziffern auf beiden Bildschirmen, verglichen von einem Menschen.

Arbeitsrechner · eingerichtet

000 000

Notebook · neu

000 000

SAS wird abgeleitet …

Der Server vermittelt nur

Wer sich dazwischensetzt, kann Schlüssel austauschen — aber nicht dafür sorgen, dass beide Seiten dieselben sechs Ziffern sehen. Stimmen sie nicht, bricht man ab. Der gewrappte Vault Key wird erst hinterlegt, nachdem der Vergleich bestätigt wurde.

Konflikte lösen sich von selbst

Eine Hybrid Logical Clock ordnet jede Änderung. Beide Seiten setzen dieselbe Regel durch: Der Client entscheidet lokal, der Server weist einen Push zurück, dessen Uhr nicht neuer ist als der gespeicherte Stand.

Ohne Server geht es auch

Der Abgleich ist freiwillig. Wer keinen Server hat, wählt bei der Einrichtung Ohne Server nutzen und hat sofort einen vollständigen Client — nur bleibt dann alles auf diesem Gerät, samt der Konsequenz: kein zweites Gerät, kein Wiederherstellungscode. Nachrüsten geht jederzeit, und alles Angelegte geht beim ersten Abgleich verschlüsselt mit hoch.

Ein Gerät entziehen wirkt sofort

Entzug allein reicht nicht — das Gerät kennt den Vault Key ja schon. Erst die Epoch-Rotation macht ihn wertlos: neuer Schlüssel, neue Wraps, alle Datensätze neu verschlüsselt, in einem Zug. Bis das geschehen ist, steht ein roter Balken über der Geräteliste.

Der Start hängt nicht am Server

Der entschlüsselte Arbeitsstand liegt lokal, also steht die Hostliste, bevor irgendwer geantwortet hat — die Sitzung zum Server holt tessera nach, während man schon arbeitet. Ist der Server weg, fehlt der Abgleich und sonst nichts: verbinden, übertragen, Snippets, Schlüsselbund laufen weiter, und Änderungen gehen hoch, sobald er wieder da ist.

Dateien

Kein halbes Dokument, das aussieht wie ein ganzes

Übertragen wird nacheinander und immer erst in eine Datei mit der Endung .tessera-part. Umbenannt wird erst, wenn das letzte Byte angekommen ist.

db-primary Dateien · db-primary
dieses GerätC:\Sicherungen
..
sicherung.tar.gz 418 MB
nginx.conf 3,1 KB
notizen.md 840 B
db-primary/var/backups
..
sicherung.tar.gz.tessera-part 8,4 MB/s · noch 50 s
sicherung (2).tar.gz 402 MB
dump-2026-08-19.sql 96 MB

Überschrieben wird nichts. Gibt es den Namen schon, wird hochgezählt — und zwar vor der Endung: aus sicherung.tar.gz wird sicherung (2).tar.gz.

Gelöscht wird nicht rekursiv. Ein rm -rf mit einem Klick ist die Art Bequemlichkeit, die man genau einmal bereut. Übertragen dagegen schon: ganze Ordner gehen in beide Richtungen, ohne Verknüpfungen zu verfolgen.

Ziehen geht auch nach draußen. Eine Zeile vom Host auf den Schreibtisch gezogen lädt sie herunter, eine Datei aus dem Explorer auf die rechte Spalte lädt sie hoch. Nach draußen ist es ein Versprechen statt einer Kopie: Der Zug beginnt sofort, den Inhalt ruft das Ziel erst nach dem Loslassen ab. Dort schreibt dann der Explorer — und nur dort gilt .tessera-part nicht.

Auch auf dem Telefon

Strg auf einem Gerät ohne Strg

Eine Bildschirmtastatur hat kein Esc, kein Tab und keine Zusatztasten. Ohne sie kommt man in vi nicht aus dem Einfügemodus heraus und bricht keinen laufenden Befehl ab. Die Leiste darüber ist der Unterschied zwischen einem Terminal und einer Textanzeige — tipp erst strg, dann einen Buchstaben.

9:41web-01
deploy@web-01:~$ tail -f /var/log/syslog
Tipp unten auf strg und danach auf c.

Vorgemerkt, nicht gehalten

Ein Finger ist entweder auf der Leiste oder auf dem Buchstaben — halten geht nicht. Also merkt die Leiste vor: Ein Tipp auf strg färbt sie ein, der nächste Buchstabe geht als Steuerzeichen hinaus, danach ist die Vormerkung weg. Genauso machen es Termux und Blink.

strg+2 ist dabei kein Kuriosum, sondern NUL: Die Ziffern stehen für die Zeichen, die auf einer amerikanischen Tastatur mit Umschalt auf ihnen liegen. Ohne diese Zeile wäre 0x00 auf einer Bildschirmtastatur unerreichbar.

Griffe an der Markierung

Langes Drücken markiert ein Wort. Damit es nicht dabei bleibt, hängen an beiden Enden Griffe: einer links unter dem Anfang, einer rechts unter dem Ende. Umschalt zum Erweitern gibt es hier nicht und eine Maus auch nicht — ohne die Griffe wäre die Markierung genau so groß, wie der Finger sie getroffen hat.

Eine Oberfläche, nicht zwei

Es gibt keine „Mobil-Version“. Es gibt drei Breitenklassen und die Frage, ob mit dem Finger oder mit einem Zeiger bedient wird. Ein schmales Desktop-Fenster bekommt dasselbe Layout wie ein Tablet im Hochformat — der Platz ist derselbe.

Was auf dem Desktop auf einem Kürzel liegt, hat hier einen sichtbaren Weg: Suche, Palette, Snippets und Benutzerwechsel stehen im Menü der Leiste. Ein Kürzel auf einem Gerät ohne Tasten ist keine Funktion, sondern eine Sackgasse.

Alles zur mobilen Fassung →

0

Tests im Client, ein Lauf unter einer Minute

0

Tests im Server, inklusive IDOR-Suite

0

direkte Pakete im Server, als Budget

0

Zeilen Telemetrie

Selbst hosten

Ein Ubuntu, eine MariaDB, zehn Minuten

Der Sync-Server ist Node.js mit Fastify und läuft unter systemd hinter nginx. Kein Docker im Produktivbetrieb, kein Runner, kein fremder Dienst. Das Installationsskript ist idempotent: derselbe Aufruf richtet ein und aktualisiert.

Für den reinen SSH- und SFTP-Betrieb brauchst du überhaupt keinen Server. Der Sync ist eine Zugabe, keine Voraussetzung.

Zur Installationsanleitung

Server aufsetzen
# Node 22+, MariaDB 11, nginx vorausgesetzt
git clone <dein-repo> tessera
cd tessera
sudo ./deploy/install.sh

# TLS holt certbot
sudo certbot --nginx -d sync.example.org

# Läuft es?
curl -s https://sync.example.org/healthz
# {"status":"ok"}

Plattformen

Windows zuerst, der Rest folgt aus derselben Codebasis

Nichts Plattformabhängiges steht direkt im Code — alles liegt hinter einer Abstraktion. Eine neue Plattform ergänzt eine Implementierung, sie gabelt keinen zweiten Client ab.

Windows Referenzplattform · verfügbar
Android wenig getestet · verfügbar
Linux & macOS vorbereitet · ungebaut
iOS Code vollständig · Unveröffentlicht

Häufige Fragen

Was Leute zuerst fragen

Sieht der Server meine Zugangsdaten?

Nein. Jeder Datensatz wird auf dem Gerät mit XChaCha20-Poly1305 verschlüsselt. Der Server speichert Ciphertext und die Metadaten, die der Delta-Sync braucht: ID, Typ, Epoch, Uhr und Sequenznummer. Kein Endpunkt entschlüsselt etwas — es gibt schlicht keinen Code dafür.

Aus den Metadaten lässt sich ablesen, wie viele Hosts und Snippets es gibt und wann sie zuletzt geändert wurden. Nicht, welche. Das ist eine bewusst getroffene und dokumentierte Entscheidung.

Gibt es ein Master-Passwort?

Nein. Geräte authentifizieren sich mit Ed25519-Schlüsseln aus dem Secure Storage des Betriebssystems. Neue Geräte kommen über eine Kopplung mit Ziffernvergleich dazu. Als Rückfalltür gibt es einen Wiederherstellungscode aus 256 Bit Zufall, der genau einmal angezeigt wird.

Was passiert, wenn ich ein Gerät verliere?

Entziehen und rotieren. Die Rotation erzeugt einen neuen Vault Key, gibt ihn jedem verbliebenen Gerät, verschlüsselt alle Datensätze neu und lädt das in einem Zug hoch — der Server nimmt es nur vollständig an.

Ehrlich gesagt: Was das verlorene Gerät bereits gesehen hat, kann es weiterhin entschlüsseln. Vergangenheit lässt sich nicht zurückholen. Neue Daten sieht es nicht mehr.

Brauche ich einen eigenen Server?

Nur für den Abgleich zwischen mehreren Geräten. Als reiner SSH- und SFTP-Client läuft tessera vollständig ohne Server. Nach außen geht dann nur noch der Blick auf latest.json, ob es ein Update gibt — und der lässt sich in den Einstellungen abschalten.

Ist mein privater SSH-Schlüssel im Sync?

Nur wenn du es willst. Pro Schlüssel lässt sich der Abgleich abschalten — ein Produktivschlüssel darf auf dem Laptop bleiben, während alles andere synchronisiert wird. Angezeigt, kopiert oder exportiert wird der private Teil nie: Was auf dem Bildschirm steht, landet früher oder später in einem Screenshot.

Welche Plattformen werden unterstützt?

Windows und Android. Beide kommen aus derselben Codebasis; alles Plattformabhängige liegt hinter einer Abstraktion, und die Oberfläche ist eine — sie richtet sich nach dem Platz und nach der Bedienart, nicht nach dem Betriebssystem.

Linux und macOS sind vorbereitet. Das iOS-Projekt ist vollständig, wurde mangels Mac aber noch nie gebaut — das steht hier so, weil „unterstützt“ und „schon einmal kompiliert“ zwei verschiedene Aussagen sind.

Lies zuerst, wie es funktioniert.

Die Doku ist kein Anhang. Sie erklärt jede kryptografische Konstruktion, jede Tastenbelegung und jede bewusst nicht getroffene Entscheidung.

Dokumentation öffnen