Privacy

What we send, and what we keep.

This page was written by reading Fetchi's source code, not by filling in a template. It describes what the software actually does today. Where the honest answer is unflattering, it is written down anyway.

Last updated 4 September 2026Applies to the Fetchi Mac app and this website

The short version

  • Fetchi is not an on-device assistant. To answer you, it sends what you said to our server, which passes it to Anthropic's Claude.
  • Your wake word and speech-to-text run entirely on your Mac. Nothing is transmitted before you say the wake phrase — the code that listens has no network access at all.
  • Our server is a metering layer, not a memory. It stores no prompt, no transcript, no screenshot. There is no database column anywhere in it that could hold one.
  • Things Fetchi remembers about you live in one unencrypted SQLite file on your Mac. We cannot read it. Neither can anyone else, unless they have your Mac.
  • By default Fetchi also sends window titles and on-screen text with each request, and it has an off switch. Saved memories used to be sent to OpenAI to be indexed as well; they are not, as of 24 August 2026 — they stay on this Mac unless you deliberately turn indexing on.
  • On a paid plan the realtime voice lane is on by default, and it streams your raw microphone audio to OpenAI. This page said the opposite until 12 August 2026. It was wrong.

What we collect, and what we do not

Plainly, because the rest of this page is detail and this is the part you came for. Fetchi runs in two places — your Mac, and a small server we operate — and they collect very different amounts. The server collects the minimum needed to know who you are, to meter what you spend, and to bill you. It does not collect what you say or what is on your screen.

What our server collects, why, and how long we retain it

Data our server collects, the reason, and how long it is retained
What we collectWhyRetention
Your email address, and an account token To have an account at all, and to reach you about it Until you ask us to delete the account
A usage ledger: which model ran, how many tokens moved, what it cost, and when. One row per request. To meter the plan you bought and stop the month at the cap Until you ask us to delete the account
Your plan, your credit balance, your Stripe customer id, and — once your first subscription event arrives — the date your plan next renews To sell you a plan, to honour credit you bought, and to be able to tell you when you are about to be charged again Until you ask us to delete the account
Push-notification endpoints, if you connect the phone companion So a notification can reach that phone. Nothing is registered unless you pair one. Until you unpair, or the push service reports the device gone
Four product event names with tiny counts — app launched, onboarding step, onboarding complete, active today — only if you opt in To know whether people come back. The server rejects any event name outside those four. Until you ask us to delete the account
Website visits: one of three event names, the page path, and the referring site's hostname To know whether anyone visited and whether the download worked Kept indefinitely. There is nothing in these rows that identifies you, so there is nothing in them to delete on request.
Standard web-server access logs: IP address, path, status code Every web server writes these; ours is not special As long as our host keeps them

What we do not collect, and structurally cannot. Our server processes your requests without retaining them. There is no prompt, no transcript, no reply, no screenshot, no window title and no memory stored on it — not as a policy we are promising to follow, but because there is no column in the database that could hold one. We also never receive your card number (Stripe collects it, and there is nowhere in Fetchi it could be typed), your passwords for connected services (Composio holds those tokens), or the contents of your local Fetchi database.

Three claims worth checking rather than trusting

  • Your speech is turned into text on your Mac, in the default configuration — by a local Whisper model, with the audio never leaving the machine. The exception is the realtime voice lane, which is on by default on paid plans and streams your audio to OpenAI. It is described in full below, and it is the reason this bullet says "in the default configuration" rather than "always".
  • Screenshots are not retained anywhere. On your Mac the capture is written to a temporary file, encoded, and the file is deleted in the same function that made it. Our server never stores it. It is sent to Anthropic to answer that one question, and their retention governs from there.
  • Usage telemetry is off unless you turn it on. The onboarding privacy step defaults to Privacy Mode; with no explicit choice the app sends nothing. Opting in is an act, not a default, and the Settings switch overrides whatever you picked at onboarding.

Who we share it with

We do not sell your data and we do not share it for advertising. It reaches the companies listed under the companies that handle your data — each for one job, each because the product cannot work without them — and nobody else.

What stays on your Mac

The wake word

