ZeChat Logo
ZeChat Zafiamy Chat
Local-first agentic chat, powered by a Rust agent runtime

Your AI Chat,
Private and On Your Side.

ZeChat is a desktop chat client for OpenAI-compatible models, built around one idea: you stay in control. The agent loop runs natively in Rust (zeagentrs) inside a Tauri 2 app — it streams turns, calls tools, connects MCP servers, loads your Markdown skills, and enforces a tool firewall before anything executes. Everything lives in plain files under ~/.zechat.

Why we built ZeChat

An AI assistant
that answers to you.

Most AI chat apps are locked to one vendor's cloud, one vendor's model, and one vendor's rules — and your conversations live on their servers. ZeChat's answer is simple: run the agent on your own machine, connect whichever model and tools you choose, and keep a firewall between the model and anything it wants to do.

Bring your own model

Point ZeChat at any OpenAI-compatible endpoint — cloud or a local server. Save several connection profiles, fetch each one's model list, and switch models from the header. Your keys, your endpoints.

Local-first by design

No account, no telemetry, no ZeChat backend. Sessions are Markdown, settings and memory are JSON — all under ~/.zechat. The only network calls are the ones you configure.

Real tools, real actions

Rust system tools, MCP servers over stdio/HTTP/SSE, and your own Markdown skills give the model more than talk — it can call functions and act, every call routed through your policy.

A firewall you control

Ordered rules decide, per tool call, whether it runs, asks, or is blocked. Presets get you started; the simulator shows what a rule matches before you save it.

See it in Action

Real screenshots of the desktop app — conversation on the left, the live agent console on the right.

ZeChat desktop app in light mode: conversation list, chat with a streamed reply, and the agent console showing run, route, memory and LLM trace events.
ZeChat desktop app in dark mode: the same conversation and agent console rendered with the dark theme.
Light mode

What ZeChat Actually Ships

No roadmap items — this is what is in the build you download.

Rust Agent Runtime

The whole agent loop lives in the Tauri backend via zeagentrs: streaming turns, routing, iteration limits, tool budgets, short-term memory and tracing — all in-process, not in the browser.

Native, in-process

Providers & Profiles

Configure base URL, API key, model and token limits for any OpenAI-compatible provider. Keep several profiles side by side and swap model right from the header switcher.

Bring your own model

Native MCP Servers

Connect stdio, HTTP and SSE MCP servers with optional bearer/header auth and a per-call timeout. Inspect the tools each one exposes and enable or disable them individually.

stdio · HTTP · SSE

Tool Firewall

Ordered rules match a tool name (glob or regex) and optionally its arguments, then accept, ask, or deny. Four presets, live simulation, and an in-app approval prompt when a call needs you.

First match wins

Built-in System Tools

Date/time, a real expression calculator, random & dice generation, and media-library access ship in Rust and are always registered. Chart plotting and text formatting can be toggled per tool.

Nothing to install

Memory Center

Durable facts are reflected out of conversations and injected into later turns, stored per provider/profile under ~/.zechat/memory — readable, editable, deletable.

It remembers what matters

Live Agent Console

A filterable trace panel shows every step of a run — system startup, route catalog, memory injection, skills loaded, each LLM call and tool result, with timings and token counts.

No black box

Skills Center

Write skills as plain Markdown files in ~/.zechat/skills. Create, inspect, import, export, enable or disable them — with a token-cost estimate before you turn one on.

Teach it once, reuse forever

Vision & PDFs

Attach images or whole PDFs — pages are rasterized locally with pdf.js and sent to your vision model, with progress shown as each page is processed.

See, not just read

Voice In & Out

Dictate prompts with microphone transcription and have replies read back with text-to-speech, plus ambient thinking sounds while the agent works.

Talk to it, hear it back

Vault & Media Library

Sessions as Markdown, attachments and generated artifacts in a browsable library — all plain files under ~/.zechat. Back it up like any other folder.

Your data stays yours

CLI Parity

The same binary answers from a terminal: zechat ask "…" shares the session builder, tools, prompt, firewall, MCP config and memory with the UI — no GUI/CLI drift.

One runtime, two faces
Powered by MCP

One Catalogue,
Every Tool You Grant It.

ZeChat's Rust system tools, your enabled MCP servers, and your Markdown skills are merged into a single route catalogue at the start of every turn. A few core tools are always available; the rest are grouped into selectable categories so a large tool surface never floods the model's context.

MCP tools are namespaced by their server (zenote_list_notes), so two servers can both expose create_note without colliding.

  • Call real functions — files, notes, APIs, whatever a server exposes.
  • Chain tools together across iterations, inside a tool budget you set.
  • Ask permission first, because every call passes through the firewall.

Large tool results are offloaded to short-term memory chunks instead of being pasted into context — the agent can re-read or export them later.

Route Catalogue · this turn selectable categories + always-available

Always available

get_current_time

+ get_current_datetime

calc

trig · logs · stats · roots

random_generator

numbers · UUIDv4 · dice

list_media · read_media

+ view_media · export_chunk

Selectable categories

charting (1)

plot_chart

built-in

utilities (1)

format_text

built-in

Zenote (3)

zenote_list_notes · …

MCP · connected

makix (11)

makix_get_weather · …

MCP · connected

macos (54)

macos_adjust_brightness · …

MCP · connected

Add MCP server…

stdio command, HTTP or SSE endpoint

New

How to add an MCP server

  1. 1 Open Tools & MCP and add a server: give it a name and pick a transport — a stdio command with arguments, or an HTTP/SSE URL with optional bearer-token or custom-header auth. Set a per-call timeout so a slow server can't hang a turn.
  2. 2 Hit Test connection. ZeChat spawns or dials the server, lists its tools, and caches them — you can then untick any tool you don't want exposed to the model.
  3. 3 Set your policy in the Firewall Center — accept safe reads, ask before writes, and deny anything the agent should never touch.

A stdio server

Name       Zenote
Transport  stdio
Command    npx
Arguments  -y @zafiamy/zenote-mcp
Timeout    30000 ms

A remote HTTP server

Name       makix
Transport  http
URL        https://mcp.example.com/mcp
Auth       bearer <token>
Timeout    30000 ms

Server definitions live in ~/.zechat/settings/, so the CLI connects to exactly the same servers as the UI.

Firewall Center · preset “Balanced” default: accept

Confirm destructive actions

(^|_)(delete|remove|destroy|drop|rm)(_|$)

Ask

Confirm writes

(^|_)(write|create|update|edit|save)(_|$)

Ask

Block shell / exec

(^|_)(exec|shell|bash|command|spawn)(_|$)

Deny

Allow reads & searches

(^|_)(get|read|list|search|find)(_|$)

Accept

Allow this tool call?

The agent wants to run zenote_create_note — matched “Confirm writes”: modifies files or state.

Allow once Always allow Deny
Safety, built in

Agentic Power,
Without the Blind Trust.

An agent that can act is only as safe as the guardrails around it. The Firewall Center runs an ordered list of rules against every tool call — matching the tool name and, if you want, its arguments — and the first match wins.

  • Accept — trusted calls run silently, no interruptions.
  • Ask — risky calls pause for a one-tap approval in the chat.
  • Deny — blocked before the tool is ever invoked.

Start from a preset — Trusted, Balanced, Guarded or Lockdown — then tune it. Patterns are written as friendly globs (write_*) or raw regex, and a simulator shows which of your real tools each rule would catch before you save.

The same policy is enforced in the UI and the CLI — it is translated once into the Rust runtime's rules.

Tauri 2 + Rust, zesdk frontend

Heavy Lifting in Rust,
A Frontend With No Build Step.

The backend links zeagentrs and owns sessions, streaming, tools, MCP, the firewall, budgets and memory. The UI stays deliberately thin: framework-free zesdk modules served straight from src/, no bundler, no build step.

  • One file per feature — chat, settings, MCP, firewall, skills, library.
  • Native IPC — the UI creates Rust-backed sessions and renders the stream.
  • Same runtime in the CLI, so behaviour never forks between the two.

Run the desktop app in dev mode

npm install
npm run desktop:dev

Build a standalone binary

./build.sh linux      # build/zechat
./build.sh macos      # build/zechat-macos
./build.sh windows    # build/zechat-x64.exe (cross-compiled)

Ask from the terminal

zechat ask "Summarize the project architecture"
npx zeapp serve --open serves the frontend in a browser-only shell — handy for UI work, but the full agent needs the Tauri build because the runtime lives in Rust.
ZeChat Logo Large

Download ZeChat

Free, no account, no sign-up. Bring your own OpenAI-compatible endpoint, install, and start chatting — everything stays on your machine.

Windows

Coming soon

Linux

Coming soon

macOS

Coming soon

Prebuilt downloads aren't published yet. In the meantime you can build ZeChat from source — ./setup-linux.sh on Linux, ./setup-macos.sh on macOS.
Requires Rust, Node 18+ and the Tauri 2 prerequisites to build from source.