Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions public/engines/mariadb.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 3 additions & 2 deletions scripts/fetch-engine-logos.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Re-download the nineteen fetched engine marks into public/engines/.
# Re-download the twenty fetched engine marks into public/engines/.
#
# Ten more marks in public/engines/ are NOT fetched and this script never touches
# them: libredb.svg is our own, and eight come from the product's own icon set,
Expand Down Expand Up @@ -60,6 +60,7 @@ fetch opensearch "$SI/opensearch"
fetch prometheus "$SI/prometheus"
fetch kafka "$SI/apachekafka"
fetch etcd "$SI/etcd"
fetch mariadb "$SI/mariadb"

echo
echo "19 marks in $OUT"
echo "20 marks in $OUT"
53 changes: 37 additions & 16 deletions src/data/engines.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ export interface Engine {
not: string;
/** true only for the store the product carries; it is shown, but never counted as an engine */
embedded?: true;
/**
* Set on an engine with no driver of its own: the id of the engine whose driver
* it connects through. Shown, but never counted, like the embedded store.
*/
via?: string;
}

export const engines: Engine[] = [
Expand All @@ -61,9 +66,19 @@ export const engines: Engine[] = [
name: 'MySQL',
cat: 'SQL',
logo: '/engines/mysql.svg',
desc: 'Pooled connections with information_schema introspection, EXPLAIN plans and performance_schema-backed monitoring.',
desc: 'Pooled connections with information_schema introspection, EXPLAIN plans, performance_schema-backed monitoring and agent mode under a principal verified to hold nothing past SELECT and SHOW VIEW.',
tr: 'mysql2 pool · 3306',
not: 'Agent mode is unavailable, as on every engine but PostgreSQL, SQLite, DuckDB and SQL Server.',
not: 'A transaction a script leaves open is not ended when its pooled connection is released, so it holds its row locks until the connection is reused or the pool closes. The one reliable check reads performance_schema, which is off by default on MariaDB.',
},
{
id: 'mariadb',
name: 'MariaDB',
cat: 'SQL',
logo: '/engines/mariadb.svg',
via: 'mysql',
desc: "Connects through the MySQL driver and was measured against a live server. The overview shows MariaDB's own build string, EXPLAIN FORMAT=JSON plans are drawn as a tree, and agent mode runs under a principal verified to hold nothing past SELECT and SHOW VIEW.",
tr: 'mysql2 pool \u00b7 3306',
not: 'performance_schema is off by default on MariaDB, so cache hit ratio, queries per second and slow queries stay empty until the server runs with performance_schema=ON.',
},
{
id: 'oracle',
Expand All @@ -81,7 +96,7 @@ export const engines: Engine[] = [
logo: '/engines/sqlserver.svg',
desc: 'Pooled connections with sys.* catalog introspection, DMV-backed monitoring and agent mode under a least-privilege read-only profile.',
tr: 'mssql pool · 1433',
not: "The editor has no Explain action: SQL Server's estimated plan is a session mode that a statement prefix cannot express. Only agent mode reads a plan, to admit a statement.",
not: "The editor has no Explain action: SQL Server's estimated plan is a session mode that a statement prefix cannot express. Only agent mode reads an estimated plan, to admit a statement and as the plan it reports.",
},
{
id: 'db2',
Expand Down Expand Up @@ -115,7 +130,7 @@ export const engines: Engine[] = [
name: 'DuckDB',
cat: 'Analytics',
logo: '/engines/duckdb.svg',
desc: 'In-process analytics with full EXPLAIN support and agent mode. Admins can query Parquet and CSV files directly; every other role is confined to the database file.',
desc: 'In-process analytics with full EXPLAIN support and agent mode. Admins can query Parquet and CSV files on their own connections; every other role, and any seed a standard user can reach, is confined to the database file.',
tr: 'file · embedded',
not: 'Single-writer by design: no sessions to list, so health shows storage, not connections.',
},
Expand Down Expand Up @@ -160,7 +175,7 @@ export const engines: Engine[] = [
name: 'MongoDB',
cat: 'Document',
logo: '/engines/mongodb.svg',
desc: 'Document browsing, aggregation pipelines and index introspection over the native driver.',
desc: 'Document browsing, aggregation pipelines, index introspection and agent mode over the native driver, bounded by a user proven read-only at open.',
tr: 'driver · 27017',
not: 'No SQL translation layer is faked — queries here are MongoDB queries.',
},
Expand All @@ -171,7 +186,7 @@ export const engines: Engine[] = [
logo: '/engines/couchbase.svg',
desc: 'SQL++ queries with bucket, scope and collection introspection over the documented REST surfaces.',
tr: 'http · 8091',
not: 'Agent mode is unavailable, as on every engine but PostgreSQL, SQLite, DuckDB and SQL Server.',
not: 'No agent execution: agent mode sends statements only on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB, SQL Server, MongoDB and Kubernetes. Plan mode and Operate still open here.',
},
{
id: 'redis',
Expand Down Expand Up @@ -253,7 +268,7 @@ export const engines: Engine[] = [
logo: '/engines/elasticsearch.svg',
desc: 'Elasticsearch SQL over indices, with mapping introspection and cluster health.',
tr: 'http · 9200',
not: 'Search engines are query-and-browse: no row editing, no ER diagrams.',
not: 'Query-and-browse: no row editing and no EXPLAIN, and indices declare no foreign keys, so the ER diagram draws no relations.',
},
{
id: 'opensearch',
Expand All @@ -262,7 +277,7 @@ export const engines: Engine[] = [
logo: '/engines/opensearch.svg',
desc: 'The same query-and-browse surface as Elasticsearch, against OpenSearch clusters.',
tr: 'http · 9200',
not: 'Search engines are query-and-browse: no row editing, no ER diagrams.',
not: 'Query-and-browse: no row editing, no EXPLAIN and no foreign keys. DELETE is in the plugin grammar but off by default, and every other write is refused.',
},
{
id: 'prometheus',
Expand Down Expand Up @@ -316,7 +331,7 @@ export const engines: Engine[] = [
logo: '/engines/snowflake.svg',
desc: 'The SQL API v2 with Studio\u2019s own client and no Snowflake driver: every statement is one asynchronous request, signed with a key-pair JWT or a programmatic access token.',
tr: 'SQL API v2 \u00b7 https',
not: 'No driver, so driver-only features such as PUT and GET file transfer are absent.',
not: 'No driver and no bound parameters, and a transaction lives only inside one EXECUTE IMMEDIATE block.',
},
{
id: 'spark',
Expand Down Expand Up @@ -405,17 +420,17 @@ export const engines: Engine[] = [
cat: 'Network',
logo: '/engines/snmp.svg',
desc: 'A read-only view of SNMP agents, speaking SNMPv2c over UDP, with the MIB walk presented as a tree.',
tr: 'SNMPv2c over UDP',
not: 'It writes nothing, ever: no SET is implemented.',
tr: 'SNMPv2c over UDP \u00b7 161',
not: 'It writes nothing, ever: no command sends a Set, and the valve refuses one before the socket.',
},
{
id: 'kubernetes',
name: 'Kubernetes',
cat: 'Platform',
logo: '/engines/kubernetes.svg',
desc: 'A read-only browser and a kubectl-subset console for one cluster, over the API server\u2019s REST API and with no driver.',
desc: 'A read-only browser and a kubectl-subset console for one cluster, over the API server\u2019s REST API and with no driver. Agent mode runs every workflow as kubectl reads.',
tr: 'API server REST \u00b7 6443',
not: 'Read-only whatever the connection says: no request it can send changes the cluster.',
not: 'Read-only whatever the connection says: no request it can send changes the cluster. No MCP.',
},
{
id: 's3',
Expand All @@ -428,8 +443,11 @@ export const engines: Engine[] = [
},
];

/** The engines a user points Studio at: every entry but the embedded store. This is the published count. */
export const externalEngines: Engine[] = engines.filter((e) => !e.embedded);
/**
* The engines a user points Studio at: every entry but the embedded store and the
* engines that connect through another engine's driver. This is the published count.
*/
export const externalEngines: Engine[] = engines.filter((e) => !e.embedded && !e.via);

export const defaultEngineId = 'postgresql';

Expand All @@ -438,11 +456,14 @@ export const defaultEngineId = 'postgresql';
* the product name (docs/providers/README.md § Conventions). Two of our ids are
* the product name instead, so they need mapping — without it the REFERENCE line
* pointed at docs/providers/postgresql.md and sqlserver.md, neither of which
* exists. Every other id already is the type-id.
* exists. MariaDB has no type-id at all: the MySQL provider serves it, and its
* doc is that provider's (docs/providers/mysql.md § 1.1). Every other id already
* is the type-id.
*/
const TYPE_ID: Record<string, string> = {
postgresql: 'postgres',
sqlserver: 'mssql',
mariadb: 'mysql',
};

export const engineReference = (id: string) => `docs/providers/${TYPE_ID[id] ?? id}.md`;
4 changes: 2 additions & 2 deletions src/data/faq.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const faq = [
},
{
q: 'Which databases are supported?',
a: 'Forty-one engines: PostgreSQL, MySQL, Oracle, Db2 LUW, SQL Server, SQLite, libSQL, DuckDB, MongoDB, Redis, Couchbase, Firestore, ClickHouse, Apache Druid, Elasticsearch, OpenSearch, Trino, BigQuery, Databend, Snowflake, Apache Spark, Apache Cassandra, Prometheus, Apache Kafka, etcd, Neo4j, Milvus, Qdrant, InfluxDB (InfluxQL), InfluxDB 3 (SQL), Oxia, S3-compatible object storage, Kubernetes, MQTT, RabbitMQ, OPC UA, MTConnect, Modbus, NETCONF, SNMP and Sparkplug B — relational, document, key-value, wide-column, graph, vector, analytical, search, time-series, streaming and federated query. Twenty-seven more, such as MariaDB, TiDB, CockroachDB, Valkey and ScyllaDB, speak one of those wire protocols and connect through the same drivers, each measured against a live instance, so the drivers reach fifty-four named engines in all. LibreDB itself, the embedded store the playground runs on, is in the list on /databases but not in either count: those count the engines you point Studio at, not the one it carries.',
a: 'Forty-one engines: PostgreSQL, MySQL, Oracle, Db2 LUW, SQL Server, SQLite, libSQL, DuckDB, MongoDB, Redis, Couchbase, Firestore, ClickHouse, Apache Druid, Elasticsearch, OpenSearch, Trino, BigQuery, Databend, Snowflake, Apache Spark, Apache Cassandra, Prometheus, Apache Kafka, etcd, Neo4j, Milvus, Qdrant, InfluxDB (InfluxQL), InfluxDB 3 (SQL), Oxia, S3-compatible object storage, Kubernetes, MQTT, RabbitMQ, OPC UA, MTConnect, Modbus, NETCONF, SNMP and Sparkplug B — relational, document, key-value, wide-column, graph, vector, analytical, search, time-series, streaming and federated query. Twenty-seven more, such as MariaDB, TiDB, CockroachDB, Valkey and ScyllaDB, speak one of those wire protocols and connect through the same drivers, each measured against a live instance, so the drivers reach sixty-eight named engines in all. LibreDB itself, the embedded store the playground runs on, is in the list on /databases but not in either count: those count the engines you point Studio at, not the one it carries.',
},
{
q: 'Is anything held back from the open-source build?',
Expand All @@ -30,7 +30,7 @@ export const faq = [
},
{
q: 'What does the database agent do?',
a: 'You state an objective; the agent runs read-only, budgeted SQL and writes a report where every claim cites a result. It runs statements on PostgreSQL, SQLite, DuckDB and SQL Server; plan mode, which runs nothing, opens on every connection.',
a: 'You state an objective; the agent runs read-only, budgeted queries and writes a report where every claim cites a result. It runs statements on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB, SQL Server, MongoDB and Kubernetes; plan mode, which runs nothing, and the Operate workflow open on every connection.',
},
{
q: 'How is it secured for a team?',
Expand Down
6 changes: 3 additions & 3 deletions src/data/features.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* Source: libredb-studio README.md § "Key Features", docs/AGENT.md, docs/MCP.md
* and the 0.18.x release notes, re-verified at 0.18.2. Every
* `limit` is stated there too; none of them is softened here. Where the product
* documents a boundary (agent mode's four engines, masking being client-side
* documents a boundary (agent mode's seven engines, masking being client-side
* only, the toolkit being admin-only), the boundary is part of the feature.
*/
export interface FeatureDetail {
Expand Down Expand Up @@ -92,14 +92,14 @@ export const featureDetails: FeatureDetail[] = [
body: 'You state an objective and press Start. The run drafts SQL, reads what comes back, and composes a report in which every claim cites the result it came from. It never starts itself and never executes what it recommends. It stays out of your editor unless you opt in: an Analyze run opened with auto-execute, after a consent step, places its answer’s statement in your editor and runs it there, under the same database-enforced read-only boundary.',
points: [
'Five workflows: Investigate, Optimize, Assess, Analyze, which answers a question about the data rather than about the database, and Operate, which sends no SQL at all and reads the engine’s own reporting interface',
'Read-only enforced by the database, not by a parser: a read-only transaction on PostgreSQL, PRAGMA query_only re-asserted per statement on SQLite, a READ_ONLY handle plus an SQL guard on DuckDB, and on SQL Server a principal verified unable to write and a transaction always rolled back',
'Read-only enforced below the parser: a read-only transaction on PostgreSQL, PRAGMA query_only re-asserted per statement on SQLite, a READ_ONLY handle plus an SQL guard on DuckDB, on SQL Server a principal verified unable to write and a transaction always rolled back, on MySQL and MariaDB a principal verified to hold nothing past SELECT and SHOW VIEW behind START TRANSACTION READ ONLY, on MongoDB a user proven read-only at open plus a command fence, and on Kubernetes a request allowlist plus the identity\u2019s own RBAC',
'Every statement passes a policy decision, an audit event and budget accounting before the driver is touched',
'Bounded and metered on screen: 18 to 45 statements and a 6 to 15 minute deadline depending on workflow, 200 rows per read',
'Evidence or nothing — a claim with no citation cannot be composed',
'The run states its own verdict: “Run answered” or “Run did not answer”',
'An MCP endpoint, off by default, lets an AI client of your own read schemas and run bounded read-only SQL through Studio while the credentials stay on the server',
],
limit:
'Agent mode reads PostgreSQL, SQLite, DuckDB and SQL Server only, because the read-only profile is database-native and exists only where a provider implements it. On any other engine an agent run that sends statements is refused when it is started; the same four engines are the only ones where the MCP endpoint runs a query. Plan mode opens on every connection — it is toolless, runs nothing, and drafts a statement for you to run yourself. The embedded @libredb/studio package carries no agent surface at all.',
'Agent mode sends statements on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB, SQL Server, MongoDB and Kubernetes only, because each needs a read-only boundary its provider proves. On any other engine a run that sends statements is refused when it is started, and Operate still runs. The MCP endpoint runs queries on PostgreSQL, MySQL (and MariaDB), SQLite, DuckDB and SQL Server; MongoDB gets schema reads only, and Kubernetes is not offered. Plan mode opens on every connection: it is toolless, runs nothing, and drafts a statement for you to run yourself. The embedded @libredb/studio package carries no agent surface at all.',
},
];
2 changes: 1 addition & 1 deletion src/data/home.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ export const features = [
n: '06',
icon: 'bot',
t: 'The database agent',
d: 'State an objective; the agent runs read-only, budgeted SQL and writes a report where every claim cites a result.',
d: 'State an objective; the agent runs read-only, budgeted queries and writes a report where every claim cites a result.',
},
] as const;

Expand Down
5 changes: 3 additions & 2 deletions src/pages/databases.astro
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,15 @@ const BLURBS: Record<EngineCategory, string> = {

// Every card is shown, but the counters count external engines only, so they
// sum to the same externalEngines.length the heading and description state. An
// embedded store in a group (LibreDB, in Key-value) is named beside the counter
// embedded store in a group (LibreDB, in Key-value), and an engine that connects
// through another engine's driver (MariaDB, in SQL), is named beside the counter
// instead of being added to it.
const groups = ORDER.map((cat) => ({
cat,
blurb: BLURBS[cat],
items: engines.filter((e) => e.cat === cat),
counted: externalEngines.filter((e) => e.cat === cat).length,
embedded: engines.filter((e) => e.cat === cat && e.embedded).map((e) => e.name),
embedded: engines.filter((e) => e.cat === cat && (e.embedded || e.via)).map((e) => e.name),
})).filter((g) => g.items.length > 0);

const schema = [
Expand Down
4 changes: 2 additions & 2 deletions src/pages/llms-full.txt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,14 @@ each machine. Access is granted and revoked through an OIDC identity provider.
The comparison that matters is not a feature list but where the tool runs; that argument
is at ${site.url}/compare.

## Supported engines (${externalEngines.length}, plus the embedded LibreDB store)
## Supported engines (${externalEngines.length}, plus the embedded LibreDB store and MariaDB through the MySQL driver)

${engineTable()}

### What each engine does NOT do

These boundaries are documented rather than omitted. Agent mode, for example, runs
statements on four engines and not on the rest.
statements on seven engines and not on the rest.

${engineLimits()}

Expand Down
2 changes: 1 addition & 1 deletion src/pages/llms.txt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ ${links}
- [Security policy](${site.links.security}): how to report a vulnerability.
- [RSS](${site.url}/rss.xml): the blog feed.

## Supported engines (${externalEngines.length}, plus the embedded LibreDB store)
## Supported engines (${externalEngines.length}, plus the embedded LibreDB store and MariaDB through the MySQL driver)

${engineList}

Expand Down
Loading
Loading