Repository navigation
v0.6.0 — Linux binary actually loads, parallelize() restored, 67 latent fixes
Highlights
The Linux prebuilt binary now actually loads. @napi-mojo/linux-x64 up to and including 0.5.1 shipped index.node without three of the seven runtime libraries it needs, and failed at require() with Error: libNVPTX.so: cannot open shared object file on any machine without a Mojo installation. If you tried napi-mojo on Linux and it did not load, that was this.
Five separate places in the release pipeline each hardcoded the same wrong assumption — that the Mojo runtime is four fixed, unversioned libraries — and each silently dropped files: the bundler, the CI artifact glob, the staging step, npm's own files glob, and the check that was supposed to catch all of it. Versioned sonames (libstdc++.so.6, libgcc_s.so.1) slipped through three of them. The dependency set is now computed by walking the graph, recorded in a manifest, and verified by unpacking the actual published tarball and loading it with the library search paths cleared.
parallelize() dispatches to threads again. Since the dev2026072306 toolchain, init_async_runtime() had been failing and parallelize_safe() was quietly falling back to a sequential loop — correct results, no error, and all thread parallelism gone. The AsyncRT entry point had been renamed (GetOrCreateRuntime → GetOrCreateCPUDevice); it is a rename, not an ABI change, despite the three-argument C++ symbol it forwards to.
67 latent framework bugs fixed. Mojo type-checks an imported package's method body only when something calls it, so a broken method compiles, packages and publishes as long as nobody calls it. That is how 0.5.1 shipped four broken modules with a green build and a green test suite. A new compile-only coverage target now calls every public method of every framework module — each env-only/Bindings overload separately — and its first run surfaced 61 further errors on top of the 6 already known.
Added
asyncRuntimeInitOk()— reports whether the Mojo async runtime initialized, i.e. whetherparallelize_safe()will use threads. Exported so a silent regression becomes a failing test.JsInt32.create(env, n),JsInt32.from_napi_value(env, val),JsBoolean.from_napi_value(env, val)—env-only overloads thatconvert.mojohad always called but which were never implemented. Theenv-only arm of theToJsValue/FromJsValuetraits had never worked in any release.
Fixed
- 52 missing origin widenings (
.as_unsafe_any_origin()) across 16 framework files. - 5 struct fields missing
@__allow_legacy_any_origin_fields— struct definitions elaborate lazily too, so the rule never fired on structs nothing constructs. - 2
len(String)calls, now a hard error rather than a deprecation warning. - The bundled-runtime dependency set is computed by walking the dependency graph instead of a hardcoded list, so it cannot silently drift again when a Mojo nightly changes the runtime's own dependencies.
Infrastructure
tests/compile/framework_coverage.mojo, compiled by CI on both platforms. Compiling it is the test. Validated by reverting the known fix and confirming it fails at exactly the six known sites while the build and the whole suite stay green.publish.ymlgained aworkflow_dispatchrehearsal that runs the full release pipeline with the publish steps disabled, and a step that loads the bundled binary with the library search paths cleared. The rehearsal found the Linux bundling bug on its first run.
Notes
- Version 0.5.2 was prepared but never published; it is skipped.
- 612 tests, plus 6 GC finalizer tests behind
--expose-gc. - Requires Mojo
1.0.0b3.dev2026072306to build from source. The published binaries need no Mojo installation.