Planche-Dokumentation
Ein praktischer Leitfaden zu Planche mit den Ansichten, die Sie in der App sehen. Alle Screenshots verwenden die Beispieldatenbank, die sich direkt im Browser öffnen lässt.
Erste Schritte
Planche ist ein Datenbank-Client im Browser. SQLite-Dateien öffnen Sie direkt in der Seite; MySQL, PostgreSQL und andere Netzwerkdatenbanken verbinden Sie über einen Agenten auf Ihrem Rechner. Beide Wege lassen sich parallel nutzen.
SQLite-Dateien: nichts zu installieren
Ziehen Sie eine .sqlite-, .db- oder .sqlite3-Datei auf die Seite (oder wählen Sie eine im Startbildschirm). Sie wird von SQLite, nach WebAssembly kompiliert, innerhalb der Seite geladen; die Datei wird nie hochgeladen. Änderungen lassen sich in die Originaldatei zurückschreiben, wenn Ihr Browser die File System Access API unterstützt, sonst laden Sie eine Kopie herunter.
MySQL, PostgreSQL, SQL Server, Oracle, Neon, Supabase, Cloudflare D1: ein Befehl
Ein Browser kann keine TCP-Verbindung direkt zu einer Datenbank aufbauen. Dafür sorgt ein lokaler Agent:
npx planche
Der Agent startet auf 127.0.0.1:8888, und gibt einen Kopplungslink aus, den Sie öffnen (mit --open öffnet er ihn selbst im Browser). Dieser Link enthält einen einmal gültigen Code, den die App gegen das Token des Agenten tauscht. Das Token erscheint dadurch weder in einer URL noch in der Shell-History. Danach kommuniziert der Browser nur mit 127.0.0.1; der Agent verbindet sich mit der Datenbank. Host, Benutzername und Passwort bleiben auf Ihrem Rechner.

Der Agent braucht Node.js 22 oder neuer. npx lädt ihn aus der npm-Registry und führt ihn aus. npx planche@latest startet die aktuelle Version; ersetzen Sie latest durch eine Versionsnummer, wenn Sie eine bestimmte Version benötigen.
Installieren statt npx
Kein Node.js auf dem Rechner – oder hätten Sie lieber einen dauerhaften Befehl? Eine Zeile installiert den Agenten:
macOS, Linux
curl -fsSL https://planche.dev/install.sh | shWindows
irm https://planche.dev/install.ps1 | iexAlles landet in Ihrem Home-Verzeichnis, und nichts fragt nach Administratorrechten. Ist Node.js 22 oder neuer bereits vorhanden, wird es verwendet; andernfalls lädt das Skript eine eigene Kopie der offiziellen Laufzeitumgebung und prüft sie gegen die Prüfsummen, die nodejs.org dazu veröffentlicht. Danach ist planche ein Befehl in Ihrem PATH, der ohne Umweg über die Registry sofort startet. Zum Abschluss startet das Skript den Agenten gleich selbst, sodass der allererste Start nichts weiter braucht – eine Shell übernimmt einen neuen PATH erst in einem neuen Terminal.
Aktualisieren mit planche upgrade, entfernen mit planche uninstall – Ihre Einstellungen unter ~/.planche bleiben in beiden Fällen erhalten. Gibt es eine neuere Version, sagt der Agent höchstens einmal täglich Bescheid; PLANCHE_NO_UPDATE_CHECK=1 schaltet das ab. Die Installationsskripte sind reiner Text, Sie können sie also vorher lesen: curl -fsSL https://planche.dev/install.sh -o install.sh.
Ist planche.dev nicht erreichbar, etwa ohne Internet oder in einem gesperrten Netz, erkennt der Agent das beim Start und stellt die mitgelieferte App unter seiner eigenen Adresse bereit. Davon ausgenommen ist nur die Beispieldatenbank. Die App hat dann denselben Versionsstand wie der Agent; mit npx planche@latest aktualisieren Sie beide.
Abgeschottete Netze ohne Internet
Nur ein Schritt braucht die Außenwelt: npx holt den Agenten aus der npm-Registry. Wo das gesperrt ist, installieren Sie ihn einmal auf einem Rechner mit npm-Zugang (npm i -g planche), oder erzeugen Sie mit npm pack planche ein Tarball, das Sie hineinkopieren oder in eine interne Registry stellen.
Danach verlässt nichts mehr das Netz. Der Agent liefert die App unter seiner eigenen Adresse aus, und diese Seite stellt überhaupt keine Anfragen außerhalb Ihres Rechners – Editor, SQLite-Engine und sämtliche Symbole gehören zum Bündel, es gibt kein CDN, keine Web-Schrift und keine Statistik. Mit --serve-app überspringen Sie die Erreichbarkeitsprüfung und liefern von Anfang an lokal aus; das ist auch der richtige Schalter, wenn das Netz Anfragen verschluckt statt sie abzulehnen (ein Captive Portal etwa antwortet auf jede Adresse).
Verzichten müssen Sie nur auf das, was wirklich Internet braucht: die gehosteten Dienste (Neon, Supabase, Cloudflare D1), SSH zu unerreichbaren Hosts und die Beispieldatenbank. Datenbanken innerhalb des Netzes – bis hin zu einem Gateway für das ganze Team – funktionieren genau wie überall sonst.
Die Arbeitsfläche
In einem Browser-Tab können Sie mehrere Datenbankverbindungen geöffnet halten. Jede Verbindung erhält einen Tab unter der Werkzeugleiste; ein Klick wechselt zu ihr.

Ein Wechsel der Verbindung tauscht die gesamte Arbeitsfläche aus, denn jede Verbindung hält ihren eigenen Zustand. Kommen Sie zu einer Verbindung zurück, finden Sie dieselben Abfrage-Tabs, dasselbe halbfertige SQL und dieselben Ergebniszeilen vor, die Sie dort verlassen haben.
- Schema-Baum (links) – die Datenbanken, Tabellen, Views und Routinen dieser Verbindung. Ein Klick klappt einen Knoten auf, Rechtsklick zeigt die dort möglichen Aktionen.
- Abfrage-Tabs (oben rechts) – je ein SQL-Editor; öffnen Sie so viele Sie brauchen. Ein mit „Open Table“ geöffneter Tab zeigt statt eines Editors die Zeilen der Tabelle in einem Grid.
- Ergebnisbereich (unten) – Message hält fest, was jede Anweisung getan hat (betroffene Zeilen, Fehler, Dauer), daneben liegen Info und History. Für jede zurückgegebene Ergebnismenge kommt ein Result-Tab hinzu.
- Fußzeile – der Name der aktuellen Verbindung, Abzeichen bei Schreibschutz oder offener Transaktion, und die letzte Statusmeldung.
Den Browser zu schließen kostet nichts: Nach dem Neuladen verbinden sich die Verbindungen von selbst wieder, die Abfrage-Tabs und ihr Text sind zurück, und eine aus einer Datei geöffnete SQLite-Datenbank wird aus einer lokalen Kopie wiederhergestellt, noch bevor Sie den Zugriff auf die Datei erneut erteilen.
Mit einer Datenbank verbinden
Öffnen Sie die Verbindungsverwaltung mit Connection › Connect (Alt + N), klicken Sie auf Add New und wählen Sie das DBMS. Das Formular zeigt nur die Felder, die diese Engine benötigt. Test Connection prüft die Angaben, ohne eine Sitzung zu öffnen; Connect öffnet einen Verbindungstab.

