Build for web and desktop.

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 build

SSR first

Every page is fully formed HTML. Forms work with JavaScript disabled; islands hydrate only what's interactive.

Fine-grained reactivity

Signals and effects shared between server and WASM client — updates touch exactly the DOM nodes that depend on them.

Islands architecture

Each interactive region compiles to its own WASM chunk, loaded on demand and hydrated with typed props.

Typed server functions

Declare an Actions struct; get /api/<fn> endpoints with comptime-generated, typed client stubs.

Viz, anim & WebGL built in

Charts and force-directed graphs, a tween/timeline engine with scroll triggers, and declarative WebGL2 scenes — all in Zig.

Native desktop

The same Zig codebase opens OS webview windows with typed IPC, tray, notifications, hotkeys, and deep links.

Routes are functions

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.

zig
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();
}

Hydration, live

This counter is a real island: server-rendered HTML, hydrated by a WASM chunk. The +/− forms work even with JavaScript off.

Verve Counter

0

Total clicks: 0

Start building

Walk through the getting-started guide, explore the interactive examples, or dive into the API reference.