Commit Graph
246 Commits
Author SHA1 Message Date
Claude 4b478c71bd chore: set version to 0.9.0 for pre-release testing
https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-28 15:17:20 +00:00
Claude 33d1542d12 refactor: rename all secret scanner internals to auto-redact
Full internal rename since still in testing — no backwards compat needed:
- secret-scanner.js → auto-redact.js
- SecretScanner → AutoRedact
- SECRET_PATTERNS → REDACT_PATTERNS
- secretScanning → autoRedact (setting key)
- customSecretPatterns → customRedactPatterns (setting key)
- scanAndRedactSecrets → runAutoRedact (function)
- All DOM ids, CSS classes, and variable names updated
- category: 'secret' → category: 'redact'
- getOrgSecretPatterns → getOrgRedactPatterns

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-28 14:59:59 +00:00
Claude 7ec058f1ea feat: custom secret patterns + rename Secret Scanner → Auto Redact
Users can now define custom regex patterns for proprietary token formats,
internal URLs with keys, or any secret the built-in scanner doesn't cover.
Patterns are added/toggled/removed from the Options page and apply to both
the live interception (content.js) and the Test tab (popup.js).

Renamed all user-facing "Secret scanning" labels to "Auto Redact" across
popup and options. Internal variable names (secretScanning, SecretScanner)
kept for backwards compatibility with stored settings.

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-28 14:32:57 +00:00
Claude eb2e946673 feat: bump-version.sh v2 — preview, confirm, undo, profiles, help
Complete rewrite with safety features:
- Version profiles: groups files by version, only updates the current
  version (ignores unrelated X.Y.Z strings in the project)
- Preview: shows exact line-by-line diff before applying changes
- Confirmation: asks y/N before modifying files (--yes to skip)
- Undo: saves rollback info, ./bump-version.sh undo to revert
- --help: full usage documentation with examples
- Only matches version DECLARATIONS (requires keyword context like
  "version":, version=, VERSION=, v prefix) — won't match random
  numbers like dates, IPs, or port numbers

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-28 12:43:32 +00:00
Claude 863e637642 feat: make bump-version.sh truly project-agnostic
Now supports all common version patterns:
- JSON ("version": "X.Y.Z") — Node, extensions, composer
- TOML (version = "X.Y.Z") — Rust, Python pyproject.toml
- YAML (version: X.Y.Z) — Helm, GitHub Actions
- Python (__version__ = "X.Y.Z") — packages
- PHP (Version: X.Y.Z) — WordPress plugins/themes
- Shell (VERSION="X.Y.Z") — scripts
- HTML (vX.Y.Z) — display footers
- XML — .csproj, plist

Skips node_modules, dist, build, .git, __pycache__, venv, vendor.
Skips itself to avoid matching usage examples.
Skips files over 500KB to avoid scanning binaries.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-28 12:30:13 +00:00
Claude e8746babe4 feat: add version bump script (bump-version.sh)
Agnostic version bump tool that finds all version strings in the
project and updates them together.

Usage:
  ./bump-version.sh          # interactive menu
  ./bump-version.sh patch    # 0.9.0 → 0.9.1
  ./bump-version.sh minor    # 0.9.0 → 0.10.0
  ./bump-version.sh major    # 0.9.0 → 1.0.0
  ./bump-version.sh 1.2.3    # set to specific version

Finds versions in JSON files ("version": "X.Y.Z") and HTML/JS
files (vX.Y.Z). Excludes node_modules and dist directories.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-28 12:23:31 +00:00
Claude 9da922f662 chore: set version to 0.9.0 (beta)
Not a fully tested release. Marking as beta until all services
are verified and edge cases are resolved.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-28 12:00:10 +00:00
Outis 7576043542 Merge pull request #34 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-27 19:28:44 -04:00
Claude fa36a1f977 feat: add Copilot + Edge support, update README
Added copilot.microsoft.com to host_permissions, content_scripts
matches, and BUILTIN_URL_PATTERNS in both Chrome and Firefox manifests
plus the service worker.

