Skip to content

Contributing

StableTested and in active use. Breaking changes will be called out.

noeira is developed in the open and was selected for a Modular Community Grant in 2026. Bug reports and contributions are welcome — the project status is honest about which parts are settled and which are not.

Terminal window
git clone https://github.com/noeira/noeira.git
cd noeira
pixi install
pixi run install-pre-commit

See Installation for GPU environments and optional dependencies, and Toolchain for the pinned versions and the native shims (pixi run build-http, build-qhull, …) that some code paths need at run time.

Terminal window
pixi run format # mojo format -l 80
pixi run test-smoke # the CI gate
pixi run examples-compile # catch example rot

Formatting is 80 columns via mojo format, enforced by pre-commit.

The project is pinned to Mojo 1.1.0 / MAX 26.6.0 — exact versions, not nightly. Code written against older Mojo, or against examples on the web, often uses spellings the pinned compiler rejects:

OlderMojo 1.1
fndef — the only function keyword; a function that can raise says raises
inoutmut
owned (argument)var
aliascomptime
from std.gpu… import …from max.gpu… import …
Atomic[DType.int64]Atomic[Int64]
@parameter closure + parallelize[f](n)def f(i: Int) {imm}: + parallelize(f, n)

The last three came with the 1.1 upgrade; Toolchain has the details and what is still pending. Your editor’s language server may lag the pinned compiler and report false warnings on valid code — the compiler is the authority.

These are not bugs in your code. Each has cost real time here.

Intra-package imports should name the module: from .mod import X, not from . import X — the latter misses wildcard re-exports.

_DLCallable discards arguments. get_function[T](name)(args) silently becomes a no-op. Unwrap with () first, then call.

If you are looking for something to work on, these are known and documented:

AreaIssue
Replay gatherDominates step time at pixel scale; unoptimized
Dreamer 4Perceptual loss corrupts token reconstruction
Elliptic contactsDrift vs. MuJoCo; affects Sawyer
CarRacingReward shaping unfinished
Env CUDA-graph captureBlocked by the cooperative blocked-Newton kernel
nn Trainer captureCaptured training now runs with shuffle and augmentation and matches the eager run byte for byte, and on NVIDIA most GEMMs run on cuBLAS over a workspace they own. The supervised Trainer’s USE_TRAIN_CUDA_GRAPH still defaults to off, and stays fp32-only
NHWC convEnd-to-end migration designed but not landed
DocumentationREADME and package READMEs have drifted from the code

The repository’s READMEs are written by hand and drift from the code; corrections are welcome. This site is checked instead: its build fails on any repository path a page cites that does not exist — see docs-site/scripts/check-refs.mjs.

Terminal window
cd docs-site
pnpm install
pnpm dev # http://localhost:4321
pnpm build # runs check-refs, then builds

Every repo path cited in a page is validated at build time. If a page quotes code, take it from a file under examples/ rather than writing it fresh — that is the difference between docs that survive a refactor and docs that do not.

Demo videos are generated from gifs/:

Terminal window
node docs-site/scripts/build-media.mjs

From the project’s own roadmap:

Stabilize and harden — battle-test the 3D physics engine and the complex agents for community use.

Land the model-based agents — finish AlphaZero, MuZero, DreamerV3 and TD-MPC2 in the fully-GPU pipeline.

Publish benchmarks — rigorous comparisons against Gymnasium, Stable-Baselines3 and PyTorch.

Developer experience — cleaner APIs, documentation, and example templates for new agents and environments.