Skip to content

fix(landing): derive the engine count from the grid, and correct it to 29 - #31

Merged
datlechin merged 1 commit into
mainfrom
fix/engine-count-single-source
Aug 27, 2026
Merged

fix(landing): derive the engine count from the grid, and correct it to 29#31
datlechin merged 1 commit into
mainfrom
fix/engine-count-single-source

Conversation

@datlechin

Copy link
Copy Markdown
Member

What

Consolidates the engine count into one derived value and corrects it to 29.

ENGINE_COUNT lives in resources/js/data/engines.ts and is derived from
resources/data/database-grid.json
rather than written down — the grid is what a
reader can actually count on the page, so a claim that disagrees with it is a claim
the page disproves two rows down. Adding a driver can no longer leave the copy behind.

29 = the number of tiles on the grid = the number of keys in the app's
allRegisteredTypeIds() once Turso carries a snapshot of its own.

Why it was not a find-and-replace

"25" was not an arbitrary string. It counted distinct driverGroup values in
database-grid.json — a driver count — while the headline above it promised
databases. Two different quantities wearing the same number.

It had also gone stale everywhere at once (app 28, docs 27, site 25) with a green
suite, because every copy agreed with every other copy and none agreed with the app.

Diffing allRegisteredTypeIds() against the grid showed the gap was missing content,
not stale phrasing:

  • Dameng and Kafka ship as real driver plugins (DamengDriverPlugin,
    KafkaDriverPlugin) and had no tile, no icon and no page. Dameng appeared only in
    two blog release notes; Kafka appeared nowhere on the site.
  • libSQL and Turso shared a single libSQL / Turso tile while the app
    registers them separately.

So flipping the literals alone would have rendered "29 databases." above a grid of
26 countable tiles
, with two 9 + 16 = 25 breakdowns still underneath it.

Changes

  • resources/js/data/engines.ts (new) — ENGINE_COUNT, BUNDLED_ENGINE_COUNT (9),
    ON_DEMAND_ENGINE_COUNT (20), DRIVER_PLUGIN_COUNT (23, a literal because nothing
    in this repo can derive a build-target count in an app it cannot see).
  • Seven rendered call sites now interpolate it. license.tsx was a false positive —
    its "25" is inside a comment quoting copy that was already deleted.
  • database-grid.json — added Dameng and Kafka (monogram fallback, which
    DatabaseMark already documents for engines without artwork); split
    libSQL / Turso into two tiles sharing driverGroup: libsql, exactly as Cassandra
    and ScyllaDB already do. 29 tiles, 27 driver groups, 9 bundled / 20 on demand.
  • comparisons.json — 42 values across 9 competitors. JSON cannot import the
    constant, so EngineCountTest pins those literals instead. Four relative
    phrasings were re-derived so they still sum correctly ("Postgres plus 28 other
    databases"). Five "25"s were deliberately left alone: a $255 price, two
    ~25 MB download sizes, ~250 MB via Wine, and the year 2025.
  • FAQ rewritten. Its old premise (26 tiles vs a claim of 25) no longer exists now that
    one tile means one engine; the remaining honest gap is 29 engines over 23 driver
    plugins, which is where DRIVER_PLUGIN_COUNT is used.
  • Blog: only the evergreen listicle. tablepro-0-67.md and 0-68.md are dated
    release notes that were accurate when published.

Three bugs found while verifying

  1. HomepageRenderTest counted icons, not tiles. it('server-renders all 26 database tiles') asserted substr_count($html, '/images/databases/'). The new
    tiles use the monogram fallback, so that returns 26 whether the grid holds 26 or 29
    — it would have kept passing under a name claiming otherwise.
  2. The SSR tests skip silently when run locally. All seven report as skipped
    without php artisan inertia:start-ssr, so the first pass "passed" without ever
    rendering the page. Built both bundles and started SSR before re-running; that is
    what exposed Fix what the audit found: an unrun test job, two guards that could not fail, and 4.5 MB of PNG #1.
  3. Pest's toContain() swallows a message argument. It is (mixed ...$needles),
    so a failure message passed as the second argument becomes a second needle — the
    trap this repo already documents in StaleClaimsTest. Switched to collecting
    offenders and asserting toBe([], $message), the pattern used elsewhere here.

Also fixed a brittle proxy in StaleClaimsTest, which counted question: ' to count
FAQ questions and so reported 13 of 14 as soon as one question used a template literal.

Tests

tests/Feature/Landing/EngineCountTest.php (new): pins the derived count, rejects any
literal \d+ (databases|engines|drivers) in rendered copy (comments stripped, since
they are history), asserts engines.ts derives rather than restates, and pins
comparisons.json against it.

207 passed, 0 skipped, 0 failed with SSR running. tsc --noEmit clean, both
bundles build, pint passes. Probed the running site: hero, headline, spec strip and
JSON-LD all read 29; the lede reads "9 … other 20"; /faq reads "29 engines run on 23
native driver plugins"; /compare/postico reads "Postgres plus 28 other databases".

Before merging

This says 29 on the strength of the parallel app change that gives Turso its own
snapshot. Until that ships, allRegisteredTypeIds() returns 28 and this PR
over-claims by one — worth landing them in the right order. docs.tablepro.app is a
separate repo and still says 27.

…o 29

The site published "25" in seven rendered places and about forty fields of
comparisons.json. It was not an arbitrary string: it counted distinct
driverGroup values in database-grid.json, while the headline above it promised
databases. Two quantities wearing one number, so raising either broke the other.

It had also gone stale everywhere at once — the app registered 28 types, the
docs said 27, the site said 25 — without a single failing test, because every
copy agreed with every other copy and none agreed with the app.

Diffing allRegisteredTypeIds() against the grid found the gap was real content,
not phrasing: Dameng and Kafka ship as driver plugins and had no tile, no icon
and no page, and libSQL and Turso shared one tile while the app registers them
separately. Flipping the literals alone would have put "29 databases." above a
grid of 26 countable tiles.

ENGINE_COUNT now derives from database-grid.json, which is what a reader can
actually count on the page, so the claim and the grid cannot drift apart again.
DRIVER_PLUGIN_COUNT stays a literal because nothing here can derive it.
@datlechin
datlechin merged commit fbed236 into main Aug 27, 2026
5 checks passed
@datlechin
datlechin deleted the fix/engine-count-single-source branch August 27, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant