explaingit

qingj01/pebble-web

13RustAudience · developerComplexity · 3/5ActiveLicenseSetup · moderate

TLDR

Self-hosted web email client written in Rust and React 19, with IMAP/SMTP sync, Tantivy full-text search, and Docker-based deployment for personal mail servers.

Mindmap

mindmap
  root((Pebble Web))
    Inputs
      IMAP and SMTP accounts
      .env config
      Docker host
    Outputs
      Web mail UI
      SQLite store
      Tantivy search index
    Use Cases
      Self-host a multi-account mail client
      Translate messages via DeepL or an LLM
      Run a snooze and follow-up workflow
    Tech Stack
      Rust
      Axum
      React
      SQLite
      Tantivy

Things people build with this

USE CASE 1

Self-host a multi-account web email client on a Linux box via Docker Compose

USE CASE 2

Run full-text search across years of mail using a local Tantivy index

USE CASE 3

Translate incoming messages inline through DeepL, DeepLX, or a configured LLM

USE CASE 4

Back up settings to WebDAV and sync IMAP folders on a custom interval

Tech stack

RustAxumTokioReactTypeScriptSQLiteTantivyDocker

Getting it running

Difficulty · moderate Time to first run · 30min

Needs Docker plus a JWT secret of at least 32 characters, and the auto-generated encryption key file must be backed up or stored credentials become unreadable.

AGPL-3.0 license: anyone can use and modify the code, but any network service built on it must publish its source under the same terms.

In plain English

Pebble Web is a self-hosted web email client adapted from a desktop application called Pebble. The README is written mainly in Chinese and the interface offers both Chinese and English. It is meant to be installed on a Linux server through Docker and then opened in a browser, so a user runs their own mail client on hardware they control instead of relying on a hosted service. The feature list covers multi-account management with inboxes, folders, threads, starring, archive, and a trash bin. Mail is composed with rich text, Markdown, HTML, attachments, plus reply, forward, and draft support. Accounts sync over IMAP and SMTP at a configurable interval. Full-text search uses Tantivy. Other features include batch operations, custom labels, a task board view of messages, snooze and follow-up lists, translation through DeepLX, DeepL, generic translation services, or a configured large language model, blocking of remote images by default with a trusted-sender list, attachment upload and download, WebDAV backup of settings, and a bilingual interface. For quick deployment, the README shows a one-line install script that pulls the project, writes a .env file, builds the Docker image, and starts the service on port 8080. There is also a Docker Compose flow that clones the repo, copies an example env file, and brings up the stack after setting a login password and a JWT signing secret of at least 32 characters. A manual build path uses Rust 1.80 or newer and Node.js 20 or newer, building the frontend with npm and the backend with cargo. A configuration table lists environment variables for password, JWT secret, port, data directory, static asset directory, sync interval in seconds, and a 32-byte hex encryption key that is auto-generated if not set. The data directory contains a SQLite database, a search index folder, an attachments folder, and an encryption key file that, if lost, makes already-stored credentials unreadable. The technology stack section names React 19, TypeScript, Vite, Tailwind CSS, Zustand, and TanStack Query on the front end, with TipTap for editing, and Rust with Axum and Tokio on the back end. Storage is SQLite through rusqlite, search is Tantivy, and security uses AES-256-GCM, Argon2, and JWT. The license is AGPL-3.0-only.

Copy-paste prompts

Prompt 1
Generate a docker-compose.yml that runs Pebble Web behind a Caddy reverse proxy with HTTPS
Prompt 2
Write the IMAP/SMTP env block for adding a Fastmail account to Pebble Web
Prompt 3
Explain how Pebble Web stores credentials with AES-256-GCM and what happens if the encryption key file is lost
Prompt 4
Add a custom label and a snooze rule for newsletters using Pebble Web's task board view
Open on GitHub → Explain another repo

Generated 2026-05-22 · Model: sonnet-4-6 · Verify against the repo before relying on details.