This release is a pre-release and may not be stable for production use.
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)
| 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)
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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logSecurity 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.
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 logA 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.