Rendering is a protocol, not a render-time computation.
41
stars
830
commits
TypeScript
primary language
Sep 10, 2026
updated
Seam is a protocol that separates rendering from runtime. SeamJS is the framework that implements it — stitching together existing tools (Vite, TanStack Query, TanStack Router) where they already work, and building custom pipelines (skeleton extraction, injection engine, CLI) where they don't.
Traditional SSR calls renderToString on every request — your entire component tree is re-evaluated, a virtual DOM is built, and the result is serialized. Even in a pure TypeScript stack, this costs ~100-300ms per page.
SeamJS moves that work to build time:
renderToString runs once. The output is diffed into an HTML skeleton with typed slot markersNo component tree at request time. No virtual DOM. No renderToString. The rendering cost becomes negligible — only your data loaders matter.
This is compile-time rendering (CTR). It works with any backend language because the server never imports UI code — it only performs data injection on a pre-built template. Rust, TypeScript, and Go all share the same engine and the same protocol.
| Layer | Details |
|---|---|
| Frontend | React: client bindings, TanStack Router, filesystem router, i18n, TanStack Query, ESLint plugin |
| Backend | Rust (Axum) / TypeScript (Hono, Bun, Node) / Go (Gin, Chi, net/http) — symmetric APIs, same protocol |
| Procedures | query, command, subscription, stream, upload — codegen, namespaces, context, invalidation, JTD |
| Transport | HTTP RPC, batch RPC, SSE, WebSocket channels, stream SSE, multipart upload |
| Rendering | CTR (compile-time), SSR (HTML slot injection), SSG (hybrid modes) |
| CLI | build, generate, dev, pull, clean — virtual modules, loadBuild(), head metadata |
Pick a standalone server example and run it:
# TypeScript (Bun)
cd examples/standalone/server-bun && bun run src/index.ts
# Rust (Axum)
cd examples/standalone/server-rust && cargo run
# Go (net/http)
cd examples/standalone/server-go && go run .
For a fullstack example with React frontend, see the GitHub Dashboard — same UI running on three interchangeable backends.
Architecture — UI Layer / Logic Layer / Transport Layer
Protocol — Slot / Sentinel / Manifest / Subscription / Channel / Skeleton Constraints
Development — Build commands, test matrix, prerequisites
Soild, Svelte and Vue frontends. Tauri and Electron desktop adapters. Serverless deployment mode. Island Mode; See the full roadmap.
The seam protocol is open — any language that serves HTTP can be a backend. PRs for new UI frameworks, backend languages, and transport adapters are welcome.
MIT License © 2026 Canmi
TypeScript
36.9%
Rust
33.0%
WebAssembly
12.9%
Go
12.7%
JavaScript
2.6%
Shell
1.5%
Rendering is a protocol, not a render-time computation.
41
stars
830
commits
TypeScript
primary language
Sep 10, 2026
updated
Seam is a protocol that separates rendering from runtime. SeamJS is the framework that implements it — stitching together existing tools (Vite, TanStack Query, TanStack Router) where they already work, and building custom pipelines (skeleton extraction, injection engine, CLI) where they don't.
Traditional SSR calls renderToString on every request — your entire component tree is re-evaluated, a virtual DOM is built, and the result is serialized. Even in a pure TypeScript stack, this costs ~100-300ms per page.
SeamJS moves that work to build time:
renderToString runs once. The output is diffed into an HTML skeleton with typed slot markersNo component tree at request time. No virtual DOM. No renderToString. The rendering cost becomes negligible — only your data loaders matter.
This is compile-time rendering (CTR). It works with any backend language because the server never imports UI code — it only performs data injection on a pre-built template. Rust, TypeScript, and Go all share the same engine and the same protocol.
| Layer | Details |
|---|---|
| Frontend | React: client bindings, TanStack Router, filesystem router, i18n, TanStack Query, ESLint plugin |
| Backend | Rust (Axum) / TypeScript (Hono, Bun, Node) / Go (Gin, Chi, net/http) — symmetric APIs, same protocol |
| Procedures | query, command, subscription, stream, upload — codegen, namespaces, context, invalidation, JTD |
| Transport | HTTP RPC, batch RPC, SSE, WebSocket channels, stream SSE, multipart upload |
| Rendering | CTR (compile-time), SSR (HTML slot injection), SSG (hybrid modes) |
| CLI | build, generate, dev, pull, clean — virtual modules, loadBuild(), head metadata |
Pick a standalone server example and run it:
# TypeScript (Bun)
cd examples/standalone/server-bun && bun run src/index.ts
# Rust (Axum)
cd examples/standalone/server-rust && cargo run
# Go (net/http)
cd examples/standalone/server-go && go run .
For a fullstack example with React frontend, see the GitHub Dashboard — same UI running on three interchangeable backends.
Architecture — UI Layer / Logic Layer / Transport Layer
Protocol — Slot / Sentinel / Manifest / Subscription / Channel / Skeleton Constraints
Development — Build commands, test matrix, prerequisites
Soild, Svelte and Vue frontends. Tauri and Electron desktop adapters. Serverless deployment mode. Island Mode; See the full roadmap.
The seam protocol is open — any language that serves HTTP can be a backend. PRs for new UI frameworks, backend languages, and transport adapters are welcome.
MIT License © 2026 Canmi
TypeScript
36.9%
Rust
33.0%
WebAssembly
12.9%
Go
12.7%
JavaScript
2.6%
Shell
1.5%