feat: update README and FEATURES.md
This commit is contained in:
+23
-12
@@ -2,19 +2,23 @@
|
|||||||
|
|
||||||
## Mail
|
## Mail
|
||||||
|
|
||||||
- Read, compose, reply, reply-all, and forward with a Tiptap rich text editor (inline images, drag-and-drop embedding)
|
- Read, compose, reply, reply-all, and forward with a Tiptap rich text editor (inline images, drag-and-drop embedding, tables)
|
||||||
- Gmail-style threading with inline expansion and an optional conversation toggle
|
- Gmail-style threading with inline expansion and an optional conversation toggle
|
||||||
- Unified mailbox view across all connected accounts
|
- Unified mailbox view across all connected accounts
|
||||||
- Draft auto-save with identity preservation
|
- Three selectable mail layouts: split (three-pane), focused list, and reading pane at bottom
|
||||||
- Attachment upload, download, and inline preview; forgotten-attachment warning
|
- Draft auto-save with identity preservation, persisted HTML body, and proper `In-Reply-To` / `References` headers on replies
|
||||||
|
- Attachment upload, download, drag-out to local file system, and inline preview; image thumbnails and forgotten-attachment warning
|
||||||
- Full-text search with JMAP filter panel, search chips, wildcards, OR conditions, and cross-mailbox queries
|
- Full-text search with JMAP filter panel, search chips, wildcards, OR conditions, and cross-mailbox queries
|
||||||
- Batch operations – multi-select, archive, delete, move, tag
|
- Batch operations – multi-select, archive, delete, move, tag
|
||||||
- Archive modes – direct, by year, or by month
|
- Archive modes – direct, by year, or by month
|
||||||
- Multi-tag support with color labels, reordering, and drag-and-drop assignment
|
- Multi-tag support with color labels, reordering, and drag-and-drop assignment
|
||||||
- Star/unstar with configurable mark-as-read delay
|
- Star/unstar with configurable mark-as-read delay
|
||||||
- Virtual scrolling for large mailboxes
|
- Virtual scrolling for large mailboxes plus prefetching of initial email data on login
|
||||||
- Quick reply, hover actions, sender avatars (favicon-based), and recipient popovers
|
- Quick reply, hover actions, sender avatars (favicon-based), and recipient popovers
|
||||||
- Plain-text composer mode and Reply-To support
|
- Plain-text composer mode and Reply-To support
|
||||||
|
- Configurable signature position (above or below quoted text) per identity
|
||||||
|
- From-header override in the composer with optional catch-all auto-reply: replies to an alias on a domain you own auto-fill the alias as the sender even when it isn't a configured identity
|
||||||
|
- `.eml` file import via folder right-click menu
|
||||||
- TNEF (`winmail.dat`) extraction and `message/rfc822` unwrapping
|
- TNEF (`winmail.dat`) extraction and `message/rfc822` unwrapping
|
||||||
- Folder management with icon picker, subfolders, and sidebar counts
|
- Folder management with icon picker, subfolders, and sidebar counts
|
||||||
- Print directly from the viewer
|
- Print directly from the viewer
|
||||||
@@ -79,7 +83,7 @@
|
|||||||
|
|
||||||
## Interface
|
## Interface
|
||||||
|
|
||||||
- Three-pane layout with resizable columns
|
- Selectable mail layouts (split three-pane, focused list, reading pane at bottom) with resizable columns
|
||||||
- Dark and light themes with intelligent email color transformation
|
- Dark and light themes with intelligent email color transformation
|
||||||
- Responsive desktop, tablet, and mobile layouts
|
- Responsive desktop, tablet, and mobile layouts
|
||||||
- Full keyboard navigation
|
- Full keyboard navigation
|
||||||
@@ -100,25 +104,32 @@ Automatic browser detection with persistent preference. Configurable locale URL
|
|||||||
|
|
||||||
## Identity & Multi-Account
|
## Identity & Multi-Account
|
||||||
|
|
||||||
- Up to 5 simultaneous accounts with instant switching and per-account session persistence
|
- Multiple simultaneous accounts with instant switching and per-account session persistence; the 5-account cap is lifted on HTTP/2 servers (limited by browser connection pooling on HTTP/1.1)
|
||||||
- Account switcher with connection status and default account selection
|
- Account switcher with connection status and default account selection
|
||||||
- Multiple sender identities with per-identity signatures, automatic sync, and badges in viewer/list
|
- Multiple sender identities with per-identity signatures, automatic sync, and badges in viewer/list
|
||||||
- Sub-addressing (`user+tag@domain.com`) with contextual tag suggestions
|
- Configurable signature position (above or below quoted text)
|
||||||
|
- Sub-addressing (`user+tag@domain.com`) with configurable delimiter and contextual tag suggestions
|
||||||
- Shared folders across accounts
|
- Shared folders across accounts
|
||||||
|
- Multiple JMAP servers per deployment with optional auto-pick by email domain
|
||||||
- Optional custom JMAP endpoints on the login form (`ALLOW_CUSTOM_JMAP_ENDPOINT`)
|
- Optional custom JMAP endpoints on the login form (`ALLOW_CUSTOM_JMAP_ENDPOINT`)
|
||||||
|
|
||||||
## Admin & Extensibility
|
## Admin & Extensibility
|
||||||
|
|
||||||
- Stalwart admin dashboard with dedicated policy sections
|
- Web setup wizard for first launch – guides through JMAP server(s), OAuth/OIDC, session secret, logging, branding (with file upload), and admin password; persists to the admin config dir, no `.env.local` editing required
|
||||||
- Plugin system – schema-driven config UI, render and intercept hooks, `onAvatarResolve` and i18n APIs, calendar event slots, and managed policy enforcement
|
- Stalwart admin dashboard with dedicated policy sections, collapsed into a single tabbed page
|
||||||
|
- Split admin storage: `ADMIN_CONFIG_DIR` (operator-authored, mountable read-only after setup) and `ADMIN_STATE_DIR` (runtime audit log and login timestamps)
|
||||||
|
- Plugin system – schema-driven config UI, render and intercept hooks, `onAvatarResolve`, `onBeforeEmailSend`, composer-sidebar and email-banner slots, calendar event slots, i18n APIs, and managed policy enforcement
|
||||||
|
- Plugin hot-reload and dev-folder loading, on-demand `src/` bundling via esbuild, and `http:fetch` permission with `httpOrigins`
|
||||||
- Themes – upload, enforce, and manage admin-controlled themes as ZIP bundles
|
- Themes – upload, enforce, and manage admin-controlled themes as ZIP bundles
|
||||||
- Extension marketplace – browse and install plugins and themes from a configurable directory (`EXTENSION_DIRECTORY_URL`)
|
- Extension marketplace – browse and install plugins and themes from a configurable directory (`EXTENSION_DIRECTORY_URL`); install/uninstall restricted to the admin dashboard
|
||||||
- Bundled plugins including Jitsi Meet calendar integration
|
- Bundled plugins including Jitsi Meet calendar integration
|
||||||
|
|
||||||
## Operations
|
## Operations
|
||||||
|
|
||||||
- Progressive Web App with service worker, install prompt, and dynamic manifest
|
- Progressive Web App with service worker, install prompt, web push notifications for inbox mail, and dynamic manifest
|
||||||
- Automatic update check with server-side logging of new releases
|
- Automatic update check with server-side logging of new releases and a non-dismissible update notice
|
||||||
- Structured logging (`text` or `json`) with category-based levels
|
- Structured logging (`text` or `json`) with category-based levels
|
||||||
|
- Anonymous instance telemetry (opt-out via admin UI or `BULWARK_TELEMETRY=off`) – version, platform, bucketed account counts, feature toggles only
|
||||||
- Release (`main`) and development (`dev`) Docker images on GHCR
|
- Release (`main`) and development (`dev`) Docker images on GHCR
|
||||||
|
- Subpath deployment via `NEXT_PUBLIC_BASE_PATH` for mounting behind a reverse proxy
|
||||||
- Demo mode with fixture data – no mail server required
|
- Demo mode with fixture data – no mail server required
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ A modern, self-hosted webmail client for [Stalwart Mail Server](https://stalw.ar
|
|||||||
|
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://discord.gg/tYCujymGrT)
|
[](https://discord.gg/tYCujymGrT)
|
||||||
[](CHANGELOG.md)
|
[](CHANGELOG.md)
|
||||||
[](https://ghcr.io/bulwarkmail/webmail)
|
[](https://ghcr.io/bulwarkmail/webmail)
|
||||||
[](https://grafana.external.bulwarkmail.org/)
|
[](https://grafana.external.bulwarkmail.org/)
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ Bulwark is a full webmail suite, not just an inbox. It bundles the four apps mos
|
|||||||
- **Contacts** – multiple address books, groups, vCard import/export
|
- **Contacts** – multiple address books, groups, vCard import/export
|
||||||
- **Files** – Stalwart's JMAP FileNode storage with previews and folder upload
|
- **Files** – Stalwart's JMAP FileNode storage with previews and folder upload
|
||||||
|
|
||||||
Plus the infrastructure around them: OAuth2 / OIDC SSO, TOTP 2FA, multi-account (up to 5 at once), 15 languages, PWA install, dark/light themes, a plugin system with an extension marketplace, and a admin dashboard.
|
Plus the infrastructure around them: a web setup wizard, OAuth2 / OIDC SSO, TOTP 2FA, multi-account with HTTP/2 connection pooling, 15 languages, PWA install, dark/light themes, a plugin system with an extension marketplace, and an admin dashboard.
|
||||||
|
|
||||||
Full feature list: **[FEATURES.md](FEATURES.md)**.
|
Full feature list: **[FEATURES.md](FEATURES.md)**.
|
||||||
|
|
||||||
@@ -74,28 +74,25 @@ Full feature list: **[FEATURES.md](FEATURES.md)**.
|
|||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d -p 3000:3000 \
|
docker run -d -p 3000:3000 ghcr.io/bulwarkmail/webmail:latest
|
||||||
-e JMAP_SERVER_URL=https://mail.example.com \
|
|
||||||
ghcr.io/bulwarkmail/webmail:latest
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Or with Docker Compose:
|
Or with Docker Compose:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp .env.example .env.local
|
|
||||||
# Edit .env.local – set JMAP_SERVER_URL
|
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
On first launch, open `http://localhost:3000` – the **web setup wizard** walks you through JMAP server, OAuth, branding, and the admin password. No `.env.local` editing required. Existing installs that already define `JMAP_SERVER_URL` in their environment skip the wizard and keep the env-managed flow described under [Configuration](#configuration).
|
||||||
|
|
||||||
### From Source
|
### From Source
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/bulwarkmail/webmail.git
|
git clone https://github.com/bulwarkmail/webmail.git
|
||||||
cd webmail
|
cd webmail
|
||||||
npm install
|
npm install
|
||||||
cp .env.example .env.local
|
|
||||||
# Edit .env.local – set JMAP_SERVER_URL
|
|
||||||
npm run build && npm start
|
npm run build && npm start
|
||||||
|
# Then open http://localhost:3000 to run the setup wizard
|
||||||
```
|
```
|
||||||
|
|
||||||
### Development
|
### Development
|
||||||
@@ -108,13 +105,13 @@ npm run lint
|
|||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
Most deployments are configured through the **setup wizard** (on first launch) and the **admin dashboard** thereafter; values are written to the admin config directory rather than `.env.local`. Environment variables remain supported for operators who prefer file-driven configuration or read-only / immutable infrastructure. When an environment variable is set, it takes precedence over the corresponding admin-managed value, so setting `JMAP_SERVER_URL` will hide that field from the wizard and lock it in the admin UI.
|
||||||
|
|
||||||
All variables are evaluated at runtime, so Docker deployments can be reconfigured without rebuilding. Edit `.env.local`:
|
All variables are evaluated at runtime, so Docker deployments can be reconfigured without rebuilding. Edit `.env.local`:
|
||||||
|
|
||||||
```env
|
```env
|
||||||
# Required
|
# Optional – overrides whatever the wizard writes
|
||||||
JMAP_SERVER_URL=https://mail.example.com
|
JMAP_SERVER_URL=https://mail.example.com
|
||||||
|
|
||||||
# Optional
|
|
||||||
APP_NAME=My Webmail
|
APP_NAME=My Webmail
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -218,6 +215,19 @@ LOG_LEVEL=info # error | warn | info | debug
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Admin data directories</summary>
|
||||||
|
|
||||||
|
```env
|
||||||
|
ADMIN_CONFIG_DIR=./data/admin # operator-authored: config.json, policy.json, plugins/, themes/
|
||||||
|
ADMIN_STATE_DIR=./data/admin-state # runtime: audit log, login timestamps, setup token
|
||||||
|
ADMIN_CONFIG_READONLY=true # enforce read-only mode at the app layer
|
||||||
|
```
|
||||||
|
|
||||||
|
The split lets you mount the config volume read-only after the setup wizard completes. Legacy installs that pre-date the split keep working through `ADMIN_DATA_DIR`.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Subpath / reverse proxy mount</summary>
|
<summary>Subpath / reverse proxy mount</summary>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user