Commit Graph
216 Commits
Author SHA1 Message Date
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
Outis 1ab841f554 Merge pull request #18 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 23:17:47 -04:00
Claude e739531cee fix: catch concatenated name forms (JohnSmith, john.smith, etc.)
Smart patterns now catch all concatenated combinations of first+last
names with common separators:

| Pattern | Example real | Example replaced |
|---------|-------------|-----------------|
| FirstLast | JohnSmith | AdemoDem |
| firstlast | johnsmith | ademodemo |
| first.last | john.smith | ademo.demo |
| first_last | john_smith | ademo_demo |
| first-last | john-smith | ademo-demo |
| LastFirst | SmithJohn | DemoAdemo |
| last.first | smith.john | demo.ademo |

Case is preserved: all-lowercase input → lowercase output,
ALL-UPPERCASE → uppercase, mixed case → as configured.

Also bumped all versions to 2.0.5.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:16:56 +00:00
Claude 04372ab561 feat: Options tab in popup + Safari build script
Popup:
- Added 5th "Options" tab with key settings accessible without
  opening the full options page: secret scanning, auto-detect PPI,
  auto-redact, show highlights, document scan preview
- "Open Full Options Page" button for sync/encryption/org/import
- Settings changes in popup immediately broadcast to content scripts

Safari:
- Added build-safari.sh that uses Apple's safari-web-extension-converter
  to generate an Xcode project from the Firefox build
- browser-polyfill.js already handles Safari (uses browser.* like Firefox)

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 03:11:49 +00:00
Claude 66f408713c fix: safeHTML live NodeList issue + expanded common words
Fixed safeHTML in all three files — template.content.childNodes and
doc.body.childNodes are live NodeLists that shrink as nodes are moved.
Using Array.from() to create a static copy before spreading into
replaceChildren().

Expanded proper noun common words filter with ~500 additional verbs,
nouns, and adjectives (generate, design, manage, process, account,
button, dashboard, etc.) to prevent false PPI flags on titles,
headings, and UI button labels.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 02:45:52 +00:00
Claude 6192886b92 fix: proper noun detector flagging common phrases like 'Generate Design'
Massively expanded the common words filter — added ~500 common verbs,
nouns, and adjectives that frequently appear capitalized in titles,
headings, UI buttons, and instructions. 'Generate Design', 'Create
Account', 'Search Filter', etc. are no longer flagged as PPI.

Updated both content.js and auto-detect.js with the same word list.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 02:42:14 +00:00
Outis 5dd98762a8 Merge pull request #17 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 22:17:44 -04:00
Claude 3062d4689c chore: bump all versions to 2.0.3
https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 02:11:26 +00:00
Claude 1349072330 fix: unreveal losing case — 'Ademo Demo' became 'ademo demo'
sessionSubstitutions stored keys as toLowerCase() for lookup, but the
lowercase key was also used as the substitute value when building
reveal pairs. This caused unrevealText to replace "John Smith" with
"ademo demo" instead of "Ademo Demo".

Fixed by storing both the original-case substitute and the original
real value in sessionSubstitutions. The lowercase key is still used
for lookup, but the preserved-case value is used for reveal pairs.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 02:05:10 +00:00
Outis 1441201488 Merge pull request #16 from outis1one/claude/read-repo-wA3y1
fix: reveal mode not reverting when turned OFF
2026-03-26 21:50:48 -04:00
Claude 9de70df74e fix: reveal mode not reverting when turned OFF
When reveal mode was turned OFF, text stayed showing real data
(e.g. "John Smith") instead of reverting to the AI's actual text
("Ademo Demo"). The unreveal function relied on a WeakMap of
original text nodes which lost entries when DOM nodes were replaced
during streaming responses.

Fixed by replacing WeakMap-based restore with active reverse
replacement: unrevealText() replaces real→substitute (the opposite
direction of revealText). This is reliable regardless of DOM changes.

Removed originalTexts WeakMap entirely.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 01:49:51 +00:00
Outis 2c1ceada9b Merge pull request #15 from outis1one/claude/read-repo-wA3y1
fix: Firefox signing errors — manifest format + JS syntax
2026-03-26 21:32:40 -04:00
Claude 75845d7ec7 fix: Firefox signing errors — manifest format + JS syntax
1. Removed data_collection_permissions from Firefox manifest — it
   requires Firefox 140+ but we target 128+. Only produces a warning
   when missing, not a blocking error.

2. Fixed JS syntax error in content.js line 450 — two extra closing
   braces from a bad merge in the proper noun detection function
   caused a parse error that blocked Mozilla validation.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 01:31:39 +00:00
Outis 632d372d8f Merge pull request #14 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 21:29:11 -04:00
Claude 4fd6cd6f96 fix: resolve merge conflict in manifest.firefox.json
Restored manifest_version to 3 (was corrupted to 1 by old sign script
on main). Kept version 2.0.0 from feature branch.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-27 01:28:47 +00:00
Claude ad065f42cd fix: replace all innerHTML assignments with safeHTML for AMO review
Replaced all 31 innerHTML assignments across popup.js (12),
options.js (17), and content.js (3) to pass Mozilla AMO linter.

Each file gets a safeHTML(el, html) helper:
- popup.js/options.js: DOMParser-based (extension page context)
- content.js: <template> element pattern (page world context)

Empty innerHTML clears replaced with el.replaceChildren().
innerHTML += replaced with createElement + safeHTML + appendChild.

All event listener bindings after HTML rebuilds remain functional
since safeHTML uses replaceChildren() which populates DOM
synchronously before querySelectorAll + addEventListener calls.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 23:45:35 +00:00
Claude f34e3b8eee docs: add privacy policy for AMO listing
Required for Firefox Add-ons (AMO) public listing submission.
Documents that all processing is 100% local, no data collection,
no servers, no analytics. Explains each permission and all
optional network requests (sync, org policy).

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 23:39:06 +00:00
Claude 64ed20bc88 chore: sync all versions to 2.0.0 + fix sign script
Set Chrome, Firefox, and package.json all to version 2.0.0
(major bump reflecting encrypted storage, document scanning,
org/team features, sync improvements).

Sign script rewritten:
- Tries current version first instead of always bumping
- Only bumps on "version already exists" errors
- Handles rate limiting by parsing throttle duration from error
  and waiting the exact time (not blindly retrying)
