Write TypeScript.
Run Rust.
Ditch Node.js.
Loaders, actions and JSX are read at build time and lowered into an execution plan the host evaluates directly, so a page render is a walk over data rather than a call into a JavaScript engine. What that buys you: ~130µs renders, server islands, and bearer tokens your application code cannot reach.
Live Host Inspector
This widget below has zero client React code attached. Clicks round-trip to the Rust host and patch the DOM via diffing.
~130µs Renders
Pages compile to a declarative IR. Rust evaluates the render tree directly without JS engine overhead.
Zero node_modules
Third-party libraries live in committed vendor trees and resolve through native browser import maps.
Native Microfrontends
Mount standalone site artifacts under path prefixes with shared cookies, auth identity, and layouts.
Structural Token Custody
Application TypeScript code cannot see bearer tokens. Credentials live exclusively in protected host cells.
See the Compiler in Action
TypeScript is parsed at build time into an executable JSON IR. Rust evaluates this without Node.
import type { Ctx } from "@snapfire/fsr";
export async function load({ session }: Ctx) {
const count = Object.values(session.cart).reduce((n, q) => n + q, 0n);
return { count };
}{
"let": {
"name": "count",
"expr": {
"reduce": [
{
"values": {
"session": "cart"
}
},
{
"lit": {
"int": 0
}
},
{
"lambda": {
"params": [
"n",
"q"
],
"body": {
"arith": [
"add",
{
"var": "n"
},
{
"var": "q"
}
]
}
}
}
]
}
}
}