Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
80ccf1d
test(prometheus): add the live compose services and the raw gate-4 ev…
cevheri Sep 23, 2026
7e54e9b
feat(ui): let an engine declare its connection field labels and hints
cevheri Sep 23, 2026
4c340a9
feat(prometheus): add the request paths and throwaway TLS fixtures
cevheri Sep 23, 2026
4a48124
feat(prometheus): add the transport seam and the PromQL builder
cevheri Sep 23, 2026
c81ac76
feat(prometheus): bound the queries in flight per connection
cevheri Sep 23, 2026
ac0dd55
feat(editor): give PromQL its own queryLanguage, tab type and editor …
cevheri Sep 23, 2026
e877bb3
feat(prometheus): shape query answers into grid rows, bounded by seri…
cevheri Sep 23, 2026
268893f
feat(prometheus): add the HTTP transport, the one file that knows the…
cevheri Sep 23, 2026
f310881
feat(prometheus): map the status reads to the monitoring surfaces
cevheri Sep 23, 2026
c2b3cbb
fix(ui): offer the row actions only where their destination can run them
cevheri Sep 23, 2026
db27ed2
feat(prometheus): register the prometheus type-id in every exhaustive…
cevheri Sep 23, 2026
949e5a8
feat(prometheus): write PromQL for a metric in both query generators
cevheri Sep 23, 2026
d9225df
feat(prometheus): map the transport's categories onto the repository'…
cevheri Sep 23, 2026
3ecdeb3
feat(prometheus): add the object surface, from kinds to sources
cevheri Sep 23, 2026
c4982e9
feat(prometheus): compose the provider and build it from the factory
cevheri Sep 23, 2026
d30dce4
feat(api): keep a provider-reported wasLimited on POST /api/db/query
cevheri Sep 23, 2026
0672c24
test(prometheus): guard the wire seam and the network seam of the pro…
cevheri Sep 23, 2026
efa7536
test(prometheus): hold the shared endpoint validation end to end and …
cevheri Sep 23, 2026
4129081
test(prometheus): the provider end to end through the real composition
cevheri Sep 23, 2026
1d1c21c
test(prometheus): re-capture the subquery fixture with a full stepped…
cevheri Sep 23, 2026
bc370af
docs(prometheus): provider reference, backlog, engine counts, chart 0…
cevheri Sep 23, 2026
334110a
feat(compat): VictoriaMetrics as a measured Prometheus relative
cevheri Sep 23, 2026
4366617
fix(prometheus): bound the shaped result by its size, and pin the pro…
cevheri Sep 23, 2026
39e25b6
fix(agent): read a promql fence as naming the prometheus type-id
cevheri Sep 23, 2026
fb2627e
test(prometheus): pin the fetch path's connection release to the code…
cevheri Sep 23, 2026
d10b181
fix(safety): answer PromQL from its own row instead of reading it as SQL
cevheri Sep 23, 2026
871e5a7
fix(editor): read editor shortcuts at invocation and type the embedde…
cevheri Sep 23, 2026
b6acb98
fix(prometheus): read omitted descriptions as absent, hedge non-envel…
cevheri Sep 23, 2026
720b0c8
fix(prometheus): frame the Tables list as top metrics, fix the limit …
cevheri Sep 23, 2026
3730c98
fix(compat): re-measure VictoriaMetrics now that omitted descriptions…
cevheri Sep 23, 2026
382a142
fix(prometheus): name the server, not Prometheus, in what the provide…
cevheri Sep 23, 2026
5333f54
docs(prometheus): make the provider doc, READMEs and backlog match th…
cevheri Sep 23, 2026
3033888
fix(prometheus): label the user field "User", the name its hint gives it
cevheri Sep 23, 2026
a9dc947
fix(prometheus): keep the series a matrix fits when one alone would not
cevheri Sep 23, 2026
cc0474e
fix(admin): head the Operations table list with the provider's caption
cevheri Sep 23, 2026
3586909
docs(prometheus): state what the chart tab draws and record what the …
cevheri Sep 23, 2026
5fc0caa
fix(admin): print a row with no schema by its bare name in the Operat…
cevheri Sep 23, 2026
18ab43c
docs(prometheus): record the result byte budget as M14 and match the …
cevheri Sep 23, 2026
9126fef
fix(prometheus): end a PromQL comment where the lexer does, in linear…
cevheri Sep 23, 2026
fb3bb6c
refactor(prometheus): sort label names by an explicit code-unit order
cevheri Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Guidance for Claude Code in this repo — conventions, rules, and gotchas only.

## Project Overview

