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.

Last updated: October 12, 2026Applies to the Carry extension and carry.md

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.

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 nocookiestabshistory<all_urls>access.

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. 1

    Inspect its site access

    Open chrome://extensions → Carry → Details. Under “Site access” you'll see carry.md, the providers you connected, and api.polar.sh if you've granted license activation access.

  2. 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 to carry.md/api/events. Pressing activate separately makes the disclosed request to api.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.