Was jede Engine braucht
- MySQL / MariaDB – Host, Port (3306), Benutzer, Passwort. Die Datenbank ist optional; der Baum zeigt alle. Der Zeichensatz ist standardmäßig
utf8mb4. - PostgreSQL – Host, Port (5432), Benutzer, Passwort und eine Datenbank, die Pflicht ist: Eine PostgreSQL-Sitzung kann die Datenbank nicht wechseln. Deren Schemas übernehmen im Baum die Rolle der „Datenbanken“, und Planche wechselt mit
SET search_path. - SQL Server – Host, Port (1433), Login, Passwort, Datenbank. Schemas (
dbo, …) übernehmen die Rolle der „Datenbanken“. Für Azure SQL TLS einschalten; bei einem selbstsignierten Zertifikat Serverzertifikat prüfen ausgeschaltet lassen. - Oracle – Host, Port (1521), Benutzer, Passwort und ein Servicename (zum Beispiel
FREEPDB1). Der Agent nutzt den reinen JavaScript-Thin-Treiber, ein Instant Client muss also nicht installiert werden. Schemas sind die Benutzer, und Planche wechselt mitALTER SESSION SET CURRENT_SCHEMA. - SQLite – wählen Sie, wie geöffnet wird. Im Browser braucht keine Installation und arbeitet auf einer Kopie der Datei im Speicher. Über den Agenten öffnet die Datei mit echtem SQLite auf dem Rechner des Agenten, sodass Sperren und WAL funktionieren und andere Programme dieselbe Datenbank nutzen können; dort geben Sie einen Pfad ein und können die Datei anlegen lassen.
- Neon / Supabase – fügen Sie die Verbindungszeichenfolge aus der Konsole ein, dann füllen sich Host, Benutzer, Passwort und Datenbank von selbst. TLS ist immer an, einen SSH-Schritt gibt es nicht. Verwenden Sie bei Supabase den Session-Pooler (Port 5432) oder die Direktverbindung; Port 6543 ist der Transaction-Pooler, wo jede Anweisung auf einem anderen Backend landen kann, sodass Schemawechsel, temporäre Tabellen und manuelle Transaktionen nicht funktionieren – Planche warnt Sie, wenn Sie ihn wählen.
- Cloudflare D1 – Konto-ID, Datenbank-ID und ein API-Token mit der Berechtigung D1 Edit (D1 Read für schreibgeschützt). Der Agent ruft damit die Cloudflare-REST-API auf; es gibt weder eine TCP-Verbindung noch SSH. Jede Anfrage committet automatisch, daher sind manuelle Transaktionen für D1 deaktiviert.
- Redis – Host, Port (6379), Passwort und ein ACL-Benutzer, falls der Server einen hat (für den Benutzer
defaultleer lassen). Das Datenbankfeld ist die logische Datenbank, in der Sie beginnen (db0). TLS und SSH funktionieren wie bei den SQL-Engines. - Elasticsearch / OpenSearch – Host und Port (9200). Mit Benutzer und Passwort meldet sich Planche per Basic Auth an; bleibt der Benutzer leer, wird das Passwort als API-Key gesendet (das kodierte
id:key). Schalten Sie TLS fürhttpsein; bei einem selbstsignierten Zertifikat, das Elasticsearch 8 standardmäßig verwendet, lassen Sie Serverzertifikat prüfen ausgeschaltet. - Cloudflare DO (wrangler dev) – nur die URL des wrangler-dev-Servers (Vorgabe
http://localhost:8787), ohne Konto-ID, Token oder Passwort. Liest ausschließlich eine lokalewrangler dev-Sitzung, nicht bereitgestellte Durable Objects; jedes Objekt erscheint als eigene Datenbank.
Passwörter, Token und Leitplanken
- Save password – aus bedeutet, das Passwort lebt nur bis zum Schließen des Tabs; an speichert es mit dem Profil in diesem Browser. In beiden Fällen geht es nirgendwo hin außer zu Ihrem eigenen Agenten.
- Agent token – leer lassen, um das Token aus dem Kopplungslink zu verwenden. Nur ausfüllen, wenn Sie mehrere Agenten betreiben oder manuell gekoppelt haben.
- Schreibschutz, Umgebungsfarbe und Transaktionsmodus gelten je Profil; siehe Sicherheit.
SSH-Tunnel
Für Datenbanken, die nur über einen Bastion-Host erreichbar sind, verwenden Sie einen SSH-Tunnel. Aktivieren Sie im Profil SSH tunnel und tragen Sie den Sprunghost ein. Der lokale Agent öffnet den Tunnel und verbindet den Treiber darüber; die Datenbank selbst muss nicht direkt erreichbar sein.

Felder
- SSH Host / Port – der Bastion-Host. Ein
Host-Alias aus Ihrer~/.ssh/configfunktioniert hier: Planche löst ihn genau wie derssh-Befehl auf und ergänztHostName,User,PortundIdentityFile(Include-Direktiven werden verfolgt,ProxyJumpwird nicht unterstützt). - SSH User – leer lassen, um den Benutzer aus dem Konfigurationsblock zu übernehmen.
- SSH Auth – Privater Schlüssel, Passwort oder ssh-agent.
- Privater Schlüssel: Schlüsseldatei auswählen oder leer lassen, um die
IdentityFileaus der Konfiguration zu nutzen – andernfalls~/.ssh/id_*. Passphrase eintragen, falls der Schlüssel eine hat. - ssh-agent: nutzt den Agent-Socket (
SSH_AUTH_SOCK) des Rechners, auf demnpx plancheläuft, sodass Hardware-Schlüssel und weitergeleitete Agenten funktionieren.
- Privater Schlüssel: Schlüsseldatei auswählen oder leer lassen, um die
- Host und Port der Datenbank im Formular darüber werden auf dem Sprunghost aufgelöst: meist
127.0.0.1oder ein interner Name.
Host-Schlüssel
Bei der ersten Verbindung zu einem unbekannten Sprunghost wird dessen Fingerprint angezeigt und Sie werden um Bestätigung gebeten. Akzeptierte Schlüssel landen in ~/.planche/known_hosts, und Ihre vorhandene ~/.ssh/known_hosts wird ebenfalls gelesen. Ändert sich der Schlüssel später, wird die Verbindung abgelehnt statt erneut vertraut – dieselbe Regel wie beim ssh-Befehl.
Gut zu wissen
- Schlüssel und Passphrasen folgen der Einstellung Save password und verlassen Ihren Rechner nie: Sie gehen nur vom Browser an Ihren lokalen Agenten.
- Der Tunnel wird zusammen mit der Verbindung geschlossen.
- Ein SSH-Authentifizierungsfehler wird getrennt von einem Datenbankfehler gemeldet, damit Sie wissen, welche Hälfte zu reparieren ist.
- Setzen Sie
PLANCHE_SSH_CONFIG=nonevor dem Start des Agenten, wenn er~/.ssh/configund die Standardschlüssel ignorieren soll.
Cloudflare Durable Objects mit wrangler dev
Cloudflare DO (wrangler dev) ist ausschließlich für die lokale Entwicklung bestimmt. Es liest die Durable Objects einer laufenden wrangler dev-Sitzung auf Ihrem eigenen Rechner. Bereitgestellte Durable Objects werden nicht unterstützt.
Warum jedes Objekt als Datenbank erscheint
Jedes Durable Object besitzt eine eigene private SQLite-Datenbank. Deshalb erscheinen die Objekte im Schemabaum als getrennte Datenbanken. Ein benanntes Objekt wird als <namespaceId>/<object> angezeigt. do-probe-Counter/probe-one bezeichnet zum Beispiel das Objekt probe-one im Namespace do-probe-Counter; die Namespace-ID hat die Form <script>-<ClassName>. Das ist kein herkömmlicher Datenbankname, sondern der an idFromName() übergebene Objektname. Mit newUniqueId() erzeugte Objekte haben keinen Namen und erscheinen unter ihrer 64-stelligen Hexadezimal-ID.
wrangler führt ein Entwicklungsregister. Durable Objects aus anderen gleichzeitig laufenden wrangler dev-Sitzungen erscheinen ebenfalls, sodass ein Planche-Profil mehrere lokale Projekte untersuchen kann.
Verbinden
- Führen Sie
wrangler devim Worker-Projekt aus. - Führen Sie
npx plancheaus und erstellen Sie eine Verbindung vom Typ Cloudflare DO (wrangler dev). - Geben Sie die URL des wrangler-dev-Servers ein. Vorgabe ist
http://localhost:8787. Konto-ID, API-Token, Passwort und SSH-Einstellungen gibt es nicht.
Der lokale Agent liest wranglers Local Explorer API unter <devUrl>/cdn-cgi/local/explorer/api; auf der Worker-Seite muss daher keine Komponente installiert oder bereitgestellt werden. Die URL muss eine Loopback-Adresse sein. Andernfalls würde der Agent als HTTP-Proxy zu beliebigen Hosts dienen.
Wenn dort nichts lauscht: Cannot reach a wrangler dev server at http://localhost:8787 (fetch failed). Run `wrangler dev` in your Worker project and try again.
Wenn der Port zu einem anderen Server gehört: ... answered (HTTP 401) but is not a wrangler dev server. Check the port, and that `wrangler dev` (wrangler 4.x) is what is running there.
SQLite-Werkzeuge und Speicher
Da Durable-Object-Speicher SQLite ist, funktionieren der SQL-Editor und Tabellen aus ctx.storage.sql wie bei anderen SQLite-Datenbanken. Planche liest Tabellen, Views, Trigger, Spalten und Indizes über sqlite_master und PRAGMA, unterstützt CREATE-TABLE-DDL und ein ERD aus Fremdschlüsseln und ordnet SELECT-Ergebnisse aus einer Tabelle ihrer Quelltabelle zu, damit Zeilen im Grid bearbeitet werden können.
Planche blendet miniflares interne Verwaltungstabelle __miniflare_do_name im Baum aus. _cf_KV bleibt sichtbar, weil dort mit ctx.storage.put() geschriebene Daten liegen.
Jede Anfrage committet automatisch. BEGIN, COMMIT und ROLLBACK werden mit einer Erklärung abgelehnt; wie bei Cloudflare D1 ist die Option für manuelle Transaktionen ausgeblendet.
Warum bereitgestellte Objekte nicht unterstützt werden
Cloudflares öffentliche API dokumentiert zwei Durable-Objects-Methoden: Namespaces auflisten und Objekte auflisten. Einen dokumentierten SQL-Endpunkt zum Abfragen des Objektspeichers gibt es nicht.
Das Cloudflare-Dashboard besitzt den Tab Data Studio (Beta), der bereitgestellte Objekte abfragt. Der dahinterliegende Endpunkt ist mit einem API-Token erreichbar, steht aber nicht in der öffentlichen API-Referenz und kann sich ohne Vorankündigung ändern. Außerdem gibt es keine Token-Berechtigung speziell für Durable Objects. D1 hat D1 Read/D1 Edit, Workers KV und R2 haben eigene Berechtigungen. Diesen Endpunkt schaltet jedoch nur Workers Scripts Edit frei. Das gewährt Schreibzugriff zum Bereitstellen und Ändern jedes Workers im Konto. Planche verlangt diese Berechtigung nicht, nur um Daten anzusehen.
Verwenden Sie für bereitgestellte Objekte derzeit Data Studio im Dashboard oder stellen Sie einen eigenen Endpunkt aus einem Worker bereit.
Redis
Ein Redis-Profil funktioniert mit Redis 6 und 7 und mit Servern, die dasselbe Protokoll sprechen (Valkey, KeyDB, Dragonfly). Der Agent hält eine Verbindung pro Profil, dazu eine weitere, solange ein Pub/Sub- oder Monitor-Tab geöffnet ist.
Key-Baum
Der Baum listet die logischen Datenbanken (standardmäßig db0 bis db15) mit der Anzahl ihrer Keys. Beim Aufklappen einer Datenbank werden ihre Keys nach dem ersten :-Segment gruppiert (user:, session:), und jede Gruppe klappt auf dieselbe Weise auf. Jede Ebene wird mit SCAN in Seiten zu 1.000 Keys gelesen und endet bei 10.000 mit einem Hinweis; Planche führt nie KEYS aus, das den Server blockiert, solange es den gesamten Key-Space durchläuft. Key-Namen werden nicht zwischen Sitzungen gespeichert.
Key-Ansicht
Ein Doppelklick öffnet einen Key in einem eigenen Tab. Die Kopfzeile zeigt Typ, Restlaufzeit (TTL), Länge und Speicher (MEMORY USAGE); Restlaufzeit und Name lassen sich dort ändern, und der Key kann nach einer Bestätigung gelöscht werden. Umbenennen verwendet RENAMENX, ein vorhandener Key wird also nie überschrieben.
- Hash, Set, Sorted Set – eine Tabelle, gelesen mit
HSCAN/SSCAN/ZSCAN, mit einem Filter (Klartext oder ein Glob wiea*) und Load more. Werte und Scores werden direkt bearbeitet; Zeilen werden in der Tabelle hinzugefügt und entfernt. - List – Index und Wert, jeweils 200 auf einmal gelesen; Elemente werden bearbeitet, an einem der beiden Enden eingefügt und entfernt. Redis kann Listenelemente nur nach Wert entfernen, daher überschreibt ein Entfernen das Element zuerst mit einer eindeutigen Markierung und entfernt dann die Markierung: zwei Befehle, und ein Schreiber, der die Liste dazwischen verschiebt, kann den Index verändern.
- Stream – neueste Einträge zuerst, mit ihren Feldern; Einträge werden hinzugefügt (
field value; field value) und gelöscht. - String und RedisJSON – ein JSON-Wert öffnet sich als einklappbarer Baum, ein HTML-Wert als gerenderte Seite; wechseln Sie zu Text, um zu bearbeiten. Von Werten über 1 MB wird das erste Megabyte geladen, bis Sie den Rest anfordern. HTML wird in einem abgeschotteten Frame (Sandbox) gerendert, der keine Skripte ausführt und nichts von anderen Hosts lädt.
Konsole
Ein Abfrage-Tab auf einer Redis-Verbindung ist eine Konsole: ein Befehl pro Zeile in redis-cli-Syntax (doppelte Anführungszeichen mit den Escapes \n, \xHH; einfache Anführungszeichen wörtlich), Kommentare mit # und //. Ctrl / ⌘ + Enter führt den Befehl in der Cursorzeile aus; das ganze Skript läuft Befehl für Befehl nacheinander. SELECT n wechselt den Tab in diese Datenbank. Eine Antwort aus einem einzelnen Objekt öffnet sich als JSON, Datensätze als Tabelle, und der Schalter Table / JSON über dem Ergebnis wechselt die Ansicht.
SUBSCRIBE, PSUBSCRIBE und MONITOR werden in der Konsole abgelehnt: Sie halten die Verbindung belegt, was den Baum und jeden anderen Tab anhalten würde. Verwenden Sie stattdessen die Werkzeuge Pub/Sub und Monitor.
Werkzeuge
Rechtsklick auf eine leere Stelle im Baum oder über das Menü Tools:
- Server info –
INFOals Karten (Version, Speicher, Trefferquote, Operationen pro Sekunde, Persistenz, Replikation), die Key-Anzahl jeder Datenbank und jedes Feld mit einem Filter; aktualisiert sich auf Wunsch alle 5 Sekunden. - Slow log – die 128 neuesten Einträge von
SLOWLOG GETmit Dauer und Client sowie der Schwellenwert, ab dem Einträge aufgenommen werden; Leeren fragt vorher nach. - Clients –
CLIENT LIST; ein anderer Client kann nach einer Bestätigung getrennt werden. Die eigene Verbindung der App ist markiert und kann hier nicht getrennt werden. - Pub/Sub – Kanäle und Glob-Muster abonnieren (
news orders.*) und eingehende Nachrichten verfolgen; an einen Kanal veröffentlichen und sehen, wie viele Abonnenten die Nachricht erhalten haben. - Monitor – jeder Befehl, den irgendein Client ausführt, in dem Moment, in dem er läuft. Redis kopiert jeden Befehl an jeden Monitor, auf einem stark belasteten Server kostet das also Durchsatz: nur kurz laufen lassen. Überholt der Feed das Limit des Agenten von 500 Ereignissen pro 100 ms, wird die Zahl der übersprungenen Befehle angezeigt.
- Memory analysis – durchsucht eine Datenbank (bis zu 10.000, 100.000 oder 1.000.000 Keys) und fragt Größe, Typ und Ablauf jedes Keys in Stapeln ab: Speicher nach Typ, nach Präfix und nach Ablauf sowie die 50 größten Keys. 20.000 Keys dauern etwa eine Sekunde.
MEMORY USAGEschätzt große Collections anhand einer Stichprobe ihrer Elemente. Ein Klick auf einen Key öffnet ihn, ein Klick auf ein Präfix löscht dessen Keys. - Delete keys by pattern – sucht die Keys, die auf ein Muster passen (bis zu 100.000 pro Durchlauf), zeigt ihre Anzahl und zwanzig davon, lässt Sie das Muster erneut eintippen und löscht sie dann mit
UNLINKin Schritten zu 500. Der Verlauf erhält einen Eintrag für den Durchlauf. Auch im Menü eines Datenbank- oder Präfixknotens.
Sicherheit
Ein schreibgeschütztes Profil akzeptiert nur Befehle aus Planches Liste der Lesebefehle, und ein Gateway-Agent prüft jeden Befehl anhand der Flags aus dem servereigenen COMMAND INFO. FLUSHDB, FLUSHALL, SWAPDB, SHUTDOWN und ähnliche Befehle fragen vor der Ausführung nach. Passwörter in AUTH, HELLO … AUTH, MIGRATE … AUTH, CONFIG SET requirepass und ACL SETUSER werden im Verlauf maskiert.
Noch nicht unterstützt
Redis Cluster und Sentinel. Mit einem Cluster-Knoten verbunden, zeigt Planche nur die Keys dieses Knotens in db0 und nennt für einen Key, den ein anderer Knoten hält, diesen Knoten, statt der Umleitung zu folgen.
Elasticsearch und OpenSearch
Elasticsearch (7 und 8) und OpenSearch (1 und 2) sind getrennte Einträge in der Verbindungsverwaltung und funktionieren gleich: Der Agent sendet Ihre Anfragen an die REST-API des Clusters und an nichts anderes.
Konsole
Ein Abfrage-Tab ist eine Konsole in Kibana-Dev-Tools-Syntax: Eine Zeile mit Methode und Pfad beginnt eine Anfrage, die Zeilen darunter sind ihr Body.
GET /_cat/indices?v
POST /products/_search
{
"query": { "match": { "name": "keyboard" } }
}
Ctrl / ⌘ + Enter führt die Anfrage am Cursor aus. Bodys von _bulk und _msearch werden so gesendet, wie sie geschrieben sind (NDJSON). Die Vervollständigung bietet nach der Methode gängige Endpunkte an sowie die Indexnamen, die der Baum geladen hat. SQL läuft über dieselbe Konsole: POST /_sql?format=txt bei Elasticsearch, POST /_plugins/_sql bei OpenSearch.
Ergebnisse
Suchtreffer kommen als eine Zeile pro Dokument zurück: _index, _id, _score, dann die Felder aus _source; verschachtelte Objekte und Arrays öffnen sich in der JSON-Ansicht. Ausgaben von _cat werden zu Zeilen. Eine Antwort aus einem einzelnen Objekt, etwa _cluster/health oder ein Mapping, öffnet sich als JSON; der Schalter Table / JSON wechselt jede der beiden Ansichten. Klicken Sie mit der rechten Maustaste auf einen Treffer und wählen Sie Open, um das Dokument zu bearbeiten.
Index-Baum
Der Baum listet die Indizes mit ihrer Dokumentanzahl, einen Ordner Aliases und die mit einem Punkt beginnenden Systemindizes, eingeklappt unter System indices. Das Aufklappen eines Index listet sein Mapping als Feldpfade in Punktnotation mit ihren Typen (customer.country: keyword, items: nested). Ein Doppelklick auf einen Index führt in einem neuen Konsolen-Tab eine Suche über 50 Dokumente aus. Nach einer schreibenden Anfrage lädt der Baum neu, sodass ein angelegter oder gelöschter Index sofort erscheint oder verschwindet. Ein Rechtsklick auf eine leere Stelle im Baum bietet Cluster-Health, Knoten, Shards, Index-Templates und eine Vorlage zum Anlegen eines Index.
Dokumentansicht
Die Ansicht zeigt Version, _seq_no und _primary_term des Dokuments und seine _source als Baum. Wechseln Sie zu Text, um zu bearbeiten; Speichern sendet PUT /<index>/_doc/<id>?if_seq_no=…&if_primary_term=…. Hat jemand das Dokument geändert, nachdem Sie es geöffnet haben, wird das Speichern daher mit einem Konflikt abgelehnt, statt dessen Änderung zu überschreiben. Aktualisieren Sie, um die aktuelle Version zu lesen, und bearbeiten Sie erneut.
Sicherheit
Ein schreibgeschütztes Profil erlaubt GET- und HEAD-Anfragen, POSTs an suchartige Endpunkte (_search, _count, _msearch, _mget, …) und lesendes SQL. Point-in-Time- und Scroll-Kontexte halten Zustand auf dem Cluster und werden abgelehnt. Das Löschen eines Index, Alias, Templates oder Snapshots, jedes Wildcard- oder kommagetrennten Ziels sowie _delete_by_query und _restore fragen vor der Ausführung nach; das Löschen eines einzelnen Dokuments per ID nicht. In Anfragen an die Security-APIs werden Felder für Passwort, Hash, API-Key, Secret und Token im Verlauf maskiert.
Schema-Baum
Der Schema-Baum richtet sich nach der jeweiligen Engine: MySQL und SQLite zeigen Datenbanken › Objekte, PostgreSQL und SQL Server ergänzen eine Schema-Ebene. Die Zahl am Ordner verrät schon vor dem Aufklappen, wie viele Tabellen er enthält.

Ein Rechtsklick auf einen Knoten zeigt die dort sinnvollen Aktionen:
- Open Table – das Datengrid, mit dem Zeilenlimit aus Ihren Einstellungen.
- Generate SQL – ein SELECT-, INSERT-, UPDATE- oder DELETE-Gerüst aus den echten Spalten und dem Primärschlüssel, direkt an der Cursorposition.
- Show Create / Alter – das DDL des Objekts oder der Tabellendesigner.
- Copy Table to… / Vergleichen / Daten vergleichen – siehe die Abschnitte weiter unten.
- Truncate / Drop – unten im Menü abgesetzt, und beide verlangen, dass Sie den Objektnamen erneut eintippen.
SQL-Editor
Der Editor verwendet Monaco, den Editor hinter VS Code, und wird mit der App ausgeliefert – nicht über ein CDN geladen. Die Vervollständigung kennt die Schlüsselwörter und Funktionen Ihres Dialekts sowie Tabellen und Spalten der verbundenen Datenbank.

Anweisungen ausführen
- Strg / ⌘ + Enter führt die Auswahl aus, sonst die einzelne Anweisung unter dem Cursor.
- F9 folgt Einstellungen › Sicherheit › Ausführungsbereich – standardmäßig das ganze Skript.
- Strg / ⌘ + Shift + Enter führt immer das ganze Skript aus.
Skripte werden von einem echten Parser geteilt, nicht an Semikolons: BEGIN … END-Rümpfe bleiben intakt, und der clientseitige DELIMITER-Befehl, PostgreSQLs $$-Dollar-Quoting, SQL Servers GO-Batches und Oracle-PL/SQL-Blöcke mit abschließendem / werden verstanden. Jede Anweisung wird klassifiziert – genau das macht Zeilenlimit, destruktive Bestätigung und Dry Run möglich.
Zeilenlimit
Unbegrenzte SELECTs erhalten ein LIMIT (je nach Engine TOP oder FETCH FIRST), damit ein versehentliches SELECT * auf einer riesigen Tabelle den Browser nicht überschwemmt. Standard sind 500 Zeilen, und das Ergebnis weist darauf hin. Anweisungen, die sich selbst begrenzen, bleiben unangetastet.
Verlauf und lokale Snapshots

Der History-Tab listet, was Sie ausgeführt haben; Query › Local History bewahrt Snapshots des Textes jedes Editor-Tabs, sodass ersetzter oder ausgeführter Text zurückgeholt werden kann. Passwort-Literale werden vor dem Speichern maskiert, und die Persistenz lässt sich ganz abschalten.
Ergebnisgrid
Das Grid zeichnet nur den sichtbaren Bereich. Dadurch lassen sich auch einige hunderttausend Zellen flüssig durchsuchen. Stammen alle Spalten eines Ergebnisses aus einer Tabelle mit Primärschlüssel, können Sie die Zellen direkt bearbeiten.

Bearbeiten
Doppelklicken Sie eine Zelle, um sie zu bearbeiten (oder F2 / Enter auf der zuletzt angeklickten Zelle), nutzen Sie Add row oder Add with form zum Einfügen und markieren Sie Zeilen zum Löschen. Nichts läuft, bevor Sie Commit drücken, und standardmäßig zeigt Planche die erzeugten UPDATE-, INSERT- und DELETE-Anweisungen vorher an. Discard verwirft die ausstehenden Änderungen.
Auswählen und kopieren
Text in der Oberfläche lässt sich nicht durch Ziehen markieren, ein Zug über das Grid hinterlässt also keine blau markierten Beschriftungen. Zeilen wählen Sie per Klick aus: eine Zeile anklicken, eine zweite mit Shift anklicken, um alles dazwischen zu nehmen, und mit ⌘ / Strg einzelne Zeilen hinzufügen oder entfernen. Was Sie danach im Zellmenü wählen, gilt für alle ausgewählten Zeilen.

- Filter: Spalte = dieser Wert – lädt die Tabelle gefiltert auf diesen Wert neu (exakte Übereinstimmung).
- Kopieren – die Zelle, den Spaltennamen oder die ausgewählten Zeilen als TSV (mit Kopfzeile), CSV, JSON oder direkt ausführbare INSERT-Anweisungen.
- Bearbeiten / Auf NULL setzen / Auf leeren String setzen / Zeilen löschen – alles bleibt bis zum Commit ausstehend.
- Zeilen ins Scratchpad senden – siehe unten.
- Spalte ausblenden – die Spaltenauswahl in der Leiste holt sie zurück.
Was sich seit dem letzten Laden geändert hat
Beim Aktualisieren eines Tabellen-Tabs werden die neuen Zeilen anhand des Primärschlüssels mit dem vorherigen Stand verglichen. Geänderte Zellen werden hervorgehoben (der vorherige Wert erscheint beim Überfahren), neue Zeilen markiert, und ein Abzeichen zählt verschwundene Zeilen – nützlich direkt nach einem Deployment oder Batch-Lauf. Der Vergleich lebt nur im Tab; das × verwirft ihn.
Per Fremdschlüssel ins Detail springen
Wo die verbundene Datenbank einen Fremdschlüssel hat, macht Planche die Werte dieser Spalte zu Links. Ein Klick öffnet die referenzierte Zeile in einem neuen Tab, bereits gefiltert – ohne dass Sie eine Abfrage schreiben oder eine ID kopieren müssten.

addresses öffnet customers, gefiltert auf genau diesen Kunden.Dafür ist nichts einzurichten: Die Fremdschlüssel werden beim Laden des Grids aus der Datenbank gelesen. Beim Überfahren eines Links sehen Sie, wohin er führt.
Zwei Tabellen selbst verknüpfen
Viele reale Schemata enthalten Beziehungen ohne Fremdschlüssel: etwa eine vor Jahren ohne Constraint angelegte Spalte, eine in eine andere Datenbank ausgelagerte Tabelle oder einen Dienst, dessen Benutzer auf einem anderen Server liegen. In Planche können Sie diese Beziehungen selbst festlegen und danach wie gewöhnliche Fremdschlüssel verwenden.
Rechtsklick auf einen Wert der Spalte, dann „…“ mit anderer Tabelle verknüpfen.

- In die Datenbank wird nichts geschrieben. Die Verknüpfung ist eine Information, die Planche für Sie aufbewahrt – Sie können sie also auch auf einer Datenbank anlegen, für die Sie nur Leserechte haben.
- Das Ziel kann in jeder geöffneten Verbindung liegen. Es kann sich um eine andere Datenbank auf demselben Server oder um eine Verbindung mit einer anderen Engine handeln. Eine Verknüpfung von
orders.user_idin MySQL zuusers.idin PostgreSQL wechselt beim Klick dorthin und öffnet die gefilterte Tabelle. - Sie bleibt erhalten. Verknüpfungen werden je Verbindungsprofil gespeichert und sind nach einem Neuladen wieder da.
- Sie lässt sich teilen. Export › Spaltenverknüpfungen exportieren schreibt sie in eine JSON-Datei; beim Import werden Profile per ID, dann Name, dann Host zugeordnet, sodass Kolleginnen auf anderen Rechnern dieselben Wege bekommen.
- Sie erscheint im ERD als gestrichelte Beziehung, mit einer Geister-Entität, wenn das Ziel außerhalb des Diagramms liegt.
So wird auch eine Datenbank ganz ohne Fremdschlüssel in wenigen Minuten anklickbar – und bleibt es für alle, mit denen Sie die Datei teilen.
Scratchpad
Das Scratchpad ist eine SQLite-Datenbank, die in Ihrem Browser lebt. Jedes Grid kann über das Zellkontextmenü Zeilen hineinkopieren – eine Zeile, die Auswahl oder alles Geladene.

Die Spaltentypen ergeben sich aus den Quelltypen, und die Tabelle erscheint sofort im Schema-Baum des Scratchpads. Da es eine ganz normale Browser-SQLite-Verbindung ist, können Sie sie wie jede andere Datenbank abfragen und bearbeiten, und Connection › Save Database File schreibt sie als .db-Datei heraus. Sie wird lokal zwischengespeichert und ist nach einem Neuladen noch da. Nichts aus dem Scratchpad wird irgendwohin gesendet.
Mit Tools › Scratchpad jederzeit öffnen oder in den Vordergrund holen.
Abfragen über Verbindungen hinweg
In einem Scratchpad-Abfrage-Tab können Sie Tabellen aus jeder geöffneten Verbindung über einen dreiteiligen Namen ansprechen – "Verbindungsname".datenbank.tabelle – und miteinander verknüpfen:
SELECT o.id, o.total, u.email
FROM "Shop MySQL".shop.orders o
JOIN "User service".public.users u ON u.id = o.user_id
WHERE o.status = 'paid';
Vor der Ausführung wird jede referenzierte Tabelle in eine lokale Kopie geladen und das SQL auf diese Kopien umgeschrieben. SQLite im Browser führt anschließend den Join aus. So können Sie eine MySQL- mit einer PostgreSQL-Tabelle verbinden, ohne etwas auf einem Server einzurichten.

Die Kopien werden bei jedem Lauf erneuert und sind auf 100.000 Zeilen pro Tabelle begrenzt; der Fortschritt steht in der Fußzeile. Tools › Verbundabfrage öffnet einen Tab, in dem Syntax und die Namen Ihrer offenen Verbindungen bereits stehen.
Vergleichen und Kopieren
Diese drei Werkzeuge führen nichts selbst aus. Sie erzeugen ein Skript, das Sie prüfen, anpassen und anschließend selbst starten.
Schemas vergleichen

Database › Schemas vergleichen (oder „Tabelle vergleichen…“ an einem Baumknoten) vergleicht Tabellen, Spalten, Indizes, Views, Prozeduren, Funktionen, Trigger und Events zwischen zwei geöffneten Verbindungen. CREATE-Anweisungen werden ohne Rauschen verglichen – DEFINER, SQL SECURITY, Algorithmus und der Datenbankpräfix fallen weg –, sodass nur echte Unterschiede auftauchen. Skript im Editor öffnen übergibt Ihnen die ALTER- / CREATE-Anweisungen im Zieldialekt, wobei jedes DROP auskommentiert bleibt, solange Sie das Häkchen nicht setzen.
Daten vergleichen

Database › Daten vergleichen ordnet Zeilen über den Primärschlüssel der Quelltabelle zu und vergleicht Werte als normalisierten Text, damit die unterschiedliche Art, wie Treiber Datumswerte, Dezimalzahlen und JSON liefern, keine falschen Unterschiede erzeugt. Sie sehen die im Ziel fehlenden Zeilen, die abweichenden Zeilen (Spalte für Spalte) und die nur im Ziel vorhandenen, dazu ein INSERT- / UPDATE- / DELETE-Skript – DELETEs standardmäßig auskommentiert. Bis zu 50.000 Zeilen je Seite werden mit Fortschrittsanzeige geladen.
Tabelle kopieren nach…

Rechtsklick auf eine Tabelle und Copy Table to… baut sie auf jeder anderen geöffneten Verbindung oder Datenbank neu auf. Das CREATE TABLE wird im Zieldialekt erzeugt und zur Bearbeitung angezeigt, sodass eine MySQL-Tabelle nach einer Typanpassung nach PostgreSQL kopiert werden kann. Zeilen werden in Blöcken mit Fortschrittsbalken übertragen. Existiert bereits eine Tabelle dieses Namens, wird der Kopiervorgang abgebrochen – wer stattdessen „Löschen und neu anlegen“ wählt, muss zuerst den Tabellennamen erneut eintippen.
KI-Assistent
Das Panel rechts schreibt nicht SQL zum Kopieren, sondern bedient die App: es liest das Schema, öffnet einen Query-Tab, führt dort aus, was es geschrieben hat, und fragt, bevor sich Daten ändern. Zu öffnen über das Symbol am rechten Rand oder Werkzeuge › KI-Assistent.
Wie aus einer Frage eine Antwort wird

Frag in deiner eigenen Sprache. Das Modell sieht deinen Bildschirm nicht, also fragt es zuerst die App, was offen ist, und liest die Spalten der Tabellen, die es benutzen will. Jeder Aufruf hinterlässt eine Karte, sodass sichtbar ist, worauf die Abfrage gebaut wurde, statt behauptet zu werden. Die fertige Anweisung öffnet sich in einem Query-Tab und läuft dort: du siehst den Fortschritt, kannst abbrechen, und das Ergebnis sortieren und exportieren wie jedes andere.
Was es geschrieben hat, plant die Engine zuerst. Eine Spalte, die es nicht gibt, kommt als Fehler zum Modell zurück, das ihn selbst korrigiert – eine kaputte Abfrage erreicht deinen Bildschirm also nie. Ist der Plan ein voller Scan einer großen Tabelle, wird vorher gefragt.
Was er nicht tut


- Eine Verbindung – die, die du offen hast. Es gibt kein Argument für eine andere und kein Werkzeug, eine zu öffnen oder zu schließen. Welche Datenbank gemeint ist, entscheidest du, indem du sie benutzt.
DROPundTRUNCATElaufen nie – auch nicht mit deiner Zustimmung, anders formuliert oder hinter einem Semikolon versteckt. Er kann so etwas in einen Tab schreiben und sagen, was es zerstört; ausführen musst du selbst.- Schreiben fragt zuerst – und geht danach durch dieselben Sicherungen wie eine selbst getippte Anweisung: der Dry Run mit der Zeilenzahl, die Bestätigung für destruktive Anweisungen, die Ablehnung auf einer Nur-Lese-Verbindung.
Woher das Modell kommt

Einstellungen › KI. Der Schlüssel geht an deinen lokalen Agenten und wird dort benutzt; er bleibt nie im Browser und geht nie an planche.dev – dein SQL und dein Schema ebenso wenig.
- Ein API-Schlüssel – Anthropic, ein OpenAI-kompatibler Endpunkt oder Gemini. Ob er gespeichert wird, ist deine Wahl, und die Datei wird genannt, bevor du sie triffst.
- Die Anmeldung dieses Rechners – nach
ant auth loginfindet das SDK die Zugangsdaten selbst, es gibt nichts einzufügen. - Eine lokale CLI – Claude Code oder Codex, bereits installiert und angemeldet. Gar kein Schlüssel.
Einen anderen Agenten Planche bedienen lassen

Hilfe › KI-Agent verbinden gibt dir die Konfiguration für alles, was MCP über HTTP spricht, sodass ein Agent in deinem Editor dieselben Werkzeuge nutzt. Die Aufrufe laufen im Browser-Tab, durch dieselben Sicherungen; Schreiben fragt dort und ist als von außen kommend markiert. Das Token erreicht diesen einen Endpunkt und überlebt Neustarts; ein Widerruf trennt jedes Programm, dem du es gegeben hast.
Sicherheit
Ein DELETE ohne WHERE kann in einer Produktionsdatenbank unbeabsichtigt viele Zeilen treffen. Planche prüft solche Anweisungen an mehreren Stellen; die einzelnen Schutzvorkehrungen lassen sich bei Bedarf in den Einstellungen abschalten.
Dry Run: die Zeilen sehen, bevor Sie sie ändern

Bevor ein UPDATE oder DELETE aus dem Editor ausgeführt wird, schreibt Planche es in ein SELECT der betroffenen Zeilen um. Sie sehen deren Anzahl und eine Stichprobe. Unterstützt werden Join-Formen der einzelnen Dialekte: MySQLs UPDATE a JOIN b, PostgreSQLs UPDATE … FROM und DELETE … USING, SQL Servers UPDATE alias … FROM sowie Oracles korrelierte Unterabfragen. Kann der Parser eine Anweisung nicht zuverlässig umschreiben, wird sie ohne Vorschau ausgeführt.
Weitere Schutzvorkehrungen
- Bestätigung destruktiver Anweisungen –
DROP,TRUNCATEsowieDELETE/UPDATEohneWHEREfragen vorher und zeigen genau, was laufen wird. Beim Löschen einer Tabelle oder Datenbank aus dem Baum müssen Sie zusätzlich den Namen eintippen. - Schreibgeschützte Verbindungen – Schreibzugriffe werden abgelehnt, bevor sie die Datenbank erreichen.
- Commit-Vorschau im Grid – die erzeugten Anweisungen erscheinen, bevor Ihre Änderungen geschrieben werden.
- Manuelle Transaktionen – nichts wird committet, bevor Sie es sagen.
- Umgebungsfarbe – Produktion sieht anders aus als Staging.

ERD
Tools › ERD anzeigen erstellt aus den Fremdschlüsseln der gewählten Datenbank ein Entity-Relationship-Diagramm. Es nutzt Krähenfuß-Notation; Entitäten lassen sich verschieben und Spaltenbreiten anpassen. Das Layout wird je Datenbank gespeichert.

Selbst definierte Spaltenverknüpfungen erscheinen als gestrichelte Beziehungen. Zeigt eine Verknüpfung auf eine Tabelle außerhalb des Diagramms – eine andere Datenbank oder Verbindung –, wird neben der Quelle eine Geister-Entität ergänzt, damit die Beziehung sichtbar bleibt.
Tabellenentwurf
Create Table und Alter Table öffnen einen Designer mit drei Bereichen: Spalten, Indizes und – sofern die Engine es unterstützt – Speichereigenschaften.

Der SQL-Tab zeigt die Anweisung, die Planche ausführen würde, im Dialekt Ihrer Engine und aktualisiert sie beim Tippen – gut, um einen Dialekt zu lernen, und gut, um zu prüfen, was Sie gleich tun.

Der Rest steckt in den Menüs Table und Database: umbenennen, Struktur duplizieren, Datenbanken anlegen und löschen und – wo die Engine es unterstützt – Benutzerverwaltung, Prozessliste, Servervariablen und Status.
Exportieren

- Als CSV herunterladen – das aktuelle Ergebnis oder eine ganze Tabelle. Eine Tabelle wird seitenweise nach Primärschlüssel gelesen und direkt in die von Ihnen gewählte Datei geschrieben (wenn Ihr Browser die File System Access API unterstützt), sodass auch eine große Tabelle nie in den Speicher passen muss. Der Fortschritt ist sichtbar und der Export lässt sich abbrechen.
- Schema als HTML – eine eigenständige Seite mit den Spalten und Indizes der angehakten Tabellen.
- Spaltenverknüpfungen exportieren / importieren – Ihre virtuellen Fremdschlüssel als JSON-Datei, für einen anderen Rechner oder Kolleginnen.
- Als INSERT kopieren – aus dem Grid, um eine Handvoll Zeilen von Hand zu übertragen.
- Datenbankdatei speichern – schreibt Browser-SQLite-Datenbanken (auch das Scratchpad) zurück auf die Festplatte.
CSV-Werte, die mit =, +, - oder @ beginnen, erhalten ein vorangestelltes Apostroph, damit Tabellenkalkulationen sie als Text und nicht als Formel behandeln.
Gateway-Modus (Teams)
Ein Agent kann ein ganzes Team bedienen. Im Gateway-Modus liegen die Datenbank-Zugangsdaten in einer Konfigurationsdatei auf einem gemeinsamen Host; im Browser wird nur ein Profilname ausgewählt.
Terminal
npx planche --gateway gateway.json --addr 0.0.0.0 --allow-remote \
--token "$(openssl rand -base64 24)" --public-url https://sql.example.comgateway.json
{
"name": "Acme staging",
"profiles": [
{
"name": "Shop (read-only)",
"driver": "mysql",
"host": "db.internal",
"port": 3306,
"user": "reporting",
"password": "…",
"database": "shop"
},
{
"name": "Shop (writable)",
"readOnly": false,
"driver": "postgres",
"host": "pg.internal",
"port": 5432,
"user": "app",
"password": "…",
"database": "shop"
}
]
}name– der Name des Gateways, im Verbindungsdialog sichtbar.profiles[].name– was der Browser anbietet; es ist das Einzige, was ein Client je zurückschickt.profiles[].readOnly– weglassen heißt schreibgeschützt;falseerlaubt Schreibzugriffe.- Alles Weitere ist das, was auch das Verbindungsformular abfragt, unter denselben Namen:
driver(mysql,postgres,mssql,oracle,sqlite,d1),host,port,user,password,database– dazuserviceNamefür Oracle,filefür SQLite undaccountId/databaseId/apiTokenfür Cloudflare D1. Einssh-Block funktioniert hier ebenfalls.
Ein Profil erreicht seine Datenbank über einen Sprunghost, indem es einen ssh-Block trägt. host und port darüber werden dann auf dem Sprunghost aufgelöst, sind also meist 127.0.0.1:
gateway.json (ein Eintrag aus profiles)
{
"name": "Shop via bastion (read-only)",
"driver": "mysql",
"host": "127.0.0.1",
"port": 3306,
"user": "reporting",
"password": "…",
"database": "shop",
"ssh": {
"host": "bastion.example.com",
"port": 22,
"user": "deploy",
"auth": "key"
}
}authistkey,agentoderpassword. BeikeyohneprivateKeynimmt der Agent dieIdentityFile, die die~/.ssh/configdes Gateway-Rechners für diesen Host nennt, sonst~/.ssh/id_*– auf einem Server die übliche Variante, weil der Schlüssel so nicht in der Konfigurationsdatei steht.agentnutzt denSSH_AUTH_SOCKdes Gateways,passwordbraucht ein Feldpassword.- Wenn Sie
privateKeydoch setzen, ist der Wert der Schlüsselinhalt (PEM / OpenSSH), kein Pfad.passphraseergänzen, falls der Schlüssel eine hat. - Der Schlüssel des Sprunghosts muss auf dem Gateway-Rechner bereits vertraut sein. Verbinden Sie sich dort einmal mit
ssh bastion.example.com, oder verankern Sie ihn im Profil überacceptHostKeymit demSHA256:…-Fingerprint: Im Gateway-Modus sendet ein Browser nur einen Profilnamen und kann die Rückfrage nach einem unbekannten Host-Schlüssel nicht beantworten.
- Profile sind standardmäßig schreibgeschützt, und der Schreibschutz wird vom Agenten durchgesetzt: Er nimmt pro Anfrage genau eine Anweisung in SELECT-Form an und setzt die Sitzung selbst schreibgeschützt, wo die Engine das kann. Die Leitplanken im Browser sind Komfort; diese hier lässt sich vom Client nicht umgehen.
- Anfragen, die Zugangsdaten statt eines Profilnamens tragen, werden abgelehnt.
- Der Agent liefert die Web-App selbst aus, sodass die Seite nur mit ihrem eigenen Ursprung spricht und die strenge Content-Security-Policy unangetastet bleibt.
- Er spricht einfaches HTTP: Stellen Sie einen TLS-Reverse-Proxy davor und geben Sie dessen Adresse mit
--public-urlan.
Teammitglieder öffnen diese URL und fügen das Token einmal im Feld Configure des Verbindungsdialogs ein; danach erscheinen die Profile im Startbildschirm und in der Verbindungsverwaltung.
Verbindungs-Sync (Ende-zu-Ende-verschlüsselt)
Der Verbindungs-Sync legt Ihre Verbindungsprofile auf planche.dev ab, damit Sie sie auf einem anderen Rechner weiterverwenden können. Alles wird bereits in Ihrem Browser verschlüsselt, bevor es hochgeladen wird – mit einem Schlüssel, den der Server nie zu sehen bekommt. Sie finden die Funktion unter Verbindung › Verbindungs-Sync. Ab Version 1.0 gehört sie zu Pro; in allen 0.x-Versionen ist sie kostenlos.
Einrichten
- Melden Sie sich mit GitHub an. Die Anmeldung dient nur dazu, dass der Server weiß, welcher Tresor Ihnen gehört.
- Legen Sie eine Passphrase mit mindestens 10 Zeichen fest und geben Sie sie zweimal ein. Sie ist bewusst von Ihrem GitHub-Login getrennt: Den Login kennt der Server, also darf er niemals das sein, was Ihre Daten entschlüsselt.
- Ihre Profile werden verschlüsselt und hochgeladen. Auf einem anderen Rechner melden Sie sich mit demselben Konto an und entsperren sie mit derselben Passphrase.
So funktioniert die Verschlüsselung
- Der Browser leitet aus Ihrer Passphrase mit PBKDF2-SHA256 (600.000 Iterationen, zufälliges 16-Byte-Salt) einen 256-Bit-Schlüssel für AES-GCM ab. Jedes Speichern verwendet eine neue 12-Byte-Nonce.
- Der Schlüssel wird als nicht exportierbar erzeugt und liegt nur im Arbeitsspeicher des Tabs. Weder Schlüssel noch Passphrase werden auf die Festplatte geschrieben oder irgendwohin gesendet; deshalb fragt jede neue Sitzung die Passphrase erneut ab.
- Der Server speichert pro Konto genau einen verschlüsselten Tresor. Unverschlüsselt daneben liegen nur die Werte, die zum Wiederherstellen des Schlüssels nötig sind (Salt und Iterationszahl), die Nonce, eine Versionsnummer und der Zeitpunkt des letzten Speicherns. Keiner dieser Werte verrät etwas über den Inhalt.
- Zu Ihrem Konto speichert der Server Ihre GitHub-ID und Ihre E-Mail-Adresse (bzw. Ihren GitHub-Benutzernamen, wenn die E-Mail-Adresse privat ist) sowie eine Sitzung, solange Sie angemeldet bleiben.
Was im Tresor liegt
- Ihre Verbindungsprofile: Hosts, Ports, Benutzer, Optionen und die Spaltenverknüpfungen, die Sie dafür angelegt haben.
- Passwörter, SSH-Passwörter und private Schlüssel – aber nur bei Profilen, in denen Passwort speichern aktiviert ist. Ein Geheimnis, das Sie auf diesem Rechner nicht behalten wollten, landet auch nicht auf dem Server.
- Nicht die Beispieldatenbank und nicht das Scratchpad: Beide werden auf dem Rechner angelegt, der sie gerade braucht.
- Niemals Abfrageverlauf, Ergebnisse oder die Daten in Ihren Datenbanken.
Zwei Rechner
Jedes Profil trägt den Zeitpunkt seiner letzten Änderung; beim Zusammenführen zweier Tresore gewinnt die neuere Fassung. Gelöschte Profile merkt sich der Sync 90 Tage lang, damit ein auf dem einen Rechner gelöschtes Profil nicht vom anderen zurückkommt. Speichern zwei Rechner im selben Moment, lehnt der Server das zweite Speichern ab; dieser Rechner führt dann den neueren Tresor zusammen und speichert erneut, statt ihn zu überschreiben.
Passphrase vergessen
Den Tresor auf dem Server kann niemand entschlüsseln, auch wir nicht – er lässt sich also nicht wiederherstellen. Wählen Sie auf einem Rechner, auf dem Ihre Profile noch vorhanden sind, Vom Server löschen und richten Sie den Sync mit einer neuen Passphrase neu ein. Konto löschen entfernt den Tresor und Ihre Anmeldung; die Profile auf Ihren Rechnern bleiben in beiden Fällen unangetastet.
Der Sync läuft nur auf planche.dev. Die App-Kopie, die Ihr lokaler Agent ausliefert, nimmt keine Verbindung ins Internet auf; dort steht der Sync daher nicht zur Verfügung.
Datenschutz und Sicherheit
- Ihre Daten erreichen uns nie. planche.dev liefert eine statische Seite aus; Abfragen und Ergebnisse laufen zwischen Ihrem Browser und Ihrem eigenen Agenten (oder bleiben bei Browser-SQLite ganz in der Seite).
- Zugangsdaten bleiben lokal. Profile liegen im Speicher Ihres Browsers; Passwörter und SSH-Geheimnisse bleiben nur für die Sitzung erhalten, sofern Sie sie nicht speichern lassen. Die App weigert sich, mit einem Agenten zu sprechen, der nicht auf Loopback läuft (oder die Seite selbst ausgeliefert hat) – ein entfernter Agent hieße, Zugangsdaten über das Netz zu schicken.
- Der Agent authentifiziert alles. Jede Route außer der Statusabfrage braucht ein Bearer-Token, wiederholt falsche Token sperren die Authentifizierung kurzzeitig, nur der Ursprung der App darf ihn aufrufen, und eine Bindung außerhalb von Loopback verlangt eine ausdrückliche Freigabe samt Token.
- SQLite-Dateien sind eingegrenzt. Der Agent öffnet nur Dateien unterhalb Ihres Home-Verzeichnisses (ohne versteckte und Systemordner) oder eines von Ihnen benannten Verzeichnisses und verweigert
ATTACH, solange Sie es nicht aktivieren. - Der Abfrageverlauf wird bereinigt. Passwort-Literale werden maskiert, bevor Verlauf oder Snapshots gespeichert werden, und die Speicherung lässt sich abschalten.
- Statistiken sind anonym und optional. Gezählt werden nur kategorische Fakten – welche Engine, welcher Dialog, ob eine Anweisung erfolgreich war – niemals SQL-Text, Hostnamen, Datenbank-, Tabellen- oder Dateinamen. Ein Schalter in den Einstellungen deaktiviert sie.
Planche wird wie besehen bereitgestellt. Diese Schutzmaßnahmen mindern Risiken, ersetzen aber keine Prüfung: Für ausgeführte Anweisungen bleiben Sie verantwortlich. Halten Sie deshalb Backups bereit.
Tastenkürzel
Editor-Kürzel wirken, während der SQL-Editor den Fokus hat; die übrigen gelten überall.
| Tasten | Wirkung |
|---|---|
| F9 | Ausführen – das ganze Skript oder die Anweisung am Cursor, je nach Einstellungen › Sicherheit › Ausführungsbereich. |
| Ctrl / ⌘ + Enter | Führt die Auswahl aus, sonst die Anweisung unter dem Cursor. |
| Ctrl / ⌘ + Shift + Enter | Führt immer das ganze Skript aus, unabhängig vom Ausführungsbereich. |
| Ctrl / ⌘ + K | Schnellbefehl-Palette: per Eingabe zu einer Tabelle, Menüaktion oder Verbindung springen. |
| Alt + N | Öffnet die Verbindungsverwaltung. |
| Alt + T | Neuer Abfrage-Tab auf der aktuellen Verbindung. |
| Shift / ⌘ / Ctrl + click | Im Ergebnisgrid die Zeilenauswahl erweitern (Shift) oder umschalten (⌘ / Strg). |
| F2 / Enter | Im Ergebnisgrid: die zuletzt angeklickte Zelle bearbeiten (Doppelklick tut dasselbe). |
| Ctrl / ⌘ + F | Suchen und Ersetzen im Editor. |