From 6192886b92cc1e0c3012341a9c92dc3afcadf046 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 02:42:14 +0000 Subject: [PATCH 1/4] fix: proper noun detector flagging common phrases like 'Generate Design' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/content/content.js | 124 ++++++++++++++++++++++++++++++++++++----- src/lib/auto-detect.js | 80 ++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 15 deletions(-) diff --git a/src/content/content.js b/src/content/content.js index 10fa4a7..9c4da57 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -355,17 +355,26 @@ // Common English words that are capitalized but aren't proper nouns. // Used by the proper noun heuristic to reduce false positives. + // Includes common verbs, nouns, adjectives that appear in titles, + // headings, UI buttons, and instructions. const COMMON_CAPITALIZED = new Set([ + // Prepositions, conjunctions, articles, pronouns 'the', 'a', 'an', 'and', 'or', 'but', 'if', 'then', 'else', 'when', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', - 'then', 'once', 'here', 'there', 'all', 'each', 'every', 'both', + 'once', 'here', 'there', 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'can', 'will', 'just', 'should', 'now', 'also', 'into', 'could', 'would', 'may', 'might', 'shall', 'must', 'need', 'have', 'has', 'had', 'do', 'does', 'did', 'be', 'is', 'am', 'are', 'was', 'were', 'been', 'being', + 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her', + 'us', 'them', 'my', 'your', 'his', 'its', 'our', 'their', + 'this', 'that', 'these', 'those', 'what', 'who', 'how', 'why', + 'which', 'where', 'when', 'while', 'since', 'because', 'although', + 'however', 'therefore', 'moreover', 'furthermore', 'nevertheless', + // Common verbs (appear in titles, headings, buttons, instructions) 'get', 'got', 'make', 'made', 'go', 'went', 'gone', 'take', 'took', 'come', 'came', 'see', 'saw', 'know', 'knew', 'think', 'thought', 'say', 'said', 'tell', 'told', 'give', 'gave', 'find', 'found', @@ -378,25 +387,110 @@ 'buy', 'wait', 'serve', 'die', 'send', 'expect', 'build', 'stay', 'fall', 'cut', 'reach', 'kill', 'remain', 'suggest', 'raise', 'pass', 'sell', 'require', 'report', 'decide', 'pull', 'develop', 'note', - 'however', 'because', 'although', 'since', 'while', 'where', 'which', - 'what', 'who', 'how', 'why', 'this', 'that', 'these', 'those', - 'i', 'you', 'he', 'she', 'it', 'we', 'they', 'me', 'him', 'her', - 'us', 'them', 'my', 'your', 'his', 'its', 'our', 'their', - 'new', 'old', 'big', 'small', 'long', 'short', 'good', 'bad', - 'great', 'little', 'right', 'left', 'first', 'last', 'next', - 'sure', 'like', 'well', 'back', 'still', 'even', 'much', 'many', - // Programming/tech words that appear capitalized + 'generate', 'design', 'manage', 'process', 'handle', 'check', 'verify', + 'submit', 'apply', 'accept', 'reject', 'approve', 'deny', 'confirm', + 'cancel', 'delete', 'remove', 'edit', 'modify', 'view', 'display', + 'search', 'filter', 'sort', 'select', 'choose', 'pick', 'enter', + 'input', 'output', 'upload', 'download', 'install', 'uninstall', + 'enable', 'disable', 'activate', 'deactivate', 'toggle', 'switch', + 'connect', 'disconnect', 'sync', 'refresh', 'reload', 'reset', + 'save', 'load', 'store', 'restore', 'backup', 'export', 'import', + 'copy', 'paste', 'drag', 'drop', 'click', 'press', 'hold', 'release', + 'scroll', 'zoom', 'resize', 'expand', 'collapse', 'hide', 'reveal', + 'lock', 'unlock', 'encrypt', 'decrypt', 'sign', 'register', 'login', + 'logout', 'subscribe', 'unsubscribe', 'share', 'publish', 'deploy', + 'launch', 'test', 'debug', 'fix', 'patch', 'merge', 'split', 'join', + 'link', 'attach', 'detach', 'insert', 'append', 'prepend', 'wrap', + 'format', 'parse', 'convert', 'transform', 'translate', 'compile', + 'execute', 'render', 'animate', 'validate', 'sanitize', 'escape', + // Common nouns (appear in titles, headings, labels) + 'account', 'action', 'address', 'alert', 'analysis', 'answer', + 'application', 'area', 'article', 'asset', 'background', 'badge', + 'banner', 'board', 'body', 'border', 'bottom', 'box', 'brand', + 'browser', 'buffer', 'button', 'cache', 'calendar', 'card', 'case', + 'category', 'center', 'channel', 'chart', 'chat', 'child', 'choice', + 'class', 'client', 'cloud', 'cluster', 'code', 'collection', 'color', + 'column', 'command', 'comment', 'community', 'company', 'component', + 'config', 'configuration', 'connection', 'console', 'contact', + 'container', 'content', 'context', 'control', 'corner', 'count', + 'country', 'cover', 'custom', 'dashboard', 'data', 'database', + 'date', 'day', 'default', 'description', 'design', 'desktop', + 'detail', 'device', 'dialog', 'directory', 'document', 'domain', + 'draft', 'driver', 'edge', 'editor', 'element', 'email', 'end', + 'engine', 'entry', 'environment', 'error', 'event', 'example', + 'exception', 'extension', 'feature', 'feedback', 'field', 'file', + 'filter', 'folder', 'font', 'footer', 'form', 'format', 'frame', + 'function', 'gallery', 'general', 'global', 'grid', 'group', + 'guide', 'handler', 'header', 'health', 'help', 'helper', 'history', + 'home', 'host', 'icon', 'image', 'index', 'info', 'input', 'instance', + 'interface', 'issue', 'item', 'job', 'key', 'label', 'language', + 'layout', 'level', 'library', 'light', 'limit', 'line', 'link', + 'list', 'local', 'location', 'log', 'logo', 'main', 'manager', + 'manual', 'map', 'margin', 'master', 'match', 'media', 'member', + 'memory', 'menu', 'message', 'method', 'middle', 'mobile', 'modal', + 'mode', 'model', 'module', 'monitor', 'name', 'navigation', 'network', + 'node', 'note', 'notification', 'number', 'object', 'option', + 'order', 'origin', 'output', 'overlay', 'overview', 'owner', 'package', + 'padding', 'page', 'panel', 'parent', 'parser', 'password', 'path', + 'pattern', 'permission', 'photo', 'pipeline', 'placeholder', 'plan', + 'platform', 'player', 'plugin', 'point', 'policy', 'pool', 'popup', + 'port', 'position', 'post', 'power', 'preview', 'primary', 'print', + 'priority', 'process', 'product', 'profile', 'program', 'progress', + 'project', 'prompt', 'property', 'protocol', 'provider', 'proxy', + 'public', 'query', 'queue', 'quick', 'radio', 'range', 'rate', + 'reader', 'record', 'region', 'release', 'remote', 'render', + 'report', 'request', 'resource', 'response', 'result', 'review', + 'role', 'root', 'route', 'row', 'rule', 'runtime', 'sample', + 'scanner', 'schema', 'scope', 'screen', 'script', 'search', + 'section', 'security', 'select', 'sender', 'server', 'service', + 'session', 'setting', 'settings', 'setup', 'share', 'shell', + 'shortcut', 'sidebar', 'signal', 'simple', 'single', 'site', 'size', + 'slider', 'slot', 'snapshot', 'socket', 'solution', 'source', 'space', + 'stage', 'standard', 'start', 'state', 'status', 'step', 'stop', + 'storage', 'store', 'stream', 'string', 'style', 'subject', + 'success', 'summary', 'support', 'switch', 'symbol', 'syntax', + 'system', 'table', 'target', 'task', 'team', 'template', 'terminal', + 'test', 'text', 'theme', 'thread', 'time', 'timer', 'title', 'token', + 'tool', 'toolbar', 'tooltip', 'top', 'total', 'track', 'traffic', + 'tree', 'trigger', 'type', 'unit', 'update', 'upload', 'user', + 'util', 'utility', 'value', 'variable', 'version', 'video', 'view', + 'virtual', 'warning', 'watch', 'web', 'widget', 'width', 'window', + 'wizard', 'word', 'worker', 'workspace', 'wrapper', 'zone', + // Common adjectives + 'active', 'advanced', 'available', 'basic', 'best', 'better', 'blank', + 'bold', 'clean', 'clear', 'close', 'closed', 'complete', 'complex', + 'connected', 'correct', 'critical', 'current', 'dark', 'deep', + 'detailed', 'different', 'direct', 'double', 'dynamic', 'early', + 'easy', 'empty', 'entire', 'equal', 'essential', 'exact', 'extra', + 'fast', 'final', 'fine', 'fixed', 'flat', 'free', 'fresh', 'front', + 'full', 'generic', 'given', 'good', 'great', 'green', 'hard', + 'hidden', 'high', 'hot', 'huge', 'human', 'initial', 'inner', + 'internal', 'invalid', 'large', 'late', 'latest', 'left', 'light', + 'live', 'long', 'low', 'major', 'maximum', 'middle', 'minimum', + 'minor', 'mixed', 'modern', 'multiple', 'native', 'natural', + 'nested', 'neutral', 'new', 'normal', 'null', 'old', 'online', + 'open', 'optional', 'outer', 'overall', 'parallel', 'partial', + 'pending', 'plain', 'popular', 'possible', 'previous', 'primary', + 'private', 'proper', 'protected', 'quick', 'random', 'raw', 'ready', + 'real', 'recent', 'red', 'related', 'relative', 'remote', 'required', + 'responsive', 'rich', 'right', 'round', 'safe', 'secure', 'selected', + 'sensitive', 'separate', 'serial', 'shared', 'short', 'silent', + 'similar', 'simple', 'single', 'small', 'smart', 'smooth', 'soft', + 'solid', 'special', 'specific', 'stable', 'standard', 'static', + 'strict', 'strong', 'supported', 'sweet', 'thin', 'tight', 'tiny', + 'total', 'true', 'unique', 'universal', 'unknown', 'upper', 'valid', + 'various', 'virtual', 'visible', 'visual', 'warm', 'weak', 'white', + 'whole', 'wide', 'wild', + // Programming/tech terms 'string', 'number', 'boolean', 'object', 'array', 'function', 'class', 'type', 'error', 'null', 'undefined', 'true', 'false', 'return', 'import', 'export', 'default', 'const', 'let', 'var', 'async', 'await', 'try', 'catch', 'throw', 'finally', 'switch', 'case', 'break', - 'note', 'example', 'warning', 'important', 'todo', 'fixme', 'hack', - 'step', 'option', 'result', 'value', 'key', 'data', 'info', - 'file', 'code', 'test', 'debug', 'config', 'setup', 'update', - // Common sentence starters that aren't names + 'example', 'warning', 'important', 'todo', 'fixme', 'hack', + // Common sentence starters 'please', 'thanks', 'hello', 'hi', 'hey', 'dear', 'sincerely', - 'regards', 'best', 'cheers', 'sorry', 'yes', 'no', 'ok', 'okay', - // Days and months (not PPI) + 'regards', 'best', 'cheers', 'sorry', 'yes', 'ok', 'okay', + // Days and months 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december', diff --git a/src/lib/auto-detect.js b/src/lib/auto-detect.js index 35a9eab..bea7464 100644 --- a/src/lib/auto-detect.js +++ b/src/lib/auto-detect.js @@ -257,6 +257,8 @@ const AutoDetect = { }; // Common English words to exclude from proper noun detection +// Comprehensive list including verbs, nouns, adjectives that appear +// in titles, headings, UI buttons, and instructions const COMMON_WORDS = new Set([ 'the', 'and', 'but', 'for', 'not', 'you', 'all', 'can', 'had', 'her', 'was', 'one', 'our', 'out', 'are', 'has', 'his', 'how', 'its', 'may', @@ -276,6 +278,84 @@ const COMMON_WORDS = new Set([ 'number', 'other', 'point', 'right', 'small', 'state', 'thing', 'think', 'those', 'three', 'through', 'under', 'until', 'water', 'world', 'write', 'might', 'should', 'because', 'although', + // Common verbs (titles, headings, buttons, instructions) + 'generate', 'design', 'manage', 'process', 'handle', 'check', 'verify', + 'submit', 'apply', 'accept', 'reject', 'approve', 'deny', 'confirm', + 'cancel', 'delete', 'remove', 'edit', 'modify', 'view', 'display', + 'search', 'filter', 'sort', 'select', 'choose', 'pick', 'enter', + 'upload', 'download', 'install', 'enable', 'disable', 'activate', + 'connect', 'disconnect', 'sync', 'refresh', 'reload', 'reset', + 'save', 'load', 'store', 'restore', 'backup', 'copy', 'paste', + 'lock', 'unlock', 'encrypt', 'decrypt', 'sign', 'register', 'login', + 'logout', 'subscribe', 'share', 'publish', 'deploy', 'launch', + 'merge', 'split', 'join', 'link', 'attach', 'insert', 'append', + 'format', 'parse', 'convert', 'transform', 'translate', 'compile', + 'execute', 'render', 'animate', 'validate', 'sanitize', 'escape', + 'create', 'build', 'start', 'stop', 'open', 'close', 'run', 'send', + // Common nouns (titles, headings, labels) + 'account', 'action', 'address', 'alert', 'analysis', 'application', + 'area', 'article', 'asset', 'background', 'badge', 'banner', 'board', + 'body', 'border', 'bottom', 'box', 'browser', 'buffer', 'button', + 'cache', 'calendar', 'card', 'category', 'center', 'channel', 'chart', + 'chat', 'child', 'choice', 'client', 'cloud', 'code', 'collection', + 'color', 'column', 'command', 'comment', 'community', 'company', + 'component', 'config', 'configuration', 'connection', 'console', + 'contact', 'container', 'content', 'context', 'control', 'count', + 'country', 'custom', 'dashboard', 'data', 'database', 'date', 'day', + 'default', 'description', 'design', 'desktop', 'detail', 'device', + 'dialog', 'directory', 'document', 'domain', 'draft', 'driver', + 'edge', 'editor', 'element', 'email', 'engine', 'entry', 'environment', + 'error', 'event', 'example', 'extension', 'feature', 'feedback', + 'field', 'file', 'filter', 'folder', 'font', 'footer', 'form', + 'frame', 'function', 'gallery', 'general', 'global', 'grid', + 'guide', 'handler', 'header', 'health', 'help', 'history', 'home', + 'host', 'icon', 'image', 'index', 'info', 'input', 'instance', + 'interface', 'issue', 'item', 'job', 'key', 'label', 'language', + 'layout', 'level', 'library', 'light', 'limit', 'line', 'link', + 'list', 'local', 'location', 'log', 'logo', 'main', 'manager', + 'manual', 'map', 'media', 'member', 'memory', 'menu', 'message', + 'method', 'mobile', 'modal', 'mode', 'model', 'module', 'monitor', + 'navigation', 'network', 'node', 'note', 'notification', 'object', + 'option', 'order', 'origin', 'output', 'overlay', 'overview', 'owner', + 'package', 'page', 'panel', 'parent', 'parser', 'password', 'path', + 'pattern', 'permission', 'photo', 'pipeline', 'placeholder', 'plan', + 'platform', 'player', 'plugin', 'point', 'policy', 'pool', 'popup', + 'port', 'position', 'post', 'power', 'preview', 'primary', 'print', + 'priority', 'process', 'product', 'profile', 'program', 'progress', + 'project', 'prompt', 'property', 'protocol', 'provider', 'proxy', + 'public', 'query', 'queue', 'quick', 'range', 'rate', 'reader', + 'record', 'region', 'release', 'remote', 'report', 'request', + 'resource', 'response', 'result', 'review', 'role', 'root', 'route', + 'row', 'rule', 'runtime', 'sample', 'scanner', 'schema', 'scope', + 'screen', 'script', 'search', 'section', 'security', 'select', + 'sender', 'server', 'service', 'session', 'setting', 'settings', + 'setup', 'share', 'shell', 'shortcut', 'sidebar', 'signal', 'simple', + 'single', 'site', 'size', 'slider', 'snapshot', 'socket', 'solution', + 'source', 'space', 'stage', 'standard', 'status', 'step', 'storage', + 'stream', 'string', 'style', 'subject', 'success', 'summary', + 'support', 'switch', 'symbol', 'syntax', 'system', 'table', 'target', + 'task', 'team', 'template', 'terminal', 'test', 'text', 'theme', + 'thread', 'title', 'token', 'tool', 'toolbar', 'tooltip', 'total', + 'track', 'traffic', 'tree', 'trigger', 'type', 'unit', 'update', + 'upload', 'user', 'utility', 'value', 'variable', 'version', 'video', + 'view', 'virtual', 'warning', 'watch', 'web', 'widget', 'width', + 'window', 'wizard', 'word', 'worker', 'workspace', 'wrapper', 'zone', + // Common adjectives + 'active', 'advanced', 'available', 'basic', 'clean', 'clear', 'complete', + 'connected', 'correct', 'critical', 'current', 'dark', 'deep', + 'different', 'direct', 'double', 'dynamic', 'easy', 'empty', 'entire', + 'exact', 'extra', 'fast', 'final', 'fixed', 'flat', 'free', 'fresh', + 'full', 'generic', 'given', 'hidden', 'initial', 'inner', 'internal', + 'invalid', 'latest', 'live', 'major', 'maximum', 'minimum', 'minor', + 'mixed', 'modern', 'multiple', 'native', 'natural', 'nested', 'normal', + 'online', 'optional', 'outer', 'overall', 'partial', 'pending', 'plain', + 'popular', 'possible', 'previous', 'private', 'proper', 'protected', + 'random', 'raw', 'ready', 'real', 'recent', 'related', 'relative', + 'required', 'responsive', 'safe', 'secure', 'selected', 'sensitive', + 'separate', 'shared', 'silent', 'similar', 'smart', 'smooth', 'solid', + 'special', 'specific', 'stable', 'static', 'strict', 'strong', + 'supported', 'unique', 'universal', 'unknown', 'upper', 'valid', + 'various', 'visible', 'visual', 'whole', 'wide', // Programming / tech terms 'string', 'number', 'boolean', 'object', 'array', 'function', 'class', 'type', 'error', 'null', 'undefined', 'true', 'false', 'return', From 66f408713c6c7bb570d5944f911d015897e615cf Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 02:45:52 +0000 Subject: [PATCH 2/4] fix: safeHTML live NodeList issue + expanded common words MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/content/content.js | 3 ++- src/options/options.js | 2 +- src/popup/popup.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/content/content.js b/src/content/content.js index 9c4da57..384ca10 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -14,7 +14,8 @@ function safeHTML(el, html) { const template = document.createElement('template'); template.innerHTML = html; - el.replaceChildren(...template.content.childNodes); + // Convert to static array — childNodes is live and shrinks as nodes move + el.replaceChildren(...Array.from(template.content.childNodes)); } // ============================================================ diff --git a/src/options/options.js b/src/options/options.js index 5f6eaa6..fbf0b11 100644 --- a/src/options/options.js +++ b/src/options/options.js @@ -17,7 +17,7 @@ const $ = (sel) => document.querySelector(sel); // --- Safe innerHTML replacement (AMO-compliant) --- function safeHTML(el, html) { const doc = new DOMParser().parseFromString(html, 'text/html'); - el.replaceChildren(...doc.body.childNodes); + el.replaceChildren(...Array.from(doc.body.childNodes)); } document.addEventListener('DOMContentLoaded', async () => { diff --git a/src/popup/popup.js b/src/popup/popup.js index 76de432..9b0ee0d 100644 --- a/src/popup/popup.js +++ b/src/popup/popup.js @@ -21,7 +21,7 @@ const $$ = (sel) => document.querySelectorAll(sel); // --- Safe innerHTML replacement (AMO-compliant) --- function safeHTML(el, html) { const doc = new DOMParser().parseFromString(html, 'text/html'); - el.replaceChildren(...doc.body.childNodes); + el.replaceChildren(...Array.from(doc.body.childNodes)); } // --- Init --- From 04372ab5617711a41761ead1c6e6bda8e1ea53e4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 27 Mar 2026 03:11:49 +0000 Subject: [PATCH 3/4] 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 --- build-safari.sh | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/popup/popup.css | 29 +++++++++++++++++++ src/popup/popup.html | 49 ++++++++++++++++++++++++++++++++ src/popup/popup.js | 30 +++++++++++++++++++- 4 files changed, 173 insertions(+), 1 deletion(-) create mode 100755 build-safari.sh diff --git a/build-safari.sh b/build-safari.sh new file mode 100755 index 0000000..9ffaf78 --- /dev/null +++ b/build-safari.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# +# Convert Silent Send for Safari using Apple's safari-web-extension-converter. +# +# Prerequisites: +# - macOS with Xcode installed (free from Mac App Store) +# - Apple Developer account ($99/year) for App Store distribution +# - Xcode Command Line Tools: xcode-select --install +# +# This script: +# 1. Builds the Firefox variant (Safari uses browser.* API like Firefox) +# 2. Runs safari-web-extension-converter to generate an Xcode project +# 3. The Xcode project can then be built, tested, and submitted to App Store +# + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +OUT_DIR="$SCRIPT_DIR/safari-build" + +# Check for Xcode +if ! command -v xcrun &> /dev/null; then + echo "Error: Xcode is required. Install from the Mac App Store." + echo "Then run: xcode-select --install" + exit 1 +fi + +if ! xcrun --find safari-web-extension-converter &> /dev/null; then + echo "Error: safari-web-extension-converter not found." + echo "Make sure Xcode is installed and up to date." + exit 1 +fi + +# Build the Firefox variant (Safari uses browser.* API) +echo "Building extension..." +"$SCRIPT_DIR/build.sh" firefox + +echo "" +echo "Converting for Safari..." + +# Remove previous build +rm -rf "$OUT_DIR" + +# Convert — generates an Xcode project +xcrun safari-web-extension-converter \ + "$SCRIPT_DIR/dist/firefox" \ + --project-location "$OUT_DIR" \ + --app-name "Silent Send" \ + --bundle-identifier "com.silentsend.extension" \ + --swift \ + --macos-only \ + --no-open + +echo "" +echo "Safari project created at: $OUT_DIR" +echo "" +echo "Next steps:" +echo " 1. Open $OUT_DIR/Silent Send.xcodeproj in Xcode" +echo " 2. Select your Apple Developer Team in Signing & Capabilities" +echo " 3. Build and run (Cmd+R) to test in Safari" +echo " 4. To distribute: Product → Archive → Distribute App" +echo "" +echo "For App Store submission, you'll also need:" +echo " - App Store screenshots (1280x800 for Mac)" +echo " - Privacy policy URL" +echo " - App description and keywords" diff --git a/src/popup/popup.css b/src/popup/popup.css index df8f32c..4dc2ed8 100644 --- a/src/popup/popup.css +++ b/src/popup/popup.css @@ -623,6 +623,35 @@ body { font-size: 12px; } +/* Options tab */ +.setting-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 0; + border-bottom: 1px solid #f3f4f6; +} + +.setting-item:last-of-type { border-bottom: none; } + +.setting-label { + flex: 1; + min-width: 0; +} + +.setting-label strong { + font-size: 12px; + display: block; + color: #1f2937; +} + +.setting-label .setting-desc { + font-size: 10px; + color: #9ca3af; + display: block; + margin-top: 1px; +} + /* Footer */ .footer { padding: 8px 16px; diff --git a/src/popup/popup.html b/src/popup/popup.html index 33accc5..38c8635 100644 --- a/src/popup/popup.html +++ b/src/popup/popup.html @@ -33,6 +33,7 @@ + @@ -193,6 +194,54 @@
+ +
+
+
+ Secret scanning + Auto-redact API keys, tokens, passwords, SSNs, credit cards +
+ +
+ +
+
+ Auto-detect PPI + Warn about unconfigured personal data (IPs, addresses, paths) +
+ +
+ +
+
+ Auto-redact detected PPI + Replace detected PPI with placeholders on send +
+ +
+ +
+
+ Show highlights + Highlight substituted values in AI responses +
+ +
+ +
+
+ Document scan preview + Show PPI findings before uploading documents +
+ +
+ +
+ +

Sync, encryption, org, version history, import/export, and more

+
+
+