Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

https://img.shields.io/pypi/pyversions/west-rs?logo=python https://api.securityscorecards.dev/projects/github.com/zephyrproject-rtos/west/badge https://codecov.io/gh/zephyrproject-rtos/west/graph/badge.svg

This is the Zephyr RTOS meta tool, west.

https://docs.zephyrproject.org/latest/develop/west/index.html

West v2 is a rewrite of west in Rust. It ships as:

  • a single native west binary that implements every built-in command, and

  • a Python package, also called west, that provides the extension command framework (west.commands) and the public Python API (west.manifest, west.configuration, west.util). The Python package is a thin layer over the same Rust core, exposed through a PyO3 extension module.

Both come out of one Cargo workspace and are distributed together in one wheel. If you are coming from west v1 (the pure-Python implementation), read Migrating from west v1 below and MIGRATION.md for the full list of behavioral differences.

Installation

Using pip:

pip3 install west-rs

(Use pip3 uninstall west-rs to uninstall it.)

The distribution is named west-rs, but it is a drop-in replacement for the v1 west package: it provides the same west command and the same west Python package. Uninstall v1 first (pip3 uninstall west); the two cannot coexist in one environment because they ship the same files.

The wheel contains the west binary, which pip places on your PATH, and the Python package. One abi3 wheel covers every supported Python version (3.10 and newer). When no prebuilt wheel matches your platform, pip builds from the source distribution, which requires a Rust toolchain (see Prerequisites).

Other ways to install:

  • uv tool install west-rs installs the same wheel into an isolated environment managed by uv. Extension commands run in a separate interpreter (see below), so point WEST_PYTHON at that environment’s Python, for example ~/.local/share/uv/tools/west-rs/bin/python, or install west into the virtual environment you use for Zephyr instead.

  • cargo install --path crates/west-cli from a checkout builds only the west binary, with no Python dependency at all. All built-in commands work.

Extension commands (west build, west flash, …) are Python programs. The binary runs them with the interpreter named by WEST_PYTHON, else the active virtual environment’s Python, else python3 on PATH, and that interpreter needs the west Python package installed.

Basic Usage

West lets you manage multiple Git repositories under a single directory using a single file, called the west manifest file, or manifest for short. By default the manifest file is named west.yml. You use west init to set up this directory, then west update to fetch and/or update the repositories named in the manifest.

Example usage with upstream Zephyr’s manifest file:

mkdir zephyrproject && cd zephyrproject
west init -u https://github.com/zephyrproject-rtos/zephyr
west update

What just happened:

  • west init clones the west manifest repository given with -u, in this case the zephyr repository, into the workspace. The manifest repository contains west.yml, a YAML description of the Zephyr installation, including Git repositories and other metadata. West records the workspace state in a .west/ directory next to it.

  • west update clones the other repositories named in the manifest file, creating working trees in the workspace directory zephyrproject. Projects are fetched in parallel by default; use -j 1 or --raw to see each Git command’s native output in sequence.

There is no default manifest URL: -u (or its v1 spelling -m) is required unless you initialize from an existing local manifest repository with west init -l. Use --revision (--mr) to pick a revision of the manifest repository; if not given, the remote’s default branch is used. Use --manifest-file (--mf) to use a manifest file other than west.yml.

West doesn’t care if the manifest repository is zephyr or not. You can and are encouraged to make your own manifest repositories to meet your needs. Manifest files may be written in YAML, TOML, or JSON; the format is chosen by file extension.

For more details, see West (Zephyr’s meta-tool) in the Zephyr documentation.

Commands

West has multiple sub-commands. After running west init, you can run them from anywhere under the workspace. The built-in commands are:

init

Initialize a west workspace

update

Update projects to their manifest revisions

list

List projects defined in the manifest

manifest

Inspect, validate, resolve, or freeze the workspace manifest

status

Show per-project working-tree status across the workspace

diff

Show per-project diffs across the workspace

