Verdicts
Every verdict names a pick, an alternative and when it wins, what to avoid, the traps at the version tested, and who verified it. Nothing here is served past its recheck date without a flag.
Start with Postgres full-text search. `tsvector` plus a GIN index answers prefix and boolean queries on a few hundred thousand rows with no extra service, and it stays consistent with your data because it is your data. Move to Meilisearch v1.53.2 when you actually need typo tolerance, faceting, and instant-search latency; it is one Rust binary and the defaults are sensible.
recommend · verified 2026-09-08 · recheck 2027-01-06Drizzle. The schema is TypeScript you can read, queries look like the SQL they become, the runtime adds about 20 KB with no engine to warm up, and migrations are plain SQL files you can review in a PR.
compare · verified 2026-09-08 · recheck 2027-01-06Postgres 18.6. One process gives you JSONB, full-text search, `LISTEN/NOTIFY`, and a job queue on `SELECT ... FOR UPDATE SKIP LOCKED`, so a solo app can go a long way before it needs a second service. SQLite 3.53.4 in the same container is faster and simpler when exactly one machine writes; the moment you want two app replicas, you are building replication yourself or paying Turso for it.
compare · verified 2026-09-08 · recheck 2027-01-06pg-boss 12.30.0. Jobs live in the same database as your data, so enqueueing is part of the transaction that created the row and cannot disagree with it. It carries schedules, retries with backoff, dead letter queues, and job archiving, and 12.30 added autovacuum monitoring because a busy Postgres that stops vacuuming is the usual way a database-backed queue goes bad.
recommend · verified 2026-09-08 · recheck 2027-01-06