Web-based SQL IDE for cloud-native teams: sixteen external engines, plus the embedded LibreDB store — `EXTERNAL_DATABASE_TYPES` in [`src/lib/db/compatibility.ts`](src/lib/db/compatibility.ts) is the external-engine list, never a prose enumeration — plus AI query assistance. It runs **two ways** — standalone Next.js app and published npm package — and the two render different chrome, so a UI change verified in one is not verified in the other.
Web-based SQL IDE for cloud-native teams: seventeen external engines, plus the embedded LibreDB store — `EXTERNAL_DATABASE_TYPES` in [`src/lib/db/compatibility.ts`](src/lib/db/compatibility.ts) is the external-engine list, never a prose enumeration — plus AI query assistance. It runs **two ways** — standalone Next.js app and published npm package — and the two render different chrome, so a UI change verified in one is not verified in the other.

## Branching & PRs

Expand Down
12 changes: 8 additions & 4 deletions DOCKERHUB.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

> 📖 **Full documentation, source, and issues:** <https://github.com/libredb/libredb-studio>

Query **PostgreSQL, MySQL, SQLite, libSQL, DuckDB, Oracle, SQL Server, MongoDB, Redis, Couchbase, ClickHouse, Apache Druid, Elasticsearch, OpenSearch, Apache Trino and Apache Cassandra** from your browser — with AI-powered query assistance, interactive ER diagrams, schema diff, a virtualized data grid, RBAC, OIDC SSO, and a live monitoring dashboard. A lightweight, secure bridge between heavy desktop tools (DataGrip/DBeaver) and minimal CLIs.
Query **PostgreSQL, MySQL, SQLite, libSQL, DuckDB, Oracle, SQL Server, MongoDB, Redis, Couchbase, ClickHouse, Apache Druid, Elasticsearch, OpenSearch, Apache Trino, Apache Cassandra and Prometheus** from your browser — with AI-powered query assistance, interactive ER diagrams, schema diff, a virtualized data grid, RBAC, OIDC SSO, and a live monitoring dashboard. A lightweight, secure bridge between heavy desktop tools (DataGrip/DBeaver) and minimal CLIs.

---

Expand Down Expand Up @@ -109,7 +109,8 @@ Every one of those tags is published on three bases, and the suffix is appended

## Supported databases

Sixteen external engines share one interface, and three of them are read-only because their own SQL is. The table below has seventeen rows: the seventeenth is the embedded LibreDB store, which ships inside the image rather than being a server you connect out to.
Seventeen external engines share one interface, and three of them are read-only because their own SQL is.
The eighteenth row is the embedded LibreDB store, which ships inside the image rather than being a server you connect out to.

| Database | Driver | Highlights |
| :--- | :--- | :--- |
Expand All @@ -129,13 +130,15 @@ Sixteen external engines share one interface, and three of them are read-only be
| **OpenSearch** | none — HTTP | The same read-only IDE over `_plugins/_sql`, from the same provider module; `LIMIT … OFFSET` paging works here |
| **Apache Trino** | none — HTTP | Full SQL IDE over the client protocol, every configured catalog in one tree, `EXPLAIN (FORMAT JSON)` plans, `system.runtime` monitoring and query cancellation |
| **Apache Cassandra** | `cassandra-driver` (pure JS) | CQL editor over the native protocol, keyspace browser with partition and clustering keys marked, `system_views` monitoring. No row counts and no sizes: the only figures Cassandra publishes are partition estimates and whole mebibytes, so neither is shown rather than shown wrong |
| **Prometheus** | none, HTTP | PromQL editor, metric, rule and target browser |
| **LibreDB** | `@libredb/libredb` | The embedded key-value store, for a database with nothing to install |

**Read-only where the engine is.** Druid, Elasticsearch and OpenSearch have no `UPDATE` and no `CREATE TABLE` anywhere in their grammar, so inline editing and DDL are reported as unsupported instead of failing when used. Everything else works wherever the engine has something to answer with.
**Read-only where the engine is.** Druid, Elasticsearch and OpenSearch have no `UPDATE` and no `CREATE TABLE` anywhere in their grammar, so inline editing and DDL are reported as unsupported instead of failing when used.
Prometheus is read-only too: Studio calls only its read endpoints.

### Engines with no provider of their own

Twenty-six further engines speak the wire protocol of one of the sixteen drivers above, so they connect through it unchanged: pick that driver in the connection dialog. The table has twenty-two rows rather than twenty-six because engines that behave identically share a row; all twenty-six are named in it. Every one of them was measured against a real instance rather than assumed, and how much of the product worked is recorded per engine.
Twenty-seven further engines speak the wire protocol of one of the seventeen drivers above, so they connect through it unchanged: pick that driver in the connection dialog. Engines that behave identically share a row, and all twenty-seven are named in it. Every one of them was measured against a real instance rather than assumed, and how much of the product worked is recorded per engine.

