VeilBrowserDocs

Extensions

Keep Chrome extensions in one organization library and load them into the profiles that need them, on every computer and worker.

The extension library holds the Chrome extensions your organization uses: a password manager, a wallet, an ad blocker, your own internal tool. Add each one once, choose which profiles load it, and every launch of those profiles opens with it, whether it runs on a desktop agent or a cluster worker.

Add an extension

Open Extensions in the dashboard and choose Add extension. Owners and admins can change the library; every member can see it.

Paste the extension's Chrome Web Store link, or its 32-letter id:

https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh

The cloud downloads the current version from the store. Update from Web Store in the row's menu fetches the latest version again later.

Choose the profiles

Each extension applies to profiles in one of three ways:

SettingEffect
Every profile switch onEvery profile in the organization loads it
Choose profiles and folders, Folders tabEvery profile in the folders you pick loads it, including profiles moved in later
Choose profiles and folders, Profiles tabThe profiles you pick load it, wherever they are filed

Changes take effect the next time a profile launches. A browser that is open keeps the extensions it started with.

Extensions you or a script install into a profile by hand, from inside the browser, keep working. Library extensions are loaded beside them.

Extension data travels with the profile

An extension's own data (its settings, a wallet's vault, a password manager's session) is stored inside the profile, so it is saved and restored with the rest of the profile's browser data.

For that to work an extension needs the same id on every computer. Store extensions keep their store id. An uploaded extension without a key in its manifest gets a key from VeilBrowser when it is added, and keeps it when you upload a new version. Uploading a file that carries a different key is refused, because to Chrome it is a different extension.

How launches load them

When a profile launches, its launch configuration lists the extensions it loads with short-lived download links. The desktop agent or worker downloads each version once, checks its integrity, unpacks it under its install directory in extensions/, and starts the browser with --load-extension. Later launches reuse the unpacked copy until the version changes.

If an extension cannot be downloaded, the launch fails with EXTERNAL_SERVICE_ERROR and names the extension, rather than opening the profile without it.

Self-hosted clouds

The library stores extensions in the same S3-compatible bucket as profile browser data (STATE_S3_*). Without it, adding an extension answers 503 and launches load none.

API

The library is managed with a dashboard session:

MethodPathPurpose
GET/v1/extensionsList the library
POST/v1/extensions/webstoreAdd from the Chrome Web Store: { "webStoreId": "<id or link>", "allProfiles": false }
POST/v1/extensions/uploadUpload a CRX or ZIP as multipart file (and optional allProfiles)
POST/v1/extensions/{id}/refreshFetch a store extension's latest version
POST/v1/extensions/{id}/uploadReplace with a new version of the same extension
PATCH/v1/extensions/{id}{ "allProfiles": true } to load it into every profile
GET / PUT/v1/extensions/{id}/profilesRead or replace the assigned profiles: { "profileIds": [...] }
GET / PUT/v1/extensions/{id}/foldersRead or replace the assigned folders: { "folderIds": [...] }
DELETE/v1/extensions/{id}Remove it from the library
Was this page helpful?

On this page