Skip to content

0.3.0 - 2026-07-22

Latest

Choose a tag to compare

@github-actions github-actions released this 22 Jul 07:41
99c5c89

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 init is now riz 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 new riz-wasm shim: you write a Lambda handler, the shim owns the wire)
    — plus the typescript-todo / ai-chat full-stack starters. The three
    WebSocket templates are gone; examples/chat is the WS showcase.
  • Scaffolds now carry an explicit BuiltinKind (Template / Starter) instead
    of a starts_with("templates/") guess, so riz new --list reads as three
    distinct tiers: per-runtime templates (fast start), full-stack starters
    (riz new ai-chat still 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-wasm crate;
    hand-written stdin loops are banned from examples and templates by a
    conformance test, and tests/template_smoke_all.rs scaffolds, 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's http-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/mcp and an OpenAPI
    operation, both derived from one table, both served as routes. Public (like
    /health and 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.

  • s3 brokered 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 maintained aws-sigv4 crate,
    x-amz-content-sha256 payload 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 grant key_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 when endpoint_url is 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 — declare AWS_REGION / LOG_LEVEL once 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 where env / stage_variables edits
    were ignored by hot-reload until a restart.

  • End-to-end validation flow. scripts/validate.sh runs the whole
    proof-of-life in one command against the built binary: the example fleet
    (all six runtimes + control plane), the riz new scaffold 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
    as tests/perf_regression.rs and tests/chaos.rs (isolated CI steps).

  • dynamo brokered capability. A WASM guest reads/writes DynamoDB
    through the broker: dynamo.get_item | put_item | query | delete_item over
    the DynamoDB JSON 1.0 HTTP API. The daemon injects TableName, SigV4-signs
    the request host-side
    (via the maintained aws-sigv4 crate — 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 grant key_prefix constrains 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.

  • http brokered 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 with allow_private_ips for an operator-declared internal service).
    Per-grant methods allow-list; mode = "read-only" forces GET. The guest
    API is riz_wasm::cap::http::fetch.

Security

  • Workers no longer inherit the daemon's full environment. Every worker is
    spawned with env_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 null or missing cookies / headers /
    multiValueHeaders / isBase64Encoded are now accepted exactly like real
    AWS (stock aws-lambda-go handlers marshal nil slices as null and
    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 | sh

Download 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/riz

You 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>