<div align="center">
<h1>✉️💣 LetterBomb</h1>
[](https://gitlab.com/whoatemybutter/letterbomb)
[](https://crates.io/crates/letterbomb)
[](https://docs.rs/letterbomb)
[](https://gitlab.com/whoatemybutter/letterbomb/-/pipelines)
[](https://spdx.org/licenses/MIT.html)
</div>
A Rust-native fork of the classic Wii hacking tool originally written in Python.
by [fail0verflow](https://github.com/fail0verflow/letterbomb).
Offered in both library and binary flavors.
LetterBomb generates the payload files to trigger the [LetterBomb exploit](https://wiibrew.org/wiki/LetterBomb) for a
Wii console on version 4.3.
- [MSRV](#minimum-supported-rust-version)
- [Getting started](#getting-started)
- [Example](#example)
- [As a binary](#as-a-binary)
- [As a library](#as-a-library)
- [What happened to Python?](#what-happened-to-python)
- [License](#license)
---
## Minimum supported Rust version
MSRV is `1.85.0`, edition `2024`.
## Getting started
LetterBomb is on [crates.io](https://crates.io/crates/letterbomb).
```toml
[dependencies]
letterbomb = "5.0.0"
```
Or install the standalone binary:
```shell
cargo install letterbomb
```
---
## Example
### As a binary
LetterBomb outputs in color.
```shell
# Help
letterbomb -h
# Order of arguments is mac region output
# Region can be U E J K
letterbomb "00:17:ab:5a:6e:f5" K outputdir
# Use -b or --bundle to include HackMii installer
letterbomb "00:17:ab:5a:6e:f5" U outputdir -b
# Errors are printed transparently
letterbomb "00:17:ab:99:99:99"
# => error: invalid value '00:17:ab:99:99:99' for '<mac>': MAC address is for emulated Wii
letterbomb "00:17:ab:5a:6e:f5" A
# => error: invalid value 'A' for '<region>': region "A" not U, E, J, K
# Output isn't allowed to be a file
touch outputfile
letterbomb "00:17:ab:5a:6e:f5" E outputfile
# => error: output is file; will not clobber
# If outputdir does not exist, it will be created
# Intermediate parent directories for output are created if safe
letterbomb "00:17:ab:5a:6e:f5" U outputdir/sub/sub/sub/sub
```
---
### As a library
```rust
use std::collections::HashMap;
use letterbomb::{generate::make_payload_now, mac::WiiMAC, region::Region};
fn test() {
let mac: WiiMAC = "00:17:AB:5A:6E:F5".parse()?;
let region = Region::U;
let include_bundle = true;
// `payload` maps sub-paths (e.g. "boot.elf", "message.txt", …)
// to file contents as Vec<u8>.
let payload: HashMap<String, Vec<u8>> =
make_payload_now(mac, region, include_bundle)
.ok_or("failed to build payload")?;
}
```
---
## What happened to Python?
- Versions **1.x–4.x** of LetterBomb were implemented in **Python**.
- Starting with **v5.0**, the codebase was **rewritten in Rust** for performance, safety, and cross-platform support.
Functionality should be identical, if not improved.
- If you still need Python bindings,
you can wrap the library API yourself
or continue to use the old Python release at your own risk.
---
## License
Licensed under [MIT](https://spdx.org/licenses/MIT.html).