Crabwalk
Python outside. Rust inside.
Crabwalk is a compiler/runtime for opting an explicit subset of Python functions
into real Rust semantics and native execution. There is no interpreted fallback:
accepted @rust.fn bodies become inspectable Rust, rustc checks the generated
program, and unsupported source fails with a source-oriented CRAB diagnostic.
from crabwalk import rust
rayon = rust.crate("rayon", version="1.12.0")
@rust.fn
def parallel_sum(n: rust.u64) -> rust.u64:
values: rust.Vec[rust.u64] = rust.Vec([])
for value in range(n):
values.push(value)
return values.par_iter().copied().sum()
print(parallel_sum(5_000_000))
Those annotations are concrete Rust types, Vec[rust.u64] becomes Vec<u64>,
and par_iter() is real Rayon parallelism resolved through Cargo.
Why Crabwalk
Python keeps ownership of the application, libraries, orchestration, and presentation. Selected typed regions gain native execution, Cargo crates, rustc checking, explicit ownership, GIL-aware concurrency, and source-mapped compiler diagnostics without requiring a handwritten PyO3 project for every kernel.
- Gradual native adoption: move one hot path at a time instead of starting a ground-up rewrite.
- Two ecosystems in one program: compose FastAPI, NumPy, and Matplotlib with
Rayon,
libm, and other expressible Cargo APIs. - Visible boundaries: conversions, moves, shared borrows, mutable borrows, panic translation, and GIL behavior are explicit.
- Low-overhead numeric input:
rust.Buffer[T]can lease existing read-only, contiguousmemoryview,array, and compatible NumPy storage for one native call without constructing a Rust-ownedVecor copying its elements. - Less integration machinery: Crabwalk generates Cargo and PyO3 projects, builds and caches extensions, and maps native errors back to Python source.
- An extraction path: inspect generated Rust today and promote a mature kernel into a purpose-built Rust crate when it outgrows the application boundary.
Crabwalk does not claim that arbitrary Python is Rust. It statically checks its supported compiled subset, asks rustc to check the generated Rust, and validates exported values at runtime boundaries.
Showcase
The reproducible showcase combines FastAPI, NumPy, Matplotlib, Rayon, libm,
owned Rust vectors, async scheduling, and GIL-detached native work:
python -m pip install fastapi uvicorn numpy matplotlib
python examples/showcase/showcase_api.py
Open http://127.0.0.1:8001/docs, or run the focused examples:
python examples/showcase/true_par.py
python examples/showcase/etl_rayon.py
python examples/showcase/fastapi_mre.py
python examples/showcase/ml_mre.py
Verified warm runs on the development machine showed a Rayon sum around 7.8x faster than an explicit Python loop, and the educational logistic-regression trainer around 3.4x–5.5x faster than its vectorized NumPy implementation and 8.7x–17.6x faster than equivalent scalar Python loops. These are local kernel measurements—not universal speed claims—and exclude compilation, HTTP transport, serialization, evaluation, and plotting.
See the full showcase guide for routes, expected outputs, ownership observations, measurement boundaries, and precise wording for public claims.
What works today
The current compiler surface includes:
- checked Rust primitives,
String, borrowedStr, read-only numericBuffer,Vec,Option, andResult; - locals, arithmetic, conditionals, loops, native calls, recursion, and semantic receiver/place capability checking;
- one native extension per regular Python package, including imports/re-exports;
- crates.io, path, and Git Cargo dependencies with persisted lock state;
Owned,Ref, andMuthandles with move/use-after-move and call-scoped borrow enforcement;- Rust structs, unit/tuple/record enums, exhaustive
match, and narrow derives; - general patterns and guards, inherent methods, trait objects, audited advanced/unsafe teaching intrinsics, a std-only future teaching executor, and a finite unit-job native thread pool;
- Python
printversus nativerust.println, panic containment, typedResulterrors, dispatch-aware typed effects, boundary-placement validation, and non-panicking worker teardown; - native Rayon iterators and an explicit
rust.async_callPython async boundary; - verified artifact caching, inspection commands, and wheels with embedded native extensions that need no Rust toolchain on the consumer machine.
Requirements
- CPython 3.11–3.14
- stable Rust with Cargo for source development/builds
- a native linker suitable for CPython extensions
Consumers installing a Crabwalk-built application wheel do not need Rust or Cargo. Install Crabwalk and run the readiness probe before developing from source:
python -m pip install crabwalk-lang
crabwalk doctor
The distribution is named crabwalk-lang; the import package and command remain
crabwalk.
For an editable checkout, replace the install command with
python -m pip install -e ..
Commands
crabwalk expand PATH
crabwalk check PATH [--locked] [--offline]
crabwalk build PATH [--locked] [--offline]
crabwalk inspect PATH [--json]
crabwalk show PATH SYMBOL
crabwalk wheel PACKAGE --name DIST --version VERSION
crabwalk cache status PATH [--json]
crabwalk cache prune [PROJECT] [--dry-run]
Generated Rust and disposable build/cache state live under .crabwalk/.
Resolved generated Cargo dependency locks live under crabwalk-locks/ and should
be committed. Every compilation unit has one because its graph includes mandatory
PyO3 even when source declares no additional crate.
See the compiler architecture for the pass pipeline, hygienic identity model, tagged type algebra, iterator contract, and the invariants required when extending the compiled language.
Normal builds may maintain a copied dependency lock and persist an intentional
Cargo update. Pass --locked when the lock must remain byte-for-byte unchanged.
When a .py file triggers an implicit first build, Crabwalk reports analysis,
dependency, cache, Cargo, and extension-loading phases on stderr. Interactive
terminals get an animated elapsed-time meter; redirected output gets plain log
lines. Set CRABWALK_PROGRESS=never to silence it (for example in CI), or
CRABWALK_PROGRESS=always to force progress output.
For bounded project discovery, a project may declare one or more regular packages:
[tool.crabwalk]
packages = ["src/my_package"]
python-boundaries = "allow" # allow, warn, or deny
source-locked = true # require Cargo --locked for decorator-driven source imports
extra-files = ["native/schema.proto"]
extra-env = ["MY_NATIVE_MODE"]
wheel-include = ["templates/**/*.html"]
When exactly one package is configured, the project directory itself can be passed
to build/inspection commands. --project PYPROJECT_OR_DIRECTORY selects an
explicit configuration for a source path. It does not rebase that positional source:
relative source paths resolve from the current working directory. For an out-of-tree
project copy, change into its root or pass an absolute source path beneath it.
Examples
python examples/fibonacci/app.py
python examples/core/app.py
python examples/ownership/app.py
python examples/buffer/app.py
python examples/crates_regex/app.py
python examples/parallel/app.py
# From the examples directory:
python -m the_rust_book.run_all
The Rust Book adaptation covers Chapters 1–21 and doubles as an end-to-end compiler evolution suite. That is chapter coverage, not a claim that every represented Rust subsystem is feature-complete. The generated capability maturity table separates proofs, bounded surfaces, and compositional support.
Documentation
- Project hub
- Getting started
- Language reference
- Ownership and domain types
- Tooling, packaging, and cache
- Security and limitations
- Compatibility and verification
- Release process
- Governance
- Security policy
- Changelog and migration notes
The original long-form vision remains in crabwalk.md. The implemented contract is intentionally narrower; the reference documents state what is accepted today.
License
Crabwalk is licensed under the Apache License 2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crabwalk_lang-1.0.5.tar.gz.
File metadata
- Download URL: crabwalk_lang-1.0.5.tar.gz
- Upload date:
- Size: 159.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51058efe96f9dac482711665af2d8369b277eab17c4b2efac10bc008461f289d
|
|
| MD5 |
cd9793b380bebe98ae829286e02949d6
|
|
| BLAKE2b-256 |
5aa6c4d1932bf8f761bf5960080929e152599e22581adabb86b1789a649229b7
|
Provenance
The following attestation bundles were made for crabwalk_lang-1.0.5.tar.gz:
Publisher:
release.yml on krflol/crabwalk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crabwalk_lang-1.0.5.tar.gz -
Subject digest:
51058efe96f9dac482711665af2d8369b277eab17c4b2efac10bc008461f289d - Sigstore transparency entry: 2588035278
- Sigstore integration time:
-
Permalink:
krflol/crabwalk@79c64ed52e03ea8e347fbe4cc670f748e0b837d2 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/krflol
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@79c64ed52e03ea8e347fbe4cc670f748e0b837d2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file crabwalk_lang-1.0.5-py3-none-any.whl.
File metadata
- Download URL: crabwalk_lang-1.0.5-py3-none-any.whl
- Upload date:
- Size: 172.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36621f0e61f031d0763104b45a2fde5aedb2f367d560d6747267788cc6015af2
|
|
| MD5 |
8c623329d4093da290f8e4c02b8fe0f4
|
|
| BLAKE2b-256 |
eb8cd7b4c6e19225a40fc3a8158a63fcaee8abc43ee94695133ede585bed7a69
|
Provenance
The following attestation bundles were made for crabwalk_lang-1.0.5-py3-none-any.whl:
Publisher:
release.yml on krflol/crabwalk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
crabwalk_lang-1.0.5-py3-none-any.whl -
Subject digest:
36621f0e61f031d0763104b45a2fde5aedb2f367d560d6747267788cc6015af2 - Sigstore transparency entry: 2588035826
- Sigstore integration time:
-
Permalink:
krflol/crabwalk@79c64ed52e03ea8e347fbe4cc670f748e0b837d2 -
Branch / Tag:
refs/tags/v1.0.5 - Owner: https://github.com/krflol
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@79c64ed52e03ea8e347fbe4cc670f748e0b837d2 -
Trigger Event:
push
-
Statement type: