Privacy
What DeskMate stores on your Mac, what it sends to the services you choose, and every address it connects to.
DeskMate is built so that the only parties that ever see your data are your own Mac and the model services you pick. There is no DeskMate server, no account, no telemetry and no crash reporting. This page was written from the code; if you find it out of step, please open an issue.
What stays on your Mac
Everything lives in ~/Library/Application Support/DeskMate.
- Settings and API keys, in
settings.json. Keys are stored as plain text in a file only your user can read; they are not put in the Keychain. They are never sent to the console UI once saved. - Characters: persona, voice choice and avatar.
- Memories: one SQLite database per character. A character’s memories belong to it alone. Deleting a memory on the Memory page removes it for good, including its text, search index entries and embeddings.
- An event log (
logs/events.jsonl): a record of what happened, kept for debugging, which includes conversation text and the window titles that triggered a comment. It is never cleaned up automatically, and deleting a memory does not remove it from the log. The only thing in the released app that reads it back is Settings › Diagnostics, which picks out error and timing lines and leaves the conversation behind (see below). You can delete the file with DeskMate quit. - Downloaded models, in
models/. - Your voice. The microphone is processed on your Mac by local speech recognition. Audio is never sent anywhere; only the text it was turned into goes to the language model, as part of your conversation.
- Screenshots are held in memory just long enough to be described, and are never written to disk.
What is sent to the model services you choose
You decide which services to add and which one each job uses. DeskMate sends data only to those services, and only the minimum each call needs.
| Job | What is sent | Service |
|---|---|---|
| Chatting | The character’s persona, your recent conversation, memories recalled for this turn, the character’s mood, and, if screen reading is on, the name and window title of the app you are in | Your chat model |
| Looking | One screenshot of the frontmost window, scaled to at most 1280 px, only when the character decides to look before speaking up or you ask it to, only if screen reading is on and the model can see images. Windows on the blocklist (below) are never captured | Your vision model, or your chat model if it can see images |
| Tasks | The task, tool results and, for computer use, a text outline of the apps you have allowed (password fields are blanked) | Your task model, or your chat model |
| Dreaming | While idle, the character turns finished conversations into facts and updates how it sees you, which sends those conversations and related known facts | Your dream model, or your chat model |
| Speaking | The sentences the character is about to say, one by one, plus the voice ID | Your voice service |
| Setting up | Short test requests when you save a service: a model list request, then a small prompt, a test image and a test tool call, to check the model’s abilities | The service you are adding |
Two details worth knowing:
- Requests to OpenAI are sent with
store: false, asking OpenAI not to keep them. Other services follow their own policies; read them. - MCP servers you add are yours to trust. A local (stdio) server runs on your Mac with your user’s rights; a remote (HTTP) server receives the arguments of every tool call. Nothing is sent to a server unless you added it.
What screen reading can and cannot see
Screen reading is off until you turn it on (Media › Read the Screen). It then reads the frontmost app’s name and its window title, never your screen continuously. The character looks at the actual window only when it is about to speak up or you ask. A built-in blocklist, which you cannot switch off, stops DeskMate from reading or capturing password managers, Keychain Access and windows whose title suggests banking, payment, passwords or privacy settings. DeskMate’s own windows are ignored.
Observations aren’t memories on their own: only the one that made the character speak is written down, with what it said.
Computer use
Apps are off-limits until you approve them one by one, with a level for each: read-only, can operate, or trusted. DeskMate itself, System Settings, terminals, script editors and password managers can never be approved. Actions that can’t be undone, like deleting, sending or paying, need your click on an Approve card first; speech can’t approve them. A task the character starts on its own can only read.
Every network address DeskMate uses
| Address | When | What for |
|---|---|---|
The base URL of each model or voice service you added, e.g. api.anthropic.com, api.openai.com, generativelanguage.googleapis.com, api.deepseek.com, dashscope.aliyuncs.com, api.elevenlabs.io, api.fish.audio, openspeech.bytedance.com, api.minimaxi.com, openrouter.ai, or your own endpoint | When you use that service | Chat, vision, tasks, dreaming and voice, as in the table above |
localhost:11434 | During onboarding and when you use Ollama | Looking for Ollama on your Mac, and talking to it. Nothing leaves your machine |
huggingface.co, hf-mirror.com, www.modelscope.cn (and the download hosts they redirect to) | When a local model is missing | Downloading the speech and memory search models. Nothing about you is sent |
api.github.com | At launch and once a day, unless you turn it off in Settings › Updates | Asking for the latest release. Only a User-Agent is sent |
| The URLs of MCP servers you added | When you use their tools | Calling those tools |
Links to Ollama’s download page, Live2D’s website and GitHub Releases open in your browser only when you click them. Requests go through macOS’s network stack, so they follow your system proxy.
What DeskMate does not do
- No analytics, usage statistics or crash reports. The speech and memory models’ runtime has its telemetry switched off.
- No account or sign-in with DeskMate, and no server of its own.
- No automatic updates: DeskMate tells you when a new version exists and you replace the app yourself.
- No sharing of memories: a character pack (
.deskmate) contains the persona, voice description and avatar, but never memories, API keys or service IDs.
Sharing a character
Importing a character pack always creates a new character and shows you its persona first. The persona becomes the character’s instructions, so a pack from someone you don’t know could try to steer the character, for example to push you into approving something. Read it before importing.
High-risk actions still need your click on an Approve card.
Reporting a bug
Settings › Diagnostics › Export Diagnostics collects what a bug report needs into a zip. Nothing is sent: you see the list of files, choose where to save it, and attach it yourself if you want. It holds the app version, your Mac’s chip, memory and macOS version, permission states, which parts are working, the kinds of model services you set up, local model state, core crashes, and the newest error and timing lines from the log. It leaves out API keys and other secrets, what you and the character said, memories, what the character saw on your screen, service names and addresses, and your user name. Open the zip and read it before you share it.
Last updated on