Release Notes
The capability release: the WASM broker moves into the daemon and grows from
Postgres-only to four host-signed verb families (pg, http, dynamo, s3), workers
lose their inherited environment, every function also becomes an OpenAPI 3.1
operation, and riz now boots AWS's own official Lambda samples unmodified.
Changed
riz initis nowriz new. The scaffold set is six per-runtime templates —
typescript-bun,typescript-node(real TypeScript on Node's native type
stripping, node >= 22.18),python,rust,go,wasm-rust(authored on
the newriz-wasmshim: you write a Lambda handler, the shim owns the wire)
— plus thetypescript-todo/ai-chatfull-stack starters. The three
WebSocket templates are gone;examples/chatis the WS showcase.- Scaffolds now carry an explicit
BuiltinKind(Template/Starter) instead
of astarts_with("templates/")guess, soriz new --listreads as three
distinct tiers: per-runtime templates (fast start), full-stack starters
(riz new ai-chatstill works), and the read-only examples under
examples/lambdas/you boot and read but don't scaffold. - WASM guests are authored as pure Lambda handlers on the
riz-wasmcrate;
hand-written stdin loops are banned from examples and templates by a
conformance test, andtests/template_smoke_all.rsscaffolds, builds, and
boots every template as an isolated smoke suite.
Added
-
AWS conformance corpus. A new isolated test binary
(tests/aws_conformance.rs) clones AWS's OWN official Lambda samples at pinned
commits, builds them, and boots them under riz unmodified — the reference
implementation's own code, proving riz runs it, not code we wrote. HTTP / API
Gateway v2 subset only (event-source samples are out of riz's scope). Pinned
live clones, not vendored snapshots (AWS's real code at a fixed commit, zero
repo bloat); skips cleanly when offline or a toolchain is missing. Starts with
the official Rust runtime'shttp-basic-lambda; adding a sample is one
manifest row. -
Autogenerated OpenAPI at
/openapi.json. riz already walks the live
function route table to produce the MCP tool list; the same walk now emits an
OpenAPI 3.1 document — one operation per declared route, path params typed from
the route template, query params and the request body from[function.X.mcp].
Every function is simultaneously an MCP tool at/_riz/mcpand an OpenAPI
operation, both derived from one table, both served as routes. Public (like
/healthand the agent card), no annotations, no separate spec file to drift.
OpenAPI 3.1 aligns with JSON Schema 2020-12, so the typed pieces transfer with
no translation. -
s3brokered capability. A WASM guest reads/writes S3 through the
broker:s3.get_object | put_object | list_objects | delete_object. The guest
names a grant and an object key; the daemon builds the object URL and
SigV4-signs the request host-side (via the maintainedaws-sigv4crate,
x-amz-content-sha256payload hash included — never hand-rolled, never the
full AWS SDK), and never lets a key or a signature cross to the guest.
mode = "read-only"restricts the op set to reads; a grantkey_prefix
confines the object key (and the list prefix), enforced before signing.
[resources.s3.<name>](region/bucket/endpoint_url/credential envs);
virtual-host for real AWS, path-style whenendpoint_urlis set (MinIO /
mocks). Guest API:riz_wasm::cap::s3. Signing correctness is proven by a
mock that independently re-signs each request and byte-compares the signature. -
Global
[env]table. A top-level[env]map is folded into every
function's environment at load, with[function.<name>.env]overriding a
colliding key — declareAWS_REGION/LOG_LEVELonce instead of per
function. A global var follows the same per-runtime rules as a per-function
one (process runtimes receive it; WASM guests keep their deny-by-default WASI
environment). Also fixes a standing bug whereenv/stage_variablesedits
were ignored by hot-reload until a restart. -
End-to-end validation flow.
scripts/validate.shruns the whole
proof-of-life in one command against the built binary: the example fleet
(all six runtimes + control plane), theriz newscaffold journey, a
performance floor + trend (HTTP and brokered-capability throughput/latency),
and a chaos suite that deliberately injects failures — pool saturation,
worker SIGKILL, the crash-loop circuit breaker, broker backend loss, and
SIGTERM drain — and asserts riz survives with no orphaned processes. Added
astests/perf_regression.rsandtests/chaos.rs(isolated CI steps). -
dynamobrokered capability. A WASM guest reads/writes DynamoDB
through the broker:dynamo.get_item | put_item | query | delete_itemover
the DynamoDB JSON 1.0 HTTP API. The daemon injectsTableName, SigV4-signs
the request host-side (via the maintainedaws-sigv4crate — never
hand-rolled, never the full AWS SDK), and never lets a key or a signature
cross to the guest.mode = "read-only"restricts the op set to
GetItem/Query; a grantkey_prefixconstrains partition-key values,
enforced before signing.[resources.dynamo.<name>](region/table/
endpoint_url/credential envs). Guest API:riz_wasm::cap::dynamo. Signing
correctness is proven by a mock that independently re-signs each request and
byte-compares the signature. -
httpbrokered capability. A WASM guest can now reach an outbound HTTP
origin through the broker:[resources.http.<name>]pins the origin
(base_url) and the daemon injects auth host-side, so the guest names a
grant and supplies a relative path — never a credential or an absolute URL.
SSRF-hardened by default: redirects are not followed, and a host that
resolves into loopback/private/link-local space is refused (opt out per
origin withallow_private_ipsfor an operator-declared internal service).
Per-grantmethodsallow-list;mode = "read-only"forcesGET. The guest
API isriz_wasm::cap::http::fetch.
Security
- Workers no longer inherit the daemon's full environment. Every worker is
spawned withenv_clear()plus a conservative allowlist (PATH, HOME, locale,
TLS-root and proxy vars, and riz's own non-secret control vars), so a
resource DSN or any other daemon secret lives in exactly one process — the
daemon. A function's own[function.X.env]remains the documented escape
hatch. Enforced by a secrets-canary test.
Fixed
- Lambda proxy responses with
nullor missingcookies/headers/
multiValueHeaders/isBase64Encodedare now accepted exactly like real
AWS (stockaws-lambda-gohandlers marshal nil slices asnulland
previously drew a 502 "bad gateway").
Install riz 0.3.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/24X7/riz/releases/download/v0.3.0/riz-installer.sh | shDownload riz 0.3.0
| File | Platform | Checksum |
|---|---|---|
| riz-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| riz-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| riz-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo 24X7/rizYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>