Browser Extensions

View as Markdown

Browser extensions can be loaded into runtimes to add capabilities — ad blockers, captcha solvers, or custom tools. Upload extension binaries or import from a URL, then reference them when launching runtimes.

Access via bctrl.browserExtensions.

list()

List all uploaded extensions.

1const extensions = await bctrl.browserExtensions.list();

Returns ExtensionMetadata[]


upload(request)

Upload an extension binary (.crx or .zip).

1import { readFileSync } from "fs";
2
3const ext = await bctrl.browserExtensions.upload({
4 file: readFileSync("./captcha-solver.crx"),
5 filename: "captcha-solver.crx",
6});
7console.log(ext.id);
ParameterTypeRequiredDescription
fileBuffer | Uint8Array | BlobYesExtension binary
filenamestringYesFilename with extension

Returns ExtensionMetadata


importFromUrl(request)

Import an extension from a URL.

1const ext = await bctrl.browserExtensions.importFromUrl({
2 url: "https://example.com/extension.crx",
3});
ParameterTypeRequiredDescription
urlstringYesURL to download the extension from

Returns ExtensionMetadata


get(id)

Get a specific extension by ID.

1const ext = await bctrl.browserExtensions.get("ext_abc123");
ParameterTypeRequiredDescription
idstringYesExtension ID

Returns ExtensionMetadata


delete(id)

Delete an extension.

1await bctrl.browserExtensions.delete("ext_abc123");
ParameterTypeRequiredDescription
idstringYesExtension ID

Usage with runtimes

Load extensions when launching an ephemeral runtime:

1const runtime = await workspace.runtimes.browser("main").playwright({
2 mode: "ephemeral",
3 extensionIds: ["ext_abc123"],
4});