Why it mattersA team using Tin in production can now run the same queries in development, CI and staging environments without paying for a Tin cluster in every branch, because Lead evaluates the operator directly in Postgres and returns the same rows.
PlanetScale released Lead on 17 September, a Postgres text-search extension that answers the same TINQL queries as Tin, the paid full-text index it launched last week. Lead is licensed under AGPL-3.0, has reached 131 stars in three days, and is built to run in the places Tin was never meant to run: a developer's laptop, a test suite, a CI job and a staging database.
Lead ships the same access method name (tin), the same operator (==>), the same query language, and the same scoring functions (tin.score, tin.full_score, tin.max_score, tin.score_inspect) as Tin, plus explicit and implicit tin.highlight and tin.highlight_ansi. A query that runs against a Lead index runs unchanged against a Tin index, and PlanetScale calls this the compatibility boundary. Postgres 17 and 18 are the supported build targets, through the cargo-pgrx extension framework at version 0.19.1.
What Lead is not
PlanetScale is direct that Lead is deliberately unsuitable for production. Every index scan returns the whole table's heap pages as candidates, and Postgres rechecks their visible rows for exact TINQL and MVCC behaviour. The index stores no search data at all. That is what makes the results exact, and it is also why the extension gets slower with every row: a lookup that Tin answers from its index has to walk the whole heap in Lead. PlanetScale calls the trade "correctness and a small implementation over production query performance", and puts a plain warning in the README: "It is intentionally unsuitable for production workloads."
What it fixes for a team already on Tin
The gap Tin left when it went generally available on 18 September was a way to run its queries without a Tin cluster in front of every environment. Application SQL that uses ==>, tin.score or tin.highlight has to run somewhere in development, CI and preview environments, and a production database was the only place it ran. Lead closes the loop: the same SELECT ... WHERE column ==> 'query' statement that runs against Tin in production runs against Lead in a Docker Postgres, a laptop, a pull-request preview database, or a GitHub Actions job, and returns the same rows. Score values are ordinal rather than identical, so equality tests on raw scores will not translate; ranking order does.
Lead allocates no extension shared memory, creates no files outside Postgres's normal storage, does not need shared_preload_libraries and loads on demand. Server restarts and crash recovery do not require rebuilding a Lead index because the scans use the recovered heap directly. Index builds evaluate the expressions and predicates for validation, but inserts and VACUUM have nothing to maintain because there is no index data.
Correctness over speed, for a test environment
For a team writing tests against a search feature, exactness at the row level matters more than speed. Lead makes that trade on purpose: the same rows come back in the same order, the query language is identical, and the tests that pass against Lead in CI will pass against Tin in production. The AGPL-3.0 licence and the extension's use of a private PlanetScale test suite for its own regression runs point in the same direction: Lead is built to match Tin, not to replace it.
Source
- planetscale/lead on GitHub
- PlanetScale introduces Tin (last week's release, for context)
Source: GitHub
This item was written by an AI system from the linked source. Reveneau is responsible for what it publishes.
Get AI News in your inbox
New developer tools, model and agent releases, and how teams are actually using them to release software. Short, and only when there is something worth reading.

