cd /news/developer-tools/mojo-nightly · home topics developer-tools article
[ARTICLE · art-96083] src=mojolang.org ↗ pub= topic=developer-tools verified=true sentiment=· neutral

Mojo nightly

Mojo nightly introduces compiler optimizations that speed up compilation of files with large collection literals by about 1.3x, renames the @parameter decorator to @__parameter, and adds namespace semantics for directories. The update also makes StringDict Writable, adds experimental 6-bit float types from the Open Compute microscaling specification, and renames UnsafeMaybeUninit to MaybeUninit with safer conformance gating.

read7 min views1 publishedAug 13, 2026

This version is still a work in progress.

Highlights

  • Code that performs many implicit conversions, most visibly large collection literals, compiles faster: the compiler no longer runs parameter inference on constructors that cannot be used for an implicit conversion in the first place. Files that are mostly data, such as the standard library's Unicode lookup tables, compile about 1.3x faster.

Language changes

Renamed the

@parameter

decorator on parametric closures to@__parameter

. The deprecated@parameter if

/@parameter for

forms are unchanged; prefercomptime if

/comptime for

for compile-time control flow. - The module & package system:

Directories may now have "namespace" semantics; a single directory name may resolve across distinct locations on disk which share that name.

Importing functions with the same name from different modules, combining them into one overload set, is now an error, following a period of deprecation.

Intra-package accesses without explicit

import

s are now an error, following a period of deprecation.

Library changes

StringDict

now conforms toWritable

when its value type isWritable

, matching the existing behavior ofDict

. This lets youprint()

aStringDict

or convert it to aString

. - The

chars

argument ofstrip()

,lstrip()

andrstrip()

onStringSpan

,String

andStringLiteral

is now anImmStringSpan

, so a mutable string is accepted aschars

, including the string being stripped (s.strip(s)

). - StringDict.__getitem__()

now accepts aStringSpan

, so you can index aStringDict

with a borrowed string view without first allocating aString

just to perform the lookup. - Renamed the variadic type-list parameter on

Tuple

andVariadicPack

toTs

, standardizing the naming convention used across the standard library. The old name,element_types

, remains as a deprecated alias. - Added experimental

DType.float6_e2m3fn

andDType.float6_e3m2fn

, the two 6-bit encodings from theOpen Compute microscaling specification. Both are finite-only, so neither has an inf nor a NaN encoding.These are experimental storage formats for packed weights rather than general-purpose numeric types, and standard library support is deliberately partial. As with the existing

DType.float4_e2m1fn

, they are excluded fromis_numeric()

, arithmetic is not implemented, and converting to or from another floating-point type is unsupported on every target, so values cannot be printed either. - Array

now conforms toDefaultable

when its typeT

is alsoDefaultable

. - Deprecated

is_trivially_movable()

,is_trivially_copyable()

, andis_trivially_deletable()

instd.memory

in favor ofIsTriviallyMovable[T]

,IsTriviallyCopyable[T]

, andIsTriviallyDeinitable[T]

instd.traits

. The replacements arecomptime

predicates rather than functions, so drop the call parens at use sites, for exampleIsTriviallyCopyable[T]

instead ofis_trivially_copyable[T]()

. - Renamed

UnsafeMaybeUninit

toMaybeUninit

. It conforms toMovable

,Copyable

/ImplicitlyCopyable

, andDeinitable

only when the contained type's own move, copy, or implicit deinitializer is trivial, since moving, copying, or destroying aMaybeUninit

only touches its raw bits, never the contained value's own lifecycle methods. Gating conformance this way turns what would otherwise be silent memory-safety bugs into compile-time errors. - Atomic

is now parameterized on a value typeT

instead of aDType

. Update call sites fromAtomic[DType.float32]

toAtomic[Float32]

. The atomic operations (load()

,store()

,fetch_add()

,compare_exchange()

, and so on) still only supportScalar

types. - Added

Pointer[T].unsafe_write(def() -> T)

, which initializes the pointee with the value returned by a closure, constructing it directly in place rather than moving an already-constructed value there. Unlikeunsafe_write(var T)

, this does not require the pointee type to beMovable

. - Pointer.mut_cast

is now deprecated. Developers should prefer using explicit mutabilites at the callsite viaMutPointer

orImmPointer

. If mut casting is needed (it should try to be avoided) - you can useunsafe_mut_cast

. - The following APIs have been migrated to unified closures:

sort

,debug_assert

,Span.apply

. - Uncaught exceptions now print to

stderr

, notstdout

.

Tooling changes

mojo doc

now reports the condition of a conditional trait conformance, and the generated API docs show it alongside the trait. Previously the condition was dropped, making a conditional conformance indistinguishable from an unconditional one. Also fixed rendering of somewhere

clauses.

Removed

This release completes the removal of APIs deprecated during the v1.0 cycle.

Removed the temporary

InlineArray

alias forArray

, including its re-exports fromstd.collections

and the prelude. UseArray

directly. - Removed the

std.gpu.profiler

module and itsProfileBlock

context manager. It timed host wall-clock, not GPU work, and reported the elapsed time with the operands reversed. Time a block of host code withdirectly, and use a GPU profiler such as Nsight Systems orperf_counter_ns()

rocprof

for device timings. - Removed

memcmp

and itsstd.memory

re-export. Useunsafe_memcmp

instead. - Removed the

validate

parameter from, which now always validates. Passingb64decode()

validate=False

did not skip any work on valid input; it only turned characters outside the base64 alphabet into silently corrupt output bytes. Drop[validate=True]

from existing calls; calls that relied on the default now raise instead of returning garbage. - Removed the origin aliases left over from the

Immut

toImm

andExternal

