Commit Graph
216 Commits
Author SHA1 Message Date
Outis 633a5e7a04 Merge pull request #10 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 16:08:45 -04:00
Claude 7c968e1461 feat: password import, proper noun detection, full README update
Import parser:
- Passwords now imported from Chrome/Firefox/Bitwarden/1Password CSVs
  as exact-match auto-redacted mappings (→ [REDACTED-PASSWORD-N])
- Catches passwords in any context, not just key=value patterns

Proper noun heuristic:
- Auto-detect scanner now catches capitalized words mid-sentence as
  potential names, company names, or project names
- Filters against 200+ common English words, programming terms, days,
  months to reduce false positives
- Added to both content.js (page world) and auto-detect.js (popup)

README:
- Documented proper noun detection with examples
- Documented bulk import with all supported formats
- Added Sync features section (auto sync, conflict resolution,
  version history, connected devices)
- Added Organization/Team section with policy format
- Added tamper protection documentation
- Added Legal section with liability analysis
- Updated architecture with all new modules

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:05:17 +00:00
Claude d969c7b375 feat: bulk import from CSV, password managers, browser autofill
New module: import-parser.js
- Auto-detects format from filename and content headers
- Chrome/Firefox password CSV: extracts usernames, emails, domains
  (NEVER imports passwords)
- Bitwarden/1Password CSV: extracts usernames, emails, domains
- Browser autofill CSV: extracts names, emails, phones, addresses
- Plain CSV: two-column real→substitute with optional category
- Plain text: one value per line, auto-categorizes (email, phone, name)
- Values without substitutes are marked "needs mapping" so the user
  can see what needs filling in

Options UI:
- Import button in Transfer Data section
- Preview panel shows parsed items before applying
- Summary shows counts and highlights items needing substitutes
- Apply merges into active profile (identity) and mappings table

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 19:55:05 +00:00
Outis 745986aedd Merge pull request #9 from outis1one/claude/read-repo-wA3y1
feat: auto-sync, version history, merge, org policy, tamper guard
2026-03-26 15:46:05 -04:00
Claude ea86bcfce7 feat: full options UI for all new features + managed browser docs
Options UI additions:
- Auto Sync panel: enable/disable, method (Gist/URL), interval selector
- Version History: snapshot list with timestamps/source, restore buttons,
  max snapshots setting, clear history
- Connected Devices: device table with name/browser/last-sync, rename
  this device, remove other devices
- Organization: join by invite code or policy URL, compliance status,
  required mappings count, leave button (tamper-guarded)
- Tamper Protection: enable with admin password, change password,
  disable (requires admin password), org policy can prevent disabling
- Admin auth dialog: reusable <dialog> for any protected action
- Conflict Resolution: shows local vs remote values side-by-side with
  Keep Local / Keep Remote buttons

Service worker:
- Added autosync:config-changed and org:config-changed message handlers

README:
- Added managed browser deployment instructions for Chrome and Firefox

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 19:45:44 +00:00
Claude 70c7b759c6 feat: auto-sync, version history, merge, org policy, tamper guard
New modules:
- version-history.js: IndexedDB snapshot storage with pruning/rollback
- merge.js: three-way field-level merge for sync conflict resolution
- org-policy.js: team/org policy enforcement, compliance checking,
  invite codes, required mappings that can't be disabled
- tamper-guard.js: admin password to protect disable/clear/export
  actions, org policy can prevent disabling

Auto background sync:
- Gist/URL sync via chrome.alarms (MV3-safe, survives SW restarts)
- Configurable interval (5/15/30 min), push on local changes
- performAutoSync() orchestrates pull-then-conditional-push

Multi-device dashboard:
- Device auto-registration with UUID + browser/platform detection
- Device list embedded in sync data for cross-device visibility
- getDeviceInfo(), setDeviceName(), getDevices(), removeDevice()

Manifest changes:
- Added "alarms" permission for background polling

