No files matched your search
@@ -0,0 +1,164 @@
|
||||
# RustBox features
|
||||
|
||||
RustBox is a self-hosted webmail for any standards-compliant IMAP/SMTP server. It ships as one Rust executable with the whole interface built in. The interface is available in English and Polish.
|
||||
|
||||

|
||||
|
||||
## Contents
|
||||
|
||||
- [Mail](#mail)
|
||||
- [Composing](#composing)
|
||||
- [Search, labels and contacts](#search-labels-and-contacts)
|
||||
- [Filters (Sieve)](#filters-sieve)
|
||||
- [Calendar](#calendar)
|
||||
- [Notifications and realtime](#notifications-and-realtime)
|
||||
- [Appearance](#appearance)
|
||||
- [Mobile](#mobile)
|
||||
- [Security and privacy](#security-and-privacy)
|
||||
- [Administration and deployment](#administration-and-deployment)
|
||||
- [Known limitations](#known-limitations)
|
||||
|
||||
## Mail
|
||||
|
||||
- Three-pane layout (folders, message list, reader) with resizable panes. The preview can sit on the right or at the bottom, or be turned off.
|
||||
- Folder tree with subfolders shown under their parent and collapsible branches. You can create, rename, delete and subscribe to folders, mark all as read and empty a folder.
|
||||
- Special folders (Sent, Drafts, Trash, Junk, Archive) are configured per account. They follow renames, and administrators can set server-wide defaults.
|
||||
- Accurate total and unread counters, kept in sync with the mail server. Changes appear immediately and are reconciled in the background.
|
||||
- Threaded or flat reading, previous/next navigation, and automatic opening of the next message after a move or delete.
|
||||
- Bulk actions on many messages at once, including the whole search result: read/unread, flag, archive, move, copy, label, spam and delete.
|
||||
- Drag and drop a message onto a folder to move it. Moves and deletes can be undone.
|
||||
- Snooze: hide a message until a chosen time, then see all snoozed messages in one list.
|
||||
- Pagination (up to 300 per page), progressive loading or loading the whole folder. Sort by date, sender, subject or size, and optionally keep flagged messages on top per folder.
|
||||
- A compact single-line row layout when the message list is wide.
|
||||
- Safe HTML preview in an isolated frame. Remote images are blocked until you allow them, or loaded only for contacts or trusted senders.
|
||||
- Attachment preview for images, PDF, text, HTML and video. You can download one attachment or all of them as a ZIP.
|
||||
- Raw headers, message source, `.eml` download and `.eml` import into any folder.
|
||||
- One-click unsubscribe from mailing lists when the sender supports it.
|
||||
- A short context menu with submenus (forward, labels, snooze, filters, sender, more), designed to always fit the window.
|
||||
- Mailbox quota with warnings at 80% and 95%.
|
||||
- Several accounts signed in at the same time in one browser, with quick switching.
|
||||
|
||||

|
||||
|
||||
## Composing
|
||||
|
||||
- HTML, plain-text and Markdown editors. The HTML toolbar covers fonts, sizes, colours, lists, quotes, alignment, links, undo and redo.
|
||||
- Inline images: paste or drag and drop them, then resize, align and crop in place.
|
||||
- Attachments by drag and drop, with upload progress and a reminder when the text mentions an attachment that isn't there.
|
||||
- Drafts are saved automatically and can be recovered. Drafts from the Drafts folder, including ones written in other mail clients, open directly for editing.
|
||||
- Undo Send: a short window to cancel a message after pressing Send.
|
||||
- Multiple identities, each with Reply-To, automatic Bcc, organisation and text/HTML signatures. Replies pick the matching identity automatically.
|
||||
- Priority, read-receipt requests and recipient autocomplete from contacts.
|
||||
- Forward as attachment.
|
||||
- OpenPGP: key management, signing and encryption (PGP/MIME and inline), decryption and verification, and key discovery.
|
||||
|
||||

|
||||
|
||||
## Search, labels and contacts
|
||||
|
||||
- Full-text search with operators (`from:`, `to:`, `subject:`, `folder:`, `has:attachment`, `is:unread`, `is:flagged`, dates). Matching terms are highlighted, searches can be saved and there is an advanced search dialog.
|
||||
- Coloured labels with bulk assignment. They can optionally be kept in sync with IMAP keywords, so they are visible in other clients.
|
||||
- Contacts with photos, several e-mail addresses, phone numbers and postal addresses, plus groups, duplicate detection and merging.
|
||||
- vCard import and export, including importing a vCard straight from a message.
|
||||
|
||||

|
||||
|
||||
## Filters (Sieve)
|
||||
|
||||
RustBox manages server-side filters over ManageSieve, the standard used by Dovecot Pigeonhole and others.
|
||||
|
||||
- **Visual rule editor:** conditions on sender, domain, recipients (To/Cc, To only, Cc only), subject, mailing list, any header, message size, attachments and priority. Conditions can be joined with AND/OR and negated, and a rule can have **exceptions** ("except if…").
|
||||
- **Actions:** move, copy, move to Trash, add a label, mark as read, flag, redirect (optionally keeping a copy) and discard. A rule can run several actions and stop processing further rules.
|
||||
- **Templates** for common rules: messages from a sender to a folder, subject words, flagging mail from a VIP, newsletters, mail sent to an alias, large attachments, forwarding a copy.
|
||||
- **Apply now:** a rule normally affects only new mail. "Check matches" shows how many messages already in a folder match it, and "Apply now" runs its actions on them. Each rule in the list also has its own "Apply now".
|
||||
- **Always move messages from this sender…** straight from the message context menu, and quick filters created from a message's sender, domain or subject.
|
||||
- Offers to create a target folder that does not exist yet.
|
||||
- Every rule is summarised in plain language ("When … Then …") and shown with a live preview of the generated script.
|
||||
- Out-of-office replies with optional start and end dates, plus a raw script editor with server-side validation, backup and restore.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Calendar
|
||||
|
||||
- Month, week, day and agenda views.
|
||||
- Events with all-day mode, location, attendees, status, colour and a meeting link.
|
||||
- Two reminders per event (for example 15 minutes and one day before), with default reminders for new events. Reminders for all-day events fire at the start of the working day.
|
||||
- ICS import and export, including importing an invitation attachment.
|
||||
|
||||

|
||||
|
||||
## Notifications and realtime
|
||||
|
||||
- New mail shows up immediately thanks to IMAP IDLE and a live connection to the browser.
|
||||
- Desktop notifications with an optional sound, a choice of folders to watch and Do Not Disturb hours.
|
||||
- The unread count appears in the browser tab and, where supported, on the app icon.
|
||||
|
||||
## Appearance
|
||||
|
||||
- Light, dark, system or **time-of-day** theme.
|
||||
- **43 interface styles**:
|
||||
- RustBox and classic styles;
|
||||
- Roundcube Classic, Larry and Elastic;
|
||||
- styles inspired by popular mail clients and apps;
|
||||
- editor themes such as Nord, Dracula, Catppuccin, Solarized, Gruvbox and Tokyo Night;
|
||||
- atmospheric styles;
|
||||
- retro styles: Windows XP, Mac OS X Aqua, iOS 6, Windows 7, Frutiger Aero and BeOS.
|
||||
- **Style depth:**
|
||||
- *colours only*;
|
||||
- *standard*, which adds the style's layout;
|
||||
- *immersive*, which also adds the style's shapes, typography, app bar and backdrop.
|
||||
- An optional **Style gradients** switch.
|
||||
- A predefined style's layout and typography can be adjusted while it keeps its look. Changing a colour creates a custom copy.
|
||||
- The RustBox custom style is fully adjustable: colours, fonts, sizes, density, pane widths, corner radius, contrast, selection colour, unread styling, icon size and more. A live warning appears when your custom colours are hard to read.
|
||||
- An optional colour per account, so it is always clear which account is active.
|
||||
- Keyboard shortcuts with an in-app reference.
|
||||
|
||||

|
||||
|
||||
| Gmail | Outlook (immersive) |
|
||||
|---|---|
|
||||
|  |  |
|
||||
| **Dracula (immersive, dark)** | **Windows XP (immersive, gradients)** |
|
||||
|  |  |
|
||||
|
||||
More: [dark theme](screenshots/mail-dark.png) · [Roundcube Elastic](screenshots/style-roundcube-elastic.png)
|
||||
|
||||
## Mobile
|
||||
|
||||
The interface adapts to phones and tablets: a folder drawer, a full-screen reader and touch-friendly menus.
|
||||
|
||||
| Message list | Reader (dark) |
|
||||
|---|---|
|
||||
| <img src="screenshots/mobile-list.png" width="300" alt="Mobile list"> | <img src="screenshots/mobile-reader.png" width="300" alt="Mobile reader"> |
|
||||
|
||||
## Security and privacy
|
||||
|
||||
- Mail server addresses are set by the administrator; users only enter their e-mail address and password.
|
||||
- Protection against password guessing: per-mailbox and per-address lockouts with growing delays, applied before the mail server is contacted.
|
||||
- Encrypted, revocable sessions with a list of active sessions and devices.
|
||||
- Optional strict browser security headers.
|
||||
- HTML mail is sanitised and shown in an isolated frame. Links open outside the preview, and remote content is blocked by default.
|
||||
- Secrets are never shown in diagnostics.
|
||||
|
||||
## Administration and deployment
|
||||
|
||||
- A single executable with the interface built in, a systemd service and Docker Compose examples.
|
||||
- Databases: SQLite, MySQL/MariaDB or PostgreSQL. Sessions can also be kept in Redis.
|
||||
- Attachment storage on local disk, a shared filesystem (NFS, CephFS, GlusterFS) or S3-compatible storage.
|
||||
- Search with a built-in index or OpenSearch. A cluster mode runs several nodes behind a load balancer.
|
||||
- Health and readiness endpoints, a diagnostics panel for users and an optional, protected diagnostics endpoint for administrators.
|
||||
- Features can be switched on and off: filters, OpenPGP, multi-account, diagnostics, About page.
|
||||
- A helper script imports contacts and identities from Roundcube.
|
||||
|
||||
See the [README](../README.md) for configuration, [Storage and search](STORAGE_SEARCH_OPERATIONS.md) and [System diagnostics](SYSTEM_DIAGNOSTICS.md).
|
||||
|
||||
## Known limitations
|
||||
|
||||
- No CalDAV or CardDAV synchronisation yet. Calendar invitations cannot be answered from RustBox, and recurring events are stored but not expanded.
|
||||
- No password-change integration and no IMAP shared-folder (ACL) management.
|
||||
- Notifications work while RustBox is open in a browser tab.
|
||||
- The current status of every area is tracked in [Implementation status](IMPLEMENTATION_STATUS.md).
|
||||
|
||||

|
||||
@@ -1,7 +1,13 @@
|
||||
# RustBox 0.2.25 - implementation status
|
||||
# RustBox 0.2.26 - implementation status
|
||||
|
||||
- Draft saves are realtime-silent: Drafts folder/list updates continue, but saving a draft does not surface as a new-mail notification.
|
||||
This file tracks the `0.2.25` source snapshot. Storage/search scope and outstanding acceptance work are tracked in `TODO.md`. A feature is only listed as implemented when working code exists in this source tree; partial items are called out explicitly.
|
||||
This file tracks the `0.2.26` source snapshot. Storage/search scope and outstanding acceptance work are tracked in `TODO.md`. A feature is only listed as implemented when working code exists in this source tree; partial items are called out explicitly.
|
||||
|
||||
## 0.2.26 licensing and documentation
|
||||
|
||||
- Licensed under AGPL-3.0-only with an optional commercial license (`LICENSE`, `LICENSING.md`, `NOTICE.md`). The Oxi synchronisation scripts and `UPSTREAM_BASE` were removed; the About page no longer embeds an Oxi revision.
|
||||
- `docs/FEATURES.md` lists all features with screenshots (`docs/screenshots/`, generated against a mocked API).
|
||||
- Translations are applied to dynamic settings notes after they load.
|
||||
|
||||
## 0.2.25 filters
|
||||
|
||||
@@ -113,11 +119,10 @@ This file tracks the `0.2.25` source snapshot. Storage/search scope and outstand
|
||||
|
||||
## Implemented / wired in this working snapshot
|
||||
|
||||
### Runtime and upstream
|
||||
### Runtime
|
||||
|
||||
- Single Rust runtime with embedded HTML/CSS/vanilla-JavaScript UI.
|
||||
- No TypeScript, React, Next.js, Node.js or Bun product build/runtime.
|
||||
- Oxi upstream tracking and mapped backend-port scripts retained.
|
||||
- EN/PL language assets embedded in the binary.
|
||||
|
||||
### Mail and IMAP workflow
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Releasing RustBox
|
||||
|
||||
1. Update the version in `Cargo.toml` and the RustBox package entry in `Cargo.lock`.
|
||||
2. Confirm `UPSTREAM_BASE` is the Oxi revision actually consumed by the release.
|
||||
2. Update `CHANGELOG.md` and the release notes.
|
||||
3. Ensure no TypeScript sources or separate frontend build dependencies are present.
|
||||
4. Run the release gate and package only after it passes:
|
||||
|
||||
|
||||
@@ -1,144 +0,0 @@
|
||||
# Oxi upstream policy
|
||||
|
||||
RustBox is derived from `c0h1b4/oxi`. `UPSTREAM_BASE` contains the exact Oxi commit whose backend changes have been consumed by RustBox.
|
||||
|
||||
RustBox uses a flat Cargo layout, while Oxi uses a `backend/` subtree. The sync tooling therefore treats Oxi as a source upstream and maps its backend paths into RustBox rather than reintroducing the Oxi directory layout.
|
||||
|
||||
## Path mapping
|
||||
|
||||
Automatically mapped examples:
|
||||
|
||||
```text
|
||||
Oxi backend/Cargo.toml -> RustBox Cargo.toml
|
||||
Oxi backend/Cargo.lock -> RustBox Cargo.lock
|
||||
Oxi backend/rust-toolchain.toml -> RustBox rust-toolchain.toml
|
||||
Oxi backend/src/... -> RustBox src/...
|
||||
Oxi backend/examples/... -> RustBox examples/...
|
||||
Oxi backend/docs/... -> RustBox docs/...
|
||||
```
|
||||
|
||||
Review-only boundaries, never mapped automatically:
|
||||
|
||||
```text
|
||||
Oxi backend/migrations/... -> review against RustBox migrations/...
|
||||
Oxi backend/tests/... -> review/port as native Rust tests when useful
|
||||
```
|
||||
|
||||
RustBox-owned `src/web/` has no automatic mapping from the Oxi frontend.
|
||||
|
||||
## Configure the upstream
|
||||
|
||||
A release archive does not contain `.git`. Initialize the RustBox repository once:
|
||||
|
||||
```bash
|
||||
git init
|
||||
git add .
|
||||
git commit -m "RustBox 0.1.2 baseline"
|
||||
./scripts/setup-upstream.sh
|
||||
```
|
||||
|
||||
The script adds:
|
||||
|
||||
```text
|
||||
upstream-oxi -> https://github.com/c0h1b4/oxi.git
|
||||
```
|
||||
|
||||
and fetches Oxi history/tags.
|
||||
|
||||
## Inspect a newer Oxi state
|
||||
|
||||
```bash
|
||||
./scripts/oxi-status.sh
|
||||
```
|
||||
|
||||
or inspect a specific Oxi ref:
|
||||
|
||||
```bash
|
||||
./scripts/oxi-status.sh upstream-oxi/main
|
||||
./scripts/oxi-status.sh <tag-or-commit>
|
||||
```
|
||||
|
||||
The report separates:
|
||||
|
||||
1. Oxi backend changes that can be mapped automatically;
|
||||
2. Oxi backend migrations/tests that require manual review;
|
||||
3. Oxi frontend changes that require a manual UI port;
|
||||
4. other Oxi root-level changes that require manual review;
|
||||
5. upstream commits since `UPSTREAM_BASE`.
|
||||
|
||||
## Advance the consumed Oxi backend state
|
||||
|
||||
```bash
|
||||
./scripts/sync-upstream.sh
|
||||
```
|
||||
|
||||
The operation:
|
||||
|
||||
1. requires a clean RustBox Git worktree;
|
||||
2. fetches `upstream-oxi`;
|
||||
3. verifies that the target descends from the recorded `UPSTREAM_BASE`;
|
||||
4. creates a `sync/oxi-*` review branch;
|
||||
5. generates the Oxi backend delta from `UPSTREAM_BASE` to the target, excluding `backend/migrations/` and `backend/tests/`;
|
||||
6. rewrites only patch metadata so `backend/<path>` becomes `<path>`;
|
||||
7. applies the mapped delta with Git three-way merge support;
|
||||
8. does not import Oxi frontend sources, migrations, or tests;
|
||||
9. records the target as a pending sync inside Git metadata;
|
||||
10. deliberately leaves `UPSTREAM_BASE` unchanged until the maintainer finishes review.
|
||||
|
||||
Conflicts are expected when Oxi and RustBox changed the same functionality. Resolve them in the flat RustBox paths, keeping RustBox-specific behavior where required.
|
||||
|
||||
After resolving backend conflicts and porting any relevant UI behavior, finish the sync:
|
||||
|
||||
```bash
|
||||
./scripts/finish-upstream.sh
|
||||
```
|
||||
|
||||
If Oxi changed its frontend, root-level files, or the RustBox-owned upstream migration/test areas, the finish step refuses to advance the baseline until those reviews are explicitly acknowledged:
|
||||
|
||||
```bash
|
||||
./scripts/finish-upstream.sh --ui-reviewed --root-reviewed --rustbox-owned-reviewed
|
||||
```
|
||||
|
||||
`--rustbox-owned-reviewed` confirms that changes under Oxi `backend/migrations/` and `backend/tests/` were inspected and any relevant behavior was manually ported. Those files are never copied into RustBox automatically.
|
||||
|
||||
The finish step runs the RustBox release build gate and only then stages the new `UPSTREAM_BASE`. Review `git status` and commit the sync. `--skip-build` exists for exceptional local workflows, but CI should still run the full gate before merge.
|
||||
|
||||
If the sync is rejected, discard the review branch; the main branch and its `UPSTREAM_BASE` remain unchanged.
|
||||
|
||||
## Port one Oxi feature
|
||||
|
||||
For a useful Oxi commit that should be brought in before a full baseline update:
|
||||
|
||||
```bash
|
||||
./scripts/oxi-port-commit.sh <oxi-commit>
|
||||
```
|
||||
|
||||
This creates `port/oxi-<sha>` and maps only the backend portion of that single commit. It intentionally does not change `UPSTREAM_BASE`, because RustBox has not consumed the complete Oxi history up to that revision.
|
||||
|
||||
When a later full sync includes a previously ported feature, Git may report that some hunks are already present; review those conflicts instead of duplicating the code.
|
||||
|
||||
## UI policy
|
||||
|
||||
Oxi frontend source is never copied into RustBox. For a new Oxi feature that includes frontend work:
|
||||
|
||||
- consume or port the backend/API changes;
|
||||
- inspect the corresponding Oxi frontend diff to understand behavior;
|
||||
- implement that behavior in RustBox `src/web/`;
|
||||
- keep the same-origin RustBox API/UI model;
|
||||
- do not add `.ts` or `.tsx` sources.
|
||||
|
||||
## RustBox-owned boundaries
|
||||
|
||||
These areas require explicit review and should not be replaced blindly by upstream changes:
|
||||
|
||||
- `migrations/` (RustBox owns the squashed baseline and future migration numbering);
|
||||
- `tests/` (RustBox keeps native Rust/runtime fixtures rather than importing upstream Python contracts);
|
||||
- `src/web/`;
|
||||
- `src/ui.rs`;
|
||||
- RustBox UI routing and same-origin behavior;
|
||||
- RustBox ManageSieve integration;
|
||||
- `dev.sh`;
|
||||
- native packaging/release scripts;
|
||||
- RustBox branding and documentation.
|
||||
|
||||
The goal is to keep following Oxi protocol/backend improvements without restoring its split frontend/backend repository structure.
|
||||
@@ -11,12 +11,10 @@ Release source checks:
|
||||
- mail endpoints are configuration-owned; the login request contains only email/password/session preference;
|
||||
- authenticated mail routes reuse the resolved session connection profile;
|
||||
- CSS is built by Cargo `build.rs` from `src/web/css/manifest.txt`;
|
||||
- no CSS gradients and no Unicode pseudo-icons in the browser UI;
|
||||
- gradients appear only when the "Style gradients" switch is on; no Unicode pseudo-icons in the browser UI;
|
||||
- all UI action icons are served from the embedded SVG sprite;
|
||||
- `dev.sh` runs the root Cargo package;
|
||||
- native release build outputs `target/release/rustbox`;
|
||||
- `UPSTREAM_BASE` records the consumed Oxi backend revision;
|
||||
- upstream tooling maps Oxi `backend/` deltas into RustBox's flat paths and never imports Oxi frontend source.
|
||||
|
||||
Full release gate on a host with Rust/Cargo and dependency access:
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 167 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 267 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 167 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 213 KiB |