Fetchi's microphone is open continuously when the wake word is enabled, which it is by default. Every audio frame is scored on your Mac against a local model to decide whether you said the wake phrase. Nothing is transmitted during this. The module that does the listening imports no networking library of any kind — it can score audio and hand it to the rest of the app, and that is the entire set of things it can do. Audio frames that do not trigger the wake word are discarded in memory and never written to disk or sent anywhere.

The one exception is a one-time download: on first run Fetchi fetches the pretrained wake-word model files. That is a download of model weights to your machine, not an upload of anything from it.

If you would rather the microphone not be open at all, turn the wake word off and use push-to-talk (hold ctrl+option). Fetchi then hears nothing until you hold the key.

Turning your speech into text

Speech-to-text runs on your Mac using a local Whisper model. In the default configuration the audio of your voice never leaves the machine — only the text it becomes does, and only then as part of a request you triggered.

The exception, and it is a big one. This page used to describe it wrongly. Fetchi has a realtime voice lane: your raw microphone audio streams directly from your Mac to OpenAI over a websocket, and speech comes back as speech. When it is running, the paragraph above stops being true — your voice itself leaves the machine, not just the text of it.

Until 12 August 2026 this page said that lane was "off by default and has to be deliberately switched on". That was not true of the app we ship. In the downloaded app the lane defaults on, and it runs whenever the account is on a paid plan and signed in. It is the default voice for conversation on Pro and Max. A free account never reaches it, and a build using your own Anthropic key defaults it off.

We would rather correct this loudly than quietly. If you do not want your audio going to OpenAI, turn the realtime voice lane off in Settings and Fetchi falls back to on-device speech-to-text — the same ladder it uses when the lane is unavailable for any other reason.

What leaves your Mac, and who receives it

Fetchi's default setup routes model traffic through a proxy server we run, rather than having your copy of the app hold an Anthropic key. Here is everything that goes out, in the default configuration of the packaged app.

Data Fetchi sends off your Mac, the recipient, and when it is sent
WhatGoes toWhen
The text of what you said, plus relevant saved memories and recent conversation Our proxy → Anthropic (Claude) Every request that needs the model
Name of your frontmost app, its window title, the text of that window read via macOS accessibility, and a list of your open windows Our proxy → Anthropic Attached to every request, so Fetchi knows what you are looking at
Screenshots of all attached displays Our proxy → Anthropic Only when your wording is visual ("what's this?") or asks Fetchi to operate the machine. Not on ordinary requests, and skipped entirely when a password, banking or sign-in screen is in front.
The text of each memory saved, and the text of each memory search Our proxy → OpenAI (embeddings) Never, by default. Only if you switch memory indexing on. Until 24 August 2026 this ran the other way round — on unless switched off — and this page described that. It was accurate then and is not the behaviour now.
The text of Fetchi's spoken replies Our proxy → OpenAI (text-to-speech) Every time it speaks, unless you switch to the built-in macOS voice
Raw microphone audio OpenAI, directly In the realtime voice lane, which is on by default on the paid plans in the app you download. Never on Free. Turn it off in Settings.
Whatever a connected account's action requires Composio, then that service Only if you connect an account, and only for actions you approve
Where your Mac is — a coarse position, latitude and longitude rounded to two decimal places (about a kilometre) before anything is done with it, and the town name that comes back for that rounded point Apple (the town name), then Open-Meteo (the forecast) Only when you ask something that needs it — "what's the weather", with no city named. macOS asks your permission the first time, and if you say no Fetchi uses the city you tell it instead. Never at launch, never in the background, and never written to disk.
Your IP address, in exchange for a coarse latitude and longitude ipapi.co, then Open-Meteo Only if you set up a weather watch ("tell me if it's going to rain"). That position is saved on your Mac so it is looked up once, not repeatedly.

A thing worth being clear about. This used to say that because memories were indexed the moment they were written, a request Fetchi answers without any language model — "what time is it" — could still be sent out to be indexed. That is no longer true: nothing about a saved memory leaves this Mac unless you switch indexing on. The cost of that is real and worth naming — recall now matches words rather than meaning, so asking about "the essay" will not surface a memory that only ever said "extension request".

What our server stores

