A local-first desktop email client for people who want a calmer, more private inbox.
Pebble is a desktop mail client built with Rust, Tauri, and React. It keeps mail data, the search index, attachments, rules, and application settings on your device by default.
The app is designed around a few practical ideas:
- Your mailbox should stay readable, fast, and quiet.
- Email workflows should be local-first instead of cloud-dashboard-first.
- Privacy controls should be explicit, visible, and easy to override per message.
- Search, snooze, rules, and a Kanban board should work together instead of living in separate tools.
Pebble currently supports Gmail, IMAP, and experimental Outlook accounts.
- Local SQLite database for messages, folders, labels, rules, and settings.
- Local Tantivy full-text index for fast search.
- Attachments are stored on disk under the app data directory.
- OAuth tokens and credentials are encrypted with a per-device key.
- No telemetry.
- Network requests are limited to features you configure: mail sync, translation, and optional WebDAV settings backup.
- Unified inbox across multiple accounts.
- Gmail, IMAP, and experimental Outlook support.
- Threaded and message-list views.
- Archive, delete, star, mark read, batch actions, and restore flows.
- Snooze messages and bring them back later.
- Full-text search and advanced filters.
- Rules engine for automatic organization.
- Kanban board with Todo, Waiting, and Done columns.
- Command palette and keyboard-first navigation.
- Built-in translation providers with bilingual reading.
- Dark and light themes.
- English and Chinese UI.
- Optional WebDAV backup for settings, rules, Kanban cards, and Kanban notes.
![]() Inbox |
![]() Kanban |
![]() Dark Mode |
![]() Settings |
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2 |
| Backend | Rust |
| Frontend | React 19, TypeScript |
| State | Zustand, TanStack Query |
| Database | SQLite via rusqlite |
| Search | Tantivy |
| Styling | Tailwind CSS and app CSS |
| Localization | i18next |
Download prebuilt desktop packages from the Releases page.
On Arch Linux, Pebble is available from the AUR as pebble-bin:
yay -S pebble-bin
# or
paru -S pebble-bin- Rust stable
- Node.js 18 or newer
- pnpm 8 or newer
- Tauri system dependencies for your platform
git clone https://github.com/QingJ01/Pebble.git
cd Pebble
pnpm install
cp .env.example .env
pnpm devThe development command starts the Vite frontend and the Tauri desktop app.
pnpm build
pnpm build:windows
pnpm build:macos
pnpm build:linuxDesktop bundles are written under target/release/ and target/release/bundle/.
On Linux, install the Tauri system dependencies first; pnpm build:linux produces an AppImage under target/release/bundle/appimage/.
macOS bundles are unsigned unless you provide your own signing setup.
After copying an unsigned macOS build to /Applications, run the following command before opening it:
sudo xattr -cr /Applications/Pebble.appPebble can connect to Gmail and Outlook through OAuth. IMAP accounts use the IMAP/SMTP credentials configured in the app.
Copy .env.example to .env, then fill the provider values you need.
| Variable | Description |
|---|---|
GOOGLE_CLIENT_ID |
Google OAuth client ID. Use a Desktop app client when possible. |
GOOGLE_CLIENT_SECRET |
Optional for PKCE flows. Add it if Google rejects token exchange with client_secret is missing. |
MICROSOFT_CLIENT_ID |
Microsoft public/native app client ID. |
MICROSOFT_CLIENT_SECRET |
Optional. Leave empty for public/native Microsoft apps. |
| Command | Purpose |
|---|---|
pnpm dev |
Run the Tauri desktop app in development mode. |
pnpm dev:frontend |
Run only the Vite frontend dev server. |
pnpm test |
Run frontend tests with Vitest. |
pnpm build:frontend |
Type-check and build the frontend. |
pnpm build |
Build the desktop app for the current platform. |
pnpm build:windows |
Build the Windows NSIS installer. |
pnpm build:macos |
Build unsigned macOS .app and .dmg bundles. |
pnpm build:linux |
Build the Linux .AppImage bundle. |
cargo test -p pebble-mail |
Run the mail crate tests. |
cargo check |
Check the Rust workspace. |
Pebble/
|-- src/ React frontend
| |-- components/ Shared UI components
| |-- features/ Inbox, compose, search, Kanban, settings
| |-- hooks/ React hooks and query helpers
| |-- lib/ IPC API, i18n, utilities
| `-- stores/ Zustand stores
|-- src-tauri/ Tauri application and IPC commands
|-- crates/ Rust workspace crates
| |-- pebble-core/ Shared types and errors
| |-- pebble-store/ SQLite persistence
| |-- pebble-mail/ Mail providers and sync
| |-- pebble-search/ Tantivy search index
| |-- pebble-crypto/ Credential encryption
| |-- pebble-oauth/ OAuth 2.0 and PKCE
| |-- pebble-rules/ Rules engine
| |-- pebble-translate/ Translation providers
| `-- pebble-privacy/ HTML sanitizing and tracker controls
|-- tests/ Frontend tests
`-- site/ Static project site and screenshots
| Shortcut | Action |
|---|---|
J / K |
Move through messages |
Enter |
Open the selected message |
E |
Archive |
S |
Toggle star |
R |
Reply |
A |
Reply all |
F |
Forward |
C |
Compose |
/ |
Focus search |
Esc |
Close, cancel, or go back |
Shortcuts can be reviewed and customized in Settings.
Looking for a self-hosted web version? Pebble Web provides the same features as the desktop app, accessible from any browser via Docker.
curl -fsSL https://raw.githubusercontent.com/QingJ01/Pebble-Web/main/docker-compose.yml -o docker-compose.yml && docker compose up -dPebble Web shares the same Rust core crates and React frontend. Deploy it on your own server and access your email anywhere.
Pebble is under active development. It is usable for day-to-day testing, but mail clients handle sensitive data and provider behavior varies. Keep backups of important mail, and verify account actions against your provider when testing new builds.
Issues and pull requests are welcome.
For code changes, please keep patches focused and include tests for behavior changes when practical. Before submitting, run the relevant checks:
pnpm test
pnpm build:frontend
cargo checkPebble is licensed under the GNU Affero General Public License v3.0.



