WebDataStudio

SELECT alles FROM deine_datenbanken;

Deine Datenbanken, in einem Browser-Tab

WebDataStudio ist ein Datenbank-Studio, das du selbst betreibst: ein Container, neun Engines, keine Installation auf irgendeinem Rechner. Abfragen schreiben, Daten bearbeiten, Schemas entwerfen, Ausführungspläne lesen und den Server im Blick behalten — aus jedem Browser im Netz.

Herunterladen Zur Dokumentation Quellcode auf GitHub
# ein Container, ein Volume, fertig
docker run -d -p 8080:8080 -v wds-data:/data \
  -e WDS_CONN_LOCAL="postgres://app:pw@db:5432/shop" \
  ghcr.io/fgilde/webdatastudio

Neun Engines, eine Oberfläche

Jeder Treiber sagt, was er kann — und die Oberfläche blendet aus, was eine Engine nicht unterstützt.

PostgreSQLpostgres://
MySQLmysql://
MariaDBmariadb://
SQL Serversqlserver://
SQLitesqlite:///
Oracleoracle://
DuckDBduckdb://
ClickHouseclickhouse://
MongoDBmongodb://
Redisredis://
S3 · Blob · GCSs3:// · azblob:// · gs://

Was drin ist

Alles davon steckt im selben Image; nichts ist für eine kostenpflichtige Stufe zurückgehalten.

Ein echter SQL-Editor

Monaco mit dialektbewusstem Highlighting, schemabewusster Vervollständigung, Formatierung, hervorgehobenem Statement unter dem Cursor, F5 für die Auswahl, Parametern und Snippets.

Ergebnisse, die skalieren

Ein virtualisiertes Grid für hunderttausende Zeilen, gestreamt während die Abfrage noch läuft, mit Gruppierung, Formularansicht, transponierter Ansicht, Charts und einer Karte für Geodaten.

Eine Filtersprache, kein Suchfeld

^beginnt, $endet, ~nicht, >10, NULL, LAST MONTH — Leerzeichen ist UND, Komma ist ODER. Dazu die Werte, die eine Spalte wirklich enthält, als Checkboxen mit Anzahl.

Den Daten folgen

Eine Spalte aus der Tabelle leihen, auf die ein Fremdschlüssel zeigt — oder eine Zeile in alles öffnen, was mit ihr zu tun hat, so tief wie die Frage reicht. Oder einer Tabelle selbst folgen: die Seite liest sich getaktet neu, und was seit dem letzten Lesen dazukam, ist eingefärbt.

Buckets als Verbindung

S3, Azure Blob, Google Cloud Storage oder ein Ordner — im Baum neben den Datenbanken. Ein Objekt ansehen, eine Parquet-, CSV- oder JSON-Datei (oder ein ganzes Prefix) über DuckDB als Tabelle abfragen und daraus eine echte Tabelle in der Datenbank daneben machen.

Dokumente, nicht Text

Eine JSONB-Spalte ist in den meisten Grids eine Zelle Text. Hier hat sie eine Struktur: welche Pfade es gibt, wie oft, welche Typen, ein Beispiel — und das SELECT, das sie zu Spalten macht, in der Schreibweise dieser Engine.

Wie diese Zeile vorher aussah

Gelesen aus dem, was die Datenbank selbst aufbewahrt hat — eine systemversionierte Tabelle, MariaDBs System Versioning, Oracles Flashback — mit den Spalten, die sich zwischen den Versionen bewegt haben. Wo eine Engine nichts aufbewahrt, sagt sie das, statt etwas zu erfinden.

Ein Sicherheitsgurt für den Editor

Eine Transaktion über mehrere Statements offen halten: das UPDATE ausführen, ansehen, was es getan hat — sichtbar nur für dich —, und dann committen oder zurückrollen. Eine, zu der niemand zurückkommt, beendet das Studio selbst; ein geschlossener Browser hinterlässt also keine Sperren.

MongoDB und Redis im selben Grid

Kein SQL, kein Problem: eine Collection wird vom Server mit einem find geblättert, sortiert und gefiltert, und eine Redis-Datenbank ist ihre Schlüssel mit Typ, TTL, Länge und Speicher — eine Cache-Inventarliste, die sich sortieren und exportieren lässt. Ein Schlüssel öffnet als Feld und Wert, Mitglied und Score oder Index und Wert.

Was wächst, was langsamer wird

Tabellengrößen werden gemessen, wann immer jemand hinsieht — die Historie baut sich selbst auf; die größte Änderung zuerst, mit Rate pro Tag. Dazu, was dieses Studio immer wieder ausführt, nach Form gruppiert und mit Trend — und eine aufgezeichnete Minute, gelesen vom Index-Advisor.

Regeln über die Daten