- Only updates source files on successful signing (not before)
- Reduced max attempts to 5 (with proper backoff, shouldn't need more)
- Commits version bump only after successful sign

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 22:50:17 +00:00
Outis c1595019a8 Merge pull request #13 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 18:42:06 -04:00
Claude c5239609c1 fix: ignore button now says 'ignore' instead of X icon
The X icon looked like a dismiss/close button (temporary). Changed to
a small 'IGNORE' text link that clearly communicates the action is
permanent — the value will never be flagged again.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 22:34:30 +00:00
Claude c25be011f7 fix: proper noun detection too aggressive + add ignore button
Proper noun heuristic:
- Changed from matching any single capitalized word to requiring
  TWO OR MORE consecutive capitalized words (e.g. "Acme Corp")
- Single capitalized words at sentence starts were causing massive
  false positives — every sentence starts with a capital letter
- Minimum 5 characters total and 2 proper words required

Ignore button:
- Each PPI warning item now has an X (ignore) button alongside
  the + (add mapping) button
- Ignored values are persisted to storage (ss_ignored_ppi) so
  they stay dismissed across page reloads
- Ignored values are skipped in both pattern detection and
  proper noun detection
- Clicking ignore removes the item from the warning and re-scans

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 22:18:11 +00:00
Claude ae451f73df fix: reveal mode was destroying chat input text
Reveal mode's text replacement was walking ALL text nodes on the page
including contenteditable elements (the chat input box on Claude.ai,
ChatGPT, etc.), overwriting the user's typed text with garbled
revealed content.

Fixed by adding contenteditable checks to:
- revealInElement() — returns early if element is contenteditable
- unrevealInElement() — same
- highlightMatches() — TreeWalker filter rejects contenteditable nodes
- MutationObserver — skips addedNodes and characterData mutations
  inside contenteditable elements

All four code paths now use parent.closest('[contenteditable="true"]')
to detect and skip chat input areas.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 21:59:28 +00:00
Outis ed191e6986 Bump version from 1.1.0 to 1.2.0 2026-03-26 16:59:42 -04:00
Outis 22b32b67e2 Merge pull request #12 from outis1one/claude/read-repo-wA3y1
fix: Firefox signing — manifest_version corruption + rate limiting
2026-03-26 16:59:20 -04:00
Claude 3ffac3299f fix: Firefox signing — manifest_version corruption + rate limiting
The sign script's sed command was replacing ALL "version" patterns
including "manifest_version": 3, corrupting it to "manifest_version": 1.
Fixed by anchoring the sed pattern to only match the top-level
"version" field (starts with two spaces at line beginning).

Also:
- Added data_collection_permissions to Firefox manifest (new Mozilla
  requirement for all extensions)
- Added 8-second sleep between retry attempts to avoid Mozilla API
  rate limiting (was causing cascading failures)

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:58:16 +00:00
Outis 85f08750d3 Bump version from 1.0.0 to 1.1.0 2026-03-26 16:54:13 -04:00
Outis b3d865f523 Merge pull request #11 from outis1one/claude/read-repo-wA3y1
Claude/read repo w a3y1
2026-03-26 16:45:42 -04:00
Claude 9be389f53a refactor: simplify document scanner to plaintext-only extraction
Removed ZIP read/write complexity. All document formats now extract
text and upload as plaintext — the AI extracts text from files anyway,
no need to preserve formatting in a file the user never gets back.

Added support for: DOC, XLS (old binary), ODT, ODS, ODP (OpenDocument),
PPTX (PowerPoint), RTF.

Extraction methods:
- PDF: content stream operators (Tj, TJ)
- DOCX/XLSX/PPTX/ODT/ODS/ODP: ZIP XML text extraction with DEFLATE
- DOC/XLS: UTF-16LE and ASCII text run extraction from binary
- RTF: strip formatting commands, keep text

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:40:51 +00:00
Claude c03324a871 feat: full DOCX/XLSX in-place replacement with ZIP rewrite
DOCX and XLSX files now get actual text substitution, not just
scan-and-warn:

- Reads the ZIP structure (DOCX/XLSX are ZIP files of XML)
- Decompresses DEFLATE entries via DecompressionStream API
- Finds XML text content between tags
- Applies substituteAll() to each text node
- Rewrites modified entries as uncompressed (stored) in new ZIP
- Unmodified entries preserved with original compression
- Rebuilds central directory and end-of-central-directory record

DOCX targets: word/document.xml, word/header*.xml, word/footer*.xml,
  word/comments.xml, word/endnotes.xml, word/footnotes.xml
XLSX targets: xl/sharedStrings.xml, xl/worksheets/sheet*.xml

Formatting, styles, images, formulas all preserved — only text
content between XML tags is modified. Preview mode still shows
findings before upload for user confirmation.

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:32:07 +00:00
Claude 6598587bc4 feat: document scanner — scan file uploads for PPI before sending
New module: document-scanner.js
- PDF: extracts text from content streams, scans for PPI, converts to
  sanitized plaintext for upload (PDFs can't be reliably edited in-place)
- DOCX/XLSX: extracts text from XML entries, scans for PPI
- Text files: direct string substitution
- Handles scanned/image-only PDFs gracefully (skips with message)

Fetch interceptor (content.js):
- Now intercepts FormData uploads (file uploads) in addition to JSON
- Processes each file through document scanner
- Preview mode for PDF/DOCX/XLSX: shows PPI findings with counts,
  user clicks "Substitute & Upload" or "Upload Original"
- Text files substituted silently (no preview friction)
- String form fields also substituted
- 30-second auto-dismiss on preview (uploads original if no response)

Preview UI (content.css):
- Centered overlay with dark theme matching existing warning UI
- Shows original → substituted pairs for each PPI found
- File format note (e.g. "PDF will be converted to plain text")

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:27:27 +00:00
Claude e4b44a73ea feat: masked passwords UI with vault-gated reveal
Passwords imported from password managers are now:
- Displayed as dots (••••••••) by default in both options and popup
- Separated into their own "Passwords" section in options page
- Only revealable by entering the vault encryption password
- Always masked in the popup mappings list (no reveal there)

Options page:
- New Passwords section with locked/unlocked states
- Reveal button validates against vault encryption password
- Hide button re-masks all password values
- Password mappings excluded from the general Mappings table
- Delete and enable/disable controls work while masked

Popup:
- Password-category mappings show dots for real value
- Password category added to mapping add form dropdown

Storage:
- Added 'password' to default categories list

https://claude.ai/code/session_01SWSwDfMVij53bCTNSCLMwn
2026-03-26 20:11:05 +00:00