For reviewers · Permissions

Permissions, justified

The complete, authoritative permissions reference. For each item we state why it's needed, the concrete feature it enables, and the exact chrome.* API it backs.

Version 1.0.12 Manifest V3 Min Chrome 116 12 API perms · 1 host perm
Single purpose

Convert and normalize web links into affiliate links per the user's configured rules, and optionally broadcast them to user-configured destinations (Telegram bots and HTTP webhooks).

Every permission maps directly to this purpose or to an ancillary feature (Deal Feed, Mobile Preview, Redirect Tracer, reminders, built-in tools) that supports the same workflow.

Exact manifest declaration

"permissions": [
  "storage", "tabs", "scripting", "contextMenus",
  "clipboardWrite", "notifications", "alarms",
  "webNavigation", "webRequest", "sidePanel",
  "offscreen", "declarativeNetRequest"
],
"host_permissions": ["<all_urls>"]
There is no activeTab permission. The active tab's URL is read via the already-declared tabs permission for explicit user actions only.
storagechrome.storage.local / .session

Why. The extension keeps all of your configuration, history, reminders, and a redirect cache on your own device. Nothing is synced to a server and there is no login — the foundation of the "local-first" design.

Feature. Persisting store rules, networks, shorteners, integrations (Telegram/webhooks), reminders, conversion history, and the random analytics client id. Transient cross-worker state lives in session storage so it does not survive a browser restart.

Least privilege: no chrome.storage.sync and no unlimitedStorage. Stored credentials stay on your device and are never uploaded.
tabschrome.tabs.create/update/remove/query/get

Why. To convert the page you're looking at, the extension reads the active tab's URL. To resolve JavaScript-driven redirects accurately, it opens and then closes short-lived hidden background tabs. Reminder "Open URL" buttons open that URL in a tab.

Feature. Prefill/convert the current tab's link; open a reminder's URL on notification click; create/update/remove hidden tabs to follow JS redirects in the Convert pipeline and Redirect Tracer; query the active tab for keyboard shortcuts.

Least privilege: hidden trace tabs are created only for user-initiated redirect resolution, torn down immediately, and backstopped by a watchdog alarm. The extension does not read or scrape page content from these tabs.
scriptingchrome.scripting.executeScript

Why. Copying the converted link must work even where the primary offscreen-document clipboard path is unavailable.

Feature. Fallback clipboard write — inject navigator.clipboard.writeText into the active tab only, and only when the offscreen path cannot be used.

Least privilege: targets the active tab only, runs only on a user-triggered copy, writes a single string (the link), and reads nothing back from the page.
contextMenuschrome.contextMenus.create/onClicked

Why. So you can act on a link or page directly from the right-click menu without first opening the popup.

Feature. Three explicit right-click items: Process with dealsgroup, Preview in Mobile Sidebar, and Remind Me….

Least privilege: nothing runs automatically; each item requires an explicit click.
clipboardWriteClipboard access (offscreen path)

Why. The core output of a conversion is a link you can paste anywhere.

Feature. Copy the converted affiliate link (and, in the rich-text editor, copy-as WhatsApp / Telegram / Markdown / Plain). The primary path uses a short-lived offscreen document calling execCommand('copy').

Least privilege: write-only. No clipboardRead permission is requested.
notificationschrome.notifications.create/getPermissionLevel/onButtonClicked

Why. To tell you the result of a conversion and to deliver reminders even when the popup is closed.

Feature. Show a conversion/result notification, show reminder notifications (with an "Open URL" action button), and check the OS-level permission state before notifying.

Least privilege: generated only in response to your actions (a conversion you ran, or a reminder you scheduled).
alarmschrome.alarms.create/getAll/clear/onAlarm

Why. Reminders and scheduled messages must fire at the times you choose, surviving service-worker shutdowns. A watchdog timer also guarantees hidden trace tabs are cleaned up.

Feature. Schedule reminders and scheduled messages with repeat options (none/hourly/daily/weekly/monthly/custom); missed reminders fire on startup within a 24-hour grace window. A watchdog alarm closes any orphaned hidden trace tab after a restart. Alarm ids are namespaced (dg.reminder.*, dg.tracer.watchdog).

Least privilege: alarms are local timers only; they trigger no network activity by themselves.
webNavigationchrome.webNavigation.onCommitted

