Release notes are curated from repository history. Dates reflect integration into the main branch; grouped entries are not semantic-version tags. Each entry links to its implementation and current developer guide.
Changelog
New features, architectural changes and improvements to the template.
Security and backend quick wins
Cross-site writes to the API are refused, production stops trusting the development app scheme, purge needs an owner or admin, and jobs and migrations fail more safely.
- Cross-site writes to
/api/rpcare refused. A write whoseOriginis neither the request's origin norBETTER_AUTH_URL's now gets HTTP 403. So does a write with noOriginthatSec-Fetch-Sitemarks ascross-siteorsame-site. This covers the OpenAPI mirror. A PR preview on a sibling subdomain can no longer write with a production cookie. The native app, scripts and server-to-server calls send neither header and are unaffected. See API. - Production no longer trusts
<scheme>-dev://. No production app registers the development build's scheme, so any app could claim a password-reset token sent there. The scheme is trusted in development, and on previews through the new preview-only switchNATIVE_DEV_SCHEME=1. Set it inapps/web/.dev.varsto sign a development build into a local built Worker. See Runtime switches. - Only owners and admins can purge the trash, and purge now checks the database session. The files gateway also no longer reuses a snapshot-authorized tenant where it asked for the database session. See Files.
BETTER_AUTH_SECRETmust be at least 32 characters.pnpm setupalready generates 44. A shorter secret now fails the production deploy before migrations, and the preview secrets step refuses it, so the running Worker is never replaced by one that refuses to boot. Changing a short secret signs every user out.- The cron tick is observable. Each failed job logs one
jobs.step_failedline with the type and code of its cause, never a message. Every tick logs onejobs.tickline: settled with counts, interrupted by the deadline, or failed. See Scheduled jobs. - Job and migration lock waits end on the server. The job pool's
lock_timeout(1 s) andstatement_timeout(1.5 s) now fire before its 2 s client timeout. A claim reported as failed can no longer commit later. The migration runner takes a transaction-scoped advisory lock per folder, which is safe on a pooled connection, and gives up a table lock after 5 seconds instead of queueing traffic behind it. See Database.
Authentication rate limits
Credential endpoints are rate limited in production.
Credential endpoints are now rate limited in production. The Worker previously left the limiter off because it does not set NODE_ENV. get-session and jwks remain free of rate-limit database writes. See Rate limits and PR #196.
Server session cache
Ordinary server requests use Better Auth's signed session snapshot.
Server requests use the signed Session snapshot for up to 60 seconds, avoiding one session statement on a todo.list cache hit. The scenario B latency change was within local noise. Revocation on another device can take up to a minute for ordinary data. Membership removal remains immediate. Webhook endpoint changes and OAuth connection revocation read the current database session. The files gateway reads the membership directly. See Session reads and PR #195.
Earlier releases
- Bklit is the only chart library, Stageshow the only way to draw product UI
- Signed-in navigation no longer waits on the session read
- Skullet is the only way to draw a loading skeleton
- Agent skills from upstream, Expo's renamed skills, and three updates held back
- Code is written in English
- The consent banner paints from the HTML, repeat visits skip revalidation, and real Web Vitals
- Dates in your time zone, without a hydration error
- Public pages paint before any JavaScript arrives
- Better Auth 1.7.16 security fix and dependency round
- Animated assistant approval on the landing, and a design patterns page
- Loading skeletons drawn from the real components
- Invitations are not a mail relay
- MCP Apps widget, approval status and plugin marketplaces
- One URL per language
- Account emails in React Email, in English, German and French
- Share cards, Markdown negotiation and one site identity
- TanStack AI 1.0, password forms and iPhone Duo
- Agent skills from upstream and the /pr template
- Ponytail from the official plugin
- One folder per backend feature, tagged errors and written rules
- One folder per mobile feature, and the API aliases are gone
- The web app is organized by feature, like the backend
- Auth and tenant security fixes
- Database, Worker and web performance
- Row-level security per Organization
- AI assistant and one tool catalog
- Dependency round, i18next fix and ReUI controls
- Developer documentation and changelog
- Documents and large uploads
- Landing page redesign
- Landing sections and project skills
- Trace and code block primitives
- TanStack Start 1.0, OG images and durable imports
- Payments, native screens and a new landing page
- Runtime and recovery hardening
- Authentication foundations and performance
- Platform dependency alignment
- oRPC and Drizzle upgrades
- Typed domain operations and a real dashboard
- Agent connections and native account security
- Cloudflare email and shared UI
- An enforced client/server boundary
- Native interface foundations
- Administration and data workflows
- Setup, storage and localization