Endo source this host runs; the NixOS config pins a commit from here.
  • JavaScript 88.5%
  • Rust 9.3%
  • RenderScript 0.9%
  • TypeScript 0.6%
  • CSS 0.3%
  • Other 0.2%
Find a file
Claude 3129d6448a
Some checks failed
ci.yml / fix(endo-fs-asset-server): type headers array to accept readonly baseline tuples (push) Failing after 0s
ironhorse-sanitizers.yml / fix(endo-fs-asset-server): type headers array to accept readonly baseline tuples (push) Failing after 0s
Browser Tests / browser-tests (push) Has been cancelled
CI (docs-only) / lint (push) Has been cancelled
CI (docs-only) / test (push) Has been cancelled
Copilot Setup Steps / copilot-setup-steps (push) Has been cancelled
Test project mutual dependency versions / build (push) Has been cancelled
Workflow security audit / zizmor (push) Has been cancelled
fix(endo-fs-asset-server): type headers array to accept readonly baseline tuples
The serving-core response headers were annotated Array<[string, string]>
(mutable tuples), but spread the hardened baselineSecurityHeaders, whose
entries are readonly [string, string]. tsc flagged this as TS4104 in the
docs/typecheck CI job (the package's local lint runs eslint only, so it did
not surface locally). Widening the element type to readonly [string, string]
satisfies both the spread and HttpResponse.headers, with no behavior change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ApZmRu8mL2eZBHLEUrGoL6
2026-09-08 22:08:59 +09:00
.changeset fix(floot,chat): make turn recovery and teardown authoritative 2026-09-07 21:14:41 +09:00
.claude/skills/endo feat(fae): add Endo daemon CLI skill for Claude Code 2026-03-23 14:41:39 -07:00
.github fix(ci): survive Codeberg outages in the Guile interop job 2026-09-08 18:18:58 +09:00
browser-test chore: lint fork-side files under the flat config 2026-07-24 11:01:14 -04:00
c feat(xs-oracle): XS-bytecode oracle over audited FFI, pinned to moddable 8.3.1 2026-08-06 07:36:03 +00:00
designs docs(designs): add gateway-sites-publication (the sites grant) 2026-09-08 22:08:59 +09:00
docs Merge upstream master into llm (2026-08-22) 2026-08-22 04:25:02 +00:00
evoke docs: update agent guide references 2026-07-06 16:06:51 -04:00
go/engo Endo bin should not be checked in 2026-03-25 17:43:50 -07:00
packages fix(endo-fs-asset-server): type headers array to accept readonly baseline tuples 2026-09-08 22:08:59 +09:00
pivoker Upgrade pivoker tooling 2026-04-27 09:48:52 -04:00
rust fix(ironhorse): preserve UTF-16 property key identity 2026-09-08 20:26:30 +09:00
scripts fix(ci): lower the eslint bucket size to keep module-source resolvable 2026-09-07 00:18:52 +09:00
.env.example add jained debugging stuff 2026-03-27 17:29:20 -07:00
.git-blame-ignore-revs style: ignore reformat in GitHub blame 2022-12-07 19:22:38 -08:00
.gitattributes chore: add .gitattributes file 2023-10-25 15:28:06 -07:00
.gitignore Merge branch 'llm' into feat/ironhorse-262-language-completion 2026-08-23 04:59:41 +00:00
.gitmodules build(xsnap): pin Moddable SDK as c/moddable submodule 2026-05-02 14:18:35 +00:00
.node-version ci: read Node version from .node-version 2026-05-20 09:57:19 -07:00
.prettierignore feat(thixotrope): add Ironhorse persistence MVP and CI scenarios 2026-09-08 15:30:01 +09:00
.prettierrc.json style(prettier): unify with arrowParens=avoid 2022-12-07 19:22:37 -08:00
.yarnrc chore: Disallow install scripts by default (#2956) 2025-10-01 20:04:10 +00:00
.yarnrc.yml Merge upstream master into llm (2026-08-22) 2026-08-22 04:25:02 +00:00
AGENTS.md chore: retire tsd 2026-07-31 23:33:13 -04:00
ava-base.config.mjs test: Adopt multi-config ava testing 2025-10-27 18:43:16 -07:00
ava-endo-lockdown-unsafe.config.mjs test: Adopt multi-config ava testing 2025-10-27 18:43:16 -07:00
ava-endo-lockdown.config.mjs test: Adopt multi-config ava testing 2025-10-27 18:43:16 -07:00
ava-endo-shims-only.config.mjs test: Adopt multi-config ava testing 2025-10-27 18:43:16 -07:00
ava-noop-harden.config.mjs test: Noop-harden mode testing 2026-02-24 20:19:07 -08:00
ava-ses-shims-only.config.mjs test: Adopt multi-config ava testing 2025-10-27 18:43:16 -07:00
Cargo.lock fix(ironhorse): preserve UTF-16 property key identity 2026-09-08 20:26:30 +09:00
Cargo.toml feat(thixotrope): add Ironhorse persistence MVP and CI scenarios 2026-09-08 15:30:01 +09:00
CLAUDE.md docs: point Claude files at AGENTS 2026-07-06 16:07:11 -04:00
CONTRIBUTING.md chore: retire tsd 2026-07-31 23:33:13 -04:00
eslint.config.js feat(thixotrope): add Ironhorse persistence MVP and CI scenarios 2026-09-08 15:30:01 +09:00
LICENSE Add top license file 2020-02-09 12:50:11 -08:00
package.json chore: bump the all-minor-patch group with 21 updates 2026-09-06 22:35:47 +00:00
README.md docs: Fix incomplete description of eventual send in README (#3028) 2025-12-19 11:13:18 -08:00
rust-toolchain.toml ci(ironhorse): pin toolchains and enforce shared dependency agreement 2026-09-08 06:50:10 +09:00
SECURITY.md docs: Add security doc to top level of repo 2023-07-31 13:38:57 -07:00
tsconfig-build-options.json refactor(fs): retire ambient type shim 2026-07-07 12:54:06 -04:00
tsconfig.build.json build(types): explicit rootDir for TS 6 2026-04-14 15:06:17 -07:00
tsconfig.composite.json feat(floot): integrate secure hosted agent backends 2026-09-07 00:18:52 +09:00
tsconfig.eslint-base.json chore: enable skipLibCheck everywhere (#3321) 2026-07-16 19:27:40 -07:00
tsconfig.eslint-full.json build: jsconfig.eslint* -> tsconfig… 2023-10-17 19:20:49 -07:00
tsconfig.eslint-src.json build: jsconfig.eslint* -> tsconfig… 2023-10-17 19:20:49 -07:00
tsconfig.json feat(thixotrope): add Ironhorse persistence MVP and CI scenarios 2026-09-08 15:30:01 +09:00
tsconfig.typedoc.json feat(thixotrope): add Ironhorse persistence MVP and CI scenarios 2026-09-08 15:30:01 +09:00
turbo.json ci: check workspace TypeScript programs 2026-08-04 17:40:24 -04:00
turbo.json.md docs(turbo): clarify cycle-fatality framing per panel review (#240) 2026-05-20 21:30:40 +00:00
typedoc.base.json docs: 'patterns' package docs 2023-12-04 17:34:44 -08:00
typedoc.json feat(thixotrope): add Ironhorse persistence MVP and CI scenarios 2026-09-08 15:30:01 +09:00
yarn.lock chore: Update yarn.lock 2026-09-08 22:08:59 +09:00

title group category
readme Documents Guides

Endo

contributing license CI status Mutable.ai Auto Wiki

Endo is a framework for powerful JavaScript plugin systems and supply chain attack resistance. Endo includes tools for confinement, communication, and concurrency. With Endo’s SES implementation of HardenedJS, we can opt-in to a more tamper-resistant mode of JavaScript. With Endo’s Eventual Send, we have a safe, transport-agnostic abstraction for pipelining messages to remote procedures, and concrete transports like Endo CapTP and, soon, OCapN.

Agoric and MetaMask rely on Hardened JavaScript and the SES shim as part of systems that sandbox third-party plugins or smart contracts and mitigate supply chain attacks for production web applications, web extensions, and build systems.

Agoric Logo MetaMask Logo

Endo protects program integrity both in-process and in distributed systems. Hardened JavaScript protects local integrity, defending an application against supply chain attacks: hacks that enter through upgrades to third-party dependencies. Endo does this by encouraging the Principle of Least Authority and providing foundations for the Object-capability Model.

The Principle of Least Authority states that a software component should only have access to data and resources that enable it to do its legitimate work. The Object-capability Model gives programmers a place to reason, by construction, about how permission flows through a program using well-understood mechanisms like Encapsulation.

For distributed systems, Endo stretches object oriented programming over networks using asynchronous message passing to remote objects with Capability Transport Protocols like OCapN and a portable abstraction for safely sending messages to remote objects called Eventual Send.

Security: Security-conscious JavaScript applications can use these components to improve the integrity and auditability of their own applications, improve the economics of vetting third-party dependencies, and mitigate runtime prototype pollution attacks.

Workers and Networks: Performance-conscious JavaScript applications can use these components to improve the ergonomics of message-passing between components in separate workers. Endo's Eventual Send and Capability Transport Protocols stretch asynchronous method invocation acrosses processes and networks.

Plugins: JavaScript platforms on the web and blockchains can rely on Endo to safely enable third-party plugins or smart contracts. Endo provides tooling for bundling and safely executing arbitrary programs in the presence of hardened platform objects.

Since most JavaScript libraries receive powerful capabilities from global objects like fetch or modules like net, LavaMoat generates reviewable policies that determine what capabilities will be distributed to third party dependencies according to evident need, and enforces those policies at runtime with Endo.

For distributed systems, Endo stretches object oriented programming over networks using asynchronous message passing to remote objects with the Handled Promise API and a Capability Transfer Protocol.

Between remote objects and Hardened JavaScript compartments, Endo makes distributed programs easy to program, and easy to reason about integrity. CapTP frees the programmer from needing to create bespoke communication protocols over message ports or byte streams.

Endo combines these components to demonstrate their use for a confined plugin system in the Endo Pet-name Dæmon and its CLI.

Please join the conversation on our Mailing List and Matrix. Reach out if you would like an ivitation to our meetings:

Core Concepts

HardenedJS introduces three components to the base JavaScript:

  • Lockdown
  • Harden
  • Compartment

The Shared Intrinsics are a subset of the JavaScript intrinsics like the Array and Object prototypes that, after locking down, are safe to share between programs running in compartments. After lockdown, programs can use harden to make other objects safe to share between compartments.

With these three components, we can begin to rely on certain guarantees:

  • Hardened objects can represent capabilities. That is, holding a reference to an object means you can use that object.
  • JavaScript itself guarantees that capabilities cannot be forged. That is, a useful reference cannot be obtained by guessing its address.
  • JavaScript also enforces certain structures like closures and WeakMap can guard capabilities.
  • The only way to obtain a capability is to have received it as an argument, return, global, or module of the surrounding compartmnet.
  • Once hardened, an object and its methods cannot be altered.

This gives us the foundation of the Object-capability security paradigm, or simply "OCaps". From this point forward, any interesting policy can be created with code.

We can then use Endo to stretch references to Object-capabliities between processes and over networks. Instead of relying on the memory-safety of JavaScript, we then rely on cryptography to preserve confidentiality and unforgeability of references. A suitably large, signed, cryptographically random number, reachable over a network over an encrypted connection, may safely designate a capability.

Then, Endo puts ocaps directly into the hands of users with an example Petname system called the Pet Dæmon, so user's can send, receive, and use Object-capabilities with human-meaningful names.

Ruminations on the Name

  • In Greek, "endo-" means "internal" or "within". This is fitting because Endo runs Node within a safe sandbox. This is fitting in turn because Endo is built on the legacy of Google Caja. In Spanish, "caja" means "box" and is related to the Latin word "capsum" and English "capsule", as in "encapsulate".
  • Endo is an anagram of Node and Deno. That is to say, we are not Done yet.
  • The endo command, like the sudo command, is a "do" command. However, instead of escalating privilege, it attenuates privilege.
  • Endo lets applications endow packages with limited powerful objects and modules. As they say, you can't spell "endow" without "endo"!
  • So, "E.N.Do" forms the acronym "Encapsulated Node Do".

So, just as "soo-doo" (super user do) and "soo-doh" (like "pseudo") are valid pronunciations of sudo, "en-doh" and "en-doo" are both valid pronunciations of endo.

Principle of Least Authority

The Principle of Least Authority (Wikipedia) states that a software component should only have access to data and resources that enable it to do its legitimate work.

PoLA explained in 3 minutes: Opening Statement on SOSP 50th Anniversary Panel, Mark Miller:

Video presentation explaining PoLA in 3 minutes

PoLA explained in 15 minutes: Navigating the Attack Surface to achieve a multiplicative reduction in risk, Mark Miller:

Video presentation explaining PoLA in 15 minutes

Bug Disclosure

Please help us practice coordinated security bug disclosure, by using the instructions in our security guide to report security-sensitive bugs privately.

For non-security bugs, please use the regular Issues page.

License

Endo and its components are Apache 2.0 licensed.