compare

Compare each project’s state against the manifest

forall

Run a shell command in each project

grep

Run a grep-like tool in each project (git-grep / ripgrep / grep)

config

Read or write west configuration values

topdir

Print the top directory of the west workspace

exec

Run an external program (useful with aliases)

help

Show help for a command, alias, or extension

west -h lists the built-in commands. west help additionally lists the extension commands and aliases available in the current workspace. Get help on any command with west <command> -h; west <command> --help prints the longer form.

Commands that touch every project (update, diff, status, compare, forall, grep) run in parallel by default and accept -j N to control the number of jobs. They write command data to stdout and everything else (per-project banners, progress bars, summaries, warnings) to stderr, so redirecting stdout yields clean, machine-readable output.

West is extensible: you can add new commands to west without modifying its source code. Extension commands are Python classes declared in a west-commands file (YAML, TOML, or JSON) inside a project. The Rust binary discovers them and runs each one through the west Python package. See Extensions in the documentation for details.

Configuration

West follows Git-like conventions for configuration: a system file, a per-user global file, and a per-workspace local file at .west/config.toml, with local values taking precedence. Configuration files are TOML and keys are dotted, for example manifest.path or tool.git.fetch.strategy.

west config list
west config get manifest.path
west config set --global update.jobs 4
west config unset update.jobs

Any command accepts one-off overrides with -c NAME=VALUE and extra files with --config-file PATH.

Migrating from west v1

West v2 keeps the manifest format, the workspace layout, the Python extension command API, and the names and meanings of nearly all command-line options. The changes you are most likely to notice are:

  • Configuration files are TOML rather than INI. west config migrate converts an existing v1 configuration file to v2 TOML at the same scope and leaves the original in place.

  • west config takes an explicit subcommand (get, set, unset, list, migrate) instead of positional arguments.

  • Diagnostics are prefixed west: error: and west: warning:. Exit codes are 0 (success), 1 (failure), and 2 (usage error or unmet pre-condition, such as naming an uncloned project).

  • west -h shows built-ins only; west help shows extensions and aliases.

  • west selfupdate is gone. Upgrade through the package manager you installed west with.

MIGRATION.md in this repository lists every known difference, including Python API changes, with each entry tagged as changed, dropped, or still a gap.

Hacking on West

This section contains notes for getting started developing west itself.

Repository layout

crates/west-core

Library crate: manifest parsing, import resolution, configuration, workspace discovery, and the Git client. No command-line or Python code.

crates/west-cli

The west binary (src/bin/west.rs), the built-in command implementations (src/commands/), and, behind the pyo3 Cargo feature, the _west_native Python extension module (src/python/).

src/west

The Python package. manifest.py, configuration.py, and util.py wrap _west_native; commands.py is the extension command base class; _dispatch.py is the entry point the binary spawns to run an extension.

tests

The active pytest suite. It spawns the compiled west binary and imports the Python package. tests-legacy holds v1 tests that have not been ported yet and is excluded from test discovery.

_build_backend.py

A PEP 517 build backend wrapping maturin. It builds the west binary and stages it so that the wheel ships both the binary and the extension module. pyproject.toml explains the details.

The project version lives in one place, the [workspace.package] table of the root Cargo.toml. Both crates inherit it and pyproject.toml reads it at build time.

Prerequisites

  • A Rust toolchain at or above the rust-version in Cargo.toml (currently 1.93), for example via rustup.

  • Python 3.10 or newer and uv. Plain pip (25.1 or newer, for dependency groups) works too.

  • Git.

Install the Python development dependencies once:

# Using uv
uv sync --frozen

# Using pip, in an active virtual environment
pip3 install --group dev

Building

Build the binary alone:

cargo build --release -p west-cli --bin west

The result is target/release/west. For the Python side as well, build both artifacts with the poe task used by the tests:

uv run poe build

