Built for macOS 26 Tahoe· Gmail · Microsoft 365 · IMAP

Fast enoughto finish.

  • Troxic servers0
  • Restricted Google scopes1
  • Mail providers3
  • Appearances8
  • Third-party SDKs0

Troxic is a keyboard-first email client written natively in SwiftUI for macOS 26 — for Gmail, Microsoft 365, and any IMAP mailbox. Real Liquid Glass chrome. A split inbox that classifies the sender, not every message. Phishing verdicts on the conversation you’re reading. And AI that runs on your key, or on this Mac — because there is no Troxic server to run it on.

Mailboxes

Inbox 3
To Reply 2
Calendar
New 2
Other 1
Ads

Lanes

Security
Receipts

Mail

Starred
Reminders 3
Sent
Files
People

Inbox

Synced just now · 3 accounts

Live preview — it plays itself until you click in. Then jk move ·e archive · s star ·⇥ lane · ab gatekeeper ·⌘K paletteLive preview — tap a lane or a conversation. The real thing runs on the keyboard.

The design system

Eight appearances.
One set of tokens.

Every colour in Troxic comes from a resolved ThemeTokens struct — atmosphere, glass tint, accent, split-lane colours, text, separator, star. Views never invent a colour. Pick a theme and the whole page re-tints, because this page reads the same tokens the app does.

In the app: Settings → Appearance, or ⌘K → “Use Ember Theme”.

Real Liquid Glass, not a blur

Chrome uses the macOS 26 .glassEffect APIs with a GlassEffectContainer per cluster — never a faked Material. The list itself is glass now: floating date chips, rows that sit straight on the atmosphere, a concentric selection pad. Message bodies always sit on an opaque reader.

An atmosphere worth refracting

A full-window MeshGradient drifts slowly behind the chrome, with the theme’s accent nebula anchored where that theme wants it — bottom-trailing for Aurora, straight overhead for Noir. Glass needs something to sample.

Dark mode that can read mail

HTML mail gets an inversion dark reader instead of a white slab. Reduce Transparency swaps every glass surface for a solid card, Reduce Motion stills the atmosphere, and every text pair is checked against WCAG AA in all eight appearances.

Keyboard-first

Your hands never
leave the keys.

Archive, star, snooze, reply, accept, block, jump, unsubscribe — all of it under the home row. Actions apply optimistically and land on the server a moment later; if you change your mind, ⌘Z reverses the exact call that was made, batch or single.

Multi-select with ⇧J/⇧K and one undo covers the whole batch. Selection advances after archive and trash, so a hundred newsletters is a hundred e presses — not a hundred round trips to the mouse. Spotlight knows “Search Troxic for…” and “Compose in Troxic”, too.

The split inbox

Classify the sender,
not the message.

Sorting every message forever is a losing game. Troxic decides once, per sender, and remembers. Newsletters land in Other and stay there; people you actually write to are promoted from your own Sent history; strangers wait at the gate.

Inbox

People. Not automated — no List-Unsubscribe, no Precedence: bulk, not a noreply@ — or a sender you’ve written to before, starred, or pinned as a VIP.

To Reply

People waiting on you. The last message is inbound, from a human, and you haven’t answered it. Ranked above ordinary unread inside every date group.

New

First contact. With the Gatekeeper on, an unknown sender waits outside the inbox until you press a to accept or b to block — the person, or the whole domain. ada+news@ is still Ada.

Other

Noise. Newsletters, receipts, notifications. Two or more threads from the same sender collapse into a single bundle row you can expand or archive whole.

Ads · Spam

Their own folders, sorted by Troxic’s own conservative, sender-based detection. A model may shelve mail in Ads; nothing is ever auto-filed as Spam.

Lanes you write yourself

Build a lane from deterministic rules — from, to, subject, label, has-attachment, is-automated, with exclusions, all-or-any — and choose whether it hides matching mail from Inbox and Other. Add a plain-English prompt and Troxic asks your model once per sender, then caches the verdict forever.

⇥⌘KNew Lane

Search that speaks Gmail

/ is an instant local filter with real operators — from:, to:, subject:, label:, tag:, filename:, has:attachment, after:, larger:, is:unread, OR groups and negation — with paged results when the cache runs out.

Unsubscribe that isn’t a trap

Troxic already fetches the List-Unsubscribe header, so the Subscriptions pane ranks everything mailing you by volume. It prefers the mailto: target and sends it on your normal compose path. An https: target opens only after you confirm — a silent background fetch is a tracking signal, not a courtesy.

Every mailbox

Gmail, Microsoft 365,
and plain old IMAP.

One window, mixed providers, all accounts at once or just the active one. Each connector is hand-written over URLSession — Gmail REST, Microsoft Graph, IMAP with IDLE — and the table says exactly what each can do, because they are not all the same and we would rather you knew.

BehaviourGmailMicrosoft 365IMAP / SMTP
ConnectOAuth, PKCE, one restricted scopeOAuth, PKCE, one consentHost, port, password — in the Keychain
Live arrivalHistory-based syncGraph delta syncIDLE when the server advertises it, polling otherwise
PeopleA local directory per account. You add people yourself — from the People workspace or from any address in a message — and edit the contact card. Troxic never imports a provider address book.
Send asPrimary, plus accepted send-as aliasesPrimary, plus SMTP aliases — tenant policy appliesIdentities you manage, marked as unverified by the server
Export EML / mboxYesYesYes
Import EML / mboxYes, under gmail.modifyNot for received mail — Graph won’t take itYes, via APPEND
Server rules & vacation repliesGmail filters, edited losslesslyExchange rules and automatic repliesNot in the protocol; Troxic explains instead
CalendarGoogle Calendar, separate consentMicrosoft calendars, same consent—

People

A manual directory, per account, with a real contact card: labelled phones, emails and URLs, related names, notes, a photo. “Add to People” from any address in any message. Nothing syncs anywhere unless you export it.

Files, with Quick Look

Every attachment across every account in one searchable lane, filtered by PDF, image, document or other. space previews it the way Finder does; a double-click does the same.

Tags beside labels

Provider labels stay provider labels. Tags are local, colour-coded and yours — Work, Personal, Follow up. Both are one ⌘K away, and the sidebar files by drag.

Rules and vacation replies

Edit the server’s own filters — Gmail’s or Exchange’s — losslessly. A rule Troxic can’t express stays visible and read-only rather than silently mangled. Automatic replies live in the same pane, per account.

Your mail is a file

Export a conversation, or a mailbox, as EML or mbox — user-initiated, staged atomically, quarantined. Import with a bounded preflight, dedupe, an explicit destination, and resume if it stops halfway.

Changes that survive

Archive on the train. Every mutation is an outbox entry with a retry policy: it lands when the network does, it survives a relaunch, and a stuck provider gets a recovery state instead of a spinner.

Also new: replies dock under the conversation, composed mail gets a format bar, the From picker is just addresses, ⌫ moves to Trash, and one Sync button covers mail and calendar.

Security

A verdict on the message
in front of you.

Connect Troxic to DFIR Lab and any suspicious message gets an incident responder’s read — headers, authentication results, reply paths, links — on demand, on the conversation in front of you, never as a background scan of your mailbox.

Add your own DFIR Lab key in Settings → Integrations. The shield in the reader — or p — exports the open message as RFC 822 and posts it to api.dfir-lab.ch under your key. The verdict and its reasons come back inline, so you decide before you reply.

DFIR Lab · phishing/analyze · the open message, your keyp
From:      "Priya Raghavan (ForeGuards)" <accounts@fg-secure-login.com>
Reply-To:  collect@mailer-relay.ru
To:        giuseppe@foreguards.com
Subject:   Action required: re-validate your keychain access
Date:      Tue, 2 Sep 2026 07:58:12 +0200
Authentication-Results: spf=softfail dkim=none dmarc=fail
List-Unsubscribe: (absent)
X-Mailer:  PHPMailer 6.9
Links:     https://bit.ly/3xQ… → fg-secure-login.com/verify  (×2)
Verdict

Suspicious

  • Display name does not match the sending domain
  • Reply-To points somewhere else entirely
  • DMARC fails for foreguards.com
  • Two links shortened through a redirector

