Navigated to /docs/core/deployment

Deployment

Build once and deploy either the provider-neutral static output or generated Node server.

Know what the build produces

tavo build emits two provider-neutral deployment outputs. Treat .tavo/build as generated output and rebuild it after every application change.

TEXTGenerated output — after a production build
text.tavo/build/client/              static assets and prerendered HTML
.tavo/build/server/start.mjs       generated Node production server

Choose static hosting or Node

Static hosting serves CSR assets and the HTML created during prerendering. Build-time loaders have already run; server loaders, actions, sessions, image optimization, and revalidation cannot run on that host. Run the generated Node server when the application needs request-time behavior.

Configure the static host to serve existing prerendered HTML first and use the application index.html as the fallback for remaining client routes. Test a direct visit and refresh of a nested URL. A browser-only 404 view cannot change the HTTP status returned by a static host; configure the host separately if real 404 responses are required.

BASHTerminal — run from the project root
bashnpx tavo build
PORT=4174 node .tavo/build/server/start.mjs

Verify the deployed boundary

Business logic stays in route modules and server-only application services. Core 1.0 publishes static and Node deployment outputs.

  • Rebuild after every source change.

  • Publish .tavo/build/client to a static host or run .tavo/build/server/start.mjs with Node.

  • Configure trusted hosts, canonical origin, CSP, secrets, and monitor authentication.

  • Exercise a real SSR request, a client navigation, an action, and an error response.

  • Inspect generated route sizes and enforce budgets in CI.

Build artifact contract

TEXT
text.tavo/build/client/
  static assets and prerendered HTML
.tavo/build/server/start.mjs
  generated Node production server

tavo build creates both provider-neutral outputs, discovers routes, generates route types, and attempts eligible prerenders. Invalid bundles or JavaScript budget violations fail the command.

Static and Node production output

API / optionTypeDefaultBehavior
.tavo/build/clientdirectoryalways generatedStatic assets and prerendered HTML suitable for any static host.
.tavo/build/server/start.mjsNode entryalways generatedGenerated production server for SSR, loaders, actions, sessions, plugins, and monitoring.

Production handler failure behavior

  • GET and HEAD render pages. Other methods dispatch a matching route action.

  • A non-page method without a matching action returns 405 with Allow: GET, HEAD.

  • The Node handler rejects bodies larger than maxRequestBodyBytes with 413; the default is 10 MiB.

  • Uncaught route, plugin, and handler failures return a hardened generic 500 response rather than exposing an exception.

  • canonicalOrigin must be a credential-free HTTP(S) origin with no path, query, or hash; invalid input throws TAVO_SSR_001.

  • Page and action responses receive baseline security headers. Add deployment-specific CSP and proxy policy at the platform boundary.

  • Node client disconnects abort request-owned work; streaming responses also cancel their active reader.

Monitor CLI defaults

API / optionTypeDefaultBehavior
--urlURLhttp://127.0.0.1:4174The CLI appends /_tavo/monitor unless it is already present.
--tokenstringTAVO_MONITOR_TOKENSent as a Bearer token. Never place monitor credentials in a query string.
--oncebooleanfalseWithout this flag, monitor refreshes continuously.
--intervalmilliseconds1000Watch interval, clamped to a minimum of 250 ms.
--jsonbooleanfalsePrints the complete payload instead of the human table.

Look up exact public types

Follow linked API names to their canonical TypeScript declarations and package boundaries.