Privacy
Privacy Policy
Carry processes your chats and files on your device and never uploads them. Verified compatibility settings download from carry.md, with an off switch. No Carry account is required. The extension sends anonymous usage counts — numbers, never content — and you can turn them off. Website analytics is described below. Here is what each request contains.
- 0files uploaded
- 0accounts
- 0conversation titles sent
- 0conversation bytes uploaded
The one-sentence policy
Carry processes your conversations and files on your device and never uploads them. Compatibility settings download from carry.md. License activation separately sends limited license metadata to Polar, the payment platform, only when you press activate —see exactly what it sends.
Carry is a Chrome (and Chromium browser) extension that captures your ChatGPT, Claude, and Grok conversations and writes them into a local folder you choose — a plain folder or your Obsidian vault — as Markdown files. It runs entirely on your own device.
Where your data goes
One sync, traced end to end. Every hop happens inside your browser, on your machine — and there is no fourth stop.
Their server
The provider
chatgpt.com · claude.ai · grok.com — read through the session you're already logged into. No password, no API key.
Your browser
Carry
Held in memory for one sync — long enough to write the file, then discarded. Never stored, never logged.
Your disk
Your folder
Plain Markdown files, in a folder you own. The only place your data lands.
lisbon-vs-barcelona.md✓
What Carry touches, and where it goes
Each kind of data has a one-glance answer. Expand it for the full detail.
Compatibility updatescarry.md → your browser
Carry downloads verified compatibility settings from carry.md to support fixes the maintainer explicitly publishes. All executable logic stays in the installed extension. Automatic compatibility updates are on by default; you can turn them off in settings. Requests send no conversation content, files, vault information, license data or installation identifier, and use no cookies or provider credentials. The static host, Vercel, sees ordinary request metadata, including your IP address and User-Agent. Accepted settings and update status are stored in your browser. These checks are separate from license activation.
Automatic: on by defaultCan be turned off in settingsDownloaded data, not code
Anonymous usage countscarry.md → Carry’s own analytics server (Trail), Umami and OpenPanel
To see which parts of Carry work and where people get stuck, the extension
sends anonymous usage counts to carry.md/api/events, which passes them
to Carry's own analytics server (Trail, at trail.holdon.site), Carry's self-hosted
Umami and Carry's self-hosted OpenPanel (at stats.holdon.site). Each event is a name from a fixed list —
a finished sync, a setup step, a failed license activation, a changed setting, a
pressed buy, retry or history button —
plus numbers and fixed labels: how many items were saved by kind (conversations,
files, artifacts, project files) and how many failed, a short failure category,
roughly how many conversations were waiting when you opened the popup,
which provider, which setup step, which setting was switched and to what, whether
you are on the trial, licensed or expired, the extension version, and your
browser's User-Agent. Each batch also carries a few coarse facts about the
install: roughly how long ago it was installed, whether it started fresh or as
an update and from which minor version, which trial week you are in, whether
your folder is connected or needs reconnecting, which providers are connected,
and which Chromium browser you use. Once a day it adds a health check in coarse
ranges: how many conversations are waiting to retry or need attention, how many
automatic syncs ran, and how long since the last save and the last working
folder connection. When your folder needs reconnecting, it counts whether you
reconnected and roughly how long it had been waiting. Failures carry a short
category and the step that failed (listing, fetching, formatting, writing). A
random install ID made on your device lets these services count installs; Trail and
OpenPanel store that ID with each count. It is not your license label and is never sent to Polar. Usage counts never include conversation
content, titles, ids or URLs, project names, file names, vault paths, license keys
or error messages. carry.md checks every event against the same fixed list and
drops anything else. It replaces your IP address with a private address derived
from that random install ID before forwarding events, so these analytics services
get no location from your IP; Vercel, which hosts carry.md, still sees ordinary request metadata,
including IP address. No cookies are used. Turn off “Share anonymous usage
counts” in settings → Privacy and nothing more is sent.
Automatic: on by defaultCan be turned off in settings → PrivacyNumbers and fixed labels, never content
Your conversationsmemory → your disk
During a manual or scheduled capture, Carry reads conversations from each provider you connected, using the session already open in that browser. Content is held in memory only long enough to write it to your folder, then discarded. It is written to your disk and nowhere else — never uploaded, relayed, cached, or logged off your device.
Written to: your folder onlyUploaded: neverRetained by Carry: no
Your settings & sync statebrowser storage on your device
Carry keeps your theme and capture preferences, a recent-inbox cache
(conversation ids, titles, provider, timestamps and state), the full-history
backfill cursor, a sanitized license record, and a few small internal flags
(a per-install device label, a random install ID for usage counts, and a
dismissed-notice flag) in
chrome.storage.local. The chosen folder handle and
per-conversation/project sync records (including ids, titles, timestamps and
local file paths) live in the extension's IndexedDB database. Both stores stay
inside your browser profile on this device. Carry deliberately never uses
chrome.storage.sync, which would replicate data to your browser
vendor's servers.
Lives in: chrome.storage.local + IndexedDBReplicated to any server: never
Your folder handleheld by your browser
The permission to write to the folder you picked is granted by you through the browser's File System Access API and held by the browser. Carry uses it only to write capture files into that folder.
Granted by: you, via the browserUsed for: writing captures only
Your provider sessionin memory, provider-bound
Carry never asks for or stores provider passwords or API keys. It relies on
the login cookies already held by your browser; Carry does not read or copy
those cookies. ChatGPT's session endpoint supplies a short-lived bearer access
token, which Carry holds only in memory for the active provider operation and
sends only back to chatgpt.com. It is never written to extension
storage, your capture files, Polar, or a Carry server.
Provider passwords & API keys asked for: noneSession credential persisted: never
Your license keyyou → Polar, at activation
If you buy a license, pressing activate sends exactly three things to Polar,
the payment platform: the license key you typed, Carry's Polar organization id,
and a random install label (like carry-chrome-x7k2p9) so you can
manage your device activations. It is a label Carry makes up, not a hardware
fingerprint. Re-activating an existing license also sends the activation id
Polar issued. That is the whole list — it happens only when you press activate;
Carry never contacts Polar in the background, and no conversation content,
cookies, or browsing data is ever included. Carry stores only a one-way SHA-256
digest of the key, a masked display value, Polar's activation id, and the
activation timestamp — all on your device, alongside a first-run trial
timestamp and the random install label (kept under its own key). A raw key
stored by versions through 0.2.0 is migrated to that sanitized record on
first read.
Sent: key + organization id + install labelRaw key stored by Carry: no
Every permission, explained
Carry requests access to a provider's required sites only when you click Connect for that provider — not at install. Claude access covers claude.ai. Separately, required https://carry.md/* access allows compatibility downloads. The first update with this feature may ask you to acknowledge new permissions. Turning updates off stops those requests; it does not remove the permission.
“Carry” wants additional permissions
- Read data needed for ChatGPT capture on
chatgpt.com - Read data needed for Claude capture on
claude.ai - Read data needed for Grok capture on
grok.com - Nothing — until you connect a provider, Carry cannot read any site.
Each line appears only when you connect that provider, and it is scoped to that provider's required origins and nothing broader.
Per-provider site accessrequested at connect time
Lets Carry read your conversations from a provider you chose to connect (Chrome may word it as “read and change your data”), scoped to that provider's required origins and nothing broader. ChatGPT uses chatgpt.com; Claude uses claude.ai; Grok uses grok.com.
storagelocal-only settings
Holds the local-only settings and sync state described above, in chrome.storage.local and IndexedDB. It never uses chrome.storage.sync.
alarmsscheduled capture & backfill
Schedules automatic capture checks while Chrome is open and resumes an in-progress full-history backfill after the extension's background worker sleeps. It does not create system notifications.
idleskips capture while you're away
Lets Carry skip the scheduled capture check while the browser is idle or locked, and run one catch-up check when you are back. It reads only Chrome's active/idle/locked state and is never used for tracking or notifications.
api.polar.shoptional, at activate only
Requested only if Polar's normal cross-origin response cannot complete after you press activate. It is used solely for the license request described above and is never contacted in the background.
scriptingGrok's tab-bound capture only
Used only for the tab-bound capture path a provider requires when it blocks background requests (Grok). It runs the capture in that provider's own tab; it does not inject anything into unrelated sites.
Carry requests nocookiestabshistoryaccess.<all_urls>
What Carry does not do
- No account, sign-up, or login to Carry itself.
- No upload of your conversations or files to Carry. Compatibility settings download from carry.md, anonymous usage counts go to carry.md unless you turn them off, and license activation separately talks to Polar.
- No ad trackers, tracking cookies, or fingerprinting in the extension. Its only analytics are the anonymous usage counts described above, with an off switch. Website analytics is described below.
- No advertising, and no sale or sharing of your conversation content.
- No use of your data for advertising, creditworthiness, lending, or any purpose unrelated to capture, compatibility updates, license operation and counting how Carry is used so it can be improved. Carry never uploads conversation content; license metadata goes only to Polar when you press activate.
Don't take our word for it
A policy is a promise; architecture is a fact. Every claim on this page is checkable in a few minutes.
- 1
Inspect its site access
Open
chrome://extensions→ Carry → Details. Under “Site access” you'll seecarry.md, the providers you connected, andapi.polar.shif you've granted license activation access. - 2
Watch the network
Open DevTools on the extension while you sync. Capture requests go to the connected providers' listed origins. Compatibility checks download signed JSON from
carry.md/providers/config/(orcarry.md/provider-repairs/for older extension versions). Usage counts are small, readable JSON posts tocarry.md/api/events. Pressing activate separately makes the disclosed request toapi.polar.sh.
The fine print
This website
This site (carry.md) serves static pages and signed compatibility settings through Vercel. The host receives ordinary request metadata, including IP address and User-Agent, for page visits, compatibility downloads and the extension's usage counts. This policy does not promise a specific hosting-log retention period.
This site uses Google Analytics 4, Carry's own analytics server (Trail, at trail.holdon.site) and self-hosted OpenPanel (at stats.holdon.site) to count pageviews, referrers, install clicks, and checkout clicks. Google Analytics may set cookies; Trail and OpenPanel do not set cookies. For each page, Trail gets the page path, the referring site's domain (never the full referrer URL), your browser's language, and only these campaign parameters:utm_source, utm_medium, utm_campaign,utm_term, and utm_content. Other query parameters and fragments are never sent. It also counts which store button you clicked and where it sits on the page, checkout clicks, when the pricing section comes into view, and whether you read half or most of a blog post. Its script keeps a random visitor ID and any events not yet sent in your browser's storage, so an event made just before you leave a page is sent on your next visit. Like any web server, Trail receives your IP address and User-Agent with each request. OpenPanel keeps the same five campaign parameters and removes every other query parameter and fragment from page and referrer URLs. It counts store and checkout clicks, receives your IP address and User-Agent with each request, and records browser and device information; session replay is off. Website analytics does not receive conversation content or license keys. The extension's usage counts go to the same Carry projects in Trail and OpenPanel, labelled as extension activity, and to their own Umami site. Its random install ID is separate from website visitor identity; a website visit is not automatically linked to an extension install. Extension usage counts aredescribed above.
Licensing
Carry's paid license is sold through Polar, the merchant of record. Checkout happens on Polar's own pages — Carry never sees your payment details, your name, or your email. When you activate a license, the extension sends Polar the license key you typed, Carry's Polar organization id, and a random install label; re-activating also sends the activation id Polar issued. That request happens only when you press activate — the api.polar.sh permission is itself optional and requested at that click — and it never carries any conversation content. The purchase itself is covered by Polar's privacy policy.
Retention and deletion
Local settings and sync records remain in the extension's browser storage until you clear extension data or uninstall Carry. Uninstalling removes that browser-held state; Markdown and downloaded files already written to your chosen folder remain there until you delete them. Polar retains purchase and activation records under its own policy; device activations can be managed through Carry's linked Polar customer portal.
Chrome Web Store Limited Use
Carry's use and transfer of information received from provider APIs adheres to the Chrome Web Store User Data Policy, including its Limited Use requirements. Provider content is used only to perform the user-facing capture and local file-writing features described on this page.
Children
Carry is not directed to children.
Changes to this policy
If Carry's behavior changes in a way that affects this policy — for example, an optional automatic-capture feature — this page will be updated and the “last updated” date above will change. Any such change will preserve the core promise: your conversations stay on your device.