apps/web/wrangler.jsonc now sets "placement": { "region": "aws:us-east-2" }, the region of this template’s production database. A copy on another host sets its own region, or "placement": { "mode": "smart" } when the location is unknown. Placement moves only fetch handlers; static assets stay at the edge, and previews inherit the setting.
On the database side, row-level security costs no extra round trip: tenant settings and the statement are pipelined, row membership is checked once per statement rather than per row, and the identity functions are plpgsql so their plans are cached. The membership check is one system statement and the session is read once per request. A migration adds indexes for real filters and unindexed foreign keys, stores the document search vector as a generated column and drops redundant indexes. Todo list, board and lane renumbering, audit outbox flushes and queue scans use fewer statements or their indexes. An hourly cron job deletes rate-limit rows, sessions and verifications a day past expiry.
In the web app, oRPC calls made in the same tick go as one /__batch__ request, sharing one Context and session read on the server. Queries no longer retry 4xx errors and retry network failures and 5xx at most twice. Settings, admin flags, files and integrations load their data in route loaders, and the dashboard renders its prefetched sections on the server through the new todo.stats aggregate. todo.calendar now returns at most 500 todos, with truncated set when there are more. React Compiler covers more web and mobile components, date-fns and files-sdk stay out of the client entry, thumbnail URLs are cached per Organization and the documents poll backs off.
Fixes from the same round: each board lane is counted once, large libraries show a document status for every file, and file preview URLs are always revoked.
Sources: pipelining, per-statement membership, indexes, auth cleanup job, oRPC batching, dashboard stats, server-rendered dashboard, placement.