A Dark Vector Cognition product
Privacy and processing

Where your PDF goes, and what we keep.

Your file uses HTTPS for conversion. The Markdown or searchable PDF comes back to your browser. Results get no link. You keep every right to your documents.

Memory-only Data describes ordinary text-to-Markdown conversion. OCR uses private temporary files, removed after processing.

What happens to a file

The site runs on Vercel and the conversion service runs on Modal. We check your allowance before conversion. OCR uploads can go directly from your browser to the conversion service with a single-use upload session. Other uploads pass through our server function. The service checks the page limit and returns Markdown or a searchable PDF to your browser.

For ordinary text-to-Markdown conversion, our code does not save the file, the Markdown or the file name, and there is no results link to share. It holds the file in memory only: the server function reads an upload with a 4 MB cap and the worker reads a PDF from a link with a 50 MB cap, neither writes it to a file, and both release it, and the Markdown, when the response is sent, whether the conversion worked or not. Vercel and Modal run that code on their infrastructure. How their systems buffer a request, and how long they keep request logs, is set by them; we have not measured it, so we do not claim that nothing ever touches their disks.

OCR is different: it uses a private temporary directory for each worker request, containing the input PDF, working files and result. Our code removes that directory on success, failure and worker timeout, after ending the OCR process and its child processes. The result is returned in the response and has no saved public download link. A browser cancellation or server timeout does not prove the worker stopped at that moment; the worker has its own deadline and cleanup. Hosting providers may buffer requests and keep logs under their own policies, which we have not measured.

If you convert from a link rather than an upload, the worker fetches that link. The site you name sees a request from us, not from you.

One cookie of our own and no accounts

This site sets one cookie, dvc_v: a random id, kept for a year, that lets us tell a returning browser from a new one. It carries nothing about you, is sent only to this site, and is never shared. There is no login and no signup on the free tool, and nothing is gated behind giving us an address. A visitor who arrives from a Google ad can also receive Google's cookies, described under Visitors from a Google ad.

How we count visitors

Our own server counts each page view, with no third party in the path. For each day it keeps totals by page, by the site you came from, by campaign tag, by country and by device type (phone or desktop), and it counts known crawlers apart from readers. Unique visitors are estimated from a hash of your address and browser that is salted per day, so it cannot be joined from one day to the next. We keep the hash, not the address, and nothing about a file. The first page a new browser lands on, with the site it came from, is kept once against the cookie id. We also keep a short label for where that first visit came from, such as "search" or "reddit", so we can count where visitors, free keys and paid plans come from. That label, and the day of that first visit, are also written to the payment session when you subscribe and to your API key record, which we keep while the key exists. Every other count here expires after 400 days.

PDFMD in an AI assistant

The connector at pdfmd.dev/mcp receives the public PDF URL your assistant sends, processes it through the ordinary text-to-Markdown cloud path without OCR, and returns Markdown to that assistant. It does not receive your whole chat or read local attachments. The assistant provider handles the returned text under its own policy. No result is saved by our application or assigned a download link.

We record bounded tool names, outcomes, response-time ranges, identifiable assistant families and our own test markers in Vercel Web Analytics and runtime logs. These connector measurements contain no source URLs, document text, file names, API keys, IP addresses, cookies or raw user agents. Counts represent calls, not unique people. Retention: Vercel keeps the log entries for the period its plan sets, and Vercel Analytics keeps the events under its own terms. We set no longer period and copy the events to no other store. Aggregate history is used to compare usage over time.

Requests carrying Do Not Track or Global Privacy Control skip measurement, as do connector URLs containing query parameters. The existing rate limit and page accounting still apply. Removing the connector from your assistant stops its future calls. Updated 28 September 2026: added the assistant connector and its aggregate measurement.

What the counters hold

We count how many conversions succeed, how many fail, and how many pages were converted, so we know whether the tool works and what it costs to run. These are daily totals. They are not attached to a person, a file or a session, and a page count says nothing about what was on the page.

Analytics

We use Vercel Web Analytics, which is cookieless and does not fingerprint visitors or follow them across sites. Events carry fixed codes, page counts and output character counts in coarse ranges, never a file name, a link or any text from a document.

Visitors from a Google ad

If you arrive by clicking one of our Google ads, the page you land on loads Google's ad tag, so Google Ads can count whether the click led to a successful conversion, a free API key or a paid subscription. We keep a note in your browser for 90 days that you came from an ad; within that time, the tag loads again only on a page where one of those happens, at that moment: the converter, the free key page once your key is issued, or the checkout success page once your key arrives. Google receives the ad click id, the address of those pages without any query string, their titles, and which of those happened. Google Ads can set cookies (_gcl_au and _gcl_aw). Ad personalization is off. We never pass Google a file, a link you converted, any text from a document, your email address, your API key or any payment detail. For visitors who did not come from a Google ad, our pages load nothing from Google. Global Privacy Control, Do Not Track and our internal flag turn it off.

On those same pages, Google Analytics also records page views and fixed product events, including nonempty conversion results, empty results, successful copies and download requests. Page and referrer addresses exclude query strings and fragments. Event properties use coarse page and output-size ranges. Google Analytics can set _ga and _ga_* cookies to distinguish browsers and sessions. These counts do not identify people or prove that a download was saved. Google signals and ad personalization are off. Automatic form, search, scroll and download measurement are off. The same ad-visitor restriction and privacy exclusions apply.

Updated 11 October 2026: added Google Analytics for visitors from Google ads. Ordinary visitors still load nothing from Google.

Global Privacy Control

If your browser sends a Sec-GPC header, or the older DNT header, we honour it: our own server-side counters skip your visit, and the visitor count above records nothing and sets no cookie. When your browser also reports the setting to the page, as browsers with Global Privacy Control built in do, the analytics script and Google's ad tag are not loaded either.

Rate limiting

The free allowances are per address, so one caller cannot use them up for everyone. That needs a per-address tally, kept for the current UTC day and then expired. It is a protection, not a measurement. A subscriber who reaches us through the RapidAPI marketplace is counted under the RapidAPI user name that RapidAPI sends, not under an address: daily on the free plan, and for each calendar month on a paid plan.

Payments and API keys

Plans are paid on Stripe's hosted checkout page, so card details go to Stripe, not to us. We store an API key only as a hash, with its plan, its Stripe customer and subscription identifiers, its status and billing period, and when it was created.

Logs

Our hosts keep request logs, which include IP addresses. We do not export them or build profiles from them.

Changes and contact

If this page changes in a way that is less generous, the change will be stated plainly here. Questions to hello@darkvectorcognition.ai.