Skip to content
forma.
v3.0
☰
Browse documentation
Start here
Build interfaces
Native rendering
Tooling
Security and operations
Architecture
Application guides
API reference

Docs/Start here

FORMA 3.0

Choose a rendering mode

Understand explicit Browser routes, native SSR and routes without browser JavaScript.

View source ↗Markdown ↓Source 753be2a
On this page

A route declares Browser or Ssr in its manifest. Browser routes use render_browser_shell. SSR routes load through load_ir_modules, bind a PageHandle<Props> once, and render typed values per request. Every SSR route must be bound when the application calls pages.finalize() before listening. A failed SSR render returns a coded error; it never selects the browser mode.

Minimal declares HomeProps { count: number } in its same-file TypeScript page and a matching derived Rust struct. build:ssr emits actual FMIR and Rust supplies 7 to Counter through the declared state contract. Its unary Counter owns the signal; the authenticated native root mount is removed from the browser product. An explicit Browser build retains its independent zero default. About has empty props and no islands: its native route retains IR and CSS while publishing no JavaScript. Server markup alone does not prove zero-write adoption; the packed activation checks qualify that separately.

Dashboard retains an explicit Browser route for every page. It has no compiler dependency and no SSR build command. Its API-backed client behavior has not been migrated to declared server props.

The compiler reads source rather than executing it. Unsupported constructs refuse with mandatory codes; strict builds also reject advisory diagnostics. Consult the maintained compiler contract before introducing new shapes. The dated A2 rendering measurements and old API guidance are preserved in the template migration archive.

Verified by: tests/templates.test.ts > "declares the same count prop in its page and Rust handler with a distinct server seed" Verified by: tests/templates.test.ts > "binds declared props once, finalizes before listening, and never falls back after an SSR failure" Verified by: tests/templates.test.ts > "validates and finalizes browser routes before serving explicit browser shells"

Verified by: tests/template-islands.test.ts > "scaffolds a declared Counter and a separate truly static native page" Verified by: tests/template-islands.test.ts > "pairs actual Counter metadata with its native module and never mounts the native page in JavaScript"

Find your next answer.

Search Forma 3.0 documentation, guides and examples.