Files
RustBox/README.md
T
Mateusz Gruszczyński bc5fbd6ba9
RustBox CI / rustbox (push) Waiting to run
first commit
2026-10-29 15:24:59 +01:00

167 lines
6.2 KiB
Markdown

# RustBox 0.0.1
RustBox is a webmail derived from `c0h1b4/oxi`. The consumed Oxi revision is recorded in `UPSTREAM_BASE`.
The repository is one Cargo application. The RustBox browser interface lives under `src/web/`, uses HTML/CSS/vanilla JavaScript, and is embedded into the Rust executable at build time. There is no TypeScript, React, Next.js, Node.js or Bun build step.
## Layout
```text
rustbox/
├── Cargo.toml
├── Cargo.lock
├── build.rs
├── src/
│ ├── main.rs
│ ├── ui.rs
│ └── web/
│ ├── index.html
│ ├── app.js
│ ├── icons.svg
│ └── css/
├── migrations/
├── tests/
├── examples/
├── docs/
├── packaging/
├── scripts/
├── config.dev.toml
├── config.example.toml
├── UPSTREAM_BASE
└── dev.sh
```
`build.rs` combines the CSS modules listed in `src/web/css/manifest.txt`. Cargo then embeds the CSS bundle, HTML, JavaScript and SVG sprite in the RustBox executable.
## Configure mail servers
Mail endpoints are configured by the administrator, not on the login screen. Users enter only email and password.
Edit `config.dev.toml` before the first run:
```toml
imap_host = "mail.example.com"
imap_port = 993
smtp_host = "mail.example.com"
smtp_port = 587
tls_enabled = true
# Optional; defaults to imap_host.
# sieve_host = "mail.example.com"
sieve_port = 4190
sieve_tls_mode = "starttls"
sieve_allow_insecure_auth = false
# Optional administrator-owned headers added to every outgoing message.
# Structural/MIME headers such as From, To, Subject and Content-Type are rejected.
outgoing_headers = [
"X-Company-Mailer: RustBox",
]
```
If `imap_host` is missing or blank, RustBox fails configuration validation at startup instead of letting login succeed into a broken Inbox state.
## Current 0.0.1 UI snapshot
The internal baseline includes persistent appearance/layout preferences, draggable mail-pane splitters, action toasts, recipient autocomplete, attachment preview/context actions and client-side ZIP download in addition to the existing IMAP/Sieve/mail workflow. The authoritative completion scope remains `docs/RUSTBOX_PLAN.md`; incomplete items are tracked in `docs/IMPLEMENTATION_STATUS.md`.
## Development
Requirements: Rust toolchain with Cargo. OpenPGP key generation/sign/encrypt/decrypt is implemented with rPGP. Changing the passphrase of an existing private key additionally requires GnuPG (`gpg`) on the server; override the executable with `RUSTBOX_PGP_GPG_BINARY` if needed.
```bash
./dev.sh
```
Then open:
```text
http://127.0.0.1:3001
```
To use another configuration:
```bash
RUSTBOX_CONFIG=/path/to/rustbox.toml ./dev.sh
```
Normal Cargo commands work from the repository root:
```bash
cargo run
cargo test
cargo build --release
```
## UI
RustBox uses a compact three-pane mail layout: folders, message list and reader. The current internal baseline includes configurable special IMAP folders, collapsible folder hierarchy, folder CRUD/subscriptions, move/copy/bulk actions, drag-and-drop message moves, collapsible threads, raw headers/source download, labels, advanced/saved search, quota warnings, contacts/groups/vCard, calendar/ICS import, identities/signatures with automatic reply identity selection, HTML/plain/Markdown compose modes, CID inline images, and ManageSieve raw + visual rule editing with negation, dynamically addable conditions/actions and nested AND/OR chaining. OpenPGP includes per-user key management, identity binding, PGP/MIME + inline sign/encrypt/decrypt/verify, WKD/HKP discovery and private-key passphrase management.
IMAP IDLE events are delivered to the browser over the embedded WebSocket endpoint for realtime refresh and optional desktop notifications. Notification preferences include sound, folder selection and Do Not Disturb hours.
Appearance preferences are persisted per account and include light/dark/system theme, density, preview position, UI scale, multiple color presets, custom accent/background/panel/text colors, font, row height, pane widths, radius, contrast and visibility toggles. The mailbox toolbar also exposes persisted date/sender/subject/size sorting, and remote images can be restricted to saved contacts.
The interface intentionally uses flat surfaces, small radii and one SVG icon set. It contains no CSS gradients and no Unicode characters used as toolbar icons.
## ManageSieve
Supported modes:
- `starttls` — recommended;
- `implicit` — TLS immediately after connect;
- `none` — plaintext transport; reusable credential authentication remains blocked unless `sieve_allow_insecure_auth = true` is explicitly enabled.
When `sieve_host` is not configured, RustBox uses the authenticated session's IMAP host. Sieve uses the same session credentials; passwords are not exposed to the browser after login.
## Native installation
```bash
./scripts/build-release.sh
sudo ./scripts/install-systemd.sh
sudo systemctl enable --now rustbox
sudo journalctl -u rustbox -f
```
For public access put an HTTPS reverse proxy in front of RustBox. The production example binds to `127.0.0.1:3001`.
## Following Oxi
Initialize Git after extracting the release archive:
```bash
git init
git add .
git commit -m "RustBox 0.0.1 baseline"
./scripts/setup-upstream.sh
```
Inspect newer Oxi changes:
```bash
./scripts/oxi-status.sh
```
Import the mapped Oxi backend delta:
```bash
./scripts/sync-upstream.sh
```
Oxi `backend/...` paths are mapped into RustBox's flat Cargo tree. Oxi frontend sources are never copied. Relevant upstream frontend behavior is reviewed and reimplemented in `src/web/`. `UPSTREAM_BASE` advances only after `./scripts/finish-upstream.sh` completes review and the build gate.
To port one backend commit without advancing the baseline:
```bash
./scripts/oxi-port-commit.sh <oxi-commit>
```
See `docs/UPSTREAM.md` for details.
## Attribution
See `NOTICE.md`. The supplied Oxi snapshot did not contain an authoritative `LICENSE` file; verify the exact upstream licensing terms before public redistribution.
## Internal 0.0.1 working scope
The authoritative internal feature plan is `docs/RUSTBOX_PLAN.md`. Current implementation status is tracked in `docs/IMPLEMENTATION_STATUS.md`. Version `0.0.1` remains pre-publication until the full acceptance criteria in the plan are met.