Zlack is a lightweight, optimized desktop wrapper for Slack, built with Tauri. It provides a native application experience with robust desktop notifications, handling deep links and window focus correctly even when minimized.
- Native Desktop Notifications: Integrated directly with Windows native toast notifications.
- Unread Tray & Title Badges: The tray icon shows a red badge for unread DMs/@mentions and a blue badge for other unread messages, and the window title is prefixed with
!for unread DMs — handy if you prefer ambient indicators over toast popups. - Firewall-Friendly Build (optional): A Windows build variant can bundle a private, fixed-version WebView2 runtime so firewall rules can be scoped to Zlack alone.
- Smart Context: Extracts
Team IDandChannel IDfrom Slack's console logs to ensure notifications take you to the exact right place. - Background Reliability: Includes a custom rust backend to ensure clicking a notification properly restores the window from the system tray and focuses it.
- Multi-Workspace Support: Handles navigation for multiple Slack workspaces via standard webview login.
- Lightweight: Uses Tauri's minimal footprint (WebView2 on Windows) instead of a full Chromium bundle (Electron).
- Frontend: Vanilla HTML/JS (Slack Web Client) +
preload.jsfor bridge. - Backend: Rust (Tauri) for system integration.
- Notification Engine:
tauri-winrt-notificationfor advanced Windows Toast features (Inputs, Activation Callbacks).
Download the installer for your OS:
| Platform | File |
|---|---|
| Windows | Zlack_${version}_x64-setup.exe (installer) or Zlack_${version}_x64_en-US.msi |
| macOS | Zlack_${version}_x64.dmg |
- Run the installer.
- Launch Zlack.
- Log in to your Slack workspaces.
Install Dependencies:
npm installRun in Development Mode:
npm run tauri devNote: In dev mode, clicking notifications may not reliably restore the window due to Windows AUMID restrictions. This works fully in the built release.
Build for Production (Windows):
npm run build:dist:windowsThis will compile the application and place the installer (.exe and .msi) into the dists/ folder.
Build for Production (macOS/Linux):
npm run build:dist:unixThis requires running on a Mac or Linux machine. It will generate .dmg/.app (macOS) or .deb/.AppImage (Linux) in the dists/ folder.
Build with a private, fixed WebView2 runtime (Windows):
npm run build:dist:windows:fixedBy default Zlack uses the shared, system-wide WebView2 runtime. Because that runtime is shared, allowing it through a software firewall effectively allows any app to reach the internet through it. This variant instead bundles a private, fixed-version WebView2 runtime inside Zlack's own directory, so you can write a firewall rule scoped to Zlack alone (issue #2). The trade-off is a ~150–180MB larger installer.
The runtime is downloaded once and is not committed to the repo. Get the Fixed Version .cab for your architecture from the WebView2 download page, then run:
# pass the cab path directly...
npm run build:dist:windows:fixed -- "C:\path\to\Microsoft.WebView2.FixedVersionRuntime.<ver>.x64.cab"
# ...or via an env var, or a direct URL:
$env:WEBVIEW2_FIXED_CAB = "C:\path\to.cab"; npm run build:dist:windows:fixed
$env:WEBVIEW2_FIXED_URL = "https://.../...cab"; npm run build:dist:windows:fixedOnce extracted to src-tauri/webview2-runtime/, subsequent builds reuse it. Output installers are suffixed _webview2fixed.
Slack's web client sends telemetry traces to /traces/v1/list_of_spans. Zlack's preload.js intercepts this network traffic:
- Captures
notification:sentspans to reliably identify theTeam IDandChannel IDassociated with the event. - Intercepts the browser's
NotificationAPI request. - Merges the content with the captured network context and sends it to the Rust backend.
Clicking a notification on Windows while an app is minimized is notoriously tricky due to OS foreground rules. Zlack solves this by:
- Main Thread Architecture: Creates notification objects directly on the main thread to ensure proper COM listener persistence.
- Staged Restoration: Explicitly calls
set_skip_taskbar(false),unminimize(), andshow()in the correct order. - Focus Hack: Uses a temporary "Always On Top" toggle to force the window into the foreground even if Windows tries to suppress it.
MIT