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/ddkjiahejlhfcafbddmgiahcphecmpfhThe 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:
| Setting | Effect |
|---|---|
| Every profile switch on | Every profile in the organization loads it |
| Choose profiles and folders, Folders tab | Every profile in the folders you pick loads it, including profiles moved in later |
| Choose profiles and folders, Profiles tab | The 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:
| Method | Path | Purpose |
|---|---|---|
GET | /v1/extensions | List the library |
POST | /v1/extensions/webstore | Add from the Chrome Web Store: { "webStoreId": "<id or link>", "allProfiles": false } |
POST | /v1/extensions/upload | Upload a CRX or ZIP as multipart file (and optional allProfiles) |
POST | /v1/extensions/{id}/refresh | Fetch a store extension's latest version |
POST | /v1/extensions/{id}/upload | Replace 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}/profiles | Read or replace the assigned profiles: { "profileIds": [...] } |
GET / PUT | /v1/extensions/{id}/folders | Read or replace the assigned folders: { "folderIds": [...] } |
DELETE | /v1/extensions/{id} | Remove it from the library |