Security

How BlueBot handles your data

BlueBot sends and reads texts on your own Mac, so we keep as little as we can, for as short a time as we can. This page says what we keep and for how long, how keys and secrets are stored, what the Mac app may and may never do, and how to report a security problem.

In short

  • The words of your texts are deleted after 30 days, and they never go into our logs, our analytics or our error reports.
  • We keep only hashes of your API keys and your Mac’s token, and we show each key once.
  • The Mac app reads Messages’ database read-only, and it never asks you to turn off System Integrity Protection.
  • Our staff see the facts of a text, such as when it went and its state, and never its words.
  • Report a security problem to security@usebluebot.com.

How long we keep data

WhatHow long
The words of texts, their files and voice memo transcripts30 days, then deleted
The facts of each text: who it was to or from, when, its state, its service and what sent itThe life of your account, so counts and limits stay right
Conversations with the integration assistant30 days
Events and webhook deliveries, which can carry the words of a text30 days
The API request log: the route, the status and the time, never the full address, the query or the body30 days
The first answer to a request with an Idempotency-Key24 hours
What a Text Hook receivedThe last 20 payloads for each hook, and none older than 30 days
A file you upload and never sendA day
A file waiting on your Mac to be sentUntil its text is reported, and never more than an hour
Your account and everything in it, after you delete itDeleted within 30 days

The privacy policy lists everything we keep, including the few records that stay after an account is deleted.

Words stay out of logs

Before our server writes a log line, it replaces the words of a text with a count of its characters, cuts phone numbers and email addresses down to their last four characters, and writes secrets as [secret]. Nothing we send to PostHog, our product analytics and error tracker, contains phone numbers, email addresses or the words of texts, and error reports have the words taken out before they leave.

The Mac app writes no words to its logs or its reports. The only words it sends us are in the copies of the conversations you chose to copy.

Keys, tokens and secrets

  • API keys begin with bb_live_ and end with a checksum, so a mistyped key is refused before any lookup and secret scanners can spot a key that leaked. We keep only a keyed hash of each key (HMAC-SHA256 under a secret that lives on our server, apart from the database) and a short prefix to name it by. A key is shown once, when you make it. Keys can be limited to what they may do, and a read-only key can’t send a text.
  • Your Mac’s token is made when you connect the Mac, is the app’s only credential, and is kept in the Mac’s Keychain. Our server keeps only its keyed hash. Connecting another Mac disconnects the first.
  • Pairing codes last ten minutes, and the code that opens the Mac app’s window lasts a minute. Each works once, and we keep only its hash.
  • Webhook signing secrets (whsec_) are worked out from a key on our server and the webhook’s id, so no signing secret is stored. When you rotate one, the old secret keeps signing alongside the new one for 24 hours, so you can switch without missing a delivery.
  • AI assistants you connect through our MCP server sign in with OAuth 2.1, using an authorization code with PKCE. We keep only hashes of their tokens.
  • Files are kept in private storage and reached only through signed links that last 60 minutes.
  • Text Hook addresses are the exception. A Text Hook’s address contains its token, and we keep it readable so the dashboard can show you the address whenever you need to paste it again. Anyone who has the address can post to the hook, so treat it like a password, and make a new one if it leaks.

Encryption

Every connection to BlueBot uses HTTPS with TLS: the website, the dashboard, the API, the MCP server and the Mac app. We deliver webhooks only to public https addresses, and our server checks each address before it connects, so a webhook can’t be pointed at a private network.

Our database and file storage are hosted by Supabase, which encrypts them on disk.

Keeping accounts apart

Every table in our database has row-level security turned on with no rules that let a browser in, so nothing can be read from it directly. All data goes through our server, which checks the account on every query. An id that belongs to another account answers “not found,” so ids can’t be probed.

Signed webhooks

Every webhook delivery is signed the Standard Webhooks way, with the headers webhook-id, webhook-timestamp and webhook-signature. Check the signature with your endpoint’s whsec_ secret, and refuse a delivery whose timestamp is old, so a captured delivery can’t be replayed. A delivery that fails is retried for 72 hours. If it never succeeds, the webhook is paused and you get one email. The webhooks guide has code that checks a signature.