Service worker:
- Alarm listeners for auto-sync and org policy polling (hourly)
- Tamper guard message handlers
- Alarms set up on install and startup

WIP: Options UI integration pending for all new features.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 19:39:28 +00:00
Outis e78275ccce Change manifest version to 1 and update version to 1.0.0
Updated manifest version and version number for the extension.
2026-03-26 15:15:03 -04:00
Outis 67a4836e28 Merge pull request #8 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 15:11:07 -04:00
Claude d98440350b feat: encrypt settings at rest (custom domains are PPI) + update README
Settings now encrypted at rest alongside identity, mappings, and log.
Custom domains reveal which private AI services the user accesses,
which is arguably PPI. Only the encryption salt and verification blob
remain plaintext (needed for key derivation bootstrap).

Updated README with comprehensive security documentation:
- At-rest encryption details (what's encrypted, what's not, why)
- Vault unlock flow explanation
- Authentication options table (password, TOTP, WebAuthn)
- Cross-device sync encryption flow
- Smart reveal behavior
- LOCK badge state in icon colors table
- Updated architecture section with crypto/sync modules

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 19:07:53 +00:00
Claude a22ba549a2 feat: at-rest encryption for all sensitive data + vault unlock flow
All sensitive data (identity, mappings, activity log) is now AES-256
encrypted in browser.storage.local when sync encryption is enabled.
TOTP secret is also encrypted at rest using the derived key.

Vault unlock flow:
- On browser restart, extension detects locked state (encrypted data,
  no cached CryptoKey) and shows LOCK badge in red
- Popup shows a full-screen unlock prompt with password field,
  optional TOTP, and biometric button
- After unlock, background decrypts and broadcasts data to all tabs
- Content scripts start with empty config when locked; receive
  decrypted config via vault:unlocked message after unlock
- Injector skips encrypted blobs in storage change events

Storage module changes:
- _readSecure / _writeSecure transparently encrypt/decrypt
- encryptExistingData() migrates plaintext → encrypted on setup
- decryptAllData() restores plaintext when encryption is disabled
- isLocked() checks for encrypted data + missing key

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 19:03:54 +00:00
Claude 39e609a14e feat: cross-device encryption bootstrap via sync payload
Encrypted sync data now embeds the encryption config so new devices
can self-bootstrap from just the sync data + the password:

Outer envelope (plaintext):
  - salt + verificationBlob — needed to derive key on new device

Inner payload (encrypted):
  - TOTP secret, authMethod, ttlDays, webauthn flag

Flow on new device:
1. Pull encrypted sync data from any channel
2. _decryptFromSync detects no local config, bootstraps from _encConfig
3. User enters password → key derived → payload decrypted
4. Full config (including TOTP secret) restored from inner _encMeta
5. Device is now fully configured — WebAuthn can be registered locally

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 18:44:42 +00:00
Claude 51a25a208b feat: TOTP as standalone re-auth method alongside WebAuthn/password
Re-verification (TTL expired, key still cached) now accepts any ONE of:
- WebAuthn (biometric/PIN)
- TOTP code alone (no password needed)
- Password alone (no TOTP needed)

First-device setup still requires password (+ TOTP if configured) since
the password is needed to derive the encryption key.

Added reverifyWithTOTP() and reverifyWithPassword() to sync.js.
Auth prompt UI adapts: first-device shows password+TOTP fields,
re-verify shows all three methods as alternatives.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 18:42:05 +00:00
Claude 7fd70e0891 fix: WebAuthn as primary re-auth, key persists indefinitely
- CryptoKey now persists in IndexedDB forever — never auto-deleted
- TTL controls when re-verification is needed, not key lifetime
- WebAuthn is the primary re-auth method (not a post-expiry fallback)
- Password only needed once per device (first-time setup)
- Added needsReverification() and markVerified() to crypto.js
- Auth prompt adapts message: first-device vs re-verify vs decrypt
- Biometric button hidden on first-device setup (no credential yet)

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 18:23:17 +00:00
Outis a93ecc4a21 Merge pull request #7 from outis1one/claude/read-repo-wA3y1
feat: encrypted sync with password/TOTP/WebAuthn + smart reveal
2026-03-26 14:18:51 -04:00
Claude 8198620b8a feat: encrypted sync with password/TOTP/WebAuthn + smart reveal
Sync encryption:
- AES-256-GCM encryption for all sync channels (browser sync, gist,
  custom URL, folder sync, sync codes)