Four answers, and the honest one is allowed

The verdict is Phishing, Suspicious, Legitimate — or Unknown, when the service can’t say. The check runs only when you press it, only on that message, and the key you added is validated against /health before anything is sent.

PhishingDo not act on it
SuspiciousVerify out of band
LegitimateNothing found

Links ask first

Clicking a URL in a message opens a sheet, not your browser. Send that one URL through Safe Browsing before you go, skip it, or cancel — or set link checks to run when a conversation opens. Opening always hands off to your default browser, never the in-app view.

Remote images off by default

Opening a message never tells the sender you opened it. Every remote reference is blanked before render — quoted, unquoted, srcset, CSS url(), entity-encoded, quoted-printable. The banner says what was withheld and which hosts it would have contacted. Correspondents you write to can be allowed, per sender, and revoked.

Sandboxed and least-privilege

App Sandbox, Hardened Runtime, ATS. HTML mail renders in a locked-down WKWebView with no arbitrary JavaScript. Bodies and tokens are never logged; Authorization is redacted. PKCE is S256 only, never plain.

One restricted scope. On purpose.

Google gets gmail.modify and nothing broader. Troxic deliberately never requests mail.google.com, which makes the app structurally incapable of permanently deleting your mail — delete moves to Trash, where Gmail can still undo it. Rules, vacation replies and send-as ask for gmail.settings.basic separately, only if you use them.

Intelligence

Your key. Your call.
Every single time.

Troxic has no AI business model, because it has no backend to bill you from. Paste an OpenAI key or pick Apple Intelligence on your Mac, and every request is one you asked for, scoped to one thread, sent with store: false. This is the whole list of what can leave the Mac, and when.

FeatureWhat leaves the MacWhenCached
Summary lineThe messages of that one threadWhen you open it, with AI onPer body fingerprint — reopening sends nothing
Brief ⌘⇧BThe threadWhen you press itYes
Inbox headlinesSubject and snippet of the twelve visible rowsOnly if you turn it on — off by defaultYes
Selection AI ⌘JThe text you highlightedWhen you press itNo
Write · rewrite · toneYour draft, and the thread you’re replying toWhen you askNo — drafts come back as editable text
My VoiceUp to six recent sent messages, onceWhen you enable itThe style summary stays on the Mac
Ask AI searchSubject, sender and date of up to eighty cached threadsWhen you askNo — bodies never leave
Lane and split assistOne sender’s headersWhen your rules can’t decidePer sender, forever
Anything in the backgroundNothingNever—

Three providers, no surprises

OpenAI — gpt-4.1-mini by default, gpt-4.1 if you prefer, streamed. On this Mac — Apple Intelligence through FoundationModels, nothing leaves. Automatic picks OpenAI when your key is valid and on-device otherwise. Pick one explicitly and Troxic never substitutes the other — if it isn’t available you get an error, not a quiet upload.

Drafts in your voice

Seven tones — professional, familiar, friendly, concise, empathetic, assertive, neutral — three lengths, and a free-form instruction of your own. Rewrite, shorten, lengthen, proofread. My Voice learns your style from a capped sample of sent mail in one call. Troxic never sends on its own.

⌘Jr⇧R

Off until you say so

Every AI feature stays dark until a key validates against GET /v1/models. The key lives in your Keychain. Spam is excluded from anything a model may assign — it may shelve mail in Ads, never bury it. Sign out and every derived summary is wiped with the cache.

Time

Mail that comes back
when it’s relevant.

Snooze · Send later · Follow up

Later today, tomorrow morning, next Monday, in three days, or a date you pick. Follow-ups close themselves the moment a reply arrives — you only hear about the silence.

h

An undo window that’s yours

Set the send delay to 0, 5, 10 or 30 seconds and the toast timeout to 5, 10 or 20. ⌘Z cancels a pending send before it ever leaves the Mac.

Calendar, in the same window

Day, work week, week and month grids; drag a range to create an event; RSVP to an invite straight from the reader banner it was parsed out of. Google and Microsoft calendars, and a calendar can be connected without a mailbox at all.

⌘Y

Resident, quietly

