Hatch is a cozy ecosystem of libraries and frameworks for the
Wren scripting language — tested, versioned, and
ready to drop into any project running on the Wrenlift runtime.
A single static binary, no extra runtime to install. Add packages with one command and you're up.
One line installs the hatch binary and the wrenlift runtime.
Scaffolds a hatchfile manifest and an entry script.
Wrenlift compiles and runs your script with hatched packages linked.
# 1. install $ curl -fsSL wrenlift.com/install.sh | sh # 2. scaffold $ hatch new my-app $ cd my-app $ hatch add @hatch:http @hatch:json # 3. run $ hatch run listening on :8080 ✓
Two first-party frameworks, both built on the same runtime. Same packages, same tooling, same hatchfile.
Server-rendered, htmx-native web framework for Wren. Ships a dev server with hot reload, file-based routing, and a production bundler that targets Wrenlift edge or Node.
Sprite batching, audio mixer, input mapping, ECS-lite scenes. 2D first, with hot reload for scripts, shaders, and assets — and a software renderer fallback so your prototype runs anywhere, browser included.
Curated, semver-pinned, spec-driven tested. Browse the full registry or search below.
Tiny test runner for *.spec.wren files.
Image encode + decode. PNG / JPG / BMP / WebP in, RGBA8 buffer out — `Image.decode(bytes)` feeds straight into `@hatch:gpu`'s `Device.uploadImage(image)`, and `Image.encodePng(...)` writes synthesized buffers back out. Backed by the `image` crate.
Rapier-backed physics. `World2D` and `World3D` from one import — bodies, colliders, gravity, force / impulse, position + velocity reads. Bundles rapier2d + rapier3d in a single cdylib so games never have to choose between dimensions at the package level. Wires into `@hatch:game` for a step-per-frame physics loop.
GPU primitives + 2D/3D renderers. Device, Buffer, Texture, Sampler, ShaderModule, BindGroup, RenderPipeline, CommandEncoder, RenderPass on the bottom; Camera2D/3D, Renderer2D (sprite batcher), Renderer3D (lit), Mesh, Material on top. wgpu on native, WebGPU on web — same Wren API both targets.
Window + input for any WrenLift app. winit on native, page-attached canvas on web — same `Window.create({...})` API, same `pollEvents` / `closeRequested` / `size` surface across targets. Bring-your-own canvas via `Window.attach(elementId)` on web.
General-purpose audio playback for WrenLift apps. cpal-backed output stream + a tiny mixer; WAV decoding via hound. `Audio.context()` opens the device, `Sound.load(bytes)` decodes a clip, `audio.play(sound)` schedules immediate playback against the global mixer.
Embedded SQLite. `Database.open(path)` returns a connection; prepared statements with named parameter binding, rows iterated as Maps, transactions, error handling. Backed by rusqlite (bundled libsqlite — no system dependency).
Reference plugin layout for wasm-only `@hatch:*` packages. A `Hello.greet(name)` foreign method backed by a tiny Rust cdylib — copy this directory as the starting point for your own on-demand plugin and replace the body with the real work.
Server-rendered, htmx-native web framework for Wren. Router, middleware, content-negotiated rendering via @hatch:template, HTTP/1.1 server on top of @hatch:socket.
HTTP/1.1 client with TLS, streaming bodies, and fiber-cooperative reads.
TOML parser and serializer, backed by the Rust `toml` crate.
URL parser, builder, and percent-encoder.
Wrenlift's tiered runtime is engineered for speed — cold scripts start quickly, hot paths get faster the longer they run.
Capability-based permissions for filesystem, network, and process access.
Ship your app and its packages as a single .hatch bundle — reproducible, signed, runnable on any wrenlift host.
Lockfiles, deterministic resolution, and reproducible builds out of the box.