toUntracked

renames. Use the surviving spelling in each case:ImmOrigin

forImmutOrigin

,ImmUnsafeAnyOrigin

forImmutUnsafeAnyOrigin

,ImmStaticOrigin

forStaticConstantOrigin

,UntrackedOrigin

forExternalOrigin

,MutUntrackedOrigin

forMutExternalOrigin

, andImmUntrackedOrigin

for bothImmutUntrackedOrigin

andImmutExternalOrigin

. - Removed the pre-unification pointer aliases

MutUnsafePointer

,ImmUnsafePointer

,ImmutUnsafePointer

,ImmutOpaquePointer

,ImmutPointer

, andOptionalUnsafePointer

. UseMutPointer

,ImmPointer

,ImmOpaquePointer

, andOptionalPointer

instead.UnsafePointer

itself remains available, but is deprecated in favor ofPointer

. - Removed the raw memory functions superseded by their

unsafe_

-prefixed spellings:memcpy

,memset

,memset_zero

,uninit_move_n

,uninit_copy_n

, anddestroy_n

. Useunsafe_memcpy

,unsafe_memset

,unsafe_memset_zero

,unsafe_uninit_move_n

,unsafe_uninit_copy_n

, andunsafe_destroy_n

instead. - Removed the

size

aliases left from thesize

tolength

rename:SIMD.size

,Array.size

,TypeList.size

, and theSIMDSize

alias forSIMDLength

. Uselength

andSIMDLength

. - Removed the

as_immutable()

andget_immutable()

methods onPointer

,Span

, andStringSpan

. Useas_imm()

. - Removed the

ImmutSpan

alias. UseImmSpan

. - Removed

String.as_string_slice()

. Construct aStringSpan

from the string instead:StringSpan(my_string)

. - Removed the

ImplicitlyDestructible

andImplicitlyDeletable

aliases. UseDeinitable

. - Removed the deprecated ownership-transfer methods:

List.steal_data()

andOwnedPointer.steal_data()

are nowunsafe_take_allocation()

,OwnedPointer.take()

isinto_inner()

, andVariant.take()

andVariant.unsafe_take()

areunwrap()

andunsafe_unwrap()

. - Removed the

Pointer

methods superseded by theirunsafe_

-prefixed spellings:as_noalias_ptr()

,destroy_pointee()

,destroy_pointee_with()

,init_pointee_move()

,init_pointee_copy()

, andinit_pointee_move_from()

. Useunsafe_as_noalias()

,unsafe_deinit_pointee()

,unsafe_deinit_pointee_with()

,unsafe_write()

, andunsafe_write_move_from()

. ThePointer.type

alias forPointer.T

is gone as well. - Removed the

ConditionalType

type function and thestd.utils.type_functions

module. Use the ternary expressionT if cond else U

. - Removed

trait_downcast()

. Constrain on the trait instead, withconforms_to(type_of(src), Trait)

in awhere

clause or acomptime assert

. - Removed the parametric

benchmark.run[func]()

overloads. Pass the function as an argument torun(f)

instead, which accepts a unified closure. - Removed

AnyCoroutine

,Coroutine

andRaisingCoroutine

from the prelude, and made the module that defines them private. Mojo's async support is unfinished, and these types being globally visible led people to build on an API that carries no stability guarantees.async def

is unaffected: the compiler still synthesizes these types for you, so they continue to appear in inferred types and diagnostics. There is no supported way to name them directly. - Removed the async task API from the public

std.runtime.asyncrt

module, which is now private.initialize_runtime()

andparallelism_level()

are unaffected and have moved up to thestd.runtime

package, so import them fromstd.runtime

instead ofstd.runtime.asyncrt

. - Removed support for

.mojopkg

files after a period of deprecation. Use.mojoc

files instead.

Fixed

mojo build --emit asm

and--emit llvm

now always write the offload kernel files next to the host output file. Building a kernel that an earlier build had already compiled could write them into the earlier build's output directory, or skip them with no diagnostic. - Parametric

raises

now accepts any primary expression as the thrown type in a function signature, matching the syntax positions where types otherwise appear. This most notably fixesraises Self.SomeAssocType

on trait and struct methods, which would previously fail with an error. The parenthesized workaround (raises (Self.DriveErrorType)

) is no longer required. - An integer

range()

with a step of zero is now always empty. It previously used to be an infinite loop - iterating forever at runtime, and hanging the compiler at comptime. - Fixed

ceildiv()

returning0

for unsigned operands near the type's maximum value. The unsigned code path computednumerator + denominator - 1

, which overflows and wraps for large operands; it now derives the ceiling from the floor division and remainder instead. - Counter.most_common(n)

now returns all elements whenn

exceeds the number of unique elements, matching Python, instead of aborting. - os.path.join()

now inserts separators based on the accumulated path rather than the first argument, sojoin("/", "a", "b")

returns/a/b

(previously/ab

) andjoin("a", "b/", "c")

returnsa/b/c

(previouslya/b//c

). - base64.b64decode()

now raises an error when the input length is not divisible by 4 instead of reading past the end of the input (or aborting when asserts are enabled). - On macOS,

os.stat()

andos.lstat()

no longer return a negativest_mode

for regular files. The underlyingmode_t

andnlink_t

C type aliases were declared as signed 16-bit integers, but macOS defines them as unsigned, so any mode with theS_IFREG

bit set (every regular file) sign-extended into a negativeInt

. - PythonObject

no longer leaks a CPython reference per positional argument when calling a Python object, nor when setting an item, attribute, or set literal element.

── more in #developer-tools 4 stories · sorted by recency
── more on @mojo 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/mojo-nightly] indexed:0 read:7min 2026-08-13 ·