Verve is a full-stack Zig framework — server-side rendering, fine-grained reactivity, WASM islands, and native desktop apps. No macros. No JS toolchain. One binary.
git clone https://github.com/sirhco/verve && cd verve && zig buildEvery page is fully formed HTML. Forms work with JavaScript disabled; islands hydrate only what's interactive.
Signals and effects shared between server and WASM client — updates touch exactly the DOM nodes that depend on them.
Each interactive region compiles to its own WASM chunk, loaded on demand and hydrated with typed props.
Declare an Actions struct; get /api/<fn> endpoints with comptime-generated, typed client stubs.
Charts and force-directed graphs, a tween/timeline engine with scroll triggers, and declarative WebGL2 scenes — all in Zig.
The same Zig codebase opens OS webview windows with typed IPC, tray, notifications, hotkeys, and deep links.
A page is a Zig function from request context to a node tree. The router captures :params; the arena frees everything at end of request.
const verve = @import("verve");
pub const routes: []const verve.Route = &.{
verve.Route.init("/", renderHome),
verve.Route.init("/hello/:name", renderHello),
};
fn renderHello(ctx: *verve.Context) !*verve.Node {
const name = ctx.param("name") orelse "world";
return ctx.div().class("card").children(.{
ctx.h1("Hello"),
ctx.p().children(.{
ctx.span().text("Greetings, "),
ctx.code(name),
}),
}).build();
}
This counter is a real island: server-rendered HTML, hydrated by a WASM chunk. The +/− forms work even with JavaScript off.
Total clicks: 0
Walk through the getting-started guide, explore the interactive examples, or dive into the API reference.