Your AI, your key.
Not ours in between.
PDFMacro ships no AI that writes text. Chat with PDF, Summarize, Write with AI and Translate run on the AI you choose: your own API key with OpenAI, Anthropic or Google, or a model on your own computer. This page says where your text goes in each case, and where it never goes.
Three places, and one that is never used.
OpenAI, Anthropic (Claude), Google Gemini, OpenAI-compatible. Requests go from your browser straight to the provider's address and are billed to your account. The app asks before the first one and lists every one in Settings → AI.
Ollama or LM Studio. Document excerpts go to that endpoint — your machine — and the code refuses to send them anywhere else. Nothing reaches an AI company.
Never. PDFMacro runs no AI and no server for it, so there is nothing of ours in between to see your key, your question or your document.
Two small helpers that write nothing.
They match what you type to a tool and find names and sensitive details. Both run in this tab and send nothing anywhere. The repository id is kept for auditing; the capability leads. The larger of the two is ~110 MB.
Understanding what you type in the command bar, and Pre-discovery search
Finding names and other sensitive details in a document, and Privilege review
The two default models come to ~155 MB together, and consent is asked per model rather than once for all of them — agreeing to the smaller one for the command bar is not agreeing to the larger one for entity recognition. They are different sizes bought for different reasons.
Readiness also means “everything you can actually use is ready”: both features the second model powers are part of the licence, so a free account is never told to fetch it.
Weights live in your browser's Cache Storage, on this device — not in your account. So they stay put, and they also stay subject to your browser: clearing site data, a private window, or the browser reclaiming space will remove them, and you will be asked once more rather than charged the bandwidth silently.
Every request to your provider is listed on your device.
Asked once, per provider.
Before the first request to a provider, the app says what will be sent and to whom, and sends nothing until you agree.
Logged, without the text.
Settings → AI lists each request: the provider's address, the model, the sizes in and out, the status and the time. Never what was sent.
Your key stays in this browser.
It is sent only to your provider's own address, and any request outside that address is refused in code. Forget key removes it.
Point it at a bigger model you already run.
For anyone who wants nothing to reach an AI company: run the model on your own computer and connect it in Settings → AI.
Paste an endpoint — http://localhost:11434 for Ollama, http://localhost:1234 for LM Studio — and press Test connection. That click is the only thing that fetches. Nothing dials out on page load, on import or on a timer, and a saved endpoint is remembered as text that becomes a live connection only when you press the button again.
Once connected, Chat with PDF, Summarize, Write with AI and Translate send document excerpts to that endpoint and nowhere else. That is enforced rather than intended: every request URL is checked against the origin you configured, and one outside it throws instead of being sent.
PDFMacro never pulls models onto your server. It lists what is already installed; when a server has none, it prints the command for you to run yourself, sized for the machine it detected:
ollama pull qwen2.5:7b4.7 GB · your machine can run a 7B model comfortablyollama pull llama3.2:3b2.0 GB · a good balance for this machineollama pull llama3.2:1b1.3 GB · small enough to run smoothly hereconnectedThe server answered and listed its models — exactly what `ollama list` shows, with no editorialising. Press “Use this server” and inference moves there for Chat with PDF and Summarize.
origin-rejectedSomething is listening and it refused this page's origin. For Ollama, set OLLAMA_ORIGINS to this app's origin and restart it. In LM Studio, enable CORS in the server settings.
unreachableThe server is not running, the port is wrong, or the browser blocked the request before it left — a page served from a public address can be stopped by the browser's private-network rules before the server's own configuration is even consulted.
The middle case is the one worth knowing about in advance. A server that is running but has not been told to accept this app looks, to page JavaScript, exactly like a server that is not running — both surface as the same fetch failure. A second probe separates them, because a present-but-refusing server still returns an opaque response while an absent one throws. That is what lets the app name the actual problem instead of shrugging.
Questions about your own AI.
Does PDFMacro include an AI model?
Where does my document go when I use my API key?
Where is my API key stored?
Can I keep everything on my own machine?
Which AI models does PDFMacro still download?
Why does my own server need OLLAMA_ORIGINS set?
Will PDFMacro download models to my Ollama server?
Connect your AI in a minute.
Paste your key, or point it at Ollama. Then open the request log and see exactly where each request went.