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/kafka.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/engines/prometheus.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions site.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"url": "https://libredb.org",
"domain": "libredb.org",
"tagline": "The database editor that deploys next to your data.",
"description": "LibreDB Studio is the open-source database IDE that deploys next to your data instead of onto your laptop — one browser tab for PostgreSQL, MySQL, MongoDB, Redis and thirteen more engines, with SSO and audit built in.",
"version": "0.16.2",
"description": "LibreDB Studio is the open-source database IDE that deploys next to your data instead of onto your laptop — one browser tab for PostgreSQL, MySQL, MongoDB, Redis and fifteen more engines, with SSO and audit built in.",
"version": "0.17.0",
"license": "MIT",
"company": "Sekoya Grup Bilişim ve Teknoloji Ltd. Şti., İstanbul",
"copyrightYear": 2026,
Expand Down
2 changes: 1 addition & 1 deletion src/data/compare.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ export const consequences: Consequence[] = [
{
question: 'Working across several engines at once',
desktop: 'Depends on the tool; often several tools.',
beside: 'Seventeen engines behind one tab and one grid.',
beside: 'Nineteen engines behind one tab and one grid.',
},
];

Expand Down
25 changes: 22 additions & 3 deletions src/data/engines.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/**
* The seventeen engines shown in the hexagon grid (design/Home.dc.html → engineData).
* The nineteen engines shown in the hexagon grid (design/Home.dc.html → engineData).
* Copy, transport strings and the "what this engine does not do" lines are final —
* they are the honest-capability claim the design is built around.
*
* `logo` points at a self-hosted copy under public/engines/; the prototype
* hot-linked devicon / simpleicons CDNs (see scripts/fetch-engine-logos.sh).
*/
export type EngineCategory = 'SQL' | 'Analytics' | 'Federated' | 'Document' | 'Key-value' | 'Wide-column' | 'Search';
export type EngineCategory =
'SQL' | 'Analytics' | 'Federated' | 'Document' | 'Key-value' | 'Wide-column' | 'Search' | 'Time-series' | 'Streaming';