Der Katalog kann nicht sagen, dass ein Drittel der Bestellungen von gestern keinen Kunden hat. Eine Regel kann es: hat einen Wert, keine Duplikate, in einem Bereich, zeigt auf eine existierende Zeile, ist aktuell. Jede zählt die Zeilen, die sie brechen — und eine fehlschlagende Regel wird ein Health-Finding.

Ein Entwicklungs-Subset, das lädt

Diese Zeilen, die Zeilen, auf die sie zeigen, und alles Personenbezogene ersetzt — ein SQL-Skript, das in eine leere Datenbank lädt. Schlüssel bleiben unangetastet, und derselbe Wert wird immer zum selben Pseudonym: die Tabellen passen also weiter zusammen.

Single Sign-on, und wer was getan hat

Mit Entra, Keycloak, Auth0 oder Okta anmelden und deren Gruppen auf die Rollen des Studios abbilden — oder die Konten in der Umgebung behalten. In beiden Fällen hinterlässt jedes Statement, jeder Export und jeder abgelehnte Zugriff eine Zeile, die ein Admin liest.

Was in dieser Spalte steht, gezählt

Zeilen, leere Werte, verschiedene Werte, kleinster und größter — je Spalte, in einem Statement. Dazu die Spalten, deren Werte wie IBAN, Kartennummer oder Adresse aussehen: so wird col_17 gefunden und maskiert.

Ein Index gemessen, nicht behauptet

Der Advisor schreibt das CREATE INDEX; Try it legt es an, fragt die Engine erneut nach dem Plan und wirft es weg. „Der Planner würde ihn wohl nutzen" ist genau der Teil, den alle falsch einschätzen.

Ein Weg zurück nach einem DELETE

Ein Statement, das alle Zeilen nimmt, liest die Tabelle vorher in ein Archiv — eine Datei, die das Studio wieder öffnen und als Inserts ausschreiben kann. Undo galt nie für Statements; jetzt schon.

Eine gespeicherte Abfrage als Formular

Bind-Parameter werden Felder, der Link trägt die Werte und läuft von selbst. „Die Zahlen vom letzten Monat" ist damit etwas zum Verschicken statt zum Erklären — und es liest nur, was auch immer die Abfrage sagt.

Notizen dort, wo das Objekt ist

COMMENT ON braucht ein DDL-Recht und eine Migration, also landet Erarbeitetes in einer Chat-Nachricht. Eine Notiz hier hat Namen und Datum und steht neben der Tabelle, dem View oder der Funktion, um die es geht.

Für Agenten, nach den Regeln des Studios

Ein MCP-Endpunkt mit derselben Abmachung wie für Menschen: maskierte Spalten bleiben maskiert, eine nur-lesende Verbindung bleibt nur-lesend, und ein Schreibvorgang wird vorher gezeigt und gehasht.

Archive

Ein Ergebnis als Datei behalten, die das Studio aufbewahrt — wie die Tabelle vor der Migration aussah —, später wieder als Grid öffnen und die Zeilen als Inserts ausschreiben.

Bearbeiten mit Vorschau

Zellen bearbeiten wie in einer Tabellenkalkulation. Vor der Ausführung siehst du das exakte SQL, und eine Tabelle ohne Primärschlüssel sagt, warum sie nicht bearbeitbar ist.

Export und Import

CSV, TSV, Excel, JSON, NDJSON, XML, YAML, Markdown, HTML, SQL und Parquet — gestreamt statt gepuffert. Import aus CSV, Excel, JSON und SQL, oder eine Tabelle in eine andere Engine kopieren.

Schema-Werkzeuge

Tabellen-Designer, Index- und Constraint-Verwaltung, Editoren für Views, Routinen, Trigger und Sequenzen, ER-Diagramm mit automatischem Layout — und für jede Änderung eine Statement-Vorschau, daneben alles, was von dem Objekt abhängt.

Dashboards

Eine Leinwand in vierundzwanzig Spalten mit fünfzehn Widget-Typen — Kennzahl, Tacho, Balken, Linie, Kreis, Treemap, Heatmap, Karte, Sankey, Tabelle —, eine Zeitspanne, die die Statements über $__timeFilter lesen, Variablen als gebundene Parameter und ein Widget über mehrere Datenbanken gleichzeitig. Grafana-Dashboards werden gelesen und geschrieben, mit Bericht darüber, was nicht mitkommen konnte.

Analyse

Geschätzte und tatsächliche Pläne mit Kosten-Heatmap, ein Index-Berater, der das CREATE INDEX gleich schreibt, Deep Analyze, langsame Abfragen und Server-Metriken.

Administration

Wartungsbefehle, Sitzungen samt Beenden, Datenbanken, Benutzer und Rechte, das Server-Log, ein Dashboard, das seine Zahlen über eine halbe Stunde zeichnet, sowie Backup und Restore über die Werkzeuge der Engine selbst.

Was nur PostgreSQL hat

Row Level Security und ihre Policies, die Partitionen einer partitionierten Tabelle samt Grenzen, der Quelltext einer Funktion und ein Lauf in einer zurückgerollten Transaktion — dazu Extensions, Rollen, Tablespaces und Publications im Baum.

