diff --git a/public/engines/kafka.svg b/public/engines/kafka.svg
new file mode 100644
index 0000000..1404c10
--- /dev/null
+++ b/public/engines/kafka.svg
@@ -0,0 +1 @@
+
diff --git a/public/engines/prometheus.svg b/public/engines/prometheus.svg
new file mode 100644
index 0000000..0689d33
--- /dev/null
+++ b/public/engines/prometheus.svg
@@ -0,0 +1 @@
+
diff --git a/site.config.json b/site.config.json
index f07f1b5..fc3d15f 100644
--- a/site.config.json
+++ b/site.config.json
@@ -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,
diff --git a/src/data/compare.ts b/src/data/compare.ts
index 7647933..cc43bb0 100644
--- a/src/data/compare.ts
+++ b/src/data/compare.ts
@@ -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.',
},
];
diff --git a/src/data/engines.ts b/src/data/engines.ts
index 809b86b..6c97a03 100644
--- a/src/data/engines.ts
+++ b/src/data/engines.ts
@@ -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;
@@ -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.',
@@ -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';
diff --git a/src/data/faq.ts b/src/data/faq.ts
index bf326e0..fd9eb99 100644
--- a/src/data/faq.ts
+++ b/src/data/faq.ts
@@ -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?',
diff --git a/src/data/home.ts b/src/data/home.ts
index cc6ac3b..2de2e2e 100644
--- a/src/data/home.ts
+++ b/src/data/home.ts
@@ -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',
@@ -151,7 +151,7 @@ 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.",
@@ -159,7 +159,7 @@ export const databases = {
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 --------------------------------------------------------- */
diff --git a/src/pages/databases.astro b/src/pages/databases.astro
index d3b249f..bf2c131 100644
--- a/src/pages/databases.astro
+++ b/src/pages/databases.astro
@@ -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 = {
SQL: 'Pooled connections, catalog introspection, visual EXPLAIN and ER diagrams.',
@@ -18,6 +28,8 @@ const BLURBS: Record = {
'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) => ({
@@ -44,7 +56,7 @@ const schema = [
@@ -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;
diff --git a/tests/engines.test.ts b/tests/engines.test.ts
index b83e63f..909a99f 100644
--- a/tests/engines.test.ts
+++ b/tests/engines.test.ts
@@ -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', () => {
@@ -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);
}
});