| Engine | Connect as | Support |
| :--- | :--- | :--- |
Expand All @@ -159,6 +162,7 @@ Twenty-six further engines speak the wire protocol of one of the sixteen drivers
| OceanBase | `mysql` | Partial - health fails outright because the tenant has no `performance_schema` database at all, every size reads 0 B, and row counts are correct only once `ANALYZE TABLE` has run |
| SingleStore | `mysql` | Partial - every surface answers, including the five that once failed for reasons that were ours rather than SingleStore's. Row counts and sizes are missing rather than wrong, a 2000-row table reading 0 rows and 0 B, and foreign keys do not exist at all |
| ScyllaDB | `cassandra` | Partial - the editor and the object browser work in full, and all 18 CQL types read back byte-identically to the Apache Cassandra 5.0.9 probed in the same pass. ScyllaDB has no `system_views` keyspace at all, so the overview, health, metrics, session and monitoring panels read empty rather than throw. No version is displayed, and creating a keyspace on the 2026.2 line needs `NetworkTopologyStrategy` |
| VictoriaMetrics | `prometheus` | Partial |
| Materialize · RisingWave | `postgres` | Query editor only |
| Databend | `mysql` | Query editor only — SQL and a plain `EXPLAIN` run, but every parameterised read fails with *Prepare is not support in Databend*, so the object browser and all statistics panels are empty |

Expand Down
18 changes: 12 additions & 6 deletions README.md

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions README_es.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,9 @@ Tomada en serio, esa frase deja de ser una preferencia y se vuelve una especific

## Capacidades principales

### Dieciséis motores, una sola interfaz
### Diecisiete motores, una sola interfaz

PostgreSQL · MySQL · Oracle · SQL Server · SQLite · libSQL · DuckDB · MongoDB · Redis · Couchbase · ClickHouse · Apache Druid · Elasticsearch · OpenSearch · Apache Trino · Apache Cassandra
PostgreSQL · MySQL · Oracle · SQL Server · SQLite · libSQL · DuckDB · MongoDB · Redis · Couchbase · ClickHouse · Apache Druid · Elasticsearch · OpenSearch · Apache Trino · Apache Cassandra · Prometheus

Todos los motores SQL comparten el mismo explorador de esquemas, los diagramas ER, la comparación de esquemas y los paneles de monitoreo. MongoDB y Redis no son motores SQL: no tienen diagrama ER ni comparación de esquemas. Druid, Elasticsearch, OpenSearch y Trino son doblemente excepcionales: sus interfaces SQL sobre HTTP no tienen una forma de URI que este build sepa interpretar, así que se configuran por host y puerto, y las migraciones que se generan explican la limitación en lugar de inventar DDL para un motor cuyo SQL no tiene sentencias de cambio de columna. Lo mismo pasa con las colecciones sin esquema de Couchbase. El diagrama ER de los clústeres de búsqueda tiene cajas pero no líneas: los índices no declaran claves foráneas, y en el modelo del motor no hay ninguna que declarar.

