From 21d3fd866354aa390859901ab775613418d989ba Mon Sep 17 00:00:00 2001
From: Local Dev
Date: Mon, 5 Oct 2026 23:40:48 +0200
Subject: [PATCH] theseus.x: the extensions page describes the sandbox
community extensions run in
The trust note said a community extension runs with the same access as any
add-on. It now runs in its own process with read access to its own folder
only; the note says what that does and does not cover, and the build steps
list what an author has to change (promises, bundled dependencies, no
request filters). To be deployed with the Theseus release that ships the
sandbox, not before.
---
extensions/index.html | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/extensions/index.html b/extensions/index.html
index 6c57240..04d72d6 100644
--- a/extensions/index.html
+++ b/extensions/index.html
@@ -283,9 +283,12 @@
cannot substitute code under a trusted name.
- Trust, stated plainly. A community extension runs with the same access as any add-on —
- treat one like an unsigned executable from that publisher. The signature proves who published it,
- not that it is safe.
+ Trust, stated plainly. The signature proves who published an extension, not that it
+ is safe. A community extension runs in its own sandboxed process: it can read only its own folder, cannot start
+ other programs, and cannot see your vault, your wallet or the browser's memory. It reaches Theseus only through
+ the capabilities its manifest declares, and it can use the network. Its panel and anything it injects
+ into pages still do what those capabilities allow, so read the capability list before installing. Older Theseus
+ builds ran extensions inside the browser itself — keep Theseus up to date.
@@ -306,6 +309,14 @@
The bundled Notepad
is the smallest complete example; addons-host.js
is the full API. id is [a-z0-9._-], 2–64 chars, and belongs to the first name that publishes it.
+ Mind the sandbox. Your main script runs in its own process, not inside the browser:
+
+ - It can read its own folder and write to
api.dataDir, nothing else on disk. No child processes, workers or native modules.
+ - Calls into Theseus return promises,
api.tabs.active() included. api.storage.get stays synchronous.
+ api.require and api.import are not available: bundle the modules you need in the package.
+ - Request filters and site routes are for built-in add-ons. The vault is reachable only as
api.vault.derive under your own id and api.vault.requestUnlock, where Theseus draws the prompt.
+ api.features.sandboxed is true when this applies.
+
Test it locally. Settings › Extensions › Open extensions folder, drop the folder in, Reload.
Package it. tar -czf my-ext-1.0.0.tar.gz -C my-ext . (max 8 MB; addon.json at the root or in a single top folder).
Publish it. Open Publish an extension →