Install browser extensions
In this tutorial you will attach extensions to a profile at creation, add more later, and understand how persistence and compatibility work. Extensions can enhance automation (ad blocking, helper tooling) but must not conflict with fingerprint masking.
Prerequisites
- Completion of the Quickstart guide
- Kameleo app running locally (default
http://localhost:5050) - Local file paths to valid extension packages (
.crxfor Chromium,.xpifor Firefox)
Avoid masking overlap
Do not install extensions that alter user agent, canvas, WebGL, timezone, or language. They may create inconsistencies versus Kameleo's coordinated fingerprint.
1. Add extensions at profile creation
from kameleo.local_api_client.models import CreateProfileRequest, UpdateProfileRequest
fp = client.fingerprint.search_fingerprints(browser_product='chrome')[0]
profile = client.profile.create_profile(
CreateProfileRequest(
fingerprint_id=fp.id,
name='with-extensions',
extensions=['/Users/me/exts/uBlock.crx', '/Users/me/exts/helper.xpi'],
)
)
print('Created profile with extensions', profile.id)
const fp = (await client.fingerprint.searchFingerprints(undefined, undefined, "chrome"))[0];
const profile = await client.profile.createProfile({
fingerprintId: fp.id,
name: "with-extensions",
extensions: ["/Users/me/exts/uBlock.crx", "/Users/me/exts/helper.xpi"],
});
console.log("Created profile", profile.id);
using Kameleo.LocalApiClient;
using Kameleo.LocalApiClient.Model;
using System.Linq;
var fp = (await client.Fingerprint.SearchFingerprintsAsync(browserProduct: "chrome"))[0];
var create = new CreateProfileRequest(
fingerprintId: fp.Id,
name: "with-extensions",
extensions: ["/Users/me/exts/uBlock.crx", "/Users/me/exts/helper.xpi"]
);
var profile = await client.Profile.CreateProfileAsync(create);
Console.WriteLine($"Created profile {profile.Id}");
2. Add extensions after creation
current = profile.extensions or []
update = UpdateProfileRequest(extensions=current + ['/Users/me/exts/newTool.crx'])
updated = client.profile.update_profile(profile.id, update_profile_request=update)
print('Extensions now:', updated.extensions)
const updated = await client.profile.updateProfile(profile.id, {
extensions: [...profile.extensions, "/Users/me/exts/newTool.crx"],
});
console.log("Extensions now", updated.extensions);
var newList = profile.Extensions?.ToList() ?? [];
newList.Add("/Users/me/exts/newTool.crx");
var update = new UpdateProfileRequest(extensions: newList);
var updated = await client.Profile.UpdateProfileAsync(profile.Id, update);
Console.WriteLine($"Extensions now: {string.Join(",", updated.Extensions)}");
3. Persistence & export
- Extensions and their storage persist while the profile exists
- Exported profile archives (.kameleo) include installed extensions
- Importing the archive restores them automatically