Privacy Policy
Last updated: 13 July 2026
DesignLoop is a Chrome extension that restyles live pages, exports them to Figma, and turns what you say into GitHub issues. This policy describes exactly what data the extension touches, where it goes, and what it never does.
There is no DesignLoop server. No analytics, no tracking, no account. Every request goes straight from your browser to a service you set up, using your own keys.
That describes the extension as it ships today, and it is the only product this policy covers. We are separately building an opt-in cloud tier — hosted storage for design systems and history, stronger models we run ourselves, and shared sessions for teams, none of which a browser tab can do on its own. It does not exist yet, no data is being collected for it, and it will not turn itself on: it will be a separate account you choose to create, published under its own policy before it accepts a single byte. The local extension described below stays exactly as it is.
Summary
On default settings, no data leaves your browser at all. The default model
(Nano) runs on your machine, and the default transcription mode is none.
Data leaves only when you take an explicit action — pushing an issue to GitHub — or turn on a feature that is off until you turn it on: the Plus or Pro cloud models, cloud transcription, Structure with AI, Web Speech transcription, or attaching audio. Each of those runs on an API key you supply, and calls the provider directly from your browser.
The one thing to understand: choosing a cloud model changes where your page goes. On Nano the page never leaves the machine. On Plus or Pro, the parts of the page you are working on are sent to OpenRouter under your key.
What the extension handles
Data that stays on your device
| Data | Where it lives | Notes |
|---|---|---|
| GitHub personal access token | chrome.storage.local |
Never synced across devices. Readable only by the extension's background service worker. Never sent to a content script or to any page. |
| OpenAI API key | chrome.storage.local |
Same handling as above. Only ever sent to api.openai.com as an Authorization header. |
| OpenRouter API key | chrome.storage.local |
Same handling as above. Only ever sent to openrouter.ai as an Authorization header. Unlocks the Plus and Pro models; without it they stay off. |
| Issue drafts | chrome.storage.local |
Deleted when you delete the draft. |
| Microphone audio recordings | Extension-origin IndexedDB | Deleted with the draft. Never uploaded unless you enable Attach audio or a cloud transcription mode. |
| Screenshots | Extension-origin IndexedDB | Uploaded only when you push an issue that includes them. |
| Captured page HTML, console errors, element metadata | chrome.storage.local, inside the draft |
Sanitized before capture (see below). Shown to you in the draft preview before anything is sent. |
| Chat / iteration sessions | chrome.storage.local |
Stored locally and deleted when you forget the session. Processed on-device on the Nano model; on Plus or Pro the element or page you are working on is sent to OpenRouter (see below). |
| Extracted design systems | chrome.storage.local |
Reading a page's colours, type and spacing is local computation. The passes that name those tokens (enrich, complete, leftover-colour mapping) always use the on-device model — by design, even when you have Plus or Pro selected for editing. Design systems never go to a cloud model. |
| Reference images attached in chat | Held in the session | Sent only to a cloud model, and only if you attach one. The Nano rung cannot read images, so an attachment is dropped rather than uploaded. |
The extension declares no <all_urls> content script. Nothing is
injected into a page until you click the toolbar action, press a keyboard shortcut, or
⌥ double-click an element. Page access is granted per-tab via activeTab.
Data that leaves your device — and only when you ask
1. GitHub (api.github.com, github.com)
When you press Push to GitHub, the extension sends the issue you reviewed —
title, body, labels, and any screenshots or audio you chose to attach — to the repository you
configured, using your personal access token. Screenshots and audio are committed as files to
your configured assets branch (default designloop-assets) because the GitHub REST
API cannot attach binaries to an issue directly. This is the extension's core purpose and
happens only on that explicit action.
2. OpenAI (api.openai.com) — off by default
Two independent, opt-in features send data to OpenAI using your API key:
- Whisper transcription uploads your recorded audio to OpenAI's transcription
endpoint. The default transcription mode is
none— no upload. - Structure with AI sends the transcript, the page URL, the selected element's
tag and selector, and up to 500 characters of captured console errors to
gpt-4o-minito format the issue. Default is off.
Neither feature works until you supply an OpenAI key and explicitly grant the
optional https://api.openai.com/* host permission from the options page. Your use of
the OpenAI API is governed by
OpenAI's privacy policy
and the terms attached to your own API key.
3. OpenRouter (openrouter.ai) — off by default
DesignLoop offers three models. Nano is Chrome's on-device model and is the default. Plus and Pro are cloud models reached through OpenRouter using your own API key, and they are what make the following leave your machine:
- Editing and sweeps. To change an element, the model has to see it: the element's markup and computed styles, its surrounding context, and — for a page-wide sweep — every element the sweep matched. On Plus and Pro, that goes to OpenRouter.
- Your instruction and the chat history of the session.
- Reference images you attach in the composer, and the crop of the element being edited.
- Cloud transcription. If you pick a transcription model, your recorded audio
is uploaded to
openrouter.ai/api/v1/audio/transcriptions.
None of this happens until you supply an OpenRouter key and grant the optional
https://openrouter.ai/* host permission from the options page. Which model runs
where is always shown on the model chip in the panel — it reads on-device · private
on Nano. Your use of OpenRouter is governed by
OpenRouter's privacy policy, the
upstream provider it routes to, and the terms attached to your own key.
4. Google (Web Speech API) — off by default
If you select the webspeech transcription mode, Chrome's built-in
SpeechRecognition streams your microphone audio to Google's speech servers. This is
Chrome behaviour, not DesignLoop behaviour, and the extension cannot intercept or prevent it.
It is why the default transcription mode is none.
5. Google Fonts (fonts.googleapis.com, fonts.gstatic.com)
When you rename a font family in the Design System tab, DesignLoop fetches that font from Google Fonts so the page can actually render in it. This sends the font name and, as with any Google Fonts request, your IP address to Google. It happens only when you change a font.
6. Chrome built-in AI (Gemini Nano) — on-device
On the Nano rung, chat and iteration use Chrome's Prompt API, which runs Gemini
Nano locally. Nothing is transmitted. Design-system naming always runs here regardless of the
model you picked. If the model is unavailable, the feature degrades to accepting raw
property: value CSS and no model is used at all.
The options page also reports the availability of Chrome's other built-in models (Proofreader, Rewriter, Writer, Summarizer, Language Detector). These are Chrome's, they run locally, and downloading them is a matter between Chrome and Google.
7. Images referenced by the page
When exporting to Figma, the extension fetches images the page references so it can embed them,
using credentials: 'omit' so your cookies are never attached to those requests.
8. The debugger permission — local only
Chrome lists this permission alarmingly, so: it is used for exactly one thing. Capturing a page
at several widths at once needs Emulation.setDeviceMetricsOverride, which is only
reachable through the DevTools protocol. DesignLoop attaches to the tab, resizes it, captures,
clears the override and detaches. It reads no network traffic and sends nothing anywhere.
Sanitization
Before any page HTML is stored in a draft, DesignLoop:
- replaces the
valueof every<input>and<textarea>with«redacted» - replaces
data-*attributes whose names look sensitive (token, key, secret, auth, session, and similar) with«redacted» - runs a secret-detection pass over the resulting markup
- truncates the result to 4 KB
You always see the sanitized draft in the side panel before it is sent anywhere. HTML capture, console capture, and full-viewport screenshots can each be disabled entirely in options.
What DesignLoop never does
- It never sends data to a server operated by the developer. There isn't one.
- It never collects analytics, telemetry, crash reports, or usage statistics.
- It never sells, rents, or shares your data with third parties.
- It never uses your data to train any model.
- It never transmits your GitHub, OpenAI or OpenRouter key anywhere other than, as an
authorization header, to
api.github.com,api.openai.comandopenrouter.airespectively. - It never places your credentials in a content script, where a web page could reach them.
- It never sends a page to a cloud model without you having selected a cloud model, supplied a key for it, and granted its host permission.
- It never uses your data for creditworthiness, lending, or advertising.
Limited Use disclosure
DesignLoop's use of information received from Google APIs, and any information obtained from a user's browser, adheres to the Chrome Web Store User Data Policy, including the Limited Use requirements. Data is used solely to provide the user-facing features described above and is never transferred except as required to provide those features at the user's explicit request.
Deleting your data
All extension data lives locally. Removing a draft deletes its audio and screenshots; forgetting a chat session deletes the session. The options page has two buttons under Data & storage: Delete stored work (drafts, exports, sessions, design systems) and Erase everything, which also takes your keys and settings with it. Uninstalling the extension removes the lot.
Data you have already pushed to GitHub, or sent to OpenAI or OpenRouter, is governed by those services and must be deleted there.
Permissions
A per-permission justification is published in the extension's Chrome Web Store listing, and is available on request.
Changes
Material changes to this policy will be published on this page and reflected in the "Last updated" date above, with a corresponding release note.
Contact
Questions or privacy concerns: email clasicwebtools@gmail.com.