Privacy
What Alcedo does by default.
This is a description of program behaviour in 0.1.0, not a legal notice. Alcedo has no servers and no accounts. There is nothing for us to collect, because there is no us in the data path.
The network
Everything that opens a connection
Alcedo connects to four kinds of host, and no others:
- Your mail provider. IMAP on port 993 and SMTP over TLS, to the servers you configure. TLS is rustls only; there is no OpenSSL path and no option to skip verification.
- Google or Microsoft, during sign-in. Only if you add such an account. The consent page opens in your system browser using OAuth with PKCE, and the token exchange goes to the provider.
- Hosts named in a message you choose to unblock. If you press Load once on a message, its remote images are fetched from wherever the sender pointed them.
- An AI provider you configured yourself. Only when you press Rewrite in the composer, and only if you supplied a key. See below.
There is no analytics endpoint, no crash reporter, no update check, and no licence server. Alcedo does not contact any domain we control, because it does not need to.
Reading
Mail cannot watch you read it
Incoming HTML goes through an allowlist sanitizer before it reaches the renderer. Scripts, embedded objects, form controls, and inline event handlers do not survive that pass. Then two more things happen.
Remote images are off
Every <img> pointing at an http or
https URL is removed from the document, and the renderer
is told not to auto-load images regardless. A banner tells you the
message had remote content. You can load it for that one message.
Tracker pixels are stripped, not deferred
Separately from the remote-image rule, and even when you do choose to load remote content, Alcedo deletes images that look like tracking beacons:
- Any image whose declared width or height is 1 pixel or less.
-
Any image whose source matches a known tracker marker:
pixel.,trk.,doubleclick.,google-analytics,facebook.com/tr,list-manage.com,mailchimp,sendgrid.net,sparkpost, andmandrill.
An honest limit. That marker list is short and finite. It catches the common commercial beacons, not a determined tracker on a first-party domain sending a 200×100 image. The defence that actually holds is leaving remote images off.
Sending
You do not track people by accident
Read receipts and outbound tracking pixels both exist in Alcedo, and both are off. Alcedo will not enable either one on your behalf.
- Read receipts. Outgoing mail carries no MDN request unless you turn it on.
- Outbound tracking pixels. Off, and inert even when enabled until you also supply an HTTPS pixel URL of your own. Alcedo hosts nothing for this.
- Disclosure before send. With either setting on, the composer tells you the message will request a receipt or carry a tracking image before it goes out. You do not find out afterwards.
On disk
Where things are kept
- Mail, folders, contacts, and calendar data: a SQLite database in your user data directory. Plain local files, yours to back up or delete.
- OAuth tokens and app passwords: the system keyring, through the Secret Service API. Never in SQLite, never in a config file, never in a log.
-
Preferences: GSettings, under
dev.alcedo.Mail.
The database is not encrypted at rest. It sits behind your user account and whatever disk encryption you already run. Saying otherwise would be a lie, and full-disk encryption is the honest answer here.
On device
Verification codes and spell-check
When a message contains a one-time sign-in code, the reader lifts it out and offers a copy button. The detection is keyword and pattern matching running in the process on your machine. No message text, and no code, leaves the device for this. There is no service behind it to switch off.
Spell-check runs through Enchant against the dictionaries installed on your system. Same story: local, offline.
Opt-in third party
Compose rewrite
Alcedo can ask a hosted language model to rewrite a draft. This is a convenience at the edge of the program, not the point of it, and it is worth being exact about:
- It does nothing until you supply your own API key for Groq, OpenAI, Anthropic, or Gemini. Alcedo ships no key and proxies nothing.
- It runs when you press Rewrite. It sends the draft you are editing to the provider you picked, under your key, subject to that provider's terms.
- It never touches received mail. Your inbox is not indexed, summarised, embedded, or uploaded.
- Nobody trains a model on your mail. Alcedo has no training pipeline and no telemetry to feed one.
Leave the key empty and this entire subsystem stays dormant.
Reference
The defaults, as shipped
These are the values in the GSettings schema for 0.1.0.
- Load remote images
- Off
- Remote
<img>tags are removed until you load a message. - Request read receipts
- Off
- No MDN request on outgoing mail.
- Insert outbound tracking pixel
- Off
- And no pixel URL is set, so it stays inert if enabled.
- Show verification codes
- On
- Detected locally in the reader. No network involved.
- Trash a message after copying its code
- Off
- Nothing is deleted unless you ask for it.
- Collect outgoing addresses
- On
- Addresses you write to are saved locally as unapproved contacts until you keep or discard them. Local only.
- Default compose format
- Plain text
- HTML and Markdown are available per message.
- Close to tray
- Off
- Closing the window quits the application.
- Vendor telemetry
- None
- Not a setting. There is no code for it.
Do not take our word for it
Check the defaults yourself
gsettings get dev.alcedo.Mail load-remote-images
gsettings get dev.alcedo.Mail request-mdn
gsettings get dev.alcedo.Mail insert-tracking-pixel
All three answer false on a fresh install. The tracker
rules, the sanitizer, and the verification-code detection are a few
hundred lines of Rust in the alcedo-html crate, with tests
beside them. Alcedo is GPL-3.0-or-later, so you can read every claim on
this page in the source and change what you disagree with.
No certifications are claimed. Alcedo has not been through an external privacy audit or a security review, and it is version 0.1.0. What it has is a small, readable codebase and defaults that do not need a settings tour to be safe.