The Mac app

The Mac app is the only part of BlueBot that touches Messages. It sends with AppleScript and reads Messages’ database read-only. It asks for these permissions:

PermissionWhy it’s neededWhat it never does
Full Disk AccessTo read Messages’ database (~/Library/Messages/chat.db) and the attachments in your conversations, so it can confirm that each text went, report delivered and read receipts, and copy the conversations you chose.It opens the database read-only and never writes to it. It copies only the conversations your setting allows.
Permission to control MessagesTo send texts and files through Messages with AppleScript.It sends only the texts your account asks it to. The words of a text are handed to Messages as quoted text, never as script.
Speech Recognition (optional)To turn the voice memos people send you into words, if you turn transcription on.It transcribes on your Mac only, and it’s off until you turn it on.
Your administrator password, which macOS asks forOnly when you ask the app to keep your Mac awake: macOS asks for it before the app changes the power settings so the Mac doesn’t sleep and starts again after a power failure.You type the password into macOS, not into the app. BlueBot never sees it or keeps it.

The Mac app also:

  • never asks you to turn off System Integrity Protection, and never will;
  • uses no private Apple frameworks;
  • doesn’t read the Contacts app on your Mac;
  • keeps nothing on disk but its token in the Keychain and the files of texts waiting to send, in ~/Pictures/BlueBot Outbox/, which it deletes once each text is reported, and within an hour otherwise;
  • learns which conversations to copy, in the default setting, from salted hashes of the people you’ve texted through BlueBot, not from their numbers.

Each release is signed with the company’s Developer ID and notarized by Apple, so macOS checks it before it opens. The app checks for updates every six hours and installs only an update signed with BlueBot’s own update key.

AI and your words

Words go to Anthropic’s API only when an AI feature is used: what you type to the integration assistant, the incoming texts Autopilot answers along with your instructions and FAQ if you turn Autopilot on, and the emails people send to our support inbox. The privacy policy has the details.

The integration assistant never sees an API key’s secret. A key it makes for you is shown to you in the dashboard and never to the model, and every change it suggests waits for you to confirm it. Our support inbox is answered first by an AI agent, which reads facts about the sender’s account and never the words of their texts, hands a conversation to a person when it should, and says it is an AI when asked. Security reports always go to a person.

Payments

Stripe handles every card and payment. We never see or store a full card number.

Staff access

  • Our admin area is open only to a short list of staff email addresses. Everyone else gets “not found.”
  • The admin tools show the facts of a text, such as whom it went to, when and its state, and never its words.
  • Every hold, release and change to the switch that stops all sending is recorded with who made it and why.
  • Nothing holds or suspends an account automatically. A person decides.

Certifications and audits

BlueBot is a small company. We have no SOC 2 report, ISO 27001 certificate or other outside security audit. This page is what we do instead, and we’ll keep it up to date.

Reporting a vulnerability

If you find a security problem in BlueBot, email security@usebluebot.com. Please include:

  • what you found and where: the page, the API endpoint or the version of the Mac app;
  • the steps to reproduce it;
  • what you think an attacker could do with it;
  • how to reach you with questions.

A person will reply within 3 business days to say we have your report, and we’ll keep you told as we fix it. We don’t pay bounties yet, but we’ll thank you by name when it’s fixed if you’d like.

We welcome research done in good faith. If you follow these rules, we won’t take legal action against you over it or ask anyone else to. [Lawyer: review this safe harbor.]

  • Test only against an account of your own. Don’t reach, change or keep another customer’s data. If you come across some by accident, stop, delete it and tell us.
  • Don’t send a text to anyone who hasn’t agreed to get it. Text only your own numbers.
  • Don’t slow the service down for others: no denial-of-service attacks, no spam and no heavy automated scanning.
  • Don’t try to trick our staff or our customers, and don’t try to get into our buildings or devices.
  • Give us time to fix the problem before you tell anyone else: until it’s fixed, or 90 days, whichever comes first.