Updated internationalization section to clarify language support.
Bichon is a minimal, high-performance, standalone Rust email archiver with a built-in WebUI. Its name is inspired by the puppy my daughter adopted last month. It runs as a single binary, requires no external dependencies, and provides fast, efficient email archiving, management, and search.
🚀 Features
⚡ Lightweight & Standalone
- Pure Rust, single-machine application.
- No external database required.
- Includes WebUI for intuitive management.
📬 Multi-Account Management
- Synchronize and download emails from multiple accounts.
- Flexible selection: by date range, number of emails, or specific mailboxes.
🔑 IMAP & OAuth2 Authentication
- Supports IMAP password or OAuth2 login.
- Built-in WebUI for OAuth2 authorization, including automatic token refresh (e.g., Gmail, Outlook).
- Supports network proxy for IMAP and OAuth2.
- Automatic IMAP server discovery and configuration.
🔍 Unified Multi-Account Search
- Powerful search across all accounts:
account, mailbox, sender, attachment name, has attachments, size, date, subject, body.
🏷️ Tags & Facets
- Organize archived emails using tags backed by Tantivy facets.
- Efficiently filter and locate emails based on these facet-based tags.
💾 Compressed & Deduplicated Storage
- Store emails efficiently with transparent compression and deduplication—emails can be read directly without any extra steps.
📂 Email Management & Viewing
- Bulk cleanup of local archives.
- Download emails as EML or attachments separately.
- View and browse emails directly.
- View the full conversation thread of any email.
📊 Dashboard & Analytics
- Visualize email statistics: counts, time distribution, top senders, largest emails, account rankings.
🌐 Internationalization (i18n)
- WebUI fully supports 17 languages for all interface elements.
- Backend responses (e.g., system messages, API data) are not yet internationalized.
- Frontend is ready to support more languages in the future with minimal effort.
🛠️ OpenAPI Support
- Provides OpenAPI documentation.
- Access token authentication for programmatic access.
🐾 Why Create Bichon?
A few months ago, I released rustmailer, an email API middleware:
https://github.com/rustmailer/rustmailer
Since then, I’ve received many emails asking whether it could also archive emails, perform unified search, and support full-text indexing—not just querying recipients.
But rustmailer was designed as a middleware focused on providing API services.
Adding archiving and full-text search would complicate its core purpose and go far beyond its original scope.
Meanwhile, I realized that email archiving itself only requires a small portion of rustmailer’s functionality, plus a search engine.
With that combination, building a dedicated, efficient archiver becomes much simpler.
Using the experience gained from rustmailer, I designed and built Bichon in less than two weeks, followed by another two weeks of testing and optimization.
It has now reached a stable, usable state—and I decided to release it publicly.
Bichon is completely free.
You can download and use it however you like.
It’s not perfect, but I hope it brings you value.
📸 Snapshot
🚀 Quick Start
Docker Deployment (Recommended)
# Pull the image
docker pull rustmailer/bichon:latest
# Create data directory
mkdir -p ./bichon-data
# Run container
docker run -d \
--name bichon \
-p 15630:15630 \
-v $(pwd)/bichon-data:/data \
-e BICHON_LOG_LEVEL=info \
-e BICHON_ROOT_DIR=/data \
rustmailer/bichon:latest
-
Accessing Bichon from a browser: You need to add the exact address you use in your browser to
BICHON_CORS_ORIGINS.-
If you access via IP, add
IP:port, e.g.:http://192.168.1.16:15630 -
If you access via hostname, add
hostname:port, e.g.:http://myserver.local:15630 -
If you access via domain name, add the domain, e.g.:
http://mydomain.com -
If Bichon is running on port 80, you do not need to include the port.
-
If you want to access Bichon in multiple ways, include all of them separated by commas.
-
Example Docker run:
docker run -d \
--name bichon \
-p 15630:15630 \
-v $(pwd)/bichon-data:/data \
-e BICHON_LOG_LEVEL=info \
-e BICHON_ROOT_DIR=/data \
-e BICHON_CORS_ORIGINS="http://192.168.1.16:15630,http://myserver.local:15630,http://mydomain.com" \
rustmailer/bichon:latest
Tip: Do not add a trailing
/. Using*allows all addresses, but is not recommended for security.
Binary Deployment
Download the appropriate binary for your platform from the Releases page:
- Linux (GNU):
bichon-x.x.x-x86_64-unknown-linux-gnu.tar.gz - Linux (MUSL):
bichon-x.x.x-x86_64-unknown-linux-musl.tar.gz - macOS:
bichon-x.x.x-x86_64-apple-darwin.tar.gz - Windows:
bichon-x.x.x-x86_64-pc-windows-msvc.zip
Extract and run:
# Linux/macOS
./bichon --bichon-root-dir /tmp/bichon-data
# Windows
.\bichon.exe --bichon-root-dir e:\bichon-data
-
--bichon-root-dir argument is required and must be an absolute path.
-
If you are accessing Bichon from a proxy domain mydomain argument --bichon-cors-origins="https://mydomain" is required.
Setting the Bichon Encryption Password
Bichon uses an encryption password to secure sensitive data. You must set it before first use, when no data exists.
Once set, it cannot be changed. Changing it later will make all encrypted data unreadable. To start over, you would need to reinitialize Bichon and clear all emails and metadata.
How to Set the Password
You can set the password via command-line or environment variable:
Command-Line
bichon --bichon-encrypt-password "your-strong-password"
Environment Variable
export BICHON_ENCRYPT_PASSWORD="your-strong-password"
bichon
Tip: Use a strong, secure password and keep it safe, as it cannot be changed later.
🔑 Root User Login Information
Bichon currently supports a single Root user login for system access and management.
First Login and Enabling Access
To enable the login feature, you must specify a command-line argument or set an environment variable when starting Bichon.
1. Command-Line Argument
Add the --bichon-enable-access-token flag to your startup command:
# Linux/macOS Binary Deployment Example
./bichon --bichon-root-dir /tmp/bichon-data --bichon-enable-access-token
2. Environment Variable (Recommended for Docker)
Set the environment variable BICHON_ENABLE_ACCESS_TOKEN to true:
# Docker Deployment Example
docker run -d \
--name bichon \
-p 15630:15630 \
-v $(pwd)/bichon-data:/data \
-e BICHON_LOG_LEVEL=info \
-e BICHON_ROOT_DIR=/data \
-e BICHON_ENABLE_ACCESS_TOKEN=true \
rustmailer/bichon:latest
Default Credentials
- Initial Login Account:
root - Initial Password:
root
Changing the Password
It is strongly recommended that you change the default password immediately after your first login.
You can change the password via the WebUI:
- Log in to the WebUI.
- Navigate to the Settings page.
- Use the Reset Root Password option to modify your password.
📖 Documentation
Under construction. Documentation will be available soon. Bichon Wiki.
🛠️ Tech Stack
- Backend: Rust + Poem
- Frontend: React + TypeScript + Vite + ShadCN UI
- Core Engine (Storage & Search): Tantivy
- Acts as both the primary storage for email content and the full-text search index. This unified approach ensures high performance and eliminates data redundancy.
- Metadata Storage: Native_DB
- Used exclusively for lightweight configuration and account metadata.
- Email Protocols: IMAP (Supports standard Password & OAuth2)
🤝 Contributing
Issues and Pull Requests are welcome!
🧑💻 Developer Guide
To build or contribute to Bichon, the following environment is recommended:
Prerequisites
- Rust: Use the latest stable toolchain for best compatibility and performance.
- Node.js: Version 20+ is required.
- pnpm: Recommended package manager for the WebUI.
Steps
1. Clone the repository
git clone https://github.com/rustmailer/bichon.git
cd bichon
2. Build the WebUI
cd web
pnpm install
pnpm run build
Run the WebUI in development mode if needed:
pnpm run dev
3. Build or Run the Backend
After the WebUI is built, return to the project root:
cd ..
cargo build
Or run directly:
cargo run -- --bichon-root-dir e:\bichon-data
--bichon-root-dir specifies the directory where all Bichon data will be stored.
WebUI Access
- The WebUI runs on http://localhost:15630 by default.
- HTTPS is not enabled in development or default builds.
📄 License
This project is licensed under AGPLv3.