Kamelo 开源 Chrome 扩展:在本地遮蔽个人数据后再发给 ChatGPT、Gemini、Claude
OfficialKamelo/kamelo-open
Kamelo 是一个开源 Chrome 扩展,在数据离开设备前把个人信息替换为占位符,AI 返回后再在本地还原为真实内容。它基于规则识别 IBAN、卡号、身份证号、API key、姓名、邮箱等,占位符与真实值的对应关系保存在浏览器本地 vault,无服务器、无账号、无网络请求。
AI doesn't need to know everything.
A Chrome extension that masks personal data on your device before it reaches ChatGPT, Gemini, Claude or any other AI,
and puts the real details back in the answer, only on your screen.
How it works
- You type or paste a message into an AI chat, just like always.
- Kamelo masks personal data on your device before anything is sent.
Sarah Millerbecomes[PERSON_1], an IBAN becomes[IBAN_1]. - The AI answers with placeholders. Kamelo replaces them with the real values on your screen.
The link between placeholders and real values is kept in a local vault in your browser. There is no server, no account and no second AI: detection is rule-based (patterns, checksums and keyword lists), and restoring is a lookup in that vault.
You type: Remind Sarah Miller to pay from GB82 WEST 1234 5698 7654 32.
The AI sees: Remind [PERSON_1] to pay from [IBAN_1].
You see back: Hi Sarah Miller, please transfer the amount from GB82 WEST 1234 5698 7654 32.
What it detects
| Category | Examples |
|---|---|
| Bank details | IBANs from 87 countries (with checksum), US routing and account numbers, UK sort codes, BIC/SWIFT, Indian IFSC |
| Payment cards | Card numbers (Luhn check) and CVV codes |
| ID numbers | SSN, BSN, National Insurance, Belgian national number, DNI/NIE, codice fiscale, NIR, Aadhaar, PAN, CPF, Chinese ID, and passport, licence and other numbers after a keyword |
| Secrets | API keys (OpenAI, Anthropic, AWS, GitHub, Slack, Google, Stripe), private keys, JWTs, passwords after password: and similar |
| Personal details | Names, email addresses, phone numbers, dates of birth, addresses, postcodes, IP addresses, crypto wallets |
| Companies | Company names with a legal form, such as Acme Inc., Jansen BV, Müller GmbH or Smith Ltd |
| Your own terms | Client names, project names or anything else you add |
Formats with a fixed structure (IBANs, cards, checksummed IDs, emails, phone numbers, keys) are recognised in any language. Keywords and month names are recognised in 20+ languages.
Sensitive topics
Health, mental health, sexuality, faith, money problems and police or courts can't be replaced by a placeholder. When you share something about yourself or someone close ("my doctor", "ik heb schulden"), Kamelo shows a short notice suggesting a temporary chat, once per topic per page. General questions don't trigger it. Recognised in 82 languages (word lists; corrections from native speakers welcome).
It remembers, carefully
Once Kamelo has masked a name, it also recognises it later in other forms: in lowercase, or just the first or last name, in the next message or chat, always with the same placeholder. To avoid false positives, single names only count when they look like a name (capitalised, or after cues like "to sarah" or "dear mark"), and names that are also ordinary words (Will, May, Mark) only after a clear cue. So "Will you help me?" and "mark this as done" stay untouched.
Anything masked from memory is listed in the notice. Click a word there to keep it visible: it goes on your "Never protect" list (with the site and date it came from), and you can undo it straight from the notice.
Where it works
- AI chats: ChatGPT, Gemini, Claude, Copilot, Perplexity, Mistral, DeepSeek, Grok, Meta AI and more (full list).
- AI fields on other sites: "Help me write" in Gmail, Slack AI, Notion AI and AI chat widgets, recognised by their labels.
- AI APIs called from the browser: requests to
api.openai.com,api.anthropic.com, Azure OpenAI and others are masked before they leave. - Any other site: "Mask every text field" in the popup masks every text field on that site.
Regular messages to people, such as a normal email or chat message, are left untouched.
Privacy and security
-
No network requests. Kamelo never contacts a server, not even ours. There are no analytics, no tracking and no account. See Verify it yourself.
-
Encrypted vault (optional). Lock the vault with Touch ID (WebAuthn PRF) or a password (PBKDF2, 600,000 rounds); the vault is encrypted with AES-256-GCM. When unlocked it lives only in memory (
chrome.storage.session) and locks again when Chrome closes. -
Automatic cleanup. Vault entries that haven't been used for 30 days (adjustable) are deleted.
-
Size limit. The vault keeps at most 10,000 entries (Chrome gives extensions 10 MB of storage); the least recently used entries go first.
Why each permission
| Permission | Why |
|---|---|
| Access to all websites | AI fields appear on many sites (Gmail, Slack, Notion, support chats), so Kamelo has to recognise them anywhere. Normal messages to people are left alone. |
storage |
Your settings and the placeholder vault, stored only on your device. |
activeTab |
Lets the popup show whether Kamelo is active on the current site and mark a site as AI. |
See the privacy policy. To report a vulnerability, see SECURITY.md.
Verify it yourself
You don't have to take our word for any of this. Everything Kamelo does is in this repository, with no build step and no minified code.
- It makes no requests of its own. Search the extension code for network calls:
grep -rnE "fetch\(|XMLHttpRequest|sendBeacon|WebSocket\(" src popup unlockThe only hits are insrc/net-main.js, where Kamelo wraps the page's own requests to AI APIs so it can mask them. - The only pages it opens: kamelo.eu/welcome once after installing, kamelo.eu/goodbye when you remove it
(both in
src/background.js), and links you click in the popup. Opening a page sends nothing from your vault. - Watch what is sent. Open DevTools (Network tab) on chatgpt.com, send
My password is Hunter2!and look at the request payload: it says[SECRET_1]. - Run the tests.
npm run test:browserloads Kamelo in a real Chrome and checks that requests to AI APIs leave with placeholders, not the real values (tests/browser/extension.test.mjs). - The store package is this code.
tools/pack.mjszipsmanifest.json,_locales,src,popup,unlockandiconsas they are. Download the package from the store, unzip it and compare it with this code at the same version (seemanifest.json).
Screenshots
See kamelo.eu for screenshots and a short demo.
Installation
Chrome Web Store: coming soon. Microsoft Edge Add-ons: install Kamelo.
From source (developer mode):
- Clone this repository.
- Open
chrome://extensions(oredge://extensionsin Edge) and turn on Developer mode. - Click Load unpacked and select the repository folder.
Your browser will say the extension can "read and change data on all websites". That is needed to recognise AI fields on any site; all processing stays on your device.
Development
No build step: the extension is plain JavaScript (Manifest V3) with no runtime dependencies.
The browser tests use Puppeteer, installed with npm install.
npm install npm test # unit tests (Node 20+) npm run test:browser # Kamelo in a real Chrome, on simulated AI and shop pages npm run test:sites -- --show # Kamelo on the real AI sites (nothing is sent) python3 -m http.server 8765
With the server running, open:
http://localhost:8765/demo/: a simulated AI chat that shows exactly what would be sent to the AI.http://localhost:8765/demo/popup-preview.html: the popup with sample data.
| Path | Contents |
|---|---|
src/detector.js |
Detection, masking and restoring (shared by all parts) |
src/content.js |
Finds AI fields on the page, masks on paste and send, restores answers |
src/net-main.js |
Masks requests that pages send to AI APIs |
src/background.js, src/vault*.js |
Vault storage and encryption |
src/sites.js |
Known AI sites and where their input field is. When a site changes, this is usually the only file to edit |
src/ai-hosts.js |
AI API hosts whose requests are masked on any site |
src/config.js |
Settings and the labels that mark AI fields on other sites |
src/strings.js |
UI text in English and Dutch |
popup/, unlock/ |
Extension pages |
demo/ |
Local test pages and the popup preview used by the tests |
tests/ |
Unit tests; tests/browser/ runs Kamelo in Chrome; tests/live/ checks the real AI sites nightly |
tools/ |
release.mjs, pack.mjs (store and Firefox packages), build-locales.mjs, build-preview.mjs |
Known limitations
- AI called from a site's own server is invisible to a browser extension. Turn on "Mask every text field" for such a site.
- The network filter only sees text (JSON) requests. Uploaded files (PDFs, images) are not filtered.
- Names are recognised from first-name lists, patterns and memory; a new surname on its own can still be missed. Add important names under "Always protect".
- If an AI rewrites a placeholder (for example "Person 1" instead of
[PERSON_1]), it can't be restored.
Contributing
Bug reports, missed detections and pull requests are welcome. Read CONTRIBUTING.md to get started,
and look for issues labelled good first issue.
Questions and ideas go in Discussions.
Everyone taking part follows the Code of Conduct. See the changelog for what changed in each version.
License
Copyright © 2026 Lucas van der Wegen.
Kamelo is open source under the GNU Affero General Public License v3.0 (AGPL-3.0). You may use, study, change and share it. If you distribute Kamelo or a modified version, or offer it as a service, you must share your source under the same license. The code is public so anyone can check exactly what the extension does.
The name Kamelo and the chameleon logo are not covered by the code license. See TRADEMARKS.md.
来源:GitHub · github.com