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.
Resend 6.26.0. The free tier is 3,000 emails a month capped at 100 a day across 3 domains, the API is one POST, and React Email renders the templates. If deliverability matters more than developer experience, Postmark is the better sender and its free developer plan is only 100 emails a month with no tier between that and the 10,000 plan at 15 dollars.
recommend · verified 2026-09-08 · recheck 2027-01-06Vitest 5.0.0 for functions and components, Playwright 1.63.0 for the flows that make you money. Vitest reuses your Vite config so path aliases and TypeScript work without a second build, and Playwright drives real Chromium, Firefox, and WebKit with traces you can open after a CI failure. Skip a unit test for a server component that only awaits a query and reads props; test the query and the page instead.
recommend · verified 2026-09-08 · recheck 2027-01-06Start with server components and no client cache at all: fetch in the server component, mutate in a server action, and let the framework revalidate. Add TanStack Query 5.102.8 only for the screens that need polling, infinite scroll, optimistic updates, or offline retry, and keep the rest on the server.
recommend · verified 2026-09-08 · recheck 2027-01-06Start 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-06shadcn/ui, CLI 4.21.0. The components are copied into your repo as source, so restyling a button is editing a file rather than fighting a theme API, and there is no runtime dependency to upgrade in lockstep. The cost is real: you now own that code, including its accessibility bugs, and there is no upgrade command beyond re-running `add` and reading the diff.
recommend · verified 2026-09-08 · recheck 2027-01-06Valkey 9.1.2 over Redis. Same protocol, same clients, BSD licensed by the Linux Foundation, and no question about what happens if you ever offer the thing you built as a service. Do the limiting in a Lua script so the read and the write are one round trip, because a GET followed by a SET is a race that lets a burst through.
recommend · verified 2026-09-08 · recheck 2027-01-06Drizzle ORM 0.45.2. SQLite is a first-class dialect, migrations are plain SQL files you can read in a pull request, and the driver list covers better-sqlite3, node:sqlite, Bun, and Turso, so the same schema moves from a local file to hosted SQLite. Kysely 0.29.5 is the better pick if you want a query builder and nothing else, with no migration tooling opinions attached.
recommend · verified 2026-09-08 · recheck 2027-01-06Cloudflare R2. Egress is free, storage is $0.015 per GB-month, and the free tier is 10 GB plus 1 million Class A and 10 million Class B operations a month, so a photo-heavy side project can run at zero. It speaks the S3 API, so the AWS SDK and presigned uploads work unchanged and you can leave for S3 later.
recommend · verified 2026-09-08 · recheck 2027-01-06@modelcontextprotocol/sdk 1.x with Streamable HTTP in stateless mode (`sessionIdGenerator: undefined`), one McpServer per request. It is the line every client is tested against; v2.0.0 shipped in September 2026 and splits into @modelcontextprotocol/server, /node, /express with different imports, so wait for 2.1 before moving.
recommend · verified 2026-09-08 · recheck 2027-01-06The official SDK's `Client` over Streamable HTTP. On the 1.x line that is @modelcontextprotocol/sdk 1.30.0, the version every server in the wild is tested against. The 2.x line is published as a separate package, @modelcontextprotocol/client 2.0.0, implementing the 2026-07-28 spec; move when your servers do, not before, because the import paths change.
recommend · verified 2026-09-08 · recheck 2027-01-06next-intl 4.14.2. It is built for the App Router specifically, so the locale reaches server components, metadata, and route handlers without a client provider wrapping the tree, and ICU message syntax covers plurals and dates. Lingui 6.6.0 is the alternative worth knowing: macros extract to PO files, the runtime is around 2 kB, and it documents React Server Component support.
recommend · verified 2026-09-08 · recheck 2027-01-06react-hook-form 7.87.0 with zod 4.5.4 through @hookform/resolvers 5.9.1. The same zod schema validates the submitted body on the server, so a field can never be required in one place and optional in the other, and react-hook-form keeps inputs uncontrolled so typing does not re-render the form.
recommend · 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-06Better Auth. You own the users table in your own Postgres, the organization and api-key plugins cover teams and keys without a second vendor, and there is no per-monthly-active-user bill when you grow.
recommend · verified 2026-09-08 · recheck 2027-01-06