Skip to content

zzz - A Zig Web Framework

A Phoenix-inspired, batteries-included web framework for Zig. Blazing fast, memory-safe, with compile-time route resolution.

Compile-time Router

Routes are resolved at compile time — zero runtime overhead, instant 404s, and type-safe path parameters.

20 Built-in Middleware

Logging, CORS, compression, auth, rate limiting, CSRF, sessions, body parsing, static files, and more — all included.

Phoenix-style Channels

Real-time WebSocket channels with topic-based pub/sub, presence tracking, and a zzz.js client library.

Database Layer

Compile-time schema definitions, type-safe repositories, composable query builder, migrations, and connection pooling.

Background Jobs

Priority queues with in-memory or database-backed stores, retry strategies, cron scheduling, and telemetry.

Template Engine

Layouts, partials, XSS-safe HTML escaping, pipes, and first-class htmx integration.

OpenAPI / Swagger

Generate OpenAPI specs from route annotations. Swagger UI included.

High-performance I/O

epoll, kqueue, and io_uring backends. Built for speed from the ground up.

PackageDescription
zzz.zigCore framework — HTTP server, router, middleware, WebSockets, channels
zzz_dbDatabase layer — SQLite & PostgreSQL, schemas, repos, query builder, migrations
zzz_jobsBackground jobs — queues, workers, retry strategies, cron, telemetry
zzz_mailerEmail — SMTP adapters and templated emails
zzz_templateTemplate engine — layouts, partials, pipes, htmx helpers
zzz_cliCLI tool — project scaffolding, generators, dev server, migrations
zzz_example_appReference application demonstrating full-stack zzz usage
const std = @import("std");
const zzz = @import("zzz");
fn index(ctx: *zzz.Context) !void {
ctx.text(.ok, "Hello from zzz!");
}
const App = zzz.Router.define(.{
.middleware = &.{zzz.logger},
.routes = &.{
zzz.Router.get("/", index),
},
});
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
var server = zzz.Server.init(gpa.allocator(), .{
.port = 4000,
}, &App.handler);
std.log.info("Listening on http://127.0.0.1:4000", .{});
try server.listen(std.io.defaultIo());
}