- Password with optional TOTP (RFC 6238) second factor
- Configurable auth TTL: session, 30/90/180/365 days, or never
- CryptoKey cached in IndexedDB — auth only needed when cache expires
  AND new data exists (lastModified check runs before auth prompt)
- WebAuthn (biometric/PIN) as low-friction re-authentication gate
- Full options UI for setup, password change, and inline auth prompt

Smart reveal:
- Track which substitute values were actually sent outbound per session
- Reveal mode only replaces values that were genuinely substituted,
  preventing false positives (e.g. AI using the word "user" won't be
  replaced with a real username that maps to "user")

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 18:08:21 +00:00
Outis 8eee6aa922 Merge pull request #6 from outis1one/claude/check-repo-access-VmcDX
Claude/check repo access vmc dx
2026-03-26 10:50:38 -04:00
Claude cbe5b8584d feat: GitHub Gist and custom HTTP URL cloud sync
GitHub Gist sync:
- pushToGist(token): pushes all settings to a private Gist; creates a
  new Gist on first use and stores the Gist ID in local storage so
  subsequent pushes update the same Gist.
- pullFromGist(token): fetches the Gist, compares lastModified, applies
  if newer (raw_url used to avoid API truncation).
- No desktop client needed; works across any browser/OS with a GitHub PAT.
- Options page shows a token field + Push/Pull buttons; Gist ID shown
  once linked.

Custom URL sync:
- pushToUrl({ url, method, headers }): HTTP PUT to any endpoint.
- pullFromUrl({ url, headers }): HTTP GET, applies if newer.
- Works with Nextcloud/ownCloud WebDAV, self-hosted servers, cloud
  functions, or any static-file host that allows PUT.
- Options page shows URL + optional JSON headers field + Push/Pull.

Both methods write ss_sync_notification on apply, triggering the purple
'SYN' badge and desktop notification added in the previous commit.

https://claude.ai/code/session_01TKpSR9M8JgHLXCp5CeDsQP
2026-03-26 14:44:18 +00:00
Claude 1e475196d6 feat: sync notification badge + clarify cloud storage support
Notification system:
- When sync applies data (file folder, browser account, or sync code),
  ss_sync_notification is written to local storage with the source.