Zum Hosten gebaut

Verbindungen kommen aus Umgebungsvariablen — ein Studio für deinen Stack ist ein Container in Docker Compose, Kubernetes oder einem .NET-Aspire-App-Host.

Ansehen

Dieselbe Anwendung in zwei ihrer 21 Themes.

Abfrage-Editor und Ergebnis-Grid
Abfrage-Editor und Ergebnis-Grid
ER-Diagramm
ER-Diagramm mit automatischem Layout
Chart-Ansicht eines Ergebnisses
Jedes Ergebnis als Chart
Administrationsbereich
Wartung, Sitzungen, Benutzer, Backups
Ein Dashboard als Leinwand
Was der Server tut, über eine halbe Stunde
Eine Perspective über verwandte Zeilen
Eine Zeile und alles, was mit ihr zu tun hat
Spaltenmenü mit der Filtersprache
Eine Filtersprache, und die Werte einer Spalte
Row Level Security und ihre Policies
Row Level Security, pro Tabelle

In .NET Aspire

In den App-Host hängen — die Verbindungszeichenfolge deiner Ressource kommt automatisch an.

var db = builder.AddPostgres("db").AddDatabase("shop");

builder.AddContainer("studio", "ghcr.io/fgilde/webdatastudio")
       .WithHttpEndpoint(port: 8080, targetPort: 8080)
       .WithEnvironment("WDS_CONN_SHOP", db.Resource.ConnectionStringExpression)
       .WithVolume("wds-data", "/data");

Nextended Oder Nextended.Aspire.Hosting.WebDataStudio installieren und builder.AddPostgres("pg").AddDatabase("shop").WithWebDataStudio(); schreiben — ein Aufruf je Datenbank, ein Studio, Engine automatisch erkannt.

Im Vergleich

Nur freie und Community-Editionen, Stand August 2026. Jedes dieser Werkzeuge ist gut; die Tabelle sagt, welches zu einem browserbasierten, selbst gehosteten Setup passt.

  WebDataStudio DbGate Adminer phpMyAdmin pgAdmin 4 CloudBeaver CE
Läuft im Browser jajaja jajaja
Offizielles Container-Image jajaja jajaja
Lizenz MITGPL/PremiumApache 2.0/GPLGPL PostgreSQL-LizenzApache 2.0
Relationale Engines PostgreSQL, MySQL/MariaDB, SQL Server, SQLite, Oracle, DuckDB, ClickHouse PostgreSQL, MySQL/MariaDB, SQL Server, SQLite, Oracle, ClickHouse und weitere MySQL/MariaDB, PostgreSQL, SQLite, SQL Server, Oracle, Firebird MySQL/MariaDB PostgreSQL viele, über JDBC
Einen Wert in jeder Tabelle finden, serverseitig janeinnein neinneinja
Geplante Jobs: Agent, pg_cron, Events lesen, Änderungen als Statementnein nur Agentnur Events neinja
Buckets und Dateien als Verbindung, als Tabellen abfragbar S3, Azure Blob, GCS, ein Ordnerneinnein neinneinDateien, keine Buckets
MongoDB und Redis beidesbeidesnein neinneinin der Enterprise-Edition
Verbindungen aus Umgebungsvariablen jajaein Server pro URL jaüber servers.jsonüber Konfigurationsdatei
ER-Diagramm jajanein Designerjaja
Ausführungspläne geschätzt und tatsächlichTextplanEXPLAIN-Ausgabe EXPLAIN-Ausgabegrafischja
Index-Berater und Deep Analyze janeinnein Berater für MySQL-Variablenneinnein
Schema- und Datenvergleich jain der Premium-Editionnein neinneinnein
Backup und Restore aus der Oberfläche janur ExportSQL-Dump SQL-Dumpjanur Export
Preis für all das kostenlosKern kostenlos, Premium kostenpflichtig kostenloskostenloskostenlos Kern kostenlos, Enterprise kostenpflichtig

Etwas veraltet? Ein Issue aufmachen — ein Vergleich taugt nur, solange er stimmt.

Holen

Der Container ist der Hauptweg. Die Desktop-Builds sind derselbe Server in einer einzelnen Datei.

Docker

docker run -d -p 8080:8080 -v wds-data:/data ghcr.io/fgilde/webdatastudio
Image auf GHCR

Windows, macOS, Linux

Eine eigenständige Datei pro Plattform; starten, und der Browser geht auf.
Releases

Aus dem Quellcode

.NET 10 und Node 22, dann dotnet run und npm run dev.
Entwicklungs-Anleitung

Schreib uns

Eine Frage, eine Idee, ein Fehler, der nicht ganz ein GitHub-Issue ist — oder ein Kaffee für das nächste Release.

Kontakt WebDataStudio WebDataStudio unterstützen