These docs cover 0.2.0-beta.26. Each guide distinguishes supported beta behavior, explicit deployment boundaries, and retained 0.1 compatibility material.

Browse documentationAll guides

Develop · local feedback

Develop with compiler truth.

pnpm dev keeps one compiler-owned publication running while you edit. Presolve rebuilds from authored inputs, serves the current file-route manifest, updates CSS without replacing the page, and reloads semantic changes only after the compiler accepts them.

Start the development server

pnpm dev# Presolve dev ready at http://127.0.0.1:3000

The generated project maps that command to presolve dev. Use presolve dev --port 4000 to select another port, or presolve dev --once to produce one development build without starting the server.

What happens when a file changes

Finished CSS changesPresolve rebuilds and swaps the canonical stylesheet through /app.css?presolve-dev=<revision>. The current document, component State, focus, and scroll position remain in place.
TSX, routes, document, public files, or configurationPresolve rebuilds the complete compiler publication, replaces the served route manifest, and performs a safe full reload. Narrow semantic HMR is used only when a compiler product proves state compatibility.
A build failsThe last successful page remains available. An accessible browser alert contains the compiler diagnostic; fixing the source publishes the recovered build and reloads it automatically.

How CSS reaches a route or component

CSS is not attached to a class instance and routes do not import a global stylesheet. Presolve uses the browser's normal document cascade:

01Render a class

A route, layout, or nested component renders a literal class or compatible className.

02Author the selector

Place the matching global selector in app/app.css, or have Tailwind/PostCSS/Sass write its finished output there.

03Publish once

Presolve emits app.css plus an immutable content-addressed production stylesheet and inventories both.

04Link every route

The compiler adds one stylesheet link to each generated route's <head>. The selector applies through ordinary cascade, inheritance, specificity, media queries, and container queries.

export class Pricing extends Component {render() {return <section class="pricing-card">...</section>;}}
.pricing-card {display: grid;container-type: inline-size;}
One global stylesheet

Do not render a global <link> from app.tsx, a layout, a route, or a component. Presolve owns the document-head link so it survives every application update.

Tailwind and other CSS transforms

Presolve watches finished app/app.css. If a transformer has a separate source graph, keep that transformer's watcher running so it writes fresh output for Presolve to publish.

"scripts": {"dev": "concurrently -k \"pnpm css:watch\" \"presolve dev\"","css:watch": "tailwindcss -i ./app/tailwind.css -o ./app/app.css --watch"}

For a plain CSS application, no second watcher is needed: edit app/app.css directly and presolve dev updates it.

Development and production differ deliberately

ConcernDevelopmentProduction
Cache policyCache-Control: no-storeImmutable content-addressed assets
CSS URL/app.css?presolve-dev=N/app.<sha256>.css
Update transportExternal same-origin development clientNo development client emitted
Build errorLast good page plus diagnosticBuild fails closed; no release replaces the previous one

What the watcher ignores

Generated or dependency trees do not trigger rebuilds: dist/, .presolve/, node_modules/, target/, Git data, and Presolve's atomic publication stages. This prevents a compiler output from observing itself and creating a rebuild loop.

Vite's role

The standard presolve dev command owns the conventional host lifecycle. Vite bundles compiler-authorized package Actions, Standard Schema validators, submission capabilities, and explicitly configured asset pipelines; it does not define routes, component identity, State, or reload safety. The public Vite adapter is a lower-level seam for custom hosts that supply compiler callbacks.