- Server functions can return not_found: true to render the 404 page
with status 404.
- Page components and window.__PAGE_PROPS__ (and HMR updates) only get
props, query, url and error. response_options, redirect, cache settings
and res_transform stay on the server, so cookies and private headers no
longer end up in the HTML. BunextPageProps is narrowed to match
(breaking for code that read server-only fields from component props).
- response_options headers go through a Headers object, so repeated
headers such as several Set-Cookie survive.
- Redirects: status_code wins over permanent; response_options headers
and res_transform apply to redirects too.
- Gzip for compressible text responses; compress: false to turn it off.
- Files the router matches but never bundles (.server.ts, __root,
excluded paths and directories) return 404 instead of looping through
dev rebuild retries.
- Missing public files return 404 rather than 403, so dotted page paths
like /users/john.doe fall through to pages again.
- importFresh detects rewrites within the filesystem's mtime granularity.
- README: self-hosted React (not esm.sh), snake_case option names, static
file serving, cache headers, the new options.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Page rendering imported the SSR bundle and .server.ts modules with a
unique ?t= query on every request, in production too. Each one became a
new, never-evicted module record (and re-ran module top-level code), so
RSS grew with request count. Cache-bust only in dev via importFresh.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Bun's SQL client (mariadb/mysql adapters, Bun 1.3.14) doesn't keep the
event loop alive for a query on an idle connection, so a second dynamic
route's sitemap export querying the DB made the command exit silently.
Hold the loop open with a timer during generation, and log what a stuck
run is waiting on.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- bunext build records when each page's client bundle hash last changed
in .bunext/page-lastmod.json (sitemap.lastmod_file to relocate). The
hash covers the page's whole import graph, so component edits re-date
every page that uses them. The sitemap uses these dates as lastmod
- Add sitemap.default_lastmod
- BREAKING: use_file_lastmod now defaults to false (file mtimes are reset
by checkouts); it is a fallback after the build record
- Warn when a page or __root.tsx is skipped because its default export
is not at the start of a line (e.g. export { Page as default })
- Replace leaking module mocks in tests (log, grab-root-file-path) with
spies and fixtures
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- bunext sitemap now writes public/robots.txt (configurable via the
robots config key; robots: false or --no-robots to skip). Hand-written
robots.txt files are never overwritten without a robots config
- Large sitemaps are split into public/sitemap-chunks/sitemap-N.xml
(sitemap.chunk_size, default 10,000, max 50,000; 50MB per file) with
sitemap.xml as a sitemap index; stale chunks are cleaned up
- Export bunextGenerateRobotsTxt
- Run tests in publish.sh
Co-Authored-By: Claude Opus 5.5 <[email protected]>