Updated README:
- Added Copilot to supported services table
- Added Edge and Brave to browser list
- Added note about desktop apps (can't intercept, use web version)
- Removed old duplicate browser note

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 23:15:03 +00:00
Claude b0fce541f3 chore: rename 'Secret Scanner' to 'Auto-redact' in all UI
'Secret Scanner' described what it looks for. 'Auto-redact' describes
what it does — clearer for users. Renamed in popup, options page,
org section, and README. Internal code (secret-scanner.js) unchanged
to avoid breaking references.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 22:49:43 +00:00
Outis ba58c26d6c Merge pull request #33 from outis1one/claude/read-repo-wA3y1
fix: Options tab broken — removed footer link crashed init
2026-03-27 18:26:01 -04:00
Claude a9c5f9b43f fix: Options tab broken — removed footer link crashed init
Removing the footer <a id="btnOptions"> made $('#btnOptions') return
null, causing addEventListener to throw. This killed the rest of
initUnlockedUI(), preventing the Options tab and all subsequent
handlers from being wired up.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 22:25:15 +00:00
Outis 9bd4c45de1 Merge pull request #32 from outis1one/claude/read-repo-YMu21
feat: frictionless custom domain management
2026-03-27 17:38:15 -04:00
Claude c8673d5b1c feat: frictionless custom domain management
- Edit domains inline (pencil icon, saves on Enter)
- Suggested domains: clickable chips for popular AI/dev/collab sites
- Bulk add: paste multiple domains at once (one per line or comma-separated)
- Popup domain management: add/remove/suggestions directly from the popup
- Permission revoke on removal + suggested list updates dynamically

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-27 21:32:31 +00:00
Outis 893ecce6d4 Merge pull request #31 from outis1one/claude/read-repo-YMu21
feat: add AI services and developer/support sites to built-in domains
2026-03-27 17:26:31 -04:00
Claude e6e9894d99 feat: add AI services and developer/support sites to built-in domains
New AI sites: Perplexity, Copilot, DeepSeek, HuggingChat, Poe
Developer/support: GitHub, GitLab, Reddit (www + old), Stack Overflow, Pastebin

The existing interception is service-agnostic — it scans all JSON strings
in POST/PUT/PATCH requests through the 4-stage substitution pipeline.
No site-specific handling needed; all sites use the same method.

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-27 21:12:13 +00:00
Outis adf5a8ea33 Merge pull request #30 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-27 17:07:25 -04:00
Claude 9a1189659b fix: reveal/highlight scoped to chat area only + remove footer link — v2.0.14
Reveal mode and highlights were replacing text in sidebars, navigation,
headers, repo names, and other non-chat UI elements. Now skips:
- <nav>, <aside>, <header>, <footer> elements
- Elements with role="navigation", role="banner", role="complementary"
- Elements with class names containing sidebar, nav, menu, header

Added isInNonChatArea() check to all five code paths:
- revealInElement, unrevealInElement, highlightMatches
- MutationObserver addedNodes and characterData handlers

Also:
- Removed footer Options link (redundant with 5th Options tab)
- Updated README: ChatGPT marked as Tested

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 21:05:32 +00:00
Claude eec0d52681 fix: PPI warning accept/ignore buttons — v2.0.14
Accept (+) button:
- Was reading raw storage (getStorageData) which returns encrypted
  blobs when encryption is enabled, silently failing to add mappings
- Fixed: adds directly to the local mappings array and persists via
  setStorageData (storage bridge handles encryption transparently)

Auto-detect false positives:
- Was only checking identity values, not explicit mappings — values
  already in the mappings table still got flagged as unconfigured PPI
- Fixed: now adds all mapping real/substitute values to the skip set

Ignore button:
- Changed from plain text link to grey pill button for better UX
- Still persists permanently via ss_ignored_ppi in storage

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 20:53:53 +00:00
Outis eb11d03db9 Merge pull request #29 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-27 13:10:53 -04:00
Claude 5c863b084d fix: encrypted data breaks Firefox — injector can't decrypt — v2.0.13
When at-rest encryption is enabled, storage.local contains encrypted
blobs. The injector reads raw storage (content script world, no
access to IndexedDB CryptoKey) and sees { _ssLocalEncrypted: true }.
It passed empty config to content.js → no mappings → no substitution.

This is why Firefox stopped working after encryption was enabled.
Chrome/Brave worked because the user hadn't set up encryption there.

Fixed: injector now detects encrypted data and asks the background
script for decrypted config via 'get:decrypted-config' message.
The background uses the Storage module (which has IndexedDB access)
to decrypt and return the data. Falls back to empty config if the
vault is actually locked.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 16:58:40 +00:00
Claude c42a4aa55e revert: remove early fetch hook, restore simple injection — v2.0.12
The early hook approach (inline script, then external early-hook.js)
kept breaking Firefox due to CSP restrictions and timing issues with
the async external script load. Each fix for ChatGPT introduced a
new regression for Firefox/Brave.

Reverted to the original simple approach:
- Injector reads storage, injects content.js via <script src="...">
- content.js captures window.fetch at load time and patches it
- No inline scripts, no early hooks, no __ssOriginalFetch globals

This is what worked on Claude.ai across all browsers before the
ChatGPT fix attempts. ChatGPT support may need a different approach
later (possibly using declarativeNetRequest for header-only changes,
or a ChatGPT-specific content script), but it should not break the
core functionality on Claude.ai.

Kept the Request object handling in the fetch interceptor (needed for
some frameworks) but removed all early hook dependencies.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 16:42:09 +00:00
Outis 6cb91824c7 Merge pull request #28 from outis1one/claude/read-repo-wA3y1
fix: Firefox broken — CSP blocks inline early hook script — v2.0.11
2026-03-27 11:06:10 -04:00
Claude 557b1ffd0c fix: Firefox broken — CSP blocks inline early hook script — v2.0.11
The inline <script> with textContent was blocked by claude.ai's
Content Security Policy on Firefox (Chrome is more permissive).
No fetch interception = no substitution = completely broken on FF.

Fixed by moving the early fetch hook to its own file (early-hook.js)
loaded via <script src="..."> which is CSP-compliant. Added to
web_accessible_resources in both Chrome and Firefox manifests.

Also fixed duplicate 'const api' declaration in injector.js that
would have crashed the content script.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 15:04:13 +00:00
Outis b95dcc6a40 Merge pull request #27 from outis1one/claude/read-repo-wA3y1
fix: reveal mode broken + missing await + select rendering — v2.0.10
2026-03-27 08:45:43 -04:00
Claude 85fbc6c4d0 fix: reveal mode broken + missing await + select rendering — v2.0.10
Bug 1 - Reveal mode not working (all browsers):
sessionSubstitutions stored "ademo demo" (full name) as key, but
buildRevealPairs looked up "ademo" and "demo" individually. No match,
no reveal pairs, reveal did nothing. Fixed by also storing individual
words from multi-word replacements so both "ademo demo" AND "ademo"
AND "demo" are in the map.

Bug 2 - Missing await on _handleDecryptedMeta (sync.js):
Two call sites returned the Promise instead of the resolved value.
Downstream code checking decResult.data got undefined. Added await.

Bug 3 - Profile selector broken by safeHTML (popup.js):
DOMParser.parseFromString wraps content in <html><body> which
mangles <option> elements when moved to a <select>. Replaced with
new Option() DOM API which creates proper option elements.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 12:41:47 +00:00
Outis 80571934d0 Merge pull request #26 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-27 08:23:18 -04:00
Claude 97e37e65ac fix: cross-browser sync import corrupting local encryption + v2.0.9
Root cause: when importing an encrypted sync code from another device,
_decryptFromSync was replacing the local encryption config (salt) with
the source device's salt. This caused:
1. Local key cache derived from wrong salt
2. Local data (encrypted with local salt) became unreadable
3. _applyData tried to write with the wrong key

Fixed with a complete refactor of cross-device decryption:
- authenticateForSync() derives a TEMPORARY key using the source salt
- Temporary key stored separately as 'tempSyncKey' in IndexedDB
- Local encryption config and cached key are NEVER modified
- After decryption, _applyData writes via _writeSecure using the
  LOCAL key (which uses the local salt)
- _handleDecryptedMeta extracted for code reuse

Also:
- Options.js auth handler detects pending sync import and routes to
  authenticateForSync instead of regular authenticate
- After auth success, automatically retries the import
- README updated: imported passwords are protected (dots in UI,
  vault password to reveal, AES-256 encrypted at rest)
- Bumped to v2.0.9

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 05:23:50 +00:00
Claude f2fa4befdd fix: sync code import not applying data after authentication
When importing an encrypted sync code, the flow was:
1. Click Apply → importSyncCode returns needsAuth
2. Auth prompt shown → user enters password → authentication succeeds
3. Green checkmark shown... but nobody re-runs the import

The user had to manually click Apply a second time. Now the import
automatically retries after successful authentication via a
__ssPendingSyncImport callback.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 05:19:51 +00:00
Claude dd68361474 fix: move early fetch hook BEFORE async storage read
The early fetch hook was still inside the async init() function,
running AFTER await storage.local.get(). By the time storage
responded, ChatGPT's JS had already loaded and captured the
original fetch().

Moved the inline script injection to the TOP of the IIFE, before
any async operations. The sequence is now:

1. [synchronous] Inject inline <script> that captures fetch/XHR
2. [synchronous] Define mergeProfiles and other helpers
3. [async] Read storage for config
4. [async] Inject content.js with full substitution engine

This guarantees the fetch proxy is installed before any page
JavaScript runs, regardless of how long storage reads take.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 05:14:13 +00:00
Outis 8815ea823c Merge pull request #25 from outis1one/claude/read-repo-YMu21
feat: dynamic content script registration for custom domains
2026-03-27 00:42:17 -04:00
Claude 66b497f94b feat: dynamic content script registration for custom domains
Replace tab-load-only injection with scripting.registerContentScripts()
so custom domains inject at document_start (like built-in sites) and
persist across service worker restarts. Scripts re-register automatically
when domains change. Removed domains now revoke browser permissions.

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-27 04:40:56 +00:00
Outis 9a4b26eb61 Merge pull request #24 from outis1one/claude/read-repo-wA3y1
fix: cross-browser sync decryption + WebAuthn on extension pages
2026-03-27 00:39:03 -04:00
Claude d1bc43d02d fix: cross-browser sync decryption + WebAuthn on extension pages
Sync code import between browsers was failing with "Wrong key or
corrupted data" because each browser derives a different AES key
from the same password (different salt). The decrypt function was
using the local device's salt instead of the source device's salt
embedded in the sync envelope.

Fixed _decryptFromSync to always use the sync envelope's salt for
decryption. If the cached key's salt doesn't match, forces re-auth
so the password is re-entered and a new key is derived with the
correct salt.

Also fixed WebAuthn "device can't be used" error on extension pages.
chrome-extension:// and moz-extension:// origins are not valid for
WebAuthn. isWebAuthnAvailable() now returns false on extension pages.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:38:25 +00:00
Outis 1a2dd02d5b Merge pull request #23 from outis1one/claude/read-repo-wA3y1
chore: bump to 2.0.7
2026-03-27 00:31:45 -04:00
Claude f284238792 chore: bump to 2.0.7
https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:29:39 +00:00
Outis ba2482027e Merge pull request #22 from outis1one/claude/read-repo-wA3y1
fix: ChatGPT interception — synchronous early fetch hook
2026-03-27 00:29:00 -04:00
Claude 271f036749 fix: ChatGPT interception — synchronous early fetch hook
The fetch interceptor was loaded via <script src="content.js"> which
is asynchronous. ChatGPT's Next.js framework stores a reference to
the original fetch() during module initialization — before our script
finishes downloading. By the time content.js patches window.fetch,
ChatGPT is already using its stored copy of the original.

Fixed with a two-step injection:

1. Injector injects a tiny INLINE <script> (synchronous, instant)
   that stores the real fetch/XHR references and installs a thin
   proxy. This runs before ANY page JavaScript.

2. Content.js loads normally, uses the stored __ssOriginalFetch
   reference, and registers __ssInterceptFetch so the proxy can
   route future calls through the full substitution engine.

This ensures the fetch hook is in place before frameworks like
Next.js, React, or any SPA framework can save a reference to
the original fetch().

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:27:29 +00:00
Outis 483cfff70b Merge pull request #21 from outis1one/claude/read-repo-YMu21
security: require encryption for all sync channels, reduce activity l…
2026-03-27 00:27:10 -04:00
Claude a3904843ba security: require encryption for all sync channels, reduce activity log to 100
Sync operations (browser sync, Gist, custom URL, sync code) now refuse to
operate without encryption enabled. Disabling encryption also turns off all
active sync channels. Activity log cap reduced from 200 to 100 entries for
both storage and display.

https://claude.ai/code/session_01KF4i7Ra7zCEDskxDBaNtcT
2026-03-27 04:17:50 +00:00
Outis b333a5b0e2 Merge pull request #20 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-27 00:11:55 -04:00
Claude 02c635c4d7 fix: ChatGPT fetch interception failure + bump to 2.0.6
ChatGPT (and potentially other AI services) calls fetch() with a
Request object as the first argument: fetch(new Request(url, opts))
instead of fetch(url, opts). The interceptor only handled the second
form, so ChatGPT's conversation requests passed through unmodified.

Fixed by handling both fetch signatures:
- fetch(url, options) — existing path
- fetch(Request) — new: extracts URL, method, headers, reads body
  via request.text() for JSON/text content types

Also handles non-string body types:
- Blob → text via blob.text()
- ArrayBuffer → text via TextDecoder
- URLSearchParams → string via toString()

These cover the various ways modern frameworks call fetch().

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:07:11 +00:00
Claude 8cff1ae382 fix: auto-sync token persistence + better status display
Auto-sync now:
- Persists Gist token in the auto-sync config so it survives
  page reloads (previously only read from the input field)
- Saves token when the Gist token field changes (not just on toggle)
- Validates that credentials exist before enabling
- Shows current status: method, interval, last push/pull times
- Updated UI description to clarify it works in all browsers

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 04:01:25 +00:00
Claude b7a5bcc287 docs: add sync method compatibility table to README
Shows which sync methods work in which browsers:
- Sync Code, GitHub Gist, Custom URL: all browsers
- Browser account sync: Chrome and Firefox only
- Auto-Sync Folder: Chrome only (File System Access API)

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:58:43 +00:00
Claude 0870c050cb fix: sync code not transferring identity when encryption enabled
_getAllData() was reading raw storage which contains encrypted blobs
when at-rest encryption is enabled. The sync code export would send
{ _ssLocalEncrypted: true, data: <blob> } instead of actual identity
data. The importing browser couldn't use these blobs.

Fixed _getAllData() to use Storage._readSecure() which decrypts
transparently. Fixed _applyData() to use Storage._writeSecure()
so imported data gets encrypted on the receiving end.

Also: hide the Auto-Sync Folder section entirely in browsers that
don't support File System Access API (Firefox, Brave, Safari)
instead of showing a broken-looking error message.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:57:53 +00:00
Claude 511ee321a7 fix: disable proper noun detection by default (too many false positives)
Proper noun detection (flagging capitalized phrases like "Getting
Started", "Generate Design", "Introduction Getting Started") now
disabled by default. Enable via popup → Options tab → Detect proper
nouns.

The pattern-based detection (IPs, emails, API keys, addresses, paths,
etc.) remains always-on and reliable. The capitalized phrase heuristic
was producing too many false positives on normal UI phrases, headings,
and instructions — adding words to the filter was a losing game.

Added detectProperNouns toggle to popup Options tab.
Updated README to note it's opt-in.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:52:23 +00:00
Outis ad0176c2cf Merge pull request #19 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 23:36:12 -04:00
Claude 51d7add873 docs: detailed network inspection steps for Firefox, Chrome, Safari
Updated "How to verify it's working" with step-by-step instructions
for each browser showing exactly where to click:
- Firefox: F12 → Network → POST events → Request tab → expand JSON
- Chrome: F12 → Network → POST chat/events → Payload tab
- Safari: Cmd+Opt+I → Network → POST → Request

Includes what to look for (replaced data should be there, real data
should not) and what to do if verification fails.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:35:28 +00:00
Claude 5953072507 docs: verification guide, remove store distribution, fix legal tone
README changes:
- Added step-by-step "How to verify it's working" section with 6
  methods, including Network tab inspection to prove real data never
  reaches the AI
- Removed App Store distribution steps (internal, not user-facing)
- Rewrote "What Silent Send can't catch" — updated file uploads line
  (we now scan them), clearer language
- Replaced "Legal" section with concise user-facing disclaimer —
  removed internal litigation notes that read like developer-to-
  developer instead of developer-to-user
- Shortened license section

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:26:00 +00:00
Claude 2e0b12a494 docs: comprehensive README update
Added:
- Safari installation section (full guide: build, test without
  Apple Developer account via Allow Unsigned Extensions, App Store
  distribution steps)
- Document scanning section with format support table
- Concatenated name patterns in smart pattern examples
- Options tab mention in "how to verify" section
- Browser support note (Chrome, Firefox, Safari)
- document-scanner.js and build-safari.sh in architecture section
- Updated service-worker.js and content.js descriptions

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:22:13 +00:00