This runs the cargo build above and then maturin develop --release, which compiles the extension module with the pyo3 feature and installs it into the active virtual environment. The two builds deliberately use separate Cargo target directories (target/ and target/maturin/) so they do not invalidate each other’s caches.

Editable install

To run west “live” from the current source tree as an ordinary installed package, run this from the top-level directory of the repository:

pip3 install -e .

This goes through _build_backend.py, so you get both the binary on your PATH and the Python package. Note that maturin develop on its own only installs the extension module, not the binary.

Running the tests

There are two test suites.

Rust unit and integration tests live under crates/*/tests and in-module #[cfg(test)] blocks:

cargo test --workspace

The Python suite under tests/ drives the compiled binary and the Python API. It needs the artifacts from poe build, which the test task depends on:

# Full check: tests, ruff lint, ruff format, mypy
uv run poe all

# Just the pytest suite
uv run poe test

# In parallel with pytest-xdist
uv run poe test-xdist

Use poe -h to list all tasks. Arguments to a task are forwarded to the underlying command:

# One file
uv run poe test tests/test_manifest.py

# One test
uv run poe test tests/test_config.py::test_config_global

# Tests matching a keyword, without output capture
uv run poe test -k import --capture=no

The suite locates the binary in this order: the WEST_TEST_BIN environment variable, then target/release/west, then target/debug/west. Set WEST_TEST_BIN to test an installed wheel or a cross-built binary, which is what CI does.

Linting and formatting

Python code is checked with ruff and mypy:

uv run poe lint
uv run poe format
uv run poe types

Rust code should pass cargo fmt --check and cargo clippy --workspace; these are not yet enforced in CI (see TODO.md).

Creating a wheel package

To build the wheel and the source distribution:

uv build

This creates dist/west_rs-<version>-cp310-abi3-<platform>.whl and dist/west_rs-<version>.tar.gz. The wheel is platform-specific because it contains native code, but a single wheel per platform serves every Python version from 3.10 up. Install it with:

pip3 install -U dist/west_rs-*.whl

You can pip3 uninstall west-rs to remove this wheel before re-installing the version from PyPI, etc.

The wheels published to PyPI are built with cibuildwheel so that they are repaired for broad compatibility (manylinux, musllinux, macOS deployment targets) and smoke-tested before upload. To produce the same wheels locally:

scripts/build-wheels.sh --platform macos
scripts/build-wheels.sh --platform linux      # needs docker
scripts/build-wheels.sh --only cp310-manylinux_x86_64   # a single wheel

Finished wheels land in wheelhouse/. Linux builds need a running Docker daemon. macOS builds need the python.org CPython 3.10 installer, because cibuildwheel compiles against the framework interpreter and will not install one itself outside CI. The configuration is the [tool.cibuildwheel] table in pyproject.toml; .github/workflows/wheels.yml runs it across all supported platforms.

Quick install from Git

GitHub offers pip the ability to download and install a .zip archive of any branch, tag, or pull request with a single command. This compiles the Rust code locally, so it needs a Rust toolchain, and the first build takes a few minutes. Examples:

pip3 uninstall west-rs
# Pull request 830
pip3 install https://github.com/zephyrproject-rtos/west/archive/pull/830/head.zip
# Someone's random version
pip3 install https://github.com/someone_you_trust/west/archive/some_branch_or_tag.zip

Warning: never install software from people or locations you do not trust!

Metadata

Release files for west-rs 2.0.0a1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for west-rs 2.0.0a1
File Size Uploaded Provenance Actions
west_rs-2.0.0a1.tar.gz 334.7 kB With provenance Details for west_rs-2.0.0a1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for west-rs 2.0.0a1
File Actions
west_rs-2.0.0a1-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details for west_rs-2.0.0a1-cp310-abi3-win_arm64.whl
west_rs-2.0.0a1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details for west_rs-2.0.0a1-cp310-abi3-win_amd64.whl
west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details for west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_x86_64.whl
west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details for west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_aarch64.whl
west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64 Details for west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_x86_64.whl
west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.28+ ARM64 Details for west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_aarch64.whl
west_rs-2.0.0a1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details for west_rs-2.0.0a1-cp310-abi3-macosx_11_0_arm64.whl
west_rs-2.0.0a1-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details for west_rs-2.0.0a1-cp310-abi3-macosx_10_12_x86_64.whl

Total release size: 34.8 MB

Release files / west_rs-2.0.0a1.tar.gz

Download URL west_rs-2.0.0a1.tar.gz
Size 334.7 kB
Tags Source
SHA-256 checksum
How to use checksums
3a774524f509114ca7c58f978febef563d6d0fece67557792d73295543552e48
BLAKE2b-256 checksum
How to use checksums
d6f9cba8d294b83c2cabd4e4df6f26a05969990a3f509b48a898c3b5c143a315
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-win_arm64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-win_arm64.whl
Size 4.1 MB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
cffeb22ec3c0028f8d9ff074dbd6f441f56a547825b352c3e557507611b6a7fd
BLAKE2b-256 checksum
How to use checksums
593b89424719db3f34fd4c33081b0b561e58f0063e05b8e04cd25e3a2a72d113
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-win_amd64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-win_amd64.whl
Size 4.4 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
c5bc3fbf1b934dc51bfb82f43ec2ab383d3c8824f9a8cfe88e4eef92f1cd61f5
BLAKE2b-256 checksum
How to use checksums
818e9bb64c282f5da6888151a98e18ec187ca16c6d3424e613d0e459075f1657
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_x86_64.whl
Size 4.6 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
444ca89ae94f29062497122746c90b086483081e80be6c26d386c39ce2bc3f8d
BLAKE2b-256 checksum
How to use checksums
90fc551769f77d5c7d8e69755bc5c353b56d67ace5ccbe327f57ffd63f9df3b6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-musllinux_1_2_aarch64.whl
Size 4.3 MB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
2ef61654dd45f43cf55f9572dc9c3f99ae31a75557a316ec6edb8a51a5fe51fd
BLAKE2b-256 checksum
How to use checksums
d124e84625a821c7dc6d25e447bfda229815c13c4ecb92582b9b3f84ddbd1684
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_x86_64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_x86_64.whl
Size 4.4 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
6f2011c1b85c5c21bdf47274cdd0cc10324faa7ad40f336f562856ca4ef9b24c
BLAKE2b-256 checksum
How to use checksums
4245894542ea21ea198a6fc5a23ff29fdaf8e25152a0becc50cfc0d414940a7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_aarch64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-manylinux_2_28_aarch64.whl
Size 4.2 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
67621078779df7a63f3259b287325c08d050b169130eebb9375da0e38dae4f58
BLAKE2b-256 checksum
How to use checksums
7a50a298ecac032cf0d025e27adfa6bc8bd9c11a4246de0e84bab01ce059376b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-macosx_11_0_arm64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-macosx_11_0_arm64.whl
Size 4.1 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
579abf75bc05222fc2929d0853e4cd4dd36e36ff971dff2d653181a775579d53
BLAKE2b-256 checksum
How to use checksums
42747bce7b130195501a3f7682679036902c23da4ccb8c06e85bddaa55a97e4b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Release files / west_rs-2.0.0a1-cp310-abi3-macosx_10_12_x86_64.whl

Download URL west_rs-2.0.0a1-cp310-abi3-macosx_10_12_x86_64.whl
Size 4.3 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
a95b3417b512507cd9f266087f9068c0cbeaf384a043c2d54a09be1b25115b79
BLAKE2b-256 checksum
How to use checksums
fd6e0a0f070dec53b5a53c9057263707816bf31c2405eecf2829af1e3bf8fdc5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

Security for west-rs 2.0.0a1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 9 files in this release have been uploaded with provenance metadata.

Select from 9 files

Attestation for west_rs-2.0.0a1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 6, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page