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 @@ +Apache Kafka 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 @@ +Prometheus 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); } });