Security
Short version: your messages stay on your Mac, your passwords stay in your Keychain, and the little that goes through our relay is encrypted on your Mac first.
Last updated: 9 November 2026
Your messages stay on your Mac
Waggle has no servers that see your chats. Each bee talks straight to its own service: WhatsApp, Slack, Google, Microsoft, Telegram or your email provider. iMessage is read from the Messages app on your Mac. Waggle has no crash reporting built in, and its only usage count is the daily check-in described below.
A few things do leave your Mac. Each one is optional or carries no messages:
- Settings sync and iMessage on another Mac. If you turn them on, they go between your own Macs through the Waggle Relay, encrypted on your Mac first. The relay only ever holds scrambled data it can't read. Encrypted iMessages are kept on the relay for up to an hour, whether or not your other Mac has collected them.
- Licence and trial checks. These go to the Waggle Relay. They send your licence key (if you have one), a random ID for your Mac and your Mac's name, so you can tell your Macs apart in Settings → Licence. For a trial, the relay also notes the country it started from. For Worker Bees, it holds your licence's 3 bee types (for example Gmail and Slack), never which accounts. No messages, contacts or serial numbers. The app checks the signed answer itself, so it works offline for up to 30 days.
- Daily check-in. Once a day, on every Mac, Waggle tells the Waggle Relay a random ID made only for this, which stays the same on that Mac, its version, your plan and the kind of each bee. It can't be turned off in the app. Never account names, addresses or messages. The relay counts check-ins by country, doesn't store your IP address, and deletes them after 45 days. It keeps the ID's first and last check-in dates until 13 months after the last one, to see how long Waggle is used. We don't connect it to your licence.
- AI replies and AI bees. Only when you ask. The conversation you ask about goes to the AI provider you chose (Claude, ChatGPT, Grok or Gemini), with your own key. For a reply, that's up to the last 40 messages in that one chat, your name and the other person's name, and for email the subjects and up to 8 earlier emails from the same person in that bee. Photos and files are described ("a photo", or a file's name), not sent. Apple's on-device AI and Ollama run on your Mac and send nothing.
- Update checks. Copies downloaded from waggle.software ask waggle.software whether there's a new version, and download it from downloads.waggle.software. The check carries Waggle's version and, like any web request, your IP address. The optional system profile is turned off, and no messages are included.
- GIFs. Opening the GIF picker loads trending GIFs from GIPHY. If you search, your search words go to GIPHY, and the GIFs themselves load from GIPHY.
- Telegram sponsored messages. Telegram requires apps to report when its sponsored messages in channels are seen or clicked, so Waggle tells Telegram.
- Pictures in emails. Pictures from the internet can tell a sender you opened their email, so by default Waggle asks before loading them, per sender.
What never syncs: your passwords, API keys, pairing and sync codes, and your sign-ins.
What Waggle keeps on your Mac
Waggle keeps each bee's messages, pictures and settings in ~/Library/Application Support/Waggle/. The folder is private to your Mac account: other people who use the same Mac can't open it (an administrator still can). Waggle checks this every time it starts.
A few things are kept elsewhere: pictures and files you send by iMessage are copied to ~/Pictures/Waggle Sent so Messages can send them, GIFs are saved in a temporary folder, and Web bees keep their site data in WebKit's own folder for Waggle, under ~/Library/WebKit/.
Logs go in ~/Library/Logs/Waggle/. They record what each bee is doing, such as connecting and errors, never what your messages say. Chats, contacts, phone numbers and email addresses appear as short tags like chat #1a2b3c4d, not as names or numbers, and the tags change every time Waggle starts. Lines from the libraries each bee uses appear there too, with their phone numbers and addresses tagged the same way. Like Waggle's own folder, the logs folder is private to your Mac account, and each log starts again once it reaches 5 MB. Logs stay on your Mac. We only see one if you choose to email it to us.
Passwords and keys live in your Keychain
Waggle keeps your passwords, keys and sign-ins in your Mac's Keychain, not in files: email passwords, AI keys, your licence, the iMessage pairing code, the sync code, and the Gmail, Google, Outlook, Teams, Slack and Telegram sign-ins. So are the settings you'd only enter yourself: the address and token of a relay you host, the relay token an iMessage from another Mac bee uses, a Google client secret typed into Settings, and the Telegram api_id and api_hash. They aren't in iCloud Keychain and don't sync to your other Macs. Like other Keychain items, they move with your Mac if you use Migration Assistant.
If the Keychain is locked or says no, Waggle tells you (in Settings, or in the Telegram bee's setup) and waits, rather than quietly using a different relay. It tries again by itself once you unlock your Mac. It hands secrets to its connection helper privately, so they don't show up in the Mac's list of running programs.
Two kinds of sign-in aren't in the Keychain. WhatsApp's keys change with almost every message, which is too often for the Keychain, so they're in the bee's private folder. Sites you sign in to in a Web bee are kept like a browser's cookies, in WebKit's own store for Waggle. To unlink WhatsApp, right-click the bee → Sign Out, which deletes its keys.
Encryption
Settings sync and iMessage sharing are end-to-end encrypted. Your Mac turns your 12-character sync or pairing code into a key, and encrypts everything with it before sending. The code itself is never sent, so the relay can't read what it carries. Every message is also checked when it arrives, so it can't be changed on the way without your other Mac noticing. The Mac sharing iMessage refuses old or repeated requests, so recorded traffic can't be played back.
For experts: AES-256-GCM. The key and the relay room ID are each derived from the code with PBKDF2-HMAC-SHA256 (600,000 rounds, separate salts). Codes are 12 characters from a 31-character alphabet, about 59 bits. Requests between Macs carry a timestamp and a one-off ID; anything more than 5 minutes out, or seen before, is refused.
Waggle's connections are encrypted in transit (HTTPS or TLS, or the service's own encryption for Telegram). Unencrypted connections are only allowed to this Mac or your home network, and a relay that tries to redirect Waggle to a plain http:// address on the internet is refused.
The Waggle Relay
- It runs on Cloudflare. It carries Settings sync, iMessage sharing and licence checks, and never any readable messages.
- Sync and iMessage sharing need a licence or trial signed by the relay. Licences are signed with Ed25519, and the app checks them itself.
- Each Mac has hourly limits, and each iMessage room has a size cap, to stop any one Mac overloading the Relay.
- Messages are deleted an hour after they arrive. An encrypted sync copy nobody has used for 400 days is deleted automatically.
- Purchase notices from Paddle are only accepted when they carry Paddle's signature and come from Paddle's own addresses.
- A Mac sharing its iMessages only answers what an iMessage bee needs: chats, messages, sending, pictures and files, read and unread, and contacts. It refuses anything else, such as reading a file by its path, or changing the licence or pairing settings.
Signed and notarised by Apple
Every copy you download from waggle.software is signed with our Apple Developer ID, uses Apple's hardened runtime, and is notarised: checked by Apple for malware before release. Automatic updates use Sparkle. Each update and the update list are signed with our own private key, and Waggle installs an update only if its signature matches our key. Updates download over HTTPS.
Why isn't Waggle sandboxed? The iMessage bee needs to read your chats from the Messages app's own folder and send through Messages, which macOS doesn't allow from inside the App Store sandbox. So Waggle is sold directly instead. It still asks for only what each bee needs, only when you add that bee:
- Full Disk Access (iMessage bee): to read your messages from the Messages app's folder, and the names in Contacts shown with them.
- Automation → Messages (iMessage bee): to send your iMessages and texts through Messages.
- Accessibility (iMessage bee): to mark chats read by selecting them in Messages.
- Calendars (Calendar bees): to show your calendars. Waggle only reads them.
- Local Network and Downloads Folder (Web bees): to open pages on your home network, and to save files you download.
If a permission is missing, the bee says what it needs and opens the right page in System Settings. Waggle doesn't use your camera, microphone or location.
Work accounts
Outlook and Teams sign in through Microsoft's own sign-in page, so your organisation's rules and approvals apply. Most Gmail users connect with an app password; Sign in with Google is offered to some accounts, and Google Calendar normally reads your calendars through the Mac's Calendar app. Waggle never tries to get round your organisation's security settings or app approvals. If your Mac is managed and blocks apps that haven't been approved, ask your IT team.
The WhatsApp bee, and Slack's quick sign-in, aren't official connections, and neither company has approved Waggle. Waggle connects the way their own apps do. For a work Slack, use the admin-approved Slack app route. See the FAQs for more.
How we check our work
- Automated tests. We run them before each release. They include checks that a wrong sync or pairing code gets nothing, that recorded traffic can't be replayed, that a paired Mac can only ask for what the iMessage bee allows and never receives a sign-in, that the relay's access key never appears in an address or error, that Paddle notices without a valid signature are refused, that licence signatures are checked, and that the relay's usage limits hold.
- Separate review. Changes are reviewed separately, with an AI-assisted review, against a written checklist that includes signing, permissions, and keeping secrets in the Keychain.
- Checks built into every release. Building a release runs the full test suite, scans our code and its history for leaked secrets (gitleaks), and checks the libraries used by Waggle's connection helper for known security flaws (govulncheck). If any of them fails, the release stops. It also won't build from changes that haven't been saved to our code history. The checks can only be skipped on purpose, in an emergency.
- Daily checks. Every morning, all the libraries in Waggle's connection helper are checked for known security flaws, the ones it uses directly are checked for updates, and our code is scanned for leaked secrets. Updates are tested and reviewed before they're released, and most security fixes go out automatically once they pass.
- Our own security review of the app, the relay and this website in November 2026. It updated the Telegram library to fix a known flaw, made Waggle's folder private to your Mac account, limited which websites can talk to the relay, added the relay's usage limits, and narrowed what a paired Mac may ask for. Waggle 1.5 then moved more secrets into the Keychain, hid contacts in logs, made logs private, stopped asking Google for icons, and refused plain http relays on the internet.
This website
- It's hosted on Cloudflare and tells browsers to use HTTPS only, for a year at a time (HSTS).
- Its security headers limit what the page may load to our own site, Paddle, YouTube's privacy-enhanced player and Cloudflare's analytics, stop other sites framing it, and turn off camera, microphone and location.
- No trackers or ad pixels, and no cookies of our own. Our fonts come from this site, not Google Fonts. Cloudflare Web Analytics may count visits, without cookies. The tour video loads from YouTube only when you press play.
- Payments are handled by Paddle, so your card details never touch our servers.
Reporting a security problem
Found a vulnerability? Email hello@waggle.software, with what you found and how to reproduce it. Please give us a chance to fix it before you share it. Our security.txt has the same contact.