End to end by choice.
JavaScript, Rust, and C# each own their native lifecycle and browser path.
Three languages · six runtime paths
Use one native JavaScript module unchanged in Node.js and real browsers. vanilla-test works with bundlers and without a bundler. Native ESM uses a standard import map and no transpilation.
Use one dependency-free Rust implementation natively and compile the same unit-test inventory into browser WebAssembly.
Use one dependency-free C# lifecycle library in .NET and execute the same parameterless MSTest inventory in a browser-hosted .NET AppBundle.
# JavaScript · Node + browser
npm install vanilla-test
No build step. Node and browsers execute the ES module directly.
# Rust · native + browser WASM
cargo add vanilla-test
Zero dependencies. Safe Rust owns the lifecycle and Cargo owns the build.
# C# · verified GitHub packages
gh release download 2.1.3 --repo RIAEvangelist/vanilla-test --pattern '*.nupkg' --dir ./packages
dotnet add package vanilla-test --version 2.1.0 --source ./packages
dotnet tool install --global vanilla-test.tool --version 2.1.0 --add-source ./packages
No runtime dependencies. The core targets .NET 8; the browser tool publishes a complete .NET AppBundle. Both packages currently come from the verified GitHub release bundle.
Why Vanilla Test
Vanilla is a control-surface choice. JavaScript stays an ordinary ES module in Node and Chrome. Rust stays ordinary safe Rust natively and compiles its tests with Cargo. C# stays an ordinary .NET library and reuses its parameterless MSTest methods through a browser-hosted .NET runtime. No language implementation wraps another.
JavaScript, Rust, and C# each own their native lifecycle and browser path.
Each language's browser path executes the same source used by its native path.
No JavaScript build pipeline, Rust WASM framework, or C# test-source copy is required.
Loading verified status… latest successful main build main
One untransformed verification module in both runtimes.
CLI, configuration, timeout, server, and path-safety behavior.
Statements, branches, functions, and lines in Node and Chrome.
The same lifecycle and Behavioral inventory runs natively and as browser WASM.
The native adapter and browser host execute the same parameterless inventory, including Behavioral coverage.
.nupkg packing, clean local-source consumption, tool install, and generated AppBundle are verified separately.
Native .NET coverage remains separate from real-Chrome browser compatibility.
Browser builds, target selection, artifact discovery, and documented usage.
Instrumented regions, lines, and functions plus a detailed report.
Badge information
Badges are compact links to package metadata or build evidence. Use the testing and coverage pages when you need the scope, commit, timestamp, and raw reports behind them.
Links to the workflow that runs JavaScript, Rust, and C# natively and in real Chrome, verifies packages, and deploys Pages evidence.
Version and download badges come from npm. The license badge reflects the repository's MIT license.
Version and download badges point to the dependency-free Rust crate.
The dependency-free C# library and companion tool are separate .nupkg assets. Neither package ID is currently published on NuGet.org.
The quality endpoint is generated from the successful main build. The Testing page shows each gate separately.
Node and Chrome badges stay separate because each runtime collects and enforces its own native V8 coverage.
Regions, executable lines, and functions come from Rust's bundled LLVM tools; browser WASM remains a separate pass/fail lane.
Native line and branch coverage comes from the .NET test run; the browser AppBundle remains a separate pass/fail lane.
JavaScript engineer paths
These detailed pages belong to the JavaScript lane. Use the persistent language selector for Rust or C# documentation.
Create the shared entry, add the Node adapter, and configure the complete document-relative browser import map.
Read the getting-started guide →Start from runnable browser, Node, async, failure, and type-check examples.
Browse the examples →Understand active-test guards, immutable result snapshots, completion events, and strict decisions.
Open the API reference →Edit a real ES module, inspect its mirrored console output, and reset the isolated runtime between runs.
Launch the playground →Rust engineer paths
Every Rust topic has its own page and stays separate from the JavaScript contract.
Install, write one Rust suite, run Cargo, build WASM, and deploy.
Read the Rust guide →Passing suites, failed results, typed errors, and a custom browser page.
Browse Rust examples →Public types, methods, result fields, lifecycle errors, and invariants.
Open the Rust API →Built-in LLVM source coverage plus the separate real-Chrome WASM gate.
Open Rust coverage →C# engineer paths
Every C# topic distinguishes the dependency-free core library from the companion browser-build tool.
Install, write one MSTest inventory, run it natively, publish an AppBundle, and deploy.
Read the C# guide →Passing suites, lifecycle exceptions, MSTest reuse, and a compatible browser page.
Browse C# examples →Public classes, methods, immutable result fields, typed errors, and invariants.
Open the C# API →Line and branch coverage plus the separate real-Chrome AppBundle gate.
Open C# coverage →Install
Each package preserves the same small lifecycle while staying idiomatic to its runtime.
npm install vanilla-testcargo add vanilla-testdotnet add package vanilla-test --version 2.1.0 --source ./packagesA successful install exits with status 0.