I built Skim because I tried to find a Windows email client that doesn’t suck that hard and couldn’t really find one.
It’s not rocket science to vibecode one, right? Why has nobody done it before? Or is everyone just okay with bloated Outlook or archaic Thunderbird?
Skim – free, open-source, MIT-licensed minimalistic offline-first email client with BYOK AI.
Quick feature list:
- Installer under 5 MB
- Bring Your Own Key to enable AI features: Anthropic/OpenRouter, or any OpenAI-compatible server (including a local one)
- No menu. Minimalistic and contextual interface – buttons are shown only when you need them
- Keyboard-first controls: shortcuts for everything, no mouse needed
- Sweet warm zine design
- Super modest resource consumption
AI features are pretty basic:
- Cowriter that can scan your recently sent emails, adopt your style, and then write emails and replies that sound like you
- “Ask this email” – chat with a particular email; it can read attachments and follow links inside it
- Agentic search across all connected inboxes; the “Ask your inbox” feature can scan your whole inbox
- One-click summarization and translation
A few things I’m actually proud of under the hood
The UI part is easy to vibecode. These bits were not.
Getting the installer under 5 MB took real work.
panic = "abort" alone dropped about 6 MB of unwind tables from the binary, that’s 23% off the NSIS installer. I ship a single crypto backend (ring, with aws-lc-rs switched off) so I’m not compiling a second, unused crypto library into the thing. I even wrote a tiny Vite plugin that deletes legacy .woff fonts, since WebView2 always uses woff2 anyway. Pretty much every dependency in Cargo.toml carries a comment justifying its feature flags in kilobytes saved:
rustls = { version = "0.23", default-features = false, features = ["ring"] }
# aws-lc-rs would compile a second, unused crypto library. ~2 MB of dead weight.
Enter fullscreen mode Exit fullscreen mode
No Electron, no bundled Chromium. Tauri 2 uses the system WebView2, so it installs per-user with no admin rights.
HTML email is treated as hostile.
Every message passes three layers before it reaches your eyes: ammonia sanitizes it in Rust so unsanitized markup never crosses the IPC boundary, then it renders inside a sandboxed iframe with no allow-scripts and its own CSP, and the whole app runs under a strict app-level CSP on top of that. Remote images get stripped and counted, so you see a “show images” bar instead of silent trackers phoning home.
The AI is agentic, not RAG bolted on.
“Ask your inbox” is a real tool-calling loop. The model gets search_emails, read_email and fetch_url, runs its own retrieval over a few rounds, and answers with stable [N] citations pointing back to the actual emails. fetch_url can only open links that already showed up in your mail, and that allowlist never grows from the pages it fetches, so the web can’t expand its own reach. BYOK the whole way: Anthropic, OpenRouter, or any OpenAI-compatible endpoint including a local Ollama, all hand-rolled over streaming.
Every action is offline-first for real.
Archive, delete, star, send: they all apply locally in a single SQLite transaction and land on an op queue. The UI updates instantly, the server catches up with retries, transient network/TLS/OAuth errors get retried while real failures roll the optimistic change back. Search is SQLite FTS5 with bm25 ranking, so it’s instant and works offline too.
So, once again, it’s free forever, open-source and MIT licensed.
If you like this product, I humbly ask you to star the repo, upvote or even contribute! Btw, I already have one external contributor, and this guy rocks!
In case you didn’t notice the links to the website all over this post: here is a big one:
👉 https://skim-tech.com/ 👈
🤓 Or, straight to Github repo: https://github.com/nikserg/skim

답글 남기기