Release notesalpha
What changed in each moxzi release, and what to do when upgrading.
The CHANGELOG.md file in each release has the complete list of changes.
Versions#
The compiler, moxzid, moxzi-web and the on-chain builder share one version number. During the alpha, any release can change behaviour; changes that need action are listed under "Upgrading". Each release's SHA256SUMS lists the hashes of compiler.wasm and linker.wasm, which are the same on every platform.
moxzi.game has its own version numbers.
0.1.0-alpha.10 (2026-10-25)#
Native kernels: fast code from existing Rust crates, linked only into the canisters that call it. Candid encoding is several times faster with the same bytes, and on-chain builds are byte-identical to local builds again.
New
- Native kernels. A package can back a Motoko function with a kernel built from a Rust crate. Opt in from your application with
moxzi kernel add <package>, which pins the kernel's exact bytes under[kernels]in yourmops.toml. Without the opt-in, or undermoc, the Motoko body runs. A dependency can never add a kernel for you, and a pin that does not match stops the build. See Native kernels. - Ten kernel packages:
moxzi-hash(SHA-256/512, HMAC, RIPEMD-160, BLAKE3),moxzi-secp256k1,moxzi-p256,moxzi-ed25519,moxzi-bls12-381,moxzi-ml-dsa,moxzi-rsa,moxzi-base58,moxzi-bech32andmoxzi-bitcoin. Their source is at icdevsorg/moxzi-kernels and rebuilds to the pinned bytes. They have not had an independent security audit yet. mo:ic-agent0.3.0 verifies a mainnet certificate in about 0.37 billion instructions with its kernel, against about 2 billion with its Motoko code.moxzi kernel build,kernel verify,kernel addandkernel sdk: build a kernel from your own Rust crate, and rebuild any kernel to check it against its pin.- A kernel moxzi does not publish asks before its first build (
--accept-kernelin scripts), and every built module lists its kernels with their source and commit in public metadata;moxzi verifyshows them for an on-chain build. to_candid, and the encoding of every message argument and reply, run several times faster (about 5 times for records, up to 20 times for large variants) and produce the same bytes asmoc.--candid-fast-pathalso decodes directly when the incoming types match yours.
Changed
- A kernel declaration that names a function the package does not define stops the build (
M0291), and a kernel that returns aBoolother than 0 or 1 traps. moxzi-rsasigns only with standard 3072-bit keys (two 1,536-bit primes, reduced CRT values) and refuses other key shapes with a clear error.- The compiler canister finishes a paid build's settlement even with no donation sinks configured, and removes earlier files in one call before a new upload.
Fixed
- An on-chain build is byte-identical to a local one however the work is split into messages.
- A stable signature never gives two different types the same name. One program's signature described a
Textfield asBool. - A project that imports from several folders beside it (
../lib-a/src,../lib-b/src) builds, locally and on chain. - On the shared on-chain compiler, one caller's build could compile another caller's library file.
moxzi build --remotekeeps the compiler canister's link attestation, and no longer calls a delivered refund "pending".- Wrong values: a negative literal at a numeric type declared through an alias,
let … elseon a nested option, and a negativeFloat32literal passed as an argument. - A
labelwith the same name as a variable no longer traps,to_candidwrites its type table inmoc's order, and three kinds of programmocaccepts no longer fail.
Upgrading
- A package that declares kernels must name functions that exist; a typo now fails with
M0291instead of silently running the Motoko body. moxzi-rsausers with non-standard keys (for example 1,535/1,537-bit primes) need standard 3072-bit keys.
0.1.0-alpha.9 (2026-10-17)#
moxzi now compiles Motoko 2.0.0: the same programs moc 2.0.0 accepts, with the same behaviour and error codes, plus moxzi's own additions.
New
- Motoko 2.0 syntax:
if a and not b { … },while i < n { … },switch x.kind { … }andcase #ok(v) vneed no parentheses, and the;between cases is optional. Outside a body, braces are a record literal; write a block asdo { … }. - A function returning
asynchas anasyncbody without saying so:func f() : async Nat = 1. A function passed where anasyncfunction is expected takes its parameter types from that type. - Contextual dot (
x.f()) and implicit arguments find functions in nested modules, such as a package'slib.mothat re-exports others. { r with … }copiesvarfields into the new record.a == bon a type parameter compares at its bound.moxzi buildacceptsmoc's single-dash spelling of long flags (-measure-rts-stack).- An
actor*class can be named explicitly with(with id = "…"), and a persistent one is found again by its name, so moving or renaming its file keeps its instances. - The hosts bundle includes
moxzi-actor-hostwith the tensor device.
Changed
- Actors are persistent by default: a plain
actorkeeps its fields across upgrades. Mark a fieldtransientto reset it.persistentandstableare now redundant (M0217,M0218), andflexibleis an ordinary identifier. actor*followsactor: instances are persistent by default, andtransient actor*opts out.--experimental-local-actor-persistenceis no longer needed and is ignored.- Some warnings are now errors, as in
moc2.0.0: a pattern that does not cover every case (M0145), a dropped record field (M0215), a comparison at a type with one value (M0276), an ignoredasync*(M0222) and others.-W=M0145keeps one as a warning. - More programs
mocrejects are rejected, with its codes: migrations that produce a field of the wrong type or one the actor does not declare, asystem functhe runtime never calls, a misspelled variant tag in a pattern, and more. - The runtime is
moc2.0.0's. An upgrade that drops a stable variable while adding another is refused unless a migration function accounts for it. - Compiled canisters report
2.0.0as their compiler version.
Fixed
- A canister whose history includes classical persistence upgrades again.
- A saved game world restores again (broken in alpha.8; alpha.8 saves cannot be restored).
- A two-case
switchover a variant that repeats a label checks the tag, so a value of the other case traps instead of being read as the wrong type. Nonein an actor's interface is Candidempty, notreserved.- Two imported actor-class libraries in one program no longer swap their code on upgrade.
- A classical-persistence canister with a stable
Regionupgrades to enhanced persistence. - A generated Candid type name no longer collides with one you wrote, and hex field ids in an imported
.didare read correctly. - A class field that shadows a module-level name no longer fails with
M0055, and anasynctype over a type declared further down no longer fails withM0033. moxzi host newprojects stop with a clear message when their port is taken by another program, or when a Restate container of the same name belongs to another project.moxzid -s: upgrading an actor from the manifest works, and a restart after a crash re-runs about 30 seconds of device work instead of minutes.
Upgrading
- Programs written for the 1.x grammar may not parse. The error names the fix; most cases are a missing space (
if c [i]versusif c[i]) or a block that needsdo { … }. = async { … }as a function body is now errorM0277. Remove theasync.- Code that relied on the new errors being warnings needs a fix, or
-W=<code>while you migrate. - An actor field that cannot persist (a function in a
var, say) must be markedtransient. --default-persistent-actorsis ignored with a warning;--trap-on-call-erroris removed.- The 22
Prim.stableMemory*functions andcreateActorare gone; use regions and actor classes.__motoko_stable_var_infois no longer exported. - Upgrading a canister that still uses classical persistence needs
--enhanced-orthogonal-persistenceon the build.
0.1.0-alpha.8 (2026-10-08)#
New
- GPU math for actors.
moxzid --device burn:metal(orburn:cuda,burn:vulkan,burn:cpu) gives every hosted actor a private tensor device: parameters, optimizers (AdamW, Muon, SGD) and stored values live on the GPU under names, one message carries a whole training step, actors share weights by name with explicit readers, devices on different machines move tensors directly, device time is charged to the caller, and the device survives a crash with the actors.moxzi-actor-host --devicedoes the same on actor platforms. See GPU math for actors. - The tensor device decodes with a key/value cache and can distill one model into another.
Changed
- Outcalls from
moxzidare refused until you grant them:--grant-http-publicfor any public HTTPS host, or--outcall-public-host HOSTfor one. Private and loopback addresses need an explicit development grant. A package can't grant itself access. - Actor platform hosts check requests before they reach an actor: a body must be valid JSON of the right shape (an array for an actor call), public calls are limited to 8 MiB, and control and image traffic to 192 MiB. Oversized and malformed requests get 413 or 400.
- Restate projects sign every request from the Restate server, and the host verifies it;
moxzi host new restatesets this up. wasmCloud control routes always need the operator token. Dapr calls between actors are signed per call. - Browser games and actors run under host-owned limits: instructions per message, memory per actor and in total, and saved-image size. A package can ask for less, not more.
Fixed
- In
moxzid -s, what one actor's message did to another actor survives a crash exactly once. Before, a large callee could lose it, or a large caller could replay it. Timers fired between messages are recorded too. - A timer that came due while a query was running no longer runs as a query.
- Reading stable memory no longer copies all of it on every call.
- Failed installs and image activations leave the host usable. Durable upgrades publish code, state and deployment together, so a crash mid-upgrade recovers to one or the other.
- Actor keys with
/,~,+, spaces or Unicode stay distinct on every platform.
Upgrading
- If your actors make HTTP outcalls under
moxzid, add--grant-http-publicor--outcall-public-host HOSTto its command line. Without a grant, outcalls fail withthis host cannot make HTTP requests. - Regenerate Restate projects with
moxzi host new restate, or add a request-identity key, so the Restate server signs its requests. - Clients that sent actor calls with malformed or non-array JSON bodies now get 400 instead of a call with no arguments. An empty body still means
[].
0.1.0-alpha.7 (2026-09-29)#
New
- Actor platforms: run Motoko actors inside Dapr, Restate, Orleans, Akka (Pekko), Proto.Actor, Temporal, Ray, wasmCloud and Cloudflare Durable Objects, with state stored by the platform.
moxzi host newcreates a working project. See Actor platforms. libmoxzi_rts, the runtime as a C library, in the SDK bundle.ic-agent: call canisters on the Internet Computer from Motoko running outside it, with certificate and signature verification.moxzi agent-bindingsgenerates typed clients. See Calling the Internet Computer.moxzidJSON endpoints (/call-json,/query-json) and OpenAPI descriptions (/openapi/ACTOR).moxzi candid-compatiblechecks that a new Candid interface works for existing callers.- Libraries can declare that they need moxzi, and which features, in
mops.toml. - Games can request network access with
capabilities: [http].
Changed
- An active actor on a platform uses about 110 KiB of memory, down from about 10 MiB.
- The compiler is 347 KB smaller.
Fixed
i<22is now a syntax error, as inmoc. Writei < 22.- Forward references
mocrejects are now rejected (M0055). M0157is reported inside actor, object and module bodies.M0131names the flag needed to storeactor*instances in stable variables.- No false
M0194for an import used only in types. - Generic self tail calls run as loops instead of using stack.
- A library file with several declarations can be imported as a module, as in
moc.
Upgrading
- Code that compared with
<or>without spaces (a<b) no longer compiles. Add spaces.
0.1.0-alpha.6 (2026-09-22)#
New
actor*(experimental): many actors inside one canister, each with its own id, methods and state, enabled with--experimental-local-actors N. Add--experimental-local-actor-persistenceto keep them across upgrades.- The compiler tracks
moc1.16.1. --wasm-tail-calland--candid-fast-path(opt-in).
Changed
- The checked array-index optimisation is on by default.
--no-index-fast-pathturns it off.
Fixed
type T = A and { s : S }withSdeclared later is accepted;type A = B or CwithBorCdeclared later is now checked.- Self tail calls inside named nested functions run as loops, instead of overflowing the stack after about 24,000 iterations.
- The garbage collector handles static roots that grew during an upgrade.
--compiler PATHwith a missing file is an error.- Upgrading a suspended actor container is refused.
0.1.0-alpha.5 (2026-09-09)#
New
Nat256andNat128: fixed-width 256- and 128-bit integers, with the full set of operators, Candidnaton the wire, and stable storage.--compact-rts, for smaller heaps inmoxzidandmoxzi-web.moxzid --live-cap: unload idle actors to host many more.moxzi publishandmoxzi deprecate: publish to ICRC-118 registries with build records. The compiler canister links its own output and answersattestLinked.--gzip.
Fixed
- A canister that moved from classical persistence to enhanced orthogonal persistence can be upgraded again.
- Several programs that compiled incorrectly, or were accepted but shouldn't have been.
--packagepointing at a missing directory is errorM0012.
0.1.0-alpha.4 (2026-09-04)#
New
blob:file:imports.- Annotated imports.
Fixed
.sizeon arrays as a first-class function,±0.0literals,Float32comparisons, and integer literals declared asFloat.sharedin generic function types was being dropped.- Ill-typed programs that crashed the compiler now get error messages.
0.1.0-alpha.3#
The first public alpha: the moxzi CLI, the on-chain builder, moxzid and moxzi-web.
Also in later alpha.3 builds:
- Pattern-coverage warnings (
M0145,M0146) and unused-identifier warnings (M0194,M0198). - Error positions use
moc's format. x-callerformoxzidcalls.