Why. Some links redirect via JavaScript rather than an HTTP header. To show an accurate redirect chain, the extension observes navigation events on a tab it opened for that trace.

Feature. Detect JS-driven redirects in the Redirect Tracer by listening for committed navigations on the hidden tab the user initiated.

Least privilege: the listener follows a user-initiated trace; it is not used to monitor your general browsing.
webRequestchrome.webRequest.onHeadersReceivedread-only

Why. For cross-origin 3xx redirects, fetch hides the destination as an opaque redirect. To follow the chain the extension reads the Location response header on those hops.

Feature. Read the Location header on cross-origin 3xx redirects so the Redirect Tracer / Resolver can follow the chain. The listener is added and removed per hop.

Least privilege: read-only — it never modifies, blocks, or redirects traffic. It reads only the Location header, only during a user-initiated resolve/trace. Blocking/modifying webRequest is not used.
sidePanelchrome.sidePanel.setOptions/open

Why. Mobile Preview renders sites in a side panel so you can see how a destination page looks on a phone.

Feature. Open the Mobile Preview side panel from the keyboard shortcut, the context menu, or the Tools area.

Least privilege: the panel opens only on an explicit user action.
offscreenchrome.offscreen.createDocument/hasDocument/closeDocument

Why. MV3 service workers have no DOM and cannot use the Clipboard API directly. An offscreen document provides the minimal DOM required to write to the clipboard reliably.

Feature. Spawn a short-lived offscreen document to perform the primary clipboard write.

Least privilege: created on demand, does a single copy, and is closed. It loads no remote code (strict CSP; bundled assets only).
declarativeNetRequestdynamic rule (initiatorDomains scoped)

Why. Many sites send X-Frame-Options / Content-Security-Policy headers that forbid being shown in a frame. To preview those sites at real device dimensions, the extension uses a dynamic rule that relaxes those headers only for frames its own pages create.

Feature. A single dynamic rule that strips X-Frame-Options and Content-Security-Policy and injects a mobile user-agent + sec-ch-ua-mobile, applied only to sub_frame requests initiated by the extension's own pages. Registered only when you open Mobile Preview and removed afterward.

Least privilege: the rule is scoped to the extension's own frames (initiatorDomains = extension id) and never affects your normal browsing of any other site.
<all_urls>host permission + content script

Why. The core workflow is "convert any link." Because deals can come from any retailer or domain, the extension cannot enumerate hosts in advance: you must be able to right-click any link or page, Mobile Preview must navigate to any user-supplied URL, and webRequest / webNavigation must observe the user-initiated redirect-trace tab, which may land on any host.

Feature. Convert from any page (content script + context menu), Mobile Preview of any URL, and redirect tracing across any host. The content script matches <all_urls>, runs at document_idle, in all_frames.

The content script does NOT read or exfiltrate page content. Its optional auto-detect highlight / auto-process behavior is OFF by default. It runs only when you explicitly enable it and the page's host matches a store rule you configured. <all_urls> is requested because the set of retailer domains is open-ended and user-defined; narrowing it would break the single purpose.

Keyboard commands (commands)

Four user-customizable shortcuts (remappable at chrome://extensions/shortcuts). They use chrome.commands plus chrome.tabs.query for the convert/preview shortcuts.

Windows / LinuxmacOSAction
Alt+Shift+LCommand+Shift+LOpen the popup
Alt+Shift+KCommand+Shift+KConvert the current tab's link
Alt+Shift+MCommand+Shift+MOpen Mobile Preview
Alt+Shift+OCommand+Shift+OOpen the dashboard

Permissions we deliberately do NOT request

To minimize attack surface and respect privacy, the extension intentionally omits the following:

activeTab

Not requested. The active tab's URL is read via tabs for explicit user actions only.

chrome.storage.sync

Config and credentials stay on your device, never synced to Google's servers.

unlimitedStorage

Operates within the standard ~10 MB quota and prunes history + redirect cache.

geolocation

Never accesses your location.

cookies

Does not read, write, or enumerate cookies via the cookies API. Session cookies are sent only to a hardcoded shortener host allowlist.

blocking webRequest

Used read-only (onHeadersReceived); framing handled by a scoped DNR rule.

clipboardRead

Clipboard access is write-only.

management · downloads · history · bookmarks · proxy · debugger · nativeMessaging · identity

None requested; none needed for the single purpose.

Review follow-ups

For permission-related questions during Chrome Web Store review or general support:

[email protected]