Skip to content

Repository files navigation

Le Chat Desktop

Le Chat Desktop

A tiny, native macOS app for Le Chat (Mistral AI) — fully customizable, with the branding back the way you want it.

Le Chat Desktop in action

Built with Electrobun + Bun + TypeScript: it uses the system webview (native WKWebView on macOS), so the whole app is ~18 MB, while the Bun main process keeps real control over the webview (external links, native menu, in‑page branding). The icon, UI and concept come from M1n-74316D65/mistral-app (originally Tauri + Rust); this wrapper has been through a couple of runtimes — Neutralino before this — and now runs on Electrobun.

Note

This is a personal project. I built it for myself, to use Mistral more easily on my own machine. It's shared in case it's useful to someone else — feel free to fork it, use it, or make it your own. But I'm not maintaining it as a product: there's no support, no roadmap, and I only keep it working for my own use. Issues and PRs may go unanswered.


Make it yours

Mistral renamed Le Chat's workspace to "Vibe" — and a lot of people would rather it just said Le Chat. This app lets you fix that, and more. Open Settings (⌘,) to:

  • Rename the workspace back to "Le Chat" — or anything you like. Toggle it on/off anytime.
  • Replace the logo with your own image (SVG or PNG) and resize it with a slider.

Changes save instantly and apply live to the chat page — no restart.

Le Chat Desktop settings window

Features

  • Le Chat in a native window — wraps https://chat.mistral.ai/chat in a single resizable window.
  • Links open in your default browser — both target="_blank" links and Le Chat's "Opening an external link" confirm modal (which uses window.open()) are routed to the system browser.
  • Settings window (⌘,) — rename the workspace label (Mistral's "Vibe" → your own name, e.g. "Le Chat") and set a custom logo. Saved to ~/Library/Application Support/ai.mistral.lechat.desktop/settings.json and applied live to the chat page.
  • Native macOS menu — standard Edit actions (undo/cut/copy/paste/select‑all) wired as menu roles, so ⌘C/⌘V/⌘X reach the chat composer. ⌘W hides the window (session stays alive); the red traffic‑light button quits.
  • Light / dark theme following the OS (via prefers-color-scheme).
  • Loading / offline splash with a retry, reused from the original design.

Architecture

One Electrobun window with one webview. The webview first shows a local branded loading / offline screen (src/mainview/index.html); once it's online that page navigates the same webview to Le Chat. Everything native lives in the Bun main process (src/bun/index.ts), so it stays in effect after the webview navigates to the remote (CSP‑locked) chat page:

  • External links — Le Chat opens links via target="_blank" and, for in‑chat message links, a confirm modal that calls window.open(). Electrobun's native webview surfaces both as a new-window-open event; the main process handles it with Utils.openExternal(url). (This is the bug the previous Neutralino build couldn't fix: its webview swallowed window.open(), and its JS bridge is dead on the CSP‑locked chat page, so no in‑page workaround was possible.)
  • Application menu — set once from the main process with role‑based items, so it persists across the navigation and the Edit actions target the focused WKWebView.
electrobun.config.ts        build config (native webview, bundleCEF: false)
src/
  bun/
    index.ts                main process: windows, menu, link handler, branding, RPC
    settings.ts             load/save settings JSON in Application Support
  mainview/
    index.html              loading / offline screen
    index.ts                checks connectivity, navigates the webview to Le Chat
  settings/
    index.html              settings window UI
    index.ts                settings renderer (RPC to the main process)
icon.iconset/               app icon, generated from resources/icons/appIcon.png
resources/icons/            appIcon.png (1024×1024 source) + raster icons

Prerequisites

  • Bun (curl -fsSL https://bun.sh/install | bash). Electrobun runs the main process on Bun and downloads its native core binaries on first build.
  • macOS 14+ on Apple Silicon (these instructions build the macos-arm64 target).

Install

There's no prebuilt release — building it yourself takes about a minute:

git clone <this-repo> le-chat-desktop
cd le-chat-desktop
bun install
bun run build:release

Then open artifacts/stable-macos-arm64-LeChat.dmg, drag Le Chat.app into your Applications folder, and launch it.

Note

The app is unsigned, so the first launch is blocked by Gatekeeper. Right‑click the app → OpenOpen once; after that it opens normally. (Signing it away requires an Apple Developer ID — see Build a distributable.)

Develop & run

bun install        # one-time
bun run start      # build + launch (electrobun dev)
bun run dev        # same, with --watch for live reload

Build a distributable

bun run build           # dev build → build/dev-macos-arm64/Le Chat-dev.app
bun run build:release   # stable build → artifacts/*.dmg + self-extracting .app.tar.zst

The stable build produces a compressed, self‑extracting bundle in artifacts/ (~18 MB DMG on Apple Silicon). The app icon is generated from resources/icons/appIcon.png into icon.iconset at build time.

Code signing: builds are currently unsigned, so distributing the .app/DMG to other Macs needs a right‑click → Open (or signing + notarization). To sign, set build.mac.codesign: true (and notarize: true) in electrobun.config.ts with a Developer ID certificate in your keychain.

Credits

UI, icons and original concept: M1n-74316D65/mistral-app. "Le Chat" and Mistral branding belong to Mistral AI. This is an unofficial wrapper.

About

My vibecoded mistral le chat (vibe) desktop app. Using electrobun & typescript

Resources

Stars

2 stars

Watchers

0 watching

Forks

Contributors

Languages