Skim - Free, open-source AI email client for Windows
Skim v1.0.18 — "Mind the closing boundary" 🧱
The one where we stop blaming you for emails that render as a beautiful, pristine, completely empty rectangle. Turns out it was us. Well it was the sender's mailer. But we fixed it anyway.
Fixed
Blank emails are no longer blank. Some mailers finish a message on the last base64 chunk and just walk away, never writing the closing --boundary--. The MIME parser reads that as "this part is broken", quietly demotes your email to an attachment, and hands us nothing to show. Skim now closes those dangling multiparts itself (innermost first, like a polite houseguest turning off the lights) and parses again. Your booking confirmations are back.
No more phantom attachment. That mystery .bin full of raw base64 sitting under the empty email? It was your email. It has been returned to its rightful place.
Bad parses no longer latch forever. The old code cached "I fetched this" and "there's genuinely nothing here" as the same thing, so a message that failed to parse once stayed broken until the heat death of the universe. Now Skim can tell the difference and gives previously-mangled messages one more honest attempt.
Truly empty emails say so. If a message really has nothing to render, you get a plain line saying that instead of headers floating above a void. Silence is not a UI.
Stale attachment files get cleaned up on refetch, instead of quietly squatting on your disk forever.
Everywhere
Skim v1.0.17 — "Кто-то написал вам по-немецки" 🌍
The one where a foreign-language email stops being a research project. Press T, read it. That's the whole feature.
New
Translate an email in place Skim now notices when a message isn't in your language and offers to translate it right there: subject and body, in the reading pane, where the email already was. No copy-pasting into the Ask panel, no reading your mail as a chat bubble. Hit T, or click the offer.
"Show original" is one click away because sometimes the AI's Portuguese is worse than your Portuguese, and you'd like to check.
Translations are cached the first look costs a request, every look after that is free and instant. Re-opening a thread doesn't re-bill you.
Language detection runs locally trigram tables compiled into the binary. No model files, no download, no phoning home just to figure out that "Sehr geehrte Damen und Herren" isn't English.
The AI chat learned to grow Ctrl+E expands it to fill the window, Ctrl+Shift+E throws it into a window of its own, Esc puts everything back. The little arrows finally point where they mean.
Skim v1.0.9 — "Nice Try, Phish" 🎣
The one where Skim learns to smell a phishing email from across the room and does it all locally, offline, without phoning a single reputation service. Your inbox, now with a healthy sense of suspicion.
New
-
Phishing detection, built right in. Skim now quietly vets every message for the classic tells and warns you before you click something you'll regret.
Sender checks reads SPF / DKIM / DMARC results, catches "reply goes to a totally different domain" tricks, spots when the friendly display name hides a stranger's address, and flags lookalike domains (paypa1.com, we see you).
Link checks a link that says one thing but opens another, user@evil.com sleight of hand, and raw-IP links get stopped cold. Shorteners, plain http, punycode, weird ports and endless subdomains get side-eye too but only when the sender already looks shady, so your newsletters full of tracking redirects don't set off alarms.
A link gate click a suspicious link and Skim tells you where it actually goes and lets you bail or proceed. No more mystery destinations.
"Check for phishing" with AI one tap to have Skim AI read the sender, the auth results, and the links, then explain the whole thing in plain language.
All of it deterministic, all of it offline. No thresholds to tune, no data leaving your machine.
Skim v1.0.5 — "One Inbox to Rule Them All" 🪄
The one where all your mailboxes finally stop pretending they don't know each other. Connect five accounts, get one tidy stream of mail sorted by date. Revolutionary concept: everything in one place.
New
"All inboxes" view pick All inboxes in the account switcher and every connected mailbox pours into a single, date-sorted list of messages and threads. No more clicking between accounts like it's 2009.
From picker in compose replying or writing fresh from the unified view? Skim now lets you choose which account it goes out from, so your work self doesn't accidentally email your mom's book club.
Skim v1.0.20 — "It's an email, not a stylesheet" 🎨
The one where Skim stops reading the CSS and starts reading the letter. A tiny release: one fix, one heuristic, zero new buttons.
Still standing on @gildas-refacto's shoulders
All of v1.0.19 was theirs #30, their fourth merged PR after #16, #18 and #29, where they traced three separate translation bugs down to individual Unicode code points and measured every fix over 20 runs.
Which made this release slightly embarrassing to write: they spent all that effort making the translation trustworthy, and it turns out we were sometimes not offering it at all. Fixed below. Thank you again.
Fixed
-
The Translate chip shows up on mail that needs it. Some senders build their plain-text version by ripping the tags out of their own HTML <style> element included so the email "text" opens with a few hundred characters of .bio{margin:auto}. Skim guesses the language from that text, and on one real newsletter 72% of the sample was CSS: the guess came back "not confident", and a perfectly English email got no translation offer in a Russian UI. Braces are not a language.
Now a leaked stylesheet gets removed first and since the language guess runs fresh on every open, mail already sitting in your database is fixed too, no resync required.
Skim v1.0.15 — "Room to Breathe" 📐
The one where your email finally gets to use the whole window instead of huddling in a 840px column on the left like it's 2009.
Every fix below is the work of @gildas-refacto in #29 who not only found three pixel-level bugs we'd been staring past for months, but wrote commit messages more thorough than most postmortems. Thank you.
Fixed
The reading pane is now the reading pane. We were capping the message at 840px wide, which meant a big monitor bought you one skinny column of text, a lot of empty pane, and a scrollbar floating somewhere in the middle of the screen. Cap's gone. The mail gets the room.
Wide emails are no longer quietly guillotined. Some senders lay their newsletters out wider than that old column allowed, and the overflow just didn't exist. No scrollbar, no hint, no right-hand edge. Now a too-wide message scrolls sideways inside its own frame like a civilized document.
The message stopped growing 8 pixels every time you resized the window. Turns out the frame was measuring its own height, adding a margin, then measuring that, then adding the margin again a small ouroboros of blank canvas piling up under your email, one resize at a time. 788 812 836 860, same mail. It now measures the actual content, lands flush, and stays put.
Bonus side effect: with that 8px gone, the mail's rounded bottom corners are rounded again. Small thing. Bugged us.
Skim v1.0.14 — "Thinking, Not Loading" 🧠
The one where Skim stops insisting the model is loading while it is, in fact, sitting there thinking very hard. Turns out silence has two meanings, and we only knew one of them.
Entirely the work of @gildas-refacto in #28 thank you!
Fixed
"The model is loading " was a lie. Skim only ever watched for answer text. A reasoning model produces none while it reasons, so Skim saw silence and concluded the thing was still booting up. It now says "Thinking ", because that's what's happening.
Not just a local-model problem. Current Anthropic models reason by default, so the wrong label showed up on the default provider too. Both streaming clients report reasoning now.
The recap counter no longer freezes at "reading 20/20". It steps aside for "Thinking " the moment the mail is actually read, instead of staring at you until the answer lands.
The loading hint no longer beats the thinking one by a single frame. A flicker so brief it was almost a rumour. Gone anyway.
Skim v1.0.7 — "Ollama Mia!" 🎶
The one where setting up a local AI brain stops being a spelling test pick a chip, done.
And it's a special one: this is Skim's first release built on a pull request from an outside contributor.
🚀 Skim v1.0.4 is out — "Two inboxes walk into a titlebar" 📬📬
Small update, but a big quality-of-life one: Skim now handles multiple mailboxes at once without turning into a giant multi-account control panel.
What's new:
Multiple accounts, one calm app. Connect as many mailboxes as you like. A slim switcher shows up in the titlebar only when you have more than one, with a per-inbox unread hint.
Ctrl + 1 9 to jump straight to the Nth mailbox.
Everything lands in the right place toast clicks, search hits, AI citations, cold-start opens all switch to the account that owns the message before opening it.
Search & compose stay scoped to the mailbox you're looking at no more "sent from the wrong address" moments.
No duplicate accounts try to add one that's already connected and Skim politely declines before touching your existing setup.
Skim is still what it's always been: a free, open-source AI email client for Windows, ~5 MB installer, bring-your-own-key AI. No account, no telemetry, no bloat.
