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 Startbildschirm: Nutzungsbedingungen annehmen, den Agenten starten oder die Beispieldatenbank ausprobieren.
Der Startbildschirm: Nutzungsbedingungen annehmen, den Agenten starten oder die Beispieldatenbank ausprobieren.

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 | sh

Windows

irm https://planche.dev/install.ps1 | iex

Alles 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.

Die geöffnete Beispieldatenbank: oben die Verbindungs-Tabs, links der Schema-Baum, in der Mitte der SQL-Editor, darunter die Ergebnisse.
Die geöffnete Beispieldatenbank: oben die Verbindungs-Tabs, links der Schema-Baum, in der Mitte der SQL-Editor, darunter die Ergebnisse.

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.

Ein MySQL-Profil. Links die gespeicherten Profile, rechts das Formular, das sich je Engine ändert.
Ein MySQL-Profil. Links die gespeicherten Profile, rechts das Formular, das sich je Engine ändert.

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 mit ALTER 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 default leer 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ür https ein; 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 lokale wrangler 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.

Der SSH-Bereich: Sprunghost, Benutzer und Authentifizierung. Host und Port darüber bleiben die der Datenbank, vom Sprunghost aus gesehen.
Der SSH-Bereich: Sprunghost, Benutzer und Authentifizierung. Host und Port darüber bleiben die der Datenbank, vom Sprunghost aus gesehen.

Felder

  • SSH Host / Port – der Bastion-Host. Ein Host-Alias aus Ihrer ~/.ssh/config funktioniert hier: Planche löst ihn genau wie der ssh-Befehl auf und ergänzt HostName, User, Port und IdentityFile (Include-Direktiven werden verfolgt, ProxyJump wird 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 IdentityFile aus 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 dem npx planche läuft, sodass Hardware-Schlüssel und weitergeleitete Agenten funktionieren.
  • Host und Port der Datenbank im Formular darüber werden auf dem Sprunghost aufgelöst: meist 127.0.0.1 oder 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=none vor dem Start des Agenten, wenn er ~/.ssh/config und 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

  1. Führen Sie wrangler dev im Worker-Projekt aus.
  2. Führen Sie npx planche aus und erstellen Sie eine Verbindung vom Typ Cloudflare DO (wrangler dev).
  3. 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 wie a*) 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 – INFO als 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 GET mit 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 USAGE schä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 UNLINK in 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.

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.

Tabellen, Views und Trigger der Beispieldatenbank samt Anzahl.
Tabellen, Views und Trigger der Beispieldatenbank samt Anzahl.

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.

Vervollständigung aus dem echten Schema, mit den Schlüsselwörtern des Dialekts.
Vervollständigung aus dem echten Schema, mit den Schlüsselwörtern des Dialekts.

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

Jede Ausführung mit Dauer, Zeilenzahl und der Verbindung, auf der sie lief.
Jede Ausführung mit Dauer, Zeilenzahl und der Verbindung, auf der sie lief.

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.

Eine aus dem Baum geöffnete Tabelle: Bearbeitungsleiste, Suche, Sortierung und Spaltenauswahl.
Eine aus dem Baum geöffnete Tabelle: Bearbeitungsleiste, Suche, Sortierung und Spaltenauswahl.

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.

Das Zellmenü arbeitet auf der Auswahl: Verknüpfungen, Filter nach Wert, Kopien, Bearbeitungen und Spaltensichtbarkeit.
Das Zellmenü arbeitet auf der Auswahl: Verknüpfungen, Filter nach Wert, Kopien, Bearbeitungen und Spaltensichtbarkeit.
  • 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.

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.

Aus einer Servertabelle gesendete Zeilen landen in einer Scratchpad-Tabelle, die Sie frei abfragen können.
Aus einer Servertabelle gesendete Zeilen landen in einer Scratchpad-Tabelle, die Sie frei abfragen können.

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.

Eine entfernte Tabelle, ins Scratchpad geholt und lokal aggregiert.
Eine entfernte Tabelle, ins Scratchpad geholt und lokal aggregiert.

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

Zwei Datenbanken nebeneinander: fehlende, geänderte und zusätzliche Objekte.
Zwei Datenbanken nebeneinander: fehlende, geänderte und zusätzliche Objekte.

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

Zeilenweiser Vergleich anhand des Primärschlüssels der Quelle.
Zeilenweiser Vergleich anhand des Primärschlüssels der Quelle.

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…

