design-pick privacy policy

Applies to: the design-pick Chrome extension (which works on its own) and the optional design-pick command-line tool (design-pick), together "design-pick". Last updated: 2026-11-06. This policy covers the current under-review Chrome extension 0.3.2, the previous 0.3.1 build, and the optional command-line tool. Version 0.3.2 is not publicly released. Existing MIT CLI functionality is unchanged. Public distribution of the 0.3.0 command-line release candidate is pending; npm currently has 0.2.0.

Publisher: lo9os, an independent software developer based in South Korea. Contact: contact@lo9os.org.

Summary

How it works (so you can judge the claims)

  1. You install the extension and click its toolbar icon on a tab. That click gives access to that one tab (Chrome's activeTab); Chrome shows no site-access prompt, and the extension asks for no all-sites permission. Basic element selection and copying are free on supported websites. In 0.3.1, source/DOM packets and open-tab rendered-property verification are also free. The 0.3.2 extension requires Pro for source-file/line hints and rendered-property comparison, alongside existing screenshot/pixel comparison. Basic selection and copying work without active Pro; the worker reads saved Pro status to select the optional advanced features. Existing MIT CLI functionality is unchanged. Chrome's restricted pages cannot run the picker regardless of license.
  2. The extension runs the picker, a file shipped inside the extension, in the top-level page of that tab.
  3. When you click an element, the picker sends its description to the extension's service worker, which builds a text packet. In 0.3.1 the service worker reads the page's own served files and source maps to find source files and lines. These reads remain disclosed here for that version. In the 0.3.2 review build, source reads are used only when Pro access allows advanced source context; the Free basic packet uses the already collected element details and rendered styles without fetching source files. Source reads are limited to the page's own website (no cookies or other credentials; no redirects; at most 3 seconds and 5 MB per file). A paired command-line tool may receive a pick from localhost / 127.0.0.1 and return its packet: this is available in 0.3.1 and requires Pro advanced-feature access through the 0.3.2 extension. On any other site, the extension builds the packet itself; the command-line tool receives nothing from that page.
  4. The picker copies the packet to your clipboard.
  5. Optional pairing: run design-pick --pair in a terminal; the extension asks you to confirm that a code it shows equals the code the terminal printed, and only then stores the pairing token.

Data the extension handles

Data Why Where it goes How long
The element you pick: tag, id, classes, data-* attributes, its inline style, the first 60 characters of its text, a CSS selector, its layout box and 24 computed style values, plus the page's path, fragment, query string, origin, viewport size, pixel ratio and light/dark setting to build the packet and, where available for the extension version and Pro status, to re-measure the element after your edit ("verify") to the extension's service worker; a paired tool on 127.0.0.1 may also receive a pick from localhost / 127.0.0.1 when the extension version and Pro status allow it (free in 0.3.1; advanced-feature access in the 0.3.2 review build); the packet goes to your clipboard without a paired tool: the last 20 measurements per tab, including path/fragment and origin but not query string, are kept in chrome.storage.session, in memory only, until you close the tab or end the browser session; the query is handled transiently. With a paired tool: the queue, including query string, stays until you delete .design-pick/, subject to the rotation described below; while the tool runs it also keeps the last 500 picks' snapshots in memory
The page's own served files and source maps (read-only) to name the source file and line (free in 0.3.1; Pro source context in the 0.3.2 review build) fetched by the service worker from the page's own origin; used to build the packet; not stored not kept
Pairing token for a command-line tool, per port (the extension’s own IndexedDB) — only if you pair; older chrome.storage.local records are copied to IndexedDB and removed from the legacy area after migration succeeds proves to the tool that requests come from your paired extension stays in the extension's storage the extension stops using it 24 hours after pairing and deletes it when its tool no longer answers; removed when you uninstall the extension
A pending pairing offer (chrome.storage.session) holds the offer while the confirm window is open stays in memory up to 2 minutes, cleared when you approve/cancel or close the browser
Pro: the license record: your license key, ids, dates and a revoked flag, the Polar activation id, and a signed feature-rights grant when provisioned (IndexedDB database design-pick-license, in the extension's own storage; never chrome.storage.sync) to unlock Pro features and re-check the license; the grant is verified locally to determine included new paid features stays in the extension's storage; the key and the ids Polar needs are sent to Polar as described under "Pro license check" until you press "Remove key from this browser" on the options page or uninstall the extension
Pro: a separate random install number in the same IndexedDB database supplies part of the device label used for license activation stays in the extension's storage; only its first 8 hex characters are sent to Polar as part of the device label until you clear the extension's storage or uninstall it; removing the license key does not delete this number
Pro: before/after screenshots of the element you pick, and a short cache of their sizes (IndexedDB database design-pick-shots, in the extension's own storage) to show before, after and the difference of an edit stays in the extension's storage; never sent anywhere the newest 60 pictures / 50 MB are kept, older ones are deleted; all are removed when you uninstall the extension. A picture can show whatever the page shows, including account data on a signed-in page
Clipboard the packet is written to the clipboard when you pick an element your clipboard (written by the page-side picker in response to your click; the extension has no clipboard permission) until you overwrite it
Two counters in the page's localStorage (dp-hint-v1, dp-picks) to show first-run hints only a few times the page's own origin storage until you clear site data

The extension does not enumerate your browsing history or read bookmarks, cookies, passwords or form-field values, does not read pages you did not click on, does not run in tabs you did not activate it on (other than the pairing script on localhost / 127.0.0.1 pages, which acts only on the path /__picker/pair), and does not load or execute remote code (the picker is a file shipped inside the extension package; the page's files it reads are treated as data and never executed).

Data the command-line tool writes on your computer

Network activity

Pro license check (design-pick Pro only)

Polar validation applies to Pro licensing. It is not part of the basic MIT command-line functionality. Extension element selection and basic copying remain available without active Pro. Source-file/line hints and open-tab property verification are also free in 0.3.1; those advanced capabilities require Pro in the 0.3.2 review build. The 0.3.2 worker reads the saved Pro status to choose these advanced features. With no saved key, the extension does not contact Polar.

When you enter a license key on the extension's options page, or activate or use the Pro command-line tool, it contacts Polar (polar.sh), the payment and licensing provider, at api.polar.sh over HTTPS. What is sent:

No page content, element data, project files, screenshots, signed-in state or CI results are ever sent. As with any HTTPS request, Polar also sees your IP address; payment and licensing data are handled by Polar under its own privacy policy.

Polar's validation response may also include customer profile and billing fields, such as email, name, billing name and address, tax identifier and a payment-method identifier. The extension and Pro command-line tool receive and parse that response transiently. They use the license fields and signed-grant metadata; the unused profile and billing fields are not cached, displayed or forwarded by design-pick.

When the extension asks: when you press "Activate" or "Re-check now" on the options page; when the browser starts; and from a background timer that wakes every 6 hours and only contacts Polar if a check is due — every 3 days during the first 30 days after activation, then every 30 days. If Polar cannot be reached, Pro keeps working for up to 14 more days with a warning. Each call is limited to 5 seconds; if Polar asks the extension to slow down, it honors a valid retry delay up to 24 hours; an invalid delay defaults to 60 seconds. "Remove key from this browser" deletes the saved record and, when Polar can be reached, releases that browser's activation. Clicking the toolbar icon does not itself contact Polar: it reads the saved answer. In 0.3.2 the pick and verification worker also reads saved Pro status to select advanced features. A saved key can still be validated by the options page or due background checks described above; without a saved key, the extension does not contact Polar.

When provisioned, the local license record also contains a signed feature-rights grant: opaque license, organization, benefit, order and product identifiers, a hash binding it to the license key, a signing-key and policy identifier, and the cutoff for included new paid features. It arrives with the normal Polar license response and is verified locally after refresh or restart. It contains no page content or screenshots and adds no network service. Production issuance of these grants is not yet enabled for the new one-time offer.

The command-line tool asks once when you run design-pick activate <key>; afterwards when design-pick Pro starts and the saved answer is older than 3 days (during the first 30 days after activation) or older than 30 days (after that), and when you run design-pick license refresh. Its saved answer (the key, a masked key tail, ids, dates, the revoked flag and any provisioned signed feature-rights grant described above) is stored in license.json in your per-user configuration folder (~/Library/Application Support/design-pick/ on macOS, $XDG_CONFIG_HOME or ~/.config/design-pick/ on Linux, %APPDATA%\design-pick\ on Windows), mode 0600; design-pick license status shows it masked and makes no network call. The extension and the command-line tool each keep their own saved answer and neither reads the other's key.

In CI (CI=true and the DESIGN_PICK_LICENSE_KEY environment variable, for design-pick ci compare and ci init) the key is sent in the same way on every run, nothing is activated and nothing is written to disk; design-pick ci measure needs no license and sends nothing.

Source: the license modules of design-pick Pro (lib/license-core.mjs, lib/license.mjs, extension/license.mjs).

What we never do

We do not sell or transfer user data to third parties, we do not use it for advertising, creditworthiness or lending, and we do not use it for anything unrelated to the single purpose of the tool (pointing an AI at the right source code). Because design-pick itself sends nothing to us or to third parties (apart from the Pro license check to Polar described above, and the requests listed under "Network activity" that only reach the page's own website), there is nothing for us to share.

Your choices

Security

The local server accepts only loopback Host and Origin headers; requests from your extension must carry the paired token; the extension's service worker forwards only a short fixed list of paths. Details and limits (for example, what the token does not protect against) are in the project README, section "Security".

Children

design-pick is a developer tool and is not directed at children.

Changes

Changes to this policy will be published at this URL with a new "Last updated" date.