Privacy, security, terms

There is no Justine cloud

This page is short because the architecture is. Justine is an app on your Mac talking to accounts you own. We run no server that sees your voice, your mail, your files or your keys, and this page says exactly what does leave the machine, and to whom.

What leaves your Mac, and to whom

Every outbound connection Justine makes is to a service you signed up for, on a key or login you hold. In the order you will meet them:

  • Google (Gemini Live), your microphone audio while she is awake, her spoken replies, and the transcripts of both. Governed by your Google AI Studio account and Google's terms.
  • Anthropic (Claude, via Claude Code), the text of what you asked, the context she assembled to answer it, and tool results. On your Claude subscription. If you chose the OpenRouter path, the same goes to OpenRouter and on to the model you picked.
  • Fish Audio, the sentences she speaks aloud, for synthesis.
  • The services she acts on for you, Gmail, Google Calendar, WhatsApp Web, Telegram, and any site she drives in your Chrome or any MCP server you connect. She acts as you, on your logins, and only when you ask.
  • Optional, off by default: error reports, see below.

That is the whole list. Nothing goes to a Justine server, because there is not one. The app makes no request to any address of ours.

Your account

Downloading is open to everyone. Opening the app asks you to sign in once, in your browser, through Clerk, who hold the email address and password for that account. Your Mac keeps a device token in its Keychain and asks us periodically whether that account is still allowed; the answer is yes or no and nothing else. We store the account id, the email, the name you gave the Mac, when it was first signed in and when it last checked. That record exists so access can be switched off, and for no other purpose. Signing out from the app deletes the token from the Keychain and retires it here.

Nothing about what Justine does for you passes through that check: not a word you said, not a message she sent, not a file she read.

What stays on your Mac

  • Memory, plain Markdown files in the data folder you chose. Open, edit, delete them in any editor.
  • Knowledge, the files you upload, converted to Markdown pages in the same folder.
  • The conversation log, everything said, as a searchable record on disk.
  • Runs and usage, a SQLite database of every Claude Code run she started and of your subscription's usage windows.
  • Keys, in .env beside the data folder. The settings page can write them and can only ever read back "set" or "not set".
  • Screenshots, taken only when you ask her to look, held in memory for that one question, never written to disk.

Delete the data folder and she remembers nothing. Uninstall by dragging the app to the Trash.

Error reports

Justine can send crash reports to the developer so that a broken install can be fixed and an update shipped. The app you download from here has this on, because a fault that reaches a stranger's Mac should reach the person who can fix it, and Settings turns it off whenever you want. On or off, it obeys one rule: only errors leave the machine, every field is allow-listed, and free text is scrubbed of home paths, e-mail addresses, phone numbers and anything key-shaped before it goes. Never a transcript, a message, a mail, a contact, a URL you visited, a screen, or a key. Conversation logs are written at a lower level than the reporter listens to, so a transcript cannot ride along. If the endpoint is unreachable it fails silently and never affects the app.

Security

Your subscription cannot be billed as an API key. Claude Code prefers an inherited ANTHROPIC_API_KEY over your login and keeps reporting "logged in" while billing quietly moves to the key. So every Claude Code process Justine starts, the brain and every build, has every ANTHROPIC_* and CLAUDE_CODE_* variable removed from its environment first. The first-run check warns you if such a key is sitting in your .env.

The local web boundary. The app's backend listens on 127.0.0.1 only. One gate above every route checks the Host header on every request (against DNS rebinding) and requires either a same-origin Origin or an internal token on every WebSocket handshake and every state-changing request. There is no CORS, deliberately: a hostile page in your browser cannot read from it. The API console (/docs) is off unless you turn it on.

Sends wait for you. Sending a message or mail, and any destructive control in the browser, delete, pay, submit, is a wall she does not cross without your yes. The night shift drafts into your Drafts folder and never sends until you approve in the morning. Anything about money, billing, invoices, contracts or legal is never answered on your behalf.

Names are never guessed. A misheard name is the one silent failure that matters; when a contact match is not certain she asks instead of sending to the nearest match.

Signed and notarized. The release app is signed with an Apple Developer ID and notarized by Apple, so macOS opens it without a warning and verifies it has not been altered. Updates arrive over HTTPS from a signed release feed and are checked against their published hashes before they are installed.

Found something? Report it privately on GitHub. We read every report.

This website

This site is static pages on a content network, served under a strict content-security policy: fonts, scripts and styles come from this domain only, and nothing is loaded from a third party. It sets no cookies and uses no outside analytics service.

It does keep its own visit statistics, sent from your browser to this same domain and stored in our database. For each visit that means: your IP address and the approximate location the network maps it to (country, region, city and a rough coordinate), your browser and operating system family, screen size, language and time zone, the page that referred you, the pages you open, how long the tab stays active, which buttons and links you click (including the download buttons), and a random identifier kept in your browser's local storage so we can tell a returning visitor from a new one. Nothing in that record names you, and none of it is shared with or sold to anyone; it exists so we can see whether the site works and how many people install the app. Clearing your browser's site data removes the identifier. If you use the reach-out form, the name, email and message you type are stored with the same record so we can reply. If you press Talk to Justine, your microphone audio streams to Google's Gemini Live service for the length of that conversation (at most three minutes) so she can hear and answer you; it goes on our key, not yours, and we keep only the session's length and the number of turns, never the audio or a transcript. The download buttons send you to GitHub Releases, which has its own privacy statement.

Terms

The software. Justine is provided free, as is, without warranty of any kind. It acts on your accounts with the permissions you grant it; you are responsible for what you ask it to do and for the terms of the services it acts on for you. Use it only on a Mac you are entitled to control.

Your accounts. Claude, Gemini, Fish Audio, OpenRouter, Google, Meta, Telegram and every other service named here are separate products with their own terms and their own charges. Justine is not affiliated with, endorsed by or responsible for any of them. Their names and marks belong to their owners.

Liability. To the fullest extent the law allows, the developer is not liable for any loss arising from use of the software or this site, including anything sent, deleted, purchased or scheduled on your behalf.

Changes. This page changes when the software does. The date below and the commit history are the record.

Last updated 20 September 2026