Expand All @@ -119,9 +119,10 @@ Todos los motores SQL comparten el mismo explorador de esquemas, los diagramas E
| **OpenSearch** | Sin driver, HTTP puro (`POST /_plugins/_sql`, puerto 9200) | El mismo módulo de proveedor que Elasticsearch, con el mismo IDE de solo lectura y el mismo explorador. Acá sí funciona `LIMIT n OFFSET m`, así que la paginación está disponible |
| **Apache Trino** | Sin driver, HTTP puro (protocolo de cliente, `POST /v1/statement`, puerto 8080) | IDE SQL completo sobre todos los catálogos configurados, árbol de esquemas por el `information_schema` del catálogo fijado en la conexión, monitoreo con `system.runtime` y `jmx`, conteos reales de filas vía `SHOW STATS`, cancelación de consultas y mantenimiento con `kill_query`. Trino es un motor de consultas y no almacena datos, así que no declara claves primarias, foráneas ni índices en ningún lado: el diagrama ER tiene cajas sin líneas, la edición en línea está desactivada, y el panel de capacidad lista catálogos en vez de inventar un tamaño. Las sentencias que fallan también vuelven con HTTP 200; y aunque el clúster tenga la autenticación desactivada, una contraseña sobre HTTP en texto plano se sigue rechazando |
| **Apache Cassandra** | `cassandra-driver` (JavaScript puro, sin módulos nativos) | IDE de CQL sobre el protocolo nativo (puerto 9042), explorador de keyspaces con las claves de partición y de agrupamiento marcadas, resumen desde `system_views`, tiempo de actividad y sentencias en ejecución. La conexión **exige `localDataCenter`**: sin eso el driver se niega a conectar. No hay EXPLAIN (la gramática de CQL directamente no tiene esa palabra clave), no hay cancelación de consultas (el protocolo no tiene un frame de cancelación) y no hay operaciones de mantenimiento (compaction, repair y flush son operaciones JMX de `nodetool`). Y **no muestra ninguna cantidad de filas ni tamaño**: lo único que Cassandra puede dar es una estimación de particiones a partir de los archivos ya escritos a disco (una tabla de 500 filas se leyó como 143) y enteros en MiB (una tabla de 19.476 bytes se lee como `1 MiB`), así que preferimos no mostrar nada antes que mostrar un número equivocado |
| **Prometheus** | Sin driver, HTTP puro (la API HTTP de Prometheus, puerto 9090) | Editor de PromQL que envía el texto al servidor sin cambios, resultados en la grilla y en la pestaña de gráficos (una subconsulta con paso, como `rate(x[5m])[1h:1m]`, se grafica como líneas sobre sus marcas de tiempo: la pestaña abre con la primera serie, se agregan más desde el menú Y-Axis, una línea cada una, y se dibujan como máximo ocho a la vez, más allá de lo cual dice "Showing first 8 of N series"; pero el gráfico dibuja en 0 una muestra que falta y un `NaN` o `Inf` entre números, así que un rango crudo sobre targets con desfases de scrape distintos muestra ceros falsos), explorador de métricas con los nombres de etiqueta como columnas y los metadatos como fuente, grupos de reglas con reglas de registro y de alerta (una alerta disparada se marca en el árbol), pools y targets de scrape (un target caído se marca en el árbol), y salud, versión, tiempo de actividad y estadísticas del TSDB. Solo lectura por diseño: no llama a la API de administración, no hace remote write, no tiene EXPLAIN (el endpoint de parseo es experimental) ni operaciones de mantenimiento. Una credencial sobre HTTP en texto plano se envía en vez de rechazarse, así que activá TLS si la conexión cruza una red que no controlás |
| **Redis** | `ioredis` | Editor de comandos, explorador de claves, monitoreo basado en INFO |

> **La seguridad del transporte es transversal, no depende del motor.** El túnel SSH se establece antes de que el proveedor abra la conexión, y la conexión se reescribe hacia el extremo local: por eso no depende del motor, y aplica a cualquier conexión configurada con host y puerto. Las conexiones que se llenan con una cadena de conexión (MongoDB, Couchbase y ClickHouse lo permiten) no tienen host ni puerto, así que no pasan por el túnel; SQLite y DuckDB tampoco tienen ninguno de los dos. El panel de SSL/TLS hoy tiene efecto en PostgreSQL, MySQL, SQL Server, Couchbase, ClickHouse, Druid, Elasticsearch, OpenSearch y Trino; en Trino no es opcional, porque el coordinador rechaza contraseñas sobre HTTP en texto plano. Oracle, MongoDB y Redis ignoran esta opción, así que si el tráfico de esos tres va cifrado depende de cómo esté escrita la cadena de conexión, no de lo que se elija en el diálogo.
> **La seguridad del transporte es transversal, no depende del motor.** El túnel SSH se establece antes de que el proveedor abra la conexión, y la conexión se reescribe hacia el extremo local: por eso no depende del motor, y aplica a cualquier conexión configurada con host y puerto. Las conexiones que se llenan con una cadena de conexión (MongoDB, Couchbase y ClickHouse lo permiten) no tienen host ni puerto, así que no pasan por el túnel; SQLite y DuckDB tampoco tienen ninguno de los dos. El panel de SSL/TLS hoy tiene efecto en PostgreSQL, MySQL, SQL Server, Couchbase, ClickHouse, Druid, Elasticsearch, OpenSearch, Trino y Prometheus; en Trino no es opcional, porque el coordinador rechaza contraseñas sobre HTTP en texto plano. Oracle, MongoDB y Redis ignoran esta opción, así que si el tráfico de esos tres va cifrado depende de cómo esté escrita la cadena de conexión, no de lo que se elija en el diálogo.

> Que Redis entre en una interfaz pensada para SQL se sostiene sobre una convención. `getSchema()` agrupa prefijos de claves en "tablas" usando `SCAN`, que no bloquea (**nunca `KEYS *`**); la salud y las métricas salen de `INFO`; las consultas lentas y las sesiones, de `SLOWLOG GET` y `CLIENT LIST`.

Expand Down
Loading
Loading