You can create a custom Chrome extension and install it on the virtual browser.

To load your extension in Hyperbeam, create an unpacked zip or crx file. Then, make a request and upload the file using a multipart form. For a full example, check out our Chrome extension example.

function buildForm(extPath, vmConfig) {
  const formData = new FormData();
  formData.append("ex", fs.createReadStream(extPath));
  formData.append("body", JSON.stringify(vmConfig));
  return formData;

const zipPath = path.resolve(\_\_dirname, "./path/to/my/ext.zip");
const formData = buildForm(zipPath, {
extension: {
field: "ex"

const headers = formData.getHeaders();
headers["Authorization"] = `Bearer ${process.env.HB_API_KEY}`;
const resp = axios.post('https://engine.hyperbeam.com/v0/vm', formData, {headers});


For more information on creating zip Chrome extensions, refer to the Publish your extension guide on the Chrome Developers website.

To learn more about the crx format, see Installing extensions on Linux. We recommend creating building crx extensions with an unofficial CLI on NPM.

Manifest V2

Hyperbeam supports both Manifest V2 and V3. Manifest V2 is deprecated, and we anticipate Chromium will no longer support V2 in 2025. You can learn more about the MV2 phase-out plan on the Developer Chrome website.

If backwards compatibility is a requirement for your project, please contact us at founders@hyperbeam.com.


Do not put the manifest.json file in a subfolder

If your extension is not loading in Hyperbeam, please double-check that:

  • The manifest.json file is a well-formed JSON
  • The manifest.json file is in the root directory

The contents of the zip file should look like this:


The following file structure is invalid, do not do this:

├─ hello.html
├─ hello_extensions.png
├─ manifest.json
└─ popup.js