v0.2.25
RustBox CI / rustbox (push) Canceled after 0s

This commit is contained in:
Mateusz Gruszczyński committed 2026-11-05 08:33:13 +01:00
1 parent 648556f762
commit 99ee3385ac
69 files changed
+1423 -1365

No files matched your search

+164
View File
@@ -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.
![Mail view](screenshots/mail-light.png)
## 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.
![Context menu](screenshots/context-menu.png)
## 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.
![Composer](screenshots/compose.png)
## 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.
![Contacts](screenshots/contacts.png)
## 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.
![Filter editor](screenshots/filters-editor.png)
![Apply a filter to existing mail](screenshots/filters-apply-now.png)
## 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.
![Calendar](screenshots/calendar.png)
## 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.
![Appearance settings](screenshots/settings-appearance.png)
| Gmail | Outlook (immersive) |
|---|---|
| ![Gmail style](screenshots/style-gmail.png) | ![Outlook style](screenshots/style-outlook.png) |
| **Dracula (immersive, dark)** | **Windows XP (immersive, gradients)** |
| ![Dracula style](screenshots/style-dracula.png) | ![Windows XP style](screenshots/style-winxp.png) |
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).
![About](screenshots/about.png)
+9 -4
View File
@@ -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 -1
View File
@@ -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:
-144
View File
@@ -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.
+1 -3
View File
@@ -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:
Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB