Spade 0.18.0

Posted 2026-04-15 by The Spade Developers

Today we release Spade v0.18.0, a release which brings significant improvements to the standard library among other things.

Standard Library Expansion

The standard library has gotten a significant face lift in this update. It now contains 113 functions ranging from simple conversions between primitive types, to combinator-functions like map, fold, and zip on arrays.

Existing modules and functions have also been made more consistent. For example, all functions that simply reinterpret bit values are now called as_xx while those which preserve numerical values are now to_xxx.

SpadeDoc V2

For a while, we have had a documentation generator for generating human-readable HTML documentation from Spade libraries. However, it was not as nice as we wanted, both in terms of features and implementation. With this release, it has been re-written to address many of these issues, and it is now ready for use. You can simply run swim doc in your existing project to generate documentation for both your project and your dependencies.

This also ties in very well with the standard library changes, as all the standard library functions now have doc-comments which are nicely rendered by spadedoc. You can see this over at https://docs.spade-lang.org/std/

Prebuilt Binaries

If you have used Spade before, you were probably noticing the long time it took to set up a project since swim had to compile the compiler and surrounding tools locally for each of your project. Now, swim simply downloads pre-built binaries making initial setup and version bumps much nicer.

For now, this is only enabled on Linux, but macos will come soon.

Removing the port/value Distinction

One of the more confusing parts of Spade was the distinction between ports and values. This release, we realized that we don’t need to make this distinction anymore, so now the language only has values and inv values. There are some more details about this that are better explained in the documentation.

Types Inside Units

You can now define types inside unit bodies. This is useful in a few cases, in particular FSMs where you often want a State type which is only relevant to that particular FSM, but which previously had to be defined globally.

Associated types

Traits now support associated types:

trait Tr {
type Output;
fn produce_output() -> Self::Output;
}

While most day-to-day users will probably not make much use of this, those of you writing heavily generic code will be excited about the capabilities this adds. It also lays the foundation for operator overloading for more operators which will come in the next release.