# I built Skim: a free open-source Email client for Windows with BYOK AI (MIT)

> Source: <https://dev.to/dropdead_mouse/i-built-skim-a-free-open-source-email-client-for-windows-with-byok-ai-mit-4ji4>
> Published: 2026-07-24 09:19:34+00:00

*I built Skim because I tried to find a Windows email client that doesn't suck that hard and couldn't really find one.*

**Quick feature list:**

**AI features are pretty basic:**

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.
```

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.

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:

*🤓 Or, straight to Github repo: https://github.com/nikserg/skim*
