boa-dev/boa
{ "createdAt": "2018-08-08T22:20:05Z", "defaultBranch": "main", "description": "Boa is an embeddable Javascript engine written in Rust.", "fullName": "boa-dev/boa", "homepage": "", "language": "Rust", "name": "boa", "pushedAt": "2025-11-25T17:28:31Z", "stargazersCount": 6652, "topics": [ "ecmascript", "hacktoberfest", "interpreter", "javascript", "javascript-engine", "javascript-interpreter", "parser", "runtime", "rust", "rust-crate", "wasm", "webassembly" ], "updatedAt": "2025-11-26T01:05:07Z", "url": "https://github.com/boa-dev/boa"}Boa is an experimental JavaScript lexer, parser and interpreter written in Rust 🦀, it has support for more than 90% of the latest ECMAScript specification. We continuously improve the conformance to keep up with the ever-evolving standard.
[![Build Status][build_badge]][build_link]
[build_badge] !: https://github.com/boa-dev/boa/actions/workflows/rust.yml/badge.svg?event=push&branch=main [build_link] !: https://github.com/boa-dev/boa/actions/workflows/rust.yml?query=event%3Apush+branch%3Amain
⚡️ Live Demo (WASM)
Section titled “⚡️ Live Demo (WASM)”Try out the engine now at the live WASM playground here!
Prefer a CLI? Feel free to try out boa_cli!
📦 Crates
Section titled “📦 Crates”Boa currently publishes and actively maintains the following crates:
boa_ast- Boa’s ECMAScript Abstract Syntax Treeboa_cli- Boa’s CLI && REPL implementationboa_engine- Boa’s implementation of ECMAScript builtin objects and executionboa_gc- Boa’s garbage collectorboa_interner- Boa’s string internerboa_parser- Boa’s lexer and parserboa_icu_provider- Boa’s ICU4X data providerboa_runtime- Boa’s WebAPI featuresboa_string- Boa’s ECMAScript string implementation.tag_ptr- Utility library that enables a pointer to be associated with a tag of typeusize.
[!NOTE]
The
Boaandboa_unicodecrates are deprecated.
🚀 Example
Section titled “🚀 Example”To start using Boa simply add the boa_engine crate to your Cargo.toml:
[dependencies]boa_engine = "0.21.0"Then in main.rs, copy the below:
use boa_engine::{Context, Source, JsResult};
fn main() -> JsResult<()> { let js_code = r#" let two = 1 + 1; let definitely_not_four = two + "2";
definitely_not_four "#;
// Instantiate the execution context let mut context = Context::default();
// Parse the source code let result = context.eval(Source::from_bytes(js_code))?;
println!("{}", result.display());
Ok(())}Now, all that’s left to do is cargo run.
Congrats! You’ve executed your first JavaScript code using Boa!
🔎 Documentation
Section titled “🔎 Documentation”For more information on Boa’s API, feel free to check out our documentation.
🏅 Conformance
Section titled “🏅 Conformance”To know more details about Boa’s conformance surrounding the ECMAScript specification, you can check out our ECMAScript Test262 test suite results here.
🪚 Contributing
Section titled “🪚 Contributing”Please, check the [CONTRIBUTING.md]!(CONTRIBUTING.md) file to know how to contribute in the project. You will need Rust installed and an editor. We have some configurations ready for VSCode.
🐛 Debugging
Section titled “🐛 Debugging”Check [debugging.md]!(./docs/debugging.md) for more info on debugging.
🕸 Web Assembly
Section titled “🕸 Web Assembly”[!IMPORTANT]
This only applies to
wasm32-unknown-unknowntarget,WASIandEmscriptentarget variants are handled automatically.
- Enable the
jsfeature flag. - Set
RUSTFLAGS='--cfg getrandom_backend="wasm_js"'
The rustflags can also be set by adding a .cargo/config.toml file in the project root directory:
[target.wasm32-unknown-unknown]rustflags = '--cfg getrandom_backend="wasm_js"'For more information see: [getrandom WebAssembly Support][getrandom-webassembly-support]
[getrandom-webassembly-support] !: https://docs.rs/getrandom/latest/getrandom/index.html#webassembly-support
⚙️ Usage
Section titled “⚙️ Usage”- Clone this repo.
- Run with
cargo run -- test.jsin the project root directory wheretest.jsis a path to an existing JS file with any valid JS code. - If any JS doesn’t work then it’s a bug. Please raise an issue!
Example
Section titled “Example”![Example]!(docs/img/latestDemo.gif)
Command-line Options
Section titled “Command-line Options”Usage: boa [OPTIONS] [FILE]...
Arguments: [FILE]... The JavaScript file(s) to be evaluated
Options: --strict Run in strict mode -a, --dump-ast [<FORMAT>] Dump the AST to stdout with the given format [possible values: debug, json, json-pretty] -t, --trace Dump the AST to stdout with the given format --vi Use vi mode in the REPL -O, --optimize --optimizer-statistics --flowgraph [<FORMAT>] Generate instruction flowgraph. Default is Graphviz [possible values: graphviz, mermaid] --flowgraph-direction <FORMAT> Specifies the direction of the flowgraph. Default is top-top-bottom [possible values: top-to-bottom, bottom-to-top, left-to-right, right-to-left] --debug-object Inject debugging object `$boa` -m, --module Treats the input files as modules -r, --root <ROOT> Root path from where the module resolver will try to load the modules [default: .] -h, --help Print help (see more with '--help') -V, --version Print version🧭 Roadmap
Section titled “🧭 Roadmap”See Milestones.
📊 Benchmarks
Section titled “📊 Benchmarks”The current benchmarks are taken from v8’s benchmark that you can find [here][boa-benchmarks]. You can also view the results of nightly benchmark runs comparing Boa with other JavaScript engines here.
If you wish to run the benchmarks locally, then run Boa in release using the combined.js script which contains all the sub-benchmarks in the bench-v8 directory.
cargo run --release -p boa_cli -- bench-v8/combined.js[!TIP]
If you’d like to run only a subset of the benchmarks, you can modify the
Makefilelocated in the [bench-v8directory][boa-benchmarks]. Comment out the benchmarks you don’t want to include, then runmake. After that, you can run Boa using the same command as above.
[boa-benchmarks] !: https://github.com/boa-dev/data/tree/benchmarks/bench
🧠 Profiling
Section titled “🧠 Profiling”See [Profiling]!(./docs/profiling.md).
📆 Changelog
Section titled “📆 Changelog”See [CHANGELOG.md]!(./CHANGELOG.md).
💬 Communication
Section titled “💬 Communication”Feel free to contact us on Matrix if you have any questions. Contributor discussions take place on the same Matrix Space if you’re interested in contributing. We also have a Discord for any questions or issues.
⚖️ License
Section titled “⚖️ License”This project is licensed under the [Unlicense]!(./LICENSE-UNLICENSE) or [MIT]!(./LICENSE-MIT) licenses, at your option.