@bobfrankston/rmfmail 1.0.474 → 1.0.475
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -44
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
#
|
|
1
|
+
# rmfmail -- Email Client
|
|
2
2
|
|
|
3
3
|
A local-first email client with IMAP sync, full offline reading, and a standalone native app. Replaces Thunderbird/Outlook.
|
|
4
4
|
|
|
5
5
|
> **Disclaimer:** This is a personal project written for my own use. I provide it as-is with no promises of support, stability, or fitness for any particular purpose. Use at your own risk.
|
|
6
6
|
|
|
7
|
+
> **Renamed from `@bobfrankston/mailx`** (2026-05). The old name collided with Linux's BSD `mailx` (`/usr/bin/mailx`) every launch in WSL or on a Linux box. If you have the old package, run `npm install -g @bobfrankston/rmfmail && npm uninstall -g @bobfrankston/mailx`. The old `~/.mailx/` config directory is auto-migrated to `~/.rmfmail/` on first start.
|
|
8
|
+
|
|
7
9
|
MIT License -- Copyright (c) 2026 Bob Frankston
|
|
8
10
|
|
|
9
11
|
## Installation
|
|
10
12
|
|
|
11
13
|
```bash
|
|
12
|
-
npm install -g @bobfrankston/
|
|
13
|
-
|
|
14
|
+
npm install -g @bobfrankston/rmfmail
|
|
15
|
+
rmfmail
|
|
14
16
|
```
|
|
15
17
|
|
|
16
18
|
Requires Node.js 22 or later.
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
On Windows, the native WebView2 app launches automatically via IPC (no HTTP server needed). Use `mailx --server` for browser mode at `http://127.0.0.1:9333`.
|
|
20
|
+
On Windows, the native WebView2 app launches automatically via IPC (no HTTP server needed). Use `rmfmail --server` for browser mode at `http://127.0.0.1:9333`.
|
|
21
21
|
|
|
22
22
|
## First-Time Setup
|
|
23
23
|
|
|
24
|
-
On first run,
|
|
24
|
+
On first run, rmfmail shows a setup form. Enter your name and email address.
|
|
25
25
|
|
|
26
26
|
### Gmail / Google Workspace
|
|
27
27
|
|
|
28
|
-
No password needed.
|
|
28
|
+
No password needed. rmfmail detects Gmail via MX records, opens a browser for OAuth2 sign-in, and auto-configures Google Drive for settings sync. Custom domains hosted on Google Workspace are detected automatically.
|
|
29
29
|
|
|
30
30
|
### Outlook / Hotmail / Live
|
|
31
31
|
|
|
@@ -36,29 +36,29 @@ No password needed. OAuth2 sign-in opens in your browser.
|
|
|
36
36
|
Use an **app password** (not your regular password):
|
|
37
37
|
1. Go to **Yahoo Account Settings** > **Account Security**
|
|
38
38
|
2. Click **Generate app password**
|
|
39
|
-
3. Paste the generated password into
|
|
39
|
+
3. Paste the generated password into rmfmail
|
|
40
40
|
|
|
41
41
|
### AOL
|
|
42
42
|
|
|
43
43
|
Use an **app password**:
|
|
44
44
|
1. Go to **AOL Account Settings** > **Account Security**
|
|
45
45
|
2. Click **Generate app password**
|
|
46
|
-
3. Paste the generated password into
|
|
46
|
+
3. Paste the generated password into rmfmail
|
|
47
47
|
|
|
48
48
|
### iCloud
|
|
49
49
|
|
|
50
50
|
Use an **app-specific password**:
|
|
51
51
|
1. Go to [appleid.apple.com](https://appleid.apple.com) > **Sign-In and Security**
|
|
52
52
|
2. Click **App-Specific Passwords** > **Generate**
|
|
53
|
-
3. Paste the generated password into
|
|
53
|
+
3. Paste the generated password into rmfmail
|
|
54
54
|
|
|
55
55
|
### Other Providers (Dovecot, Fastmail, etc.)
|
|
56
56
|
|
|
57
|
-
Enter your IMAP password.
|
|
57
|
+
Enter your IMAP password. rmfmail auto-detects server settings via MX records and DNS. If detection fails, use **Manual setup (advanced)** in the setup form, or create an accounts file and import it (see below).
|
|
58
58
|
|
|
59
59
|
### Adding Accounts via File
|
|
60
60
|
|
|
61
|
-
You can create an `accounts.jsonc` file and import it into
|
|
61
|
+
You can create an `accounts.jsonc` file and import it into rmfmail. This is useful for adding accounts that aren't easily configured through the setup form (custom IMAP servers, non-standard ports, etc.).
|
|
62
62
|
|
|
63
63
|
**Step 1.** Create a file (e.g., `my-accounts.jsonc`) with your account(s):
|
|
64
64
|
|
|
@@ -106,10 +106,10 @@ For known providers, most fields are optional:
|
|
|
106
106
|
}
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
-
**Step 2.** Import into
|
|
109
|
+
**Step 2.** Import into rmfmail:
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
|
-
|
|
112
|
+
rmfmail --import my-accounts.jsonc
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
This merges the accounts into your Google Drive settings (deduplicates by email address). Existing accounts are preserved.
|
|
@@ -247,30 +247,30 @@ All AI features are opt-in. Provider + API key live in the autocomplete settings
|
|
|
247
247
|
## Command Line
|
|
248
248
|
|
|
249
249
|
```
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
250
|
+
rmfmail Start the app (native window via IPC)
|
|
251
|
+
rmfmail --email <addr> First-time setup with this email (skips prompt)
|
|
252
|
+
rmfmail --verbose Show log output in terminal (default: log file only)
|
|
253
|
+
rmfmail --import <file> Import accounts.jsonc into Google Drive
|
|
254
|
+
rmfmail --server Start HTTP server for dev/remote (http://localhost:9333)
|
|
255
|
+
|
|
256
|
+
rmfmail -kill Kill running rmfmail processes + clean up WAL files
|
|
257
|
+
rmfmail -repair Re-sync message metadata (fix garbled subjects)
|
|
258
|
+
rmfmail -rebuild Wipe local cache and re-download everything from IMAP
|
|
259
|
+
rmfmail -setup Interactive first-time setup (CLI)
|
|
260
|
+
rmfmail -test Test IMAP/SMTP connectivity for all accounts
|
|
261
|
+
rmfmail -reauth Clear cached OAuth tokens; next start re-consents
|
|
262
|
+
rmfmail -v Show version
|
|
263
263
|
```
|
|
264
264
|
|
|
265
265
|
### -repair vs -rebuild
|
|
266
266
|
|
|
267
|
-
**-repair** clears message metadata (subjects, flags, sender names) from the database but preserves your downloaded `.eml` message files. Folder sync state resets so
|
|
267
|
+
**-repair** clears message metadata (subjects, flags, sender names) from the database but preserves your downloaded `.eml` message files. Folder sync state resets so rmfmail re-fetches all envelopes on next run. Use this when subjects show garbled characters.
|
|
268
268
|
|
|
269
269
|
**-rebuild** deletes the entire database and message store, then re-downloads everything from IMAP. Accounts and settings are preserved. Use this for a clean start or to reclaim disk space.
|
|
270
270
|
|
|
271
271
|
## Configuration
|
|
272
272
|
|
|
273
|
-
All config files live in `~/.
|
|
273
|
+
All config files live in `~/.rmfmail/` (on Windows: `C:\Users\You\.rmfmail\`). On first start, an existing `~/.mailx/` directory is auto-renamed to `~/.rmfmail/`.
|
|
274
274
|
|
|
275
275
|
### config.jsonc (per-machine, not synced)
|
|
276
276
|
|
|
@@ -278,8 +278,8 @@ Points to shared settings and controls local behavior. Created automatically for
|
|
|
278
278
|
|
|
279
279
|
```jsonc
|
|
280
280
|
{
|
|
281
|
-
"sharedDir": { "provider": "gdrive", "path": "
|
|
282
|
-
"storePath": "C:/Users/You/.
|
|
281
|
+
"sharedDir": { "provider": "gdrive", "path": "rmfmail", "folderId": "..." },
|
|
282
|
+
"storePath": "C:/Users/You/.rmfmail/mailxstore",
|
|
283
283
|
"historyDays": 90,
|
|
284
284
|
"accountOverrides": {
|
|
285
285
|
"work": { "historyDays": 7 },
|
|
@@ -289,8 +289,8 @@ Points to shared settings and controls local behavior. Created automatically for
|
|
|
289
289
|
```
|
|
290
290
|
|
|
291
291
|
**sharedDir** can be:
|
|
292
|
-
- `{ "provider": "gdrive", "path": "
|
|
293
|
-
- `"C:/Users/You/OneDrive/home/.
|
|
292
|
+
- `{ "provider": "gdrive", "path": "rmfmail" }` -- Google Drive via API (auto-configured for Gmail). The legacy folder names `mailx` and `home/.mailx` are also discovered automatically for users migrating from the old name.
|
|
293
|
+
- `"C:/Users/You/OneDrive/home/.rmfmail"` -- Local/network path
|
|
294
294
|
|
|
295
295
|
### accounts.jsonc (shared via Google Drive or local)
|
|
296
296
|
|
|
@@ -369,12 +369,12 @@ Settings sync via Google Drive API. Each machine has its own `config.jsonc`:
|
|
|
369
369
|
|
|
370
370
|
**Desktop** (full history):
|
|
371
371
|
```jsonc
|
|
372
|
-
{ "sharedDir": { "provider": "gdrive", "path": "
|
|
372
|
+
{ "sharedDir": { "provider": "gdrive", "path": "rmfmail" }, "historyDays": 0 }
|
|
373
373
|
```
|
|
374
374
|
|
|
375
375
|
**Laptop** (recent only):
|
|
376
376
|
```jsonc
|
|
377
|
-
{ "sharedDir": { "provider": "gdrive", "path": "
|
|
377
|
+
{ "sharedDir": { "provider": "gdrive", "path": "rmfmail" }, "historyDays": 30,
|
|
378
378
|
"accountOverrides": { "archive": { "enabled": false } } }
|
|
379
379
|
```
|
|
380
380
|
|
|
@@ -392,32 +392,34 @@ Both machines share accounts, preferences, and allowlist via Google Drive.
|
|
|
392
392
|
| mailxstore/ | No | Cached message bodies (.eml per message) |
|
|
393
393
|
| logs/ | No | Daily log files |
|
|
394
394
|
|
|
395
|
+
Note: the SQLite database file (`mailx.db`) and message-store directory (`mailxstore/`) keep their original filenames inside `~/.rmfmail/` — they're internal to the app and renaming them would break backwards compatibility for no user benefit.
|
|
396
|
+
|
|
395
397
|
**Safe to delete:** mailxstore/ (re-downloaded on sync), mailx.db (re-created on startup), logs/ (anytime).
|
|
396
398
|
|
|
397
399
|
## Logs
|
|
398
400
|
|
|
399
|
-
Daily log files: `~/.
|
|
401
|
+
Daily log files: `~/.rmfmail/logs/mailx-YYYY-MM-DD.log`
|
|
400
402
|
|
|
401
|
-
Use `
|
|
403
|
+
Use `rmfmail --verbose` to see logs in the terminal instead.
|
|
402
404
|
|
|
403
405
|
## Troubleshooting
|
|
404
406
|
|
|
405
|
-
**Blank window or no response** -- Run `
|
|
407
|
+
**Blank window or no response** -- Run `rmfmail -kill` then `rmfmail` to restart.
|
|
406
408
|
|
|
407
|
-
**OAuth timeout** -- If the browser auth window doesn't appear or times out (5 minutes), close
|
|
409
|
+
**OAuth timeout** -- If the browser auth window doesn't appear or times out (5 minutes), close rmfmail and try again.
|
|
408
410
|
|
|
409
|
-
**Garbled subjects** -- Run `
|
|
411
|
+
**Garbled subjects** -- Run `rmfmail -repair` to re-sync metadata from IMAP.
|
|
410
412
|
|
|
411
|
-
**Sync stuck or corrupt data** -- Run `
|
|
413
|
+
**Sync stuck or corrupt data** -- Run `rmfmail -rebuild` for a clean start. Accounts and settings are preserved.
|
|
412
414
|
|
|
413
|
-
**"Too many connections"** --
|
|
415
|
+
**"Too many connections"** -- rmfmail uses up to 5 IMAP connections per account. Close other email clients if you hit your server's limit.
|
|
414
416
|
|
|
415
417
|
**App password rejected (Yahoo/AOL/iCloud)** -- Make sure you're using an app-specific password, not your regular login. Generate a new one from your account security settings.
|
|
416
418
|
|
|
417
419
|
## Architecture
|
|
418
420
|
|
|
419
421
|
- **IPC-first** -- Default mode uses msger (Rust/WebView2) with bidirectional IPC. No TCP server, no CLOSE_WAIT zombies.
|
|
420
|
-
- **Host abstraction** --
|
|
422
|
+
- **Host abstraction** -- rmfmail talks to the WebView host through `@bobfrankston/mailx-host`, which picks msger (default) or msgview (Electron, planned for Mac and niche Linux) at runtime. Override with `MAILX_HOST=msger|msgview`. Internal package names retain the historical `mailx-*` prefix; only the public package was renamed.
|
|
421
423
|
- **HTTP fallback** -- `--server` flag starts Express for browser/remote access.
|
|
422
424
|
- **Local-first** -- Changes update local DB immediately; background worker syncs to IMAP.
|
|
423
425
|
- **Offline reading** -- Full message bodies cached as .eml files.
|