Jint is a modern ECMAScript interpreter for .NET. It runs JavaScript directly in your process without native dependencies, bytecode generation, or a separate runtime.
Jint targets .NET Framework 4.7.2, .NET Standard 2.0/2.1, .NET 8, and .NET 10. Start with the documentation or install the core package:
dotnet add package Jint
The examples below assume using Jint;.
var engine = new Engine();
var result = engine.Evaluate("40 + 2").AsNumber();
var engine = new Engine()
.SetValue("log", new Action<string>(Console.WriteLine))
.Execute("""
function greet(name) {
const message = `Hello, ${name}!`;
log(message);
return message;
}
""");
var greeting = engine.Invoke("greet", "Ada").AsString();
var script = Engine.PrepareScript(
"items.reduce((sum, value) => sum + value, 0)",
source: "sum.js",
strict: true);
var engine = new Engine();
engine.SetValue("items", new[] { 1, 2, 3 });
var total = engine.Evaluate(in script).AsNumber();
Prepared<Script> and Prepared<Module> are thread-safe and may be shared
across engines. JavaScript objects are not: a JsValue that contains an object
belongs to the engine and realm that created it.
Intl,
and TemporalBrowser and Node APIs are not installed by default. Hosts explicitly grant the capabilities each script needs.
Projects using Jint include RavenDB, EventStoreDB, Orchard Core, Elsa Workflows, Docfx, and JavaScript Engine Switcher.
Jint is the core package used throughout this README. Add another package
only when the application needs an optional debugging or browser surface.
| Package | Purpose |
|---|---|
Jint.DevTools | Chrome DevTools Protocol server for debugging and profiling an engine |
Jint.Browser | Headless HTML, DOM, navigation, networking, storage, and content extraction |
Jint.Browser.Tool | jint-browser command-line tool |
Jint.Browser.Mcp | Model Context Protocol server for browser automation |
See Additional packages for dependencies, target frameworks, and common combinations.
Jint 5 is under development on main and has not been released. This branch
includes breaking changes; development packages are available from the
preview feed.
The 4.x branch is the maintenance lane for Jint 4.16. Changes there preserve
compatibility and focus on non-breaking correctness and conformance fixes. The
3.x branch receives only security and severe-correctness maintenance.
Pull requests target main unless they are explicit backports. See
Branches and Releases
for the complete policy and
Migrating to Jint 5
when upgrading from Jint 4.
These percentages describe the pinned test corpora in this repository, not the entire web platform.
| Surface | Result | Measured scope |
|---|---|---|
| ECMAScript and ECMA-402 | 99.9% (102,585 / 102,692) | Generated test262 cases from annexB, built-ins, intl402, language, and staging; 107 cases are skipped |
| WinterTC Minimum Common API | 79.5% (62 / 78) | 59 members present and 3 correctly absent for Jint's global shape; the remaining 16 are WebAssembly, which Jint declines by design |
| Jint runtime Web APIs | 92.9% (38,649 / 41,581) | Assertions in the vendored .any.js WPT corpus across 44 suite directories |
| Jint.Browser | 84.0% (9,691 / 11,541) | Tests in the gated in-process browser WPT corpus |
The test262 result uses commit
419d3e0.
Read the detailed scope and exclusions for
ECMAScript,
Web APIs, and
Jint.Browser.
See performance and advanced hosting for engine lifetime, pooling, projection, and caching guidance.
The repository's current default-job BenchmarkDotNet comparison uses each engine's recommended cached execution path:
Native V8 remains faster on long, compute-heavy loops. Managed allocation figures also cannot include V8's native heap. Read the engine comparison and methodology before comparing engines; absolute numbers from different benchmark sessions are not comparable.
Jint is an in-process interpreter, not an operating-system security boundary. Start with the hardened profile, keep the host surface small, and add a process-level boundary for hostile input.
var limits = UntrustedCodeLimits.Default with
{
TimeoutInterval = TimeSpan.FromSeconds(1),
MaxStatements = 50_000,
MemoryLimit = 16_000_000
};
var options = new Options().ForUntrustedCode(limits);
using var engine = new Engine(options);
using (limits.BeginOperation(engine, cancellationToken))
{
var value = engine.Evaluate(source);
return engine.ConvertResult(value, limits.ResultLimits);
}
The profile disables broad CLR and reflection access, module loading, string
compilation, projected CLR writes, live CLR-array views, registered extension
methods, and blocking Atomics.wait. It also applies finite parsing, execution,
memory, recursion, regular-expression, promise, and result limits.
Constraints are cooperative and cannot preempt arbitrary host callbacks. Use an external deadline, restrict module and network loaders on every hop, and run hostile code in a least-privileged disposable process or container.
Read Running untrusted code and the threat model before deploying a script service.
Jint is licensed under the BSD 2-Clause License.
Overall
Maintained
Code review
NuGet
Latest release
Releases this year
(top 24 of 27)
164 followers · starred Jul 2023
235 followers · starred Oct 2022
74 followers · starred Mar 2021
2,959 followers · starred Feb 2020
Jint is a modern ECMAScript interpreter for .NET. It runs JavaScript directly in your process without native dependencies, bytecode generation, or a separate runtime.
Jint targets .NET Framework 4.7.2, .NET Standard 2.0/2.1, .NET 8, and .NET 10. Start with the documentation or install the core package:
dotnet add package Jint
The examples below assume using Jint;.
var engine = new Engine();
var result = engine.Evaluate("40 + 2").AsNumber();
var engine = new Engine()
.SetValue("log", new Action<string>(Console.WriteLine))
.Execute("""
function greet(name) {
const message = `Hello, ${name}!`;
log(message);
return message;
}
""");
var greeting = engine.Invoke("greet", "Ada").AsString();
var script = Engine.PrepareScript(
"items.reduce((sum, value) => sum + value, 0)",
source: "sum.js",
strict: true);
var engine = new Engine();
engine.SetValue("items", new[] { 1, 2, 3 });
var total = engine.Evaluate(in script).AsNumber();
Prepared<Script> and Prepared<Module> are thread-safe and may be shared
across engines. JavaScript objects are not: a JsValue that contains an object
belongs to the engine and realm that created it.
Intl,
and TemporalBrowser and Node APIs are not installed by default. Hosts explicitly grant the capabilities each script needs.
Projects using Jint include RavenDB, EventStoreDB, Orchard Core, Elsa Workflows, Docfx, and JavaScript Engine Switcher.
Jint is the core package used throughout this README. Add another package
only when the application needs an optional debugging or browser surface.
| Package | Purpose |
|---|---|
Jint.DevTools | Chrome DevTools Protocol server for debugging and profiling an engine |
Jint.Browser | Headless HTML, DOM, navigation, networking, storage, and content extraction |
Jint.Browser.Tool | jint-browser command-line tool |
Jint.Browser.Mcp | Model Context Protocol server for browser automation |
See Additional packages for dependencies, target frameworks, and common combinations.
Jint 5 is under development on main and has not been released. This branch
includes breaking changes; development packages are available from the
preview feed.
The 4.x branch is the maintenance lane for Jint 4.16. Changes there preserve
compatibility and focus on non-breaking correctness and conformance fixes. The
3.x branch receives only security and severe-correctness maintenance.
Pull requests target main unless they are explicit backports. See
Branches and Releases
for the complete policy and
Migrating to Jint 5
when upgrading from Jint 4.
These percentages describe the pinned test corpora in this repository, not the entire web platform.
| Surface | Result | Measured scope |
|---|---|---|
| ECMAScript and ECMA-402 | 99.9% (102,585 / 102,692) | Generated test262 cases from annexB, built-ins, intl402, language, and staging; 107 cases are skipped |
| WinterTC Minimum Common API | 79.5% (62 / 78) | 59 members present and 3 correctly absent for Jint's global shape; the remaining 16 are WebAssembly, which Jint declines by design |
| Jint runtime Web APIs | 92.9% (38,649 / 41,581) | Assertions in the vendored .any.js WPT corpus across 44 suite directories |
| Jint.Browser | 84.0% (9,691 / 11,541) | Tests in the gated in-process browser WPT corpus |
The test262 result uses commit
419d3e0.
Read the detailed scope and exclusions for
ECMAScript,
Web APIs, and
Jint.Browser.
See performance and advanced hosting for engine lifetime, pooling, projection, and caching guidance.
The repository's current default-job BenchmarkDotNet comparison uses each engine's recommended cached execution path:
Native V8 remains faster on long, compute-heavy loops. Managed allocation figures also cannot include V8's native heap. Read the engine comparison and methodology before comparing engines; absolute numbers from different benchmark sessions are not comparable.
Jint is an in-process interpreter, not an operating-system security boundary. Start with the hardened profile, keep the host surface small, and add a process-level boundary for hostile input.
var limits = UntrustedCodeLimits.Default with
{
TimeoutInterval = TimeSpan.FromSeconds(1),
MaxStatements = 50_000,
MemoryLimit = 16_000_000
};
var options = new Options().ForUntrustedCode(limits);
using var engine = new Engine(options);
using (limits.BeginOperation(engine, cancellationToken))
{
var value = engine.Evaluate(source);
return engine.ConvertResult(value, limits.ResultLimits);
}
The profile disables broad CLR and reflection access, module loading, string
compilation, projected CLR writes, live CLR-array views, registered extension
methods, and blocking Atomics.wait. It also applies finite parsing, execution,
memory, recursion, regular-expression, promise, and result limits.
Constraints are cooperative and cannot preempt arbitrary host callbacks. Use an external deadline, restrict module and network loaders on every hop, and run hostile code in a least-privileged disposable process or container.
Read Running untrusted code and the threat model before deploying a script service.
Jint is licensed under the BSD 2-Clause License.
Overall
Maintained
Code review
NuGet
Latest release
Releases this year
(top 24 of 27)
164 followers · starred Jul 2023
235 followers · starred Oct 2022
74 followers · starred Mar 2021
2,959 followers · starred Feb 2020