Turn on the companion and Troxic registers as a login item with a menu-bar extra — unread Inbox count, Compose, the next reminder — so a send-later still leaves at 7am whether or not the window is open. Scheduled work fires while Troxic runs and catches up on next launch. Set working hours and new-mail banners sleep outside them.

Part of the Mac

Spotlight can search Troxic or start a message. A Focus Filter limits notifications to Inbox only, or to one named account. Notifications themselves are Smart, All, VIPs only, or Off — with a Dock badge you scope the same way.

Privacy

There is no Troxic server.

Not “we don’t look at your mail.” There is no mailbox sync, no index, no queue — no place for it to go. Troxic talks to Google, Microsoft or your IMAP server with your own token — or your own password, from the Keychain — and nothing sits in between. Two optional services can each be handed one thread when you ask: OpenAI and DFIR Lab, each under your own key.

Google Gmail REST, Calendar

  • Full sync on first run, history-based partial sync after
  • Labels, modify, trash, send — no permanent delete

Microsoft Graph

  • Mail, calendar and mailbox settings in one consent; delta sync after

Your IMAP server IMAP + SMTP

  • Password in the Keychain, IDLE when advertised, TLS required

Your Mac

The whole application. SwiftData is the source of truth the UI reads.

  • Mail cache, People, tags and lanes inside the app sandbox
  • Google and Microsoft tokens, IMAP passwords and every API key in the macOS Keychain
  • Pending changes queued locally until the server takes them
  • No analytics, no telemetry, no crash reporting

OpenAI optional

Only on an action you took, for the thread you’re in, under your key, with store: false. Or never, if you use Apple Intelligence instead.

DFIR Lab optional, and ours

Only the message you pressed the shield on, or the single URL you chose to check. Never a background scan of the mailbox.

  • Run by the same people who make Troxic. A message you send it is processed on infrastructure we control — the one case where mail reaches us
  • Off entirely until you add a key, and never triggered on its own
  • How long a submitted message is kept is not published here. Write to contact@troxic.ch — we will not invent a number on this page

Disconnecting is real. Sign out revokes the grant and wipes the local mail cache and every derived summary. Your OpenAI and DFIR keys are only deleted if you ask for that too — they’re yours, not ours.

Under the hood

The whole spec sheet.

Platform
macOS 26 (Tahoe)Native SwiftUI. Not Catalyst, not a web view, no iOS build.
Language
Swift 6Strict concurrency, MainActor-by-default isolation.
Providers
Gmail · Microsoft 365 · IMAP/SMTPMixed in one window; all accounts or the active one. Calendar-only connections too.
Persistence
SwiftDataThread rollups, messages, People, tags, lanes, verdicts, and a durable outbox of pending changes.
Networking
URLSessionHand-written Gmail, Graph, IMAP/SMTP, Calendar, OpenAI and DFIR clients as actors.
Dependencies
NoneNo third-party SDK ships in the app.
Auth
OAuth 2.0 + PKCE (S256)Installed-app flow over a loopback redirect for Google and Microsoft. IMAP passwords, like tokens, live in the Keychain.
Google scopes
gmail.modifyPlus gmail.settings.basic for rules, vacation and send-as, and calendar.events + calendar.calendarlist.readonly, each only if you use it.
Microsoft scopes
Mail.ReadWrite · Mail.SendWith Calendars.ReadWrite and MailboxSettings.ReadWrite, in one consent.
Entitlements
Sandbox · Hardened RuntimeNetwork client, loopback listener, user-selected files, Keychain group.
Settings
19 panesFrom General to Shortcuts, including Rules, Lanes, Senders, Subscriptions, Tags, Snippets and Integrations.
Distribution
Closed testingGoogle OAuth is in Testing: up to 100 named users while restricted-scope verification and CASA are underway.
Troxic app icon

Ten seats at a time.

Troxic is in closed testing while Google verification runs. Seats go to people who live in their inbox, love jk, and will tell us when something is wrong.

Requires macOS 26. Gmail seats see an “unverified app” screen on first consent during testing; Microsoft 365 and IMAP accounts connect as usual.

Ask for a seat.

Three questions. We read every one of these ourselves.

We only use this to answer you. ⌘⏎ sends.