Mimir

Security model

How Mimir protects you, in one place: who it defends against, the rules that do it, and what's left. The user-facing details are on Tools and safety and Privacy; this page is the overview, for users who want to know and for contributors who must keep these rules when changing the code.

Who it defends against #

It does not defend against someone with your computer account, your server's admin token, or your AI account: those are you.

The rules #

Your things stay in your chats. Email, calendar, meetings and the bots' computer are offered only in a chat with you alone (never a group, where a reply goes to everyone). A chat paired by someone else is a guest's: it gets the guest's own memory and the web, and none of your email, calendar, meetings, saved logins, browser, tool servers or computer. You are whoever paired first on each messaging app.

Outside content changes what's allowed. Once a conversation has read outside content, it's marked, and anything that changes data asks you first, even if its rule says allow. The mark sticks for the rest of the conversation ("Start fresh" ends it). It also carries over:

Reading stays allowed after outside content, except when the read itself would carry your data out. That covers:

Some actions always ask. Sending an email and making a bot ask every time, whatever the rules say, as their own kind of approval: never "always", never "all like this". An email is sent only if all of it fits on the card you approve (recipient first), at most 20 a day from a chat, with addresses checked so nothing can add a hidden recipient. A new bot gets at most the tools of the bot that made it, and can't make bots itself.

Private data stays in private chats. Email, calendar and meeting tools exist only in a chat with you alone, never in a group (where the reply goes to everyone) or incognito (where nothing may be kept).

What's learned stays yours to accept. Bots never change your memory's rules, your permissions, tool grants, saved logins or schedules on their own. A memory saved after reading outside content is marked unconfirmed and is kept out of the bots' standing instructions until you confirm it. That quarantine is why saving a new memory after outside content is the one change that doesn't ask; replacing an existing memory does, since it would take a confirmed one out of the instructions. The mark survives every path back in: a new version of the memory, a tidy-up suggestion drawn from such a conversation, or "Accept all" (which skips those suggestions). The one exception is a lesson that says what you wrote yourself (your messages only, never a file's or a forward's text): a page can't put words in your messages. Only your own words come back as past corrections or skill pitfalls. Files bots keep carry the same mark (written after outside content, or changed outside Mimir, counts as outside content), and the workspace can't be left: no .., no links, size limits.

Approval cards show what will happen.

Saved logins never reach the model. They are typed by name into the browser, only on the sites you listed (the site is read the way the browser reads it), and each use asks.

Only you talk to your bot. A chat is paired by one person with a one-time code, and only that person's messages and button presses count there. In a group, everyone else is ignored. Shared senders (an anonymous admin, a channel) can't pair. Replies never ping @everyone, @here or roles, and never show link previews (the apps fetch those on their own, so a link could otherwise leak data unclicked).

The server. The admin token is checked before a request's body is read, compared in constant time, and is at least 24 characters. The web UI can't be framed by another site, loads only its own scripts, and nothing is cached. The data folder is owner-only.

The bots' computer runs its browser without Mimir's environment or secrets, with its own home. With docker compose it's a separate container (its own user, no data folder, no published ports, a token on its control channel), so a browser exploit doesn't land next to your database. In the Docker image, file:// and internal pages and downloads are blocked by policy, and the containers drop all capabilities.

Updates are signed. The desktop app installs an update only if it's signed with Mimir's release key (the public half is built into the app); a tampered download is refused. It never restarts on its own.

Downloads and dependencies are pinned.

Hostile input can't take the app down.

What's left #

For contributors #

Every new way for text to reach a model must either be the person's own words, or mark the conversation (ToolCtx::taint). Every new action that changes data must go through tools::call. Every new kind of learned artefact must be a proposal that keeps the outside-content mark. Details, with the code they live in, are in Architecture.