export interface Engine {
id: string;
Expand Down Expand Up @@ -104,7 +105,7 @@ export const engines: Engine[] = [
},
{
id: 'trino',
name: 'Apache Trino',
name: 'Trino',
cat: 'Federated',
logo: '/engines/trino.svg',
desc: 'Federated SQL — one query across the catalogs you already have, from object storage to RDBMS.',
Expand Down Expand Up @@ -174,6 +175,24 @@ export const engines: Engine[] = [
tr: 'http · 9200',
not: 'Search engines are query-and-browse: no row editing, no ER diagrams.',
},
{
id: 'prometheus',
name: 'Prometheus',
cat: 'Time-series',
logo: '/engines/prometheus.svg',
desc: 'PromQL over the HTTP API, with the metric, rule and target browser beside it.',
tr: 'http \u00b7 9090',
not: 'Read-only: Studio calls the read APIs only, so there is nothing to write back.',
},
{
id: 'kafka',
name: 'Apache Kafka',
cat: 'Streaming',
logo: '/engines/kafka.svg',
desc: 'Topic, group and broker browser that reads by offset or by time.',
tr: 'kafka \u00b7 9092',
not: 'Read-only: it reads records, it does not produce them.',
},
];

export const defaultEngineId = 'postgresql';
Expand Down
2 changes: 1 addition & 1 deletion 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: 'Seventeen engines: PostgreSQL, MySQL, Oracle, SQL Server, SQLite, libSQL, DuckDB, ClickHouse, Apache Druid, Apache Trino, MongoDB, Couchbase, Redis, LibreDB, Cassandra, Elasticsearch and OpenSearch — relational, document, key-value, wide-column, analytical, search and federated query.',
a: 'Nineteen engines: PostgreSQL, MySQL, Oracle, SQL Server, SQLite, libSQL, DuckDB, ClickHouse, Apache Druid, Trino, MongoDB, Couchbase, Redis, LibreDB, Cassandra, Elasticsearch, OpenSearch, Prometheus and Apache Kafka — relational, document, key-value, wide-column, analytical, search, time-series, streaming and federated query. One of the nineteen is LibreDB itself, the embedded store the playground runs on, so the count you will see on the product listings is eighteen: those count the engines you point Studio at, not the one it carries.',
},
{
q: 'Is anything held back from the open-source build?',
Expand Down
6 changes: 3 additions & 3 deletions src/data/home.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const hero = {
lineOne: ['You', 'created', 'the', 'database.'],
lineTwo: ['The', 'editor', 'is', 'already', 'beside', 'it.'],
},
sub: 'LibreDB Studio is the database IDE that deploys next to your data instead of onto your laptop — one browser tab for PostgreSQL, MySQL, MongoDB, Redis and thirteen more engines, with SSO and audit built in.',
sub: 'LibreDB Studio is the database IDE that deploys next to your data instead of onto your laptop — one browser tab for PostgreSQL, MySQL, MongoDB, Redis and fifteen more engines, with SSO and audit built in.',
primaryCta: { label: 'Open live demo', href: 'https://app.libredb.org' },
secondaryCta: { label: 'Deploy in one click', href: '#deploy' },
command: 'docker run -p 3000:3000 libredb/libredb-studio',
Expand Down Expand Up @@ -151,15 +151,15 @@ export const how = {

/* --- databases ------------------------------------------------------------ */
export const databases = {
eyebrow: 'Seventeen engines',
eyebrow: 'Nineteen engines',
headline: { lineOne: 'One interface.', gradient: 'Different engines.' },
intro:
"Relational, document, key-value, analytical, search and federated query — the same tree, editor and grid over each of them, and each engine's real limits declared rather than papered over.",
notDoTitle: 'What this engine does not do',
notDoNote:
'Stated because the alternative is a feature list that quietly breaks on the fourth engine. Capability flags come from the provider itself — a control that cannot work is hidden, not offered and then failed.',
footnote:
'The claim is the span, not a count — seventeen engines, one interface. Per-engine detail lives in the provider docs.',
'The claim is the span, not a count — nineteen engines, one interface. Per-engine detail lives in the provider docs.',
} as const;

/* --- product demo --------------------------------------------------------- */
Expand Down
20 changes: 16 additions & 4 deletions src/pages/databases.astro
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,19 @@ import { site } from '../lib/site';

// The homepage shows one engine at a time behind a hexagon tablist — good for a
// first impression, useless for the question this page exists to answer: "is my
// engine in here, and what exactly does it not do?" So this renders all seventeen
// engine in here, and what exactly does it not do?" So this renders all nineteen
// at once, grouped, with every limit visible without a click.
const ORDER: EngineCategory[] = ['SQL', 'Analytics', 'Federated', 'Document', 'Key-value', 'Wide-column', 'Search'];
const ORDER: EngineCategory[] = [
'SQL',
'Analytics',
'Federated',
'Document',
'Key-value',
'Wide-column',
'Search',
'Time-series',
'Streaming',
];

const BLURBS: Record<EngineCategory, string> = {
SQL: 'Pooled connections, catalog introspection, visual EXPLAIN and ER diagrams.',
Expand All @@ -18,6 +28,8 @@ const BLURBS: Record<EngineCategory, string> = {
'Key-value': 'Ordered keyspaces. Tables and collections are conventions over the keys.',
'Wide-column': 'Partition-and-clustering-key stores, where a scan is a decision, not a default.',
Search: 'Index-first engines queried through their own DSL as well as SQL where offered.',
'Time-series': 'Metric stores read through their own query language; the series is the table.',
Streaming: 'Logs of records, browsed by offset or by time rather than queried.',
};

const groups = ORDER.map((cat) => ({
Expand All @@ -44,7 +56,7 @@ const schema = [
<BaseLayout
path="/databases"
title="Databases"
description="The seventeen engines LibreDB Studio speaks — PostgreSQL, MySQL, Oracle, MongoDB, Redis, ClickHouse and more — each with its transport and the capability it deliberately does not have."
description="The nineteen engines LibreDB Studio speaks — PostgreSQL, MySQL, Oracle, MongoDB, Redis, ClickHouse and more — each with its transport and the capability it deliberately does not have."
schema={schema}
>
<section class="dbp" aria-labelledby="dbp-title">
Expand Down Expand Up @@ -164,7 +176,7 @@ const schema = [
text-wrap: pretty;
}

/* Category jump strip — seventeen engines is enough to need one. */
/* Category jump strip — nineteen engines is enough to need one. */
.dbp__counts {
display: flex;
flex-wrap: wrap;
Expand Down
6 changes: 3 additions & 3 deletions tests/engines.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ describe('the engine count is stated consistently', () => {
// The count appears as prose in five places. It has already drifted once — the
// site said sixteen while docs/providers/README.md listed seventeen providers,
// because LibreDB (the embedded store /playground runs) was never added.
const WORD = 'seventeen';
const WORD = 'nineteen';

it('matches the number of engines actually defined', () => {
expect(engines.length).toBe(17);
expect(engines.length).toBe(19);
});

it('is spelled the same way everywhere it is written out', () => {
Expand All @@ -86,7 +86,7 @@ describe('the engine count is stated consistently', () => {
] as const;
for (const f of sources) {
const text = readFileSync(f, 'utf8').toLowerCase();
expect(text.includes('sixteen'), `${f} still says "sixteen"`).toBe(false);
expect(text.includes('seventeen'), `${f} still says "seventeen"`).toBe(false);
expect(text.includes(WORD), `${f} should name the count`).toBe(true);
}
});
Expand Down
Loading