- Service worker catches it via storage.onChanged, shows a purple 'SYN'
  badge on the extension icon that persists until Options is opened, and
  fires a desktop notification ('Settings updated via sync folder — open
  Options to review').
- Clicking the desktop notification opens the Options page directly.
- On service worker wake, SYN badge is restored if the notification was
  not yet dismissed.
- Opening Options clears ss_sync_notification, resets the badge, and
  sends a sync:notification-seen message to the service worker.
- Added 'notifications' permission to both manifests.

Cloud storage clarity:
- Options page now explicitly lists that the folder sync works with any
  cloud storage that has a desktop sync client: Dropbox, OneDrive, Google
  Drive, iCloud Drive, Box, pCloud, Nextcloud, Synology Drive, etc.

https://claude.ai/code/session_01TKpSR9M8JgHLXCp5CeDsQP
2026-03-26 14:42:18 +00:00
Claude f05375c2ec fix: PPI + button replaces text immediately; add auto-sync folder
PPI + button fix:
- After adding a mapping, the real PPI value is now immediately replaced
  with the fake value in the input/contenteditable element via the new
  replaceInInput() helper (handles both <textarea>/<input> and
  contenteditable divs by walking text nodes).
- Triggers a re-scan 150ms later so the pre-send warning updates or
  dismisses itself if no more PPI remains.

Auto-sync folder (File System Access API):
- User picks a folder once per browser via "Choose Sync Folder".
  Any settings/mappings/identity change writes silent-send-sync.json
  to that folder automatically (via api.storage.onChanged listener).
- On options page open and every time the page regains focus, the file
  is read back; if its lastModified is newer than local data, settings
  are imported immediately and the UI refreshes.
- File handle is stored in IndexedDB (ss_sync_handles) so it persists
  across browser sessions without repeated permission prompts.
- Pick the SAME folder in each browser (or a synced cloud folder for
  cross-computer sync) — fully automatic after that, no copy-paste.
- sync.js gains saveSyncDirHandle / loadSyncDirHandle / clearSyncDirHandle
  helpers backed by IndexedDB.

https://claude.ai/code/session_01TKpSR9M8JgHLXCp5CeDsQP
2026-03-26 14:32:53 +00:00
Outis dfd5238cf9 Merge pull request #5 from outis1one/claude/check-repo-access-VmcDX
fix: date false-positive, partial-word highlights, cross-browser sync
2026-03-26 10:20:10 -04:00
Claude 84f6e675db fix: date false-positive, partial-word highlights, cross-browser sync
Bug fixes:
- Date (possible DOB) pattern now requires context words (born, birthday,
  dob, etc.) before firing — prevents spurious warnings on page-load API
  calls that happen to contain ISO dates in conversation history.
- Highlight regex now uses word boundaries (\b) so short substitute values
  (e.g. "aud") no longer match inside unrelated words like "Claude".
- Both TreeWalkers in content.js now skip the extension's own UI elements
  (.ss-autodetect-warning, .ss-presend-warning, .ss-reveal-badge) to
  prevent the highlight API from marking text in the extension's banners.

Settings sync:
- New src/lib/sync.js: exportSyncCode / importSyncCode (base64 JSON) for
  manual copy-paste across any browser combination. Newest lastModified
  timestamp wins; force flag available to override.
- browser.storage.sync support: when "Browser account sync" is enabled the
  extension automatically pushes/pulls via Firefox Sync or Chrome account,
  chunked to stay within per-item quota limits.
- storage.js now writes ss_lastModified on every save so conflict resolution
  has an accurate timestamp.
- service-worker.js listens for both local and sync storage changes to keep
  all copies in sync.
- New "Sync Between Browsers" section in options.html with Generate/Copy/
  Import Sync Code UI and the browser sync toggle.

https://claude.ai/code/session_01TKpSR9M8JgHLXCp5CeDsQP
2026-03-26 14:13:22 +00:00
Outis 2e79e02bd3 Merge pull request #4 from outis1one/claude/privacy-data-substitution-extension-OvTcA
Claude/privacy data substitution extension ov tc a
2026-03-26 00:52:51 -04:00
Claude 5495024be9 feat: auto-redact detected PPI on send + standard fake values
Detected PPI is now auto-redacted in the fetch hook using
RFC/standard reserved values — not just warned about:

- IPs → 192.0.2.1 (RFC 5737 TEST-NET-1, never routed)
- MACs → 00:00:00:00:00:00
- Addresses → 123 Example Street, Anytown, ST 00000
- GPS → 0.000000,0.000000 (Gulf of Guinea)
- Dates → 01/01/1970 (Unix epoch)
- EINs → 00-0000000 (impossible prefix)
- Paths → /home/user
- Git → example org

These are obviously fake and guaranteed not to be real data,
unlike random values which could be confused with actual PPI.

New Options toggle: "Auto-redact detected PPI on send" (on by
default). When on, PPI is caught in the fetch hook even if the
user hits Enter immediately after pasting. Warning banner now
says "Auto-redacted with standard placeholders" instead of
"These were sent as-is."

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:50:59 +00:00
Claude 3cb06c6dea feat: pre-send PPI detection — warns while typing, auto-add mappings
Like spellcheck for privacy. Scans text as you type and paste
into chat inputs (debounced 800ms). Shows a dark floating warning
panel listing detected PPI BEFORE you hit Enter.

Each detected item has a green [+] button that instantly:
1. Generates a plausible fake value (random IP, fake address, etc.)
2. Adds it as a mapping to storage
3. Shows a checkmark to confirm

The warning disappears when you clear the text or when all
detected items have been addressed.

Three new Options toggles:
- Auto-detect unconfigured PPI (on by default)
- Offer to auto-add detected PPI (on by default)

Also adds a storage bridge (postMessage) so the page-world
content script can read/write chrome.storage through the
injector.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:44:12 +00:00
Claude e6b3ef7e39 feat: auto-detect unconfigured PPI — warns before sending
Scans outbound messages AFTER all substitutions for personal data
the user forgot to configure:

- Private/public IP addresses (skips 127.0.0.1, 8.8.8.8, etc.)
- MAC addresses
- Street addresses ("123 Main St")
- GPS coordinates
- Dates (possible DOBs)
- EIN/tax IDs
- Home directory paths not caught by smart patterns
- Shell prompts (user@host)
- Git remotes (reveals username/org)
- Environment variable assignments (HOME=, USER=, etc.)

Shows a floating dark warning banner (top-right, auto-dismisses
after 15s) listing each detected item with its type, value, and
hint. Skips values already in the user's identity config.

Also shows PPI warnings in the popup Test tab and adds toggle
in Options to disable auto-detect.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:38:15 +00:00
Claude 260b713c94 feat: BSL license + encrypted export/import for cross-browser transfer
License: Changed from MIT to BSL 1.1. Free for personal use,
commercial use requires a paid license. Auto-converts to MIT
on March 26, 2030.

Export/Import: Options page now has "Transfer Data" section:
- Export All (plain) — JSON file with all identities, mappings, settings
- Export Encrypted — AES-256-GCM with PBKDF2 password derivation,
  saved as .ssbackup file
- Import — handles both plain and encrypted backups, prompts for
  password if encrypted

Crypto uses Web Crypto API (browser-native, no dependencies):
100k PBKDF2 iterations, random salt + IV per export.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:30:48 +00:00
Claude b89333076f fix: sign script retries with incremented patch on version conflict
No timestamp metadata in versions. Uses simple incrementing patch
numbers (0.3.3, 0.3.4, etc.). If Mozilla rejects the version as
already existing, auto-increments and retries up to 10 times.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:26:25 +00:00
Claude 3a9343cab8 fix: sign script uses date-based version to avoid conflicts
Old approach: increment patch by 1 each time. Failed when the
same patch number was already signed with Mozilla from a
previous session.

New approach: version is 1.MMDD.HHMM (e.g., 1.326.1542).
Guaranteed unique per minute, all parts under 65535.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:25:24 +00:00
Claude 8c83dcae50 feat: CSS Custom Highlight API — yellow for fake, terminal for real
Two visual modes using the Highlight API (zero DOM modification):

- Yellow highlight: fake/substituted values the AI received.
  Shows automatically in all AI responses, even without reveal mode.
  "The AI sees these yellow values, not your real data."

- Terminal style (black bg, green text): your real data shown
  in reveal mode. "This is YOUR data — the AI never saw this."

Uses CSS.highlights with ::highlight() pseudo-elements — no
spans, no DOM changes, no copy/paste artifacts. Falls back to
CSS class-based styling if Highlight API is unavailable.

Highlights are debounced (500ms) to handle streaming responses
without excessive reflows.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:23:36 +00:00
Claude 7271027c02 feat: underline revealed text in AI responses
Revealed values are now wrapped in <span class="ss-revealed">
with a blue underline and subtle blue background, making it
obvious which parts are your real data vs what the AI said.

Hover shows tooltip "Substituted value: [fake]" so you can see
what the AI actually received. Un-reveal properly removes the
spans and normalizes text nodes.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:16:44 +00:00
Claude 684413f5fe fix: username/hostname not substituting — injector wasn't merging profiles
After the multi-profile migration, ss_identity changed from a flat
object { names, emails, ... } to { profiles: [...] }. The injector
was passing the raw profiles wrapper to the content script, which
expected the flat format.

Now the injector merges active profiles into a flat identity object
before injecting into the page world, and also merges on storage
change events. Also handles legacy format (pre-profile data) for
backward compatibility.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 04:08:02 +00:00
Outis 6d76917a65 Merge pull request #3 from outis1one/claude/privacy-data-substitution-extension-OvTcA
docs: add honest disclaimer with correctness estimate
2026-03-25 23:55:39 -04:00
Claude 0d9446d14e docs: add honest disclaimer with correctness estimate
~85-90% correctness for configured data. Lists specific things
that leak: images, file uploads, base64, short names, names
inside other words, unconfigured data, non-standard secrets.

"Think of it like a spell checker for privacy — it catches most
things, but you wouldn't send a legal document without proofreading."

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:54:28 +00:00
Outis 5d1983f927 Merge pull request #2 from outis1one/claude/privacy-data-substitution-extension-OvTcA
docs: add note about refreshing tabs after extension reload
2026-03-25 23:48:23 -04:00
Claude affea5c5e2 docs: add note about refreshing tabs after extension reload
The old content script keeps running until the page is refreshed.
This is the most common cause of "it stopped working" after
updating the extension code.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:48:01 +00:00
Outis 246127def9 Merge pull request #1 from outis1one/claude/privacy-data-substitution-extension-OvTcA
Claude/privacy data substitution extension ov tc a
2026-03-25 23:37:32 -04:00
Claude f9ddecc03b feat: sign script auto-bumps version before signing
No more manual version bumps or "version already exists" errors.
sign-firefox.sh now:
1. Reads current version from manifest.firefox.json
2. Increments the patch number (0.3.1 → 0.3.2)
3. Updates all three files (manifest.json, manifest.firefox.json, package.json)
4. Auto-commits the bump
5. Builds and signs

Just run `npm run sign:firefox` after any code change.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:33:53 +00:00
Claude ea61db7f6e chore: bump version to 0.3.1 for Firefox re-signing
https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:32:58 +00:00
Claude c1e5042d3c docs: add MIT license, explain reveal mode in README
Add LICENSE file (MIT). Explain in README that reveal mode is a
local display change only — the AI never received the real data.
Reveal exists so users can copy paths/commands from AI responses
and paste them directly into their terminal without manually
translating fake values back to real ones.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:27:35 +00:00
Claude 9c0a2f3aa8 feat: enter-to-save, dirty indicator, pre-populated name rows
- Pressing Enter in any identity field saves immediately
- Save button shows "Save Identity *" (orange) when there are
  unsaved changes, flashes "Saved!" (green) on save
- New profiles start with empty First and Last name rows
  pre-populated so users know what to fill in
- Input changes in the identity tab are tracked to show
  saved/unsaved state

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:22:55 +00:00
Claude c72971edaf fix: add Reset Everything button + improve reveal mode reliability
Storage issue: Chromium/Brave keeps storage.local data even when
an unpacked extension is removed and reloaded. Added "Reset
Everything" button in Options → Danger Zone that clears all data
(double-confirm to prevent accidents).

Reveal mode: Now re-runs revealAllResponses() every 2 seconds
while active to catch streamed content and dynamically loaded
responses. Adds console logging for reveal toggle state changes
to aid debugging. Cleans up interval when reveal mode is turned off.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:18:59 +00:00
Claude 1995208941 feat: v0.3.0 — multiple entries per field, README setup guide
Identity fields now support multiple entries per type:
- Add unlimited names (first, last, middle, nickname), emails,
  usernames, hostnames, and phone numbers per profile
- "+ Add" button on each section, "x" to remove rows
- Names have a type selector (1st/Last/Mid/Nick)

README now includes:
- First-time setup walkthrough (step by step)
- Icon color legend (gray/black/blue/red)
- Keyboard shortcuts table
- Note that extension does nothing until configured

Also bumps version to 0.3.0 for Firefox re-signing.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 03:08:46 +00:00
Claude c4356c3c6a feat: multiple identity profiles
Identity tab now supports multiple named profiles:
- Dropdown selector to switch between profiles
- "+" button to add a new profile (prompts for name)
- Pencil button to rename
- X button to delete (can't delete the last one)
- Toggle to enable/disable each profile independently

Default profile is "Personal". All active profiles are merged
and substituted simultaneously — so "Personal" (your name) and
"Work" (your work email, company domain) both get caught.

Storage model: profiles are stored as an array under ss_identity.
getIdentity() merges all active profiles into a single identity
object for the substitution engine.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:56:00 +00:00
Claude 6303ecb86b feat: add 'domain' category to mappings dropdown
Users can now label mappings as 'domain' (e.g. mycompany.com →
example.com). This is a category label for organization — the
substitution works the same as any other mapping.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:50:59 +00:00
Claude eed885ed47 feat: disable until configured + auto permission request for custom domains
Interception is now completely inactive until the user configures
at least one identity field or explicit mapping. Before that:
- Icon shows gray (unconfigured)
- No fetch/XHR hooks fire
- First-run banner tells user to set up

Custom domains: clicking "Add Domain" in Options now triggers
the browser's native permission prompt via permissions.request().
No more manual chrome://extensions site access step.

Icon states are now:
- Gray = unconfigured (nothing will happen)
- Black = active and protecting
- Blue = reveal mode on
- Red = manually disabled

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:49:03 +00:00
Claude a844c94f13 fix: activity log now records from injector + dynamic icon colors
Activity log fix:
- Injector now writes directly to storage.local in addition to
  sending runtime messages to the background worker. This fixes
  the issue where MV3 service worker sleep caused messages to be
  silently dropped.

Dynamic icon colors:
- Black "SS" = active, normal
- Blue "SS" = reveal mode on
- Red "SS" = Silent Send disabled
- Icons generated via OffscreenCanvas in the service worker
- Updates on every settings change and keyboard shortcut toggle

Also adds keyboard shortcuts section to Options page showing
current bindings and how to customize them per browser.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:37:04 +00:00
Claude e7880b3b1a feat: keyboard shortcuts for reveal mode and enable toggle
Alt+Shift+R — toggle reveal mode (fake→real in responses)
Alt+Shift+S — toggle Silent Send on/off

Badge flashes "EYE" (blue) when reveal activates, "ON"/"OFF"
(green/red) when toggling enabled state. Users can remap these
in chrome://extensions/shortcuts or Firefox about:addons.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:33:38 +00:00
Claude 85c6647395 feat: first-run setup banner when identity is unconfigured
Shows a red warning banner at the top of the popup when no identity,
email, username, or explicit mappings are configured. The status dot
turns orange (instead of green) to indicate the extension is active
but not protecting anything yet. Banner disappears as soon as the
user saves their identity.

Prevents users from thinking they're protected when nothing has
been configured.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:30:09 +00:00
Claude ac0ec2cd86 docs: fix signing time estimate — 1-5 minutes, not 10-30 seconds
Mozilla validation + approval takes longer than initially stated,
especially on first submission.

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:22:08 +00:00
Claude 40e14f5083 fix: sign script — robust .env parsing + disable config discovery
Previous sign script failed because web-ext's config file discovery
was conflicting with CLI args. Now:
- Parses .env line by line with explicit key matching
- Prints truncated key/secret so you can verify they loaded
- Uses --no-config-discovery to prevent web-ext-config.cjs from
  overriding the CLI args

https://claude.ai/code/session_01Dvgwe7XMoSxnWXkih8p1Cw
2026-03-26 02:10:34 +00:00