Warns you before sensitive details slip into AI conversations.
Overview • Install • How it works • Supported Platforms • Development • Privacy • License
A free, open-source privacy browser extension that warns you before you send sensitive personal information to an AI chat. When you submit, it scans your message right before it goes and shows a gentle, non-blocking warning if it spots something sensitive.
Everything runs locally in your browser. There is no backend, no network calls, and no data collection — your text never leaves the page you're typing on.
Detected PII types:
- Email address
- Phone number (US and international formats)
- Credit card numbers (Luhn checksum validated)
- Social Security Numbers (validated against area/group/serial rules)
- Home address (street number, name, and suffix)
- API keys (AWS, Google, GitHub, GitLab, Slack, Stripe, OpenAI, JWT, and
labeled secrets like
api_key: ...) - Passwords (when labeled in text, e.g.
password: hunter2)
Note
We currently have no plans to publish this extension in the Chrome Web Store. To audit the code yourself, see how it works.
- Download the latest release
- Open
chrome://extensionsin Chrome (or any Chromium browser) - Toggle Developer mode on (top-right)
- Click Load unpacked and select this folder
- Pin the Asterisk icon to your toolbar
- A content script runs on the supported AI platforms. When you press Enter or click Send, it scans the composer text right before the message goes.
- If sensitive data is found, a small dialog appears with three options: Send anyway, Edit first, or Learn more.
- Detection is regex + heuristics only — no external services are called.
- The toolbar popup lists the supported platforms with on/off toggles and shows whether the current tab is protected ("Active on" / "Inactive on").
- The settings page (from the popup's Settings button, or the extension's options) lets you turn detection on/off per PII type.
- Changes in the popup or settings take effect immediately, no page refresh needed.
- ChatGPT
- Claude
- Gemini
- Copilot
- Grok
- Mistral
- Perplexity
-
Add an entry to
self.Asterisk.sitesinsrc/config/sites.js:{ id: 'example', name: 'Example', hosts: ['example.com'], enterToSend: true, composer: ['textarea#prompt', 'div[contenteditable="true"]'], sendButton: ['button[aria-label*="Send"]', 'button[type="submit"]'] }
-
Add the host(s) to both
content_scripts.matchesandhost_permissionsinmanifest.json. -
Add the platform id to the
DEFAULTS.sitesobject insrc/lib/storage.js.
Field notes:
enterToSend:trueif pressing Enter sends the message. Setfalsefor composers where Enter inserts a newline. Currentlytruefor all supported platforms.composer/sendButtonare CSS selector arrays tried in order; the first match wins. These selectors are fragile — AI platforms rebuild their DOM on SPA navigation, so expect to update them when a platform changes. The content script uses aMutationObserverto re-find elements automatically.
- No ES modules in content scripts. Files are listed in order in
manifest.jsonundercontent_scripts.jsand share aself.Asterisknamespace. Load order matters:sites → storage → pii-detector → warning-ui → content. storage.jsandpii-detector.jsare reused in the popup/settings via<script src>, and in the service worker viaimportScripts. Keep them DOM-free and side-effect-free at load time so they work in every context.- The warning UI is injected via Shadow DOM with scoped inline styles, so it can't leak into or be styled by the host AI platform.
- Settings are stored in
chrome.storage.localonly (notsync), so nothing is uploaded to any sync service. - The content script always starts its listeners, even if the platform is disabled.
maybeIntercept()checks the enabled state at runtime, so toggling a platform in the popup takes effect instantly without a page refresh.
Warning
If you change Tailwind classes in the HTML or JS, you'll need to regenerate the CSS.
Popup and settings use Tailwind v4.3.1, vendored as a generated static CSS file
at src/lib/tailwind.css (loaded via a local <link> — no runtime CDN request,
which MV3 CSP would block anyway).
The CSS is compiled at dev time by the Tailwind CLI from src/lib/tailwind.source.css.
It's a JIT build, so only the classes actually used in the popup/settings HTML and
JS end up in the file (~12 KB).
When you need to regenerate — after adding or changing Tailwind classes in popup.html,
popup.js, settings.html, or settings.js:
npm install
npm run generate-cssJS-only edits that don't touch Tailwind classes never require regeneration. Never
edit tailwind.css by hand — edit the HTML/JS or tailwind.source.css,
then rerun the command.
The shared toggle switch lives in src/lib/switch.css and is linked by both the
popup and the settings page. Dark mode (browser/OS theme) is centralized in
src/lib/theme.css, which overrides the base color utilities under
@media (prefers-color-scheme: dark).
Asterisk makes zero outbound network requests. All detection happens in the content
script on the page you're already viewing. Settings stay in chrome.storage.local.
No telemetry, no analytics, no accounts.
This project is under the MIT License.
