The opinionated Go meta-framework. .stew templates, file-based routing, and hybrid isomorphic Wasm.
Server and client, both compiled in Go.
$ go install github.com/ZiplEix/stew@latest
Your pages/ directory is your router. Create @page.stew and your route is live. Zero configuration.
Go components with structured Props and slots, importable directly into your templates.
Write client-side Go in <goscript client> blocks. Automatically compiled to WebAssembly via TinyGo.
Instant browser reload via SSE. Maintains focus, scroll position, and DOM state using idiomorph.
Native server-side partial updates with HTMX. Stew handles partial rendering transparently.
Stew tracks every generated file in .stew/. A stew clean performs a precise, risk-free cleanup.
One .stew file, two execution environments.
<goscript>
// โ Executed on the SERVER (Native Go)
title := "Hello"
users := db.FindAll()
</goscript>
<goscript client>
// โ Compiled to WASM (TinyGo)
count := 0
wasm.OnUpdate(func() { ... })
</goscript>
<span class="token-tag"><h1></span>{{ title }}<span class="token-tag"></h1></span>
<span class="token-tag"><div</span> <span class="text-amber-300">bind:content</span>={{ count }}<span class="token-tag">></span>0<span class="token-tag"></div></span>
<span class="token-tag"><button</span> <span class="text-indigo-300">on:click</span>={{ count++ }}<span class="token-tag">></span>+<span class="token-tag"></button></span>
Compiles to stew.page.go. SSR, DB access, and standard Go imports.
Compiled via TinyGo to .wasm. 60FPS reactivity loop with automatic DOM bindings.
Both contexts are isolated. Communication happens via JSON serialization (stew-pagedata).