Built for macOS 26 Tahoe · Gmail · single-scope OAuth

Fast enough
to finish.

Troxic is a keyboard-first Gmail client written natively in SwiftUI for macOS 26. 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 API key — because there is no Troxic server to run it on.

Currently in closed testing — 100 named seats, no waitlist theatre.

  • Zeroservers, analytics, telemetry
  • 8appearances — 4 themes × light/dark
  • 1restricted scope: gmail.modify
  • ~30klines of Swift 6, no third-party SDKs

Mailboxes

Important 4
To Reply 2
Calendar
New 1
Other 6

Lanes

Security
Receipts

Mail

Starred
Reminders 3
Sent
Files

Important

Synced just now · 2 accounts

Live preview — click the window, then press jk to move · e archive · s star · u unread · lane · ⌘K palette Live 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 below and the whole page re-tints with it, 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. One rule keeps it readable: glass is chrome only. Message bodies always sit on an opaque reader surface.

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.

It degrades on purpose

Reduce Transparency swaps every glass surface for a solid, stroked card. Reduce Motion stills the atmosphere and drops every transition to opacity. Text pairs are checked against WCAG AA in all eight appearances.

Triage

Your hands never
leave the keys.

Archive, star, snooze, reply, jump, unsubscribe — all of it under the home row. Actions apply optimistically and land in Gmail 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.

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.

Important

People. In INBOX, 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.

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.

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.

Lanes you write yourself

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

⌘KNew Lane

Unsubscribe that isn’t a trap

Troxic already fetches the List-Unsubscribe header, so the Subscriptions pane lists everything mailing you. 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.

Security

Built by people who
read headers for a living.

Troxic is made at ForeGuards, where the day job is incident response. So the mail client ships with the checks you’d want on a suspicious message — on demand, on the conversation in front of you, never as a background scan of your mailbox.

Phishing analysis, one key away

Add your own DFIR Lab API key in Settings → Integrations and 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 comes back inline.

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. You can send that one URL through Safe Browsing before you go, or set link checks to run automatically when a conversation opens. Tracking parameters are stripped before anything is scanned.

Remote images off by default

Opening a message never tells the sender you opened it. Images stay blocked behind a banner until you load them, and “always load” is a per-sender allowance you can revoke in Settings → Privacy.

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.

One scope. On purpose.

Troxic asks for gmail.modify and nothing more. It deliberately does not request mail.google.com, which means the app is structurally incapable of permanently deleting your mail — delete moves to Trash, where Gmail can still undo it.

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 this Mac, and every request is one you asked for, scoped to one thread, sent with store: false.

Summaries and briefs

A one-line summary above a long thread, cached per body fingerprint so reopening it never re-sends anything. ⌘⇧B briefs the whole conversation when one line isn’t enough.

Drafts in your voice

Seven tones, three lengths, and a free-form instruction of your own. My Voice learns your style from a capped sample of your sent mail — one call, cached locally. Drafts always come back as editable text; Troxic never sends on its own.

⌘Jr⇧R

Or nothing leaves at all

Choose “On this Mac” and prompts run through Apple Intelligence on-device. Troxic never silently substitutes one provider for the other — if you picked on-device and it isn’t available, you get an error, not a quiet upload.

Ask, don’t remember

/ is an instant local filter with real operators — from:, has:attachment, after:7d, label:. Ask AI ranks up to eighty already-cached threads by subject, sender and date; full bodies stay on the Mac.

Sorting help, once

When a lane’s rules can’t decide, Troxic can ask your model about that sender — once — and cache the answer. It is never asked again for that address.

Off until you say so

Every AI feature stays dark until a key validates against GET /v1/models. Nothing runs against your list in the background unless you explicitly turn on inbox headlines — and even then it’s the subject and snippet of twelve visible rows, not bodies.

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. Calendar consent is separate and incremental — declining it changes nothing about mail.

⌘Y

Scheduled work fires while Troxic is running, and catches up on next launch. Turn on the companion and the app registers itself as a login item with a menu-bar extra, so a send-later still leaves at 7am whether or not the window is open.

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 with your token and nothing sits in between. Two optional services can each be handed one thread when you ask: OpenAI, under your key, and DFIR Lab, which we run ourselves and say so plainly below.

Google

Gmail REST over URLSession, one restricted scope.

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

Your Mac

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

  • Mail cache inside the app sandbox
  • Google tokens and every API key in the macOS Keychain
  • 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

Disconnecting is real. Sign out revokes the Google 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.
Persistence
SwiftDataThread rollups and messages; the UI reads the cache, the network fills it.
Networking
URLSessionHand-written Gmail, Calendar, OpenAI and DFIR clients as actors.
Dependencies
NoneNo third-party SDK ships in the app.
Auth
OAuth 2.0 + PKCEInstalled-app flow over a loopback redirect. Tokens live in the Keychain.
Scopes
gmail.modifyPlus calendar.events only if you connect Calendar.
Entitlements
Sandbox · Hardened RuntimeNetwork client, loopback listener, user-selected files, Keychain group.
Accounts
Multiple Google accountsOne merged inbox, or scoped to the active account.
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 and a Google account. During testing, Google shows an “unverified app” screen on first consent.

Ask for a seat.

Three questions. We read every one of these ourselves.

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