Eine Tabelle auf einer anderen Verbindung neu anlegen – nur die Struktur oder mit den Zeilen.
Eine Tabelle auf einer anderen Verbindung neu anlegen – nur die Struktur oder mit den Zeilen.

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

Das Panel liest das Schema, öffnet einen Tab und führt die Abfrage dort aus — die Karten über der Antwort sind die Aufrufe.
Das Panel liest das Schema, öffnet einen Tab und führt die Abfrage dort aus — die Karten über der Antwort sind die Aufrufe.

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

Schreiben hält hier an. Die Karte nennt die Anweisung, die Vorschau zählt die Zeilen, bevor etwas geschrieben wird.
Schreiben hält hier an. Die Karte nennt die Anweisung, die Vorschau zählt die Zeilen, bevor etwas geschrieben wird.
ai-dry-run
  • 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.
  • DROP und TRUNCATE laufen 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. Zwei der Provider brauchen gar keinen Schlüssel.
Einstellungen › KI. Zwei der Provider brauchen gar keinen Schlüssel.

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 login findet 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: was das Token erreicht, und die Zeile zum Einfügen.
Hilfe › KI-Agent verbinden: was das Token erreicht, und die Zeile zum Einfügen.

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

Ein UPDATE als SELECT vorab: wie viele Zeilen – und welche.
Ein UPDATE als SELECT vorab: wie viele Zeilen – und welche.

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, TRUNCATE sowie DELETE/UPDATE ohne WHERE fragen 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.
Einstellungen › Sicherheit – jede Leitplanke lässt sich abschalten, wenn sie im Weg ist.
Einstellungen › Sicherheit – jede Leitplanke lässt sich abschalten, wenn sie im Weg ist.

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.

Die Beispieldatenbank: 23 Tabellen und ihre Fremdschlüssel.
Die Beispieldatenbank: 23 Tabellen und ihre Fremdschlüssel.

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.

Spalten mit Typ, Länge, Standardwert, Nullbarkeit und Primärschlüssel.
Spalten mit Typ, Länge, Standardwert, Nullbarkeit und Primärschlüssel.

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.

Das erzeugte DDL, immer synchron zum Formular.
Das erzeugte DDL, immer synchron zum Formular.

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

Eine Tabelle exportieren: Trennzeichen, Kopfzeile und ein Fortschrittsbalken beim Schreiben.
Eine Tabelle exportieren: Trennzeichen, Kopfzeile und ein Fortschrittsbalken beim Schreiben.
  • 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.com

gateway.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; false erlaubt 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 – dazu serviceName für Oracle, file für SQLite und accountId / databaseId / apiToken für Cloudflare D1. Ein ssh-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"
  }
}
  • auth ist key, agent oder password. Bei key ohne privateKey nimmt der Agent die IdentityFile, die die ~/.ssh/config des 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. agent nutzt den SSH_AUTH_SOCK des Gateways, password braucht ein Feld password.
  • Wenn Sie privateKey doch setzen, ist der Wert der Schlüsselinhalt (PEM / OpenSSH), kein Pfad. passphrase ergä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 über acceptHostKey mit dem SHA256:…-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-url an.

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

  1. Melden Sie sich mit GitHub an. Die Anmeldung dient nur dazu, dass der Server weiß, welcher Tresor Ihnen gehört.
  2. 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.
  3. 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.

TastenWirkung
F9Ausführen – das ganze Skript oder die Anweisung am Cursor, je nach Einstellungen › Sicherheit › Ausführungsbereich.
Ctrl / ⌘ + EnterFührt die Auswahl aus, sonst die Anweisung unter dem Cursor.
Ctrl / ⌘ + Shift + EnterFührt immer das ganze Skript aus, unabhängig vom Ausführungsbereich.
Ctrl / ⌘ + KSchnellbefehl-Palette: per Eingabe zu einer Tabelle, Menüaktion oder Verbindung springen.
Alt + NÖffnet die Verbindungsverwaltung.
Alt + TNeuer Abfrage-Tab auf der aktuellen Verbindung.
Shift / ⌘ / Ctrl + clickIm Ergebnisgrid die Zeilenauswahl erweitern (Shift) oder umschalten (⌘ / Strg).
F2 / EnterIm Ergebnisgrid: die zuletzt angeklickte Zelle bearbeiten (Doppelklick tut dasselbe).
Ctrl / ⌘ + FSuchen und Ersetzen im Editor.