The proxy exists to meter usage and bill it, so that you do not have to hold an API key. It is a pass-through. It stores no prompt, no transcript, and no image.

That is a claim about structure rather than a promise about behaviour. Here is every table in the proxy's database: your account, a usage ledger, push-notification subscriptions, opt-in product events, the ids of Stripe webhooks already applied, two tables for pairing a phone for remote control, a salted hash of any sign-in code you have asked for and not yet used (ten minutes, then gone) and the extra sign-in token such a code mints, website visit counts, one key-value row the visit counter needs, and an audit log of manual admin actions. Not one of them has a column capable of holding message content. When a request comes in, the body is forwarded to Anthropic byte-for-byte and the reply is streamed back; the only thing written down is a row saying how many tokens moved, on which model, at what cost, at what time. Streamed replies are passed straight through and read only far enough to count tokens.

The same is true of the other routes. Text-to-speech records the number of characters spoken, not the words. Embeddings record a token count, not the text. Realtime voice never touches the proxy at all — it issues a short-lived token and your Mac talks to OpenAI directly.

What the server does log

To be accurate rather than flattering: the proxy does write operational logs, and they are not empty. They record account identifiers, email addresses on signup, plan changes, model names, costs, and — through the standard web-server access log — the IP address, path and status code of each request. No log line contains the content of a message, a transcript, or a screenshot. We checked every logging statement in the server to be able to write that sentence.

Onward to Anthropic and OpenAI

Once your request reaches Anthropic or OpenAI, their policies govern it, not ours. We do not control their retention. If that matters to you, both publish their API data-usage terms, and Fetchi can be configured to bypass our proxy entirely and talk to Anthropic with your own key.

The companies that handle your data

Every outside company that touches any part of this, what each one gets, and what it is for. If a company is not on this list, it does not receive your data from us.

Third-party companies that process data on our behalf
CompanyWhat it getsWhat for
Anthropic Your request: what you said, relevant saved memories, recent conversation, window titles and on-screen text, and screenshots when the request is a visual one The model that answers you, and reads your screen when you ask about it
OpenAI The text of spoken replies; in the realtime voice lane, your raw microphone audio; screenshots of the display Fetchi is driving, when you ask it to do something on your Mac or on the web, for as long as that task runs; and the text of memories saved and searched only if you switch memory indexing on Memory indexing, the speaking voice, realtime speech, and driving the screen
Stripe Your card details and billing address, which you give directly to them — they never pass through us — plus your email address and which plan you bought Taking the payment, holding the card, and running the page where you cancel. We store the customer id they give us; we never see a card number.
Railway Everything our server holds, because they host it: the account database described above, and the server's access logs Running the proxy and storing its database
Vercel Your IP address and browser user-agent when you load this website, as any host would see; and, if you join the waitlist, the stored waitlist record Serving this website and holding waitlist signups
Cloudflare (R2) Your IP address when you download the app, as any download host would see Serving the Fetchi download itself
Composio The authorisation token for any account you connect, and whatever an action you approve needs to send Connecting outside services without Fetchi holding your passwords
Resend Your email address, if you join the waitlist — or if you ask for a sign-in code to get back into an existing Fetchi account, in which case the six-digit code rides in that email too Emailing the founder that you signed up; emailing you a one-time sign-in code you asked for
Slack or Discord Your email address, if you join the waitlist and a chat webhook is configured Posting the signup to a channel of ours
Apple A coarse position — latitude and longitude already rounded to two decimal places, about a kilometre — and nothing else, when you ask Fetchi something that needs to know where you are Turning that rounded point into a town name, so Fetchi can say "Berkeley" rather than a pair of numbers
Open-Meteo Either that same rounded position, or the name of whatever city you asked about — and no account, no key and nothing that identifies you The actual weather. It is the free, keyless forecast service Fetchi asks.
ipapi.co Your IP address, only if you set up a weather watch, in exchange for the coarse latitude and longitude that watch then reuses Working out roughly where to watch the weather for, once

Two of these are worth a sentence more. Stripe is where your card actually lives: the checkout and the billing page are theirs, not ours, which is why there is no screen in Fetchi where a card number could be typed and no field in our database that could hold one. Railway hosts the server and therefore holds the account database — so "our server" throughout this page means a server running on their infrastructure.

This website itself now sends nothing to anyone else: its fonts (Geist, under the Open Font License) are served from our own host and it loads no third-party script. Until 4 September 2026 it fetched its fonts from Google Fonts and an animation library from jsDelivr, both of which saw your IP address as a consequence; that row is gone from the table because the dependency is.

Counting visits to this website

This site has no third-party analytics script, no advertising pixel and no cookies. It sends one small message to our own server when a page is viewed or the download is clicked. That message carries three things: which of three event names it was, the page path with any query string stripped off, and the referring site's hostname. No cookie, no account id, and neither your IP address nor your user-agent is stored. To count returning visitors without keeping an identifier, the server derives a scrambled per-day value that cannot be matched against the next day's — so we can tell you how many people came yesterday, and we cannot tell that one of them was also here today. If your browser sends Do Not Track or Global Privacy Control, the message is not recorded at all, and that is enforced on the server as well as in the page.

What is stored on your Mac

Everything Fetchi remembers is in a single SQLite file on your machine. We have no copy of it and no way to reach it. It holds fourteen tables, covering: things you said you would do, saved memories, receipts of actions taken, pending actions waiting for your approval, reminders, scheduled jobs, price watches, errands and the evidence gathered for them, settings, and local usage and spend counters.

That file is not encrypted. It is protected by your macOS user account and by FileVault if you have it on, and by nothing else. Anyone with access to your unlocked Mac can read it. We would rather say that plainly than imply a lock that is not there.

There is one guard in front of it: before anything is written to memory, Fetchi checks the text for credentials — passwords, PINs, card numbers — and drops it if it finds any, so it is neither saved nor sent out to be indexed. This exists because an earlier version did persist a real bank PIN.

Watching your screen over time

Fetchi can keep a rolling local log of what has been on your screen — app, window title and text read by on-device OCR — so that "what was I reading yesterday?" is answerable. This is off by default. If you turn it on, the text stays in the local database, and — like memories — is indexed locally, going nowhere unless you have also switched memory indexing on.

Checking whether you are stuck

Fetchi watches the shape of what you are doing so it can offer help you did not ask for — noticing a dialog that has been waiting on you, or a document you walked away from. This is on by default. Between 8am and 10pm it takes a reading roughly every 25 seconds: which app is in front, that window's title, the titles of up to 24 open windows, and how long since you touched the keyboard. After about eight seconds of stillness it also reads the frontmost window's accessibility tree, including the first 200 characters of any dialog sitting on screen.

No language model is involved and none of it is a screenshot. Most of it is held in memory only — a rolling window of about forty minutes. What reaches the database is narrower but real: when Fetchi decides it has something to say, it stores a key so it does not repeat itself, and that key contains the window title or dialog text it noticed. Those entries are pruned after eight hours, but the pruning runs on the next write, so if Fetchi never speaks again the last ones stay.

When the screen looks sensitive — a password field, a banking window — the title is blanked and the accessibility read is skipped. The name of the app is still recorded.

Turn it off in Settings → Permissions, under Proactive check-ins. Turning it off also throws away the readings already held in memory. Saying "quiet mode" stops it too.

Nudges reaching your phone

If you have paired a phone, those check-ins can arrive there as notifications, which means the text of the nudge — including the window title or dialog text that prompted it — passes through our server on the way. We log that a notification was sent; we do not log what it said.

Until 24 August 2026 this fired for every signed-in account, whether or not a phone had ever been paired, while this page said the way to avoid it was not to pair one. That was wrong. It now requires an actual pairing, and there is a switch in Settings.

Usage counts, if you opt in

During onboarding Fetchi asks how to handle your data. The default, Privacy Mode, sends no usage data at all. If you choose Help improve Fetchi, the app sends event names with tiny counts — the app launched, an onboarding step was completed, the app was used today — so we can tell whether people come back. Four event names exist, the server rejects any other, and the payload is capped so small that a sentence would not fit: no transcript, no screen text, no titles of the things you're working on, ever. You can flip this either way later in Settings, and the switch wins over whatever you picked at onboarding.

Connected accounts

Fetchi can connect to outside services through Composio, which holds the authorisation tokens so that Fetchi never stores your passwords. Nothing is connected until you connect it, and connecting is a deliberate act with the service's own consent screen. Data reaches a connected service only when an action runs, and actions with real-world consequences stop for your confirmation first. You can revoke a connection at the service itself or at Composio, and Fetchi loses that access immediately.

The waitlist on this website

If you put your email address into the form on this site, here is the whole of what happens to it.

  • It is stored as a small record on Vercel, who host this site. The record contains your email address, the time, the page that referred you, and your browser's user-agent string. The record is stored under an unguessable filename derived from a salted hash of your address, but the storage itself is public-read, which means anyone who knew that exact filename could fetch it.
  • It is emailed to the founder, through Resend, so that he sees each signup as it lands.
  • If a chat webhook is configured, the same notice is posted to a Slack or Discord channel belonging to us.

We do not sell it, rent it, or add it to an advertising audience. You will get one email when Fetchi is ready for you, and no newsletter in the meantime. To be removed before then, email riyaan.aldimassi+fetchi@gmail.com and we will delete the record.

This site sets no advertising or analytics cookies. It does load fonts from Google Fonts and an animation library from a public CDN, both of which will see your IP address as a consequence of your browser fetching the file.

The switches you actually have

These are real settings in the shipped app, not aspirations.

Wake word off

The microphone stops being open. Fetchi hears nothing until you hold push-to-talk.

Memory indexing on

Off unless you turn it on. Left alone, memories stay on your Mac and recall matches words rather than meaning. Switching it on sends the text of each memory saved and each memory searched to be indexed, in exchange for recall that understands what you meant.

Screen access off

Fetchi stops attaching window contents and screenshots to requests.

Location denied

Optional, and asked for only in context. The first time you ask something that needs to know where you are, macOS asks; say no, or switch Fetchi off later under System Settings → Privacy & Security → Location Services. Fetchi then uses the city you tell it ("I'm in Berkeley") and nothing stops working except knowing where "here" is. Even when you allow it, the position is rounded to about a kilometre before it is used and is never written to disk.

Local macOS voice

Replies are spoken by the built-in macOS voice, so the text of what Fetchi says stops going to OpenAI.

Your own Anthropic key

Fetchi talks to Anthropic directly and our proxy is out of the path entirely. We then see nothing at all, including your usage.

Fully local model

Reasoning can be pointed at a model running on your own Mac. This works, and it is meaningfully weaker at using tools — we would rather tell you that than let you discover it.

What we don't do

  • We do not sell your data, and we have no advertising business that could want it.
  • We do not train models on your conversations. We could not: we do not keep them.
  • We do not listen before the wake word, and the listening code is structurally incapable of it.
  • We do not read your local database. We have no route to it.
  • Fetchi does not spend your money without asking. Payments always stop for confirmation, at every autonomy setting, including the most permissive one.

Your data, and getting rid of it

Most of what Fetchi knows about you is on your own machine, so deleting it is something you can do without us: remove the Fetchi database file and it is gone.

Deleting the account on our server is real deletion, not a hidden flag. It cancels any Stripe subscription first — a card still being charged after "delete forever" would be the worst possible version of this — and only then erases the account row, the usage ledger, the opt-in events, and any paired device, in a single transaction. There is no soft-delete to undo it with.

For that, for a waitlist entry, or for a copy of what we hold, email riyaan.aldimassi+fetchi@gmail.com. If you are in a jurisdiction that gives you rights of access, correction, export or erasure, use the same address and we will honour them.

That address is the right one to use, and it is a Gmail address on purpose: fetchi.app is registered to someone unconnected with us, so mail sent there reaches a stranger rather than us. Every contact route on this site points at the address above and none of them at that domain.

Changes to this page

Fetchi is early and changing quickly, and this page describes the code as it stands on the date at the top. When what the software does changes, this page changes with it. If we ever start storing something we say here that we do not store, that is a material change and we will say so directly rather than quietly editing this page.

Questions, or something here that does not match what you observe: riyaan.aldimassi+fetchi@gmail.com.