CXPost
April 7, 2026 · View on GitHub
A cross-platform terminal email client built on SharpConsoleUI.
⭐ If you find CXPost useful, please consider giving it a star! ⭐
It helps others discover the project and motivates continued development.
CXPost brings a polished terminal UI to email. Multi-account IMAP with push notifications, offline SQLite caching, conversation threading, rich HTML rendering, attachment support, and a three-pane layout — all without leaving the terminal.
Read. Compose. Manage.

Quick Start
Option 1: One-line install (Linux/macOS, no .NET required)
curl -fsSL https://raw.githubusercontent.com/nickprotop/cxpost/master/install.sh | bash
cxpost
Windows (PowerShell)
irm https://raw.githubusercontent.com/nickprotop/cxpost/master/install.ps1 | iex
Option 2: Build from source (requires .NET 10)
git clone https://github.com/nickprotop/cxpost.git
cd cxpost
./build-and-install.sh
cxpost
On first run, CXPost will prompt you to configure your email account (IMAP/SMTP).
Features
| 📬 Multi-Account | Unified inbox across multiple email accounts with per-account folder trees |
| 📎 Attachments | View attachment metadata, save to disk (quick save or folder picker), send with attachments |
| 🔍 Search | Instant local search + server-side IMAP SEARCH with recent query suggestions |
| 💬 Threading | JWZ conversation threading via Message-ID/References/In-Reply-To headers |
| 📊 Dashboard | Interactive account dashboard with stats, sparklines, clickable folders and actions |
| 🖥️ Layouts | Classic, Wide, and Read mode with composable view toggles (F2/F3/F4/F8) |
| ✉️ Compose | Reply, reply-all, forward with configurable prefixes. Signature with position control |
| 🗑️ Safe Delete | Move to Trash with 5-second undo. Confirmation dialog for permanent deletes |
| 🔐 Credentials | OS-native keyring (secret-tool/Keychain) with encrypted file fallback |
| 🌐 HTML Email | AngleSharp-based rendering to rich terminal markup with link preservation |
| ⚡ IMAP IDLE | Push notifications with debounced sync for real-time new mail |
| 📁 Folder Detection | IMAP special-use attributes (RFC 6154) + name heuristics, manual override in settings |
| 🔄 Offline Cache | SQLite-backed message/contact storage with lazy body fetching |
| 🎨 Polished UI | Depth-based focus dimming, animated transitions, gradient sync progress, row micro-animations |
| ⚙️ Per-Account Settings | Signature, reply-to, auto-bcc, default-cc, sync interval, mark-as-read, folder paths |
| 🖱️ Mouse Support | Click to navigate, click buttons, click attachment save, click breadcrumb |
Keyboard Shortcuts
| Key | Action |
|---|---|
↑ ↓ | Navigate messages / folders |
Enter | Select / activate |
Ctrl+N | Compose new message |
Ctrl+R | Reply (Ctrl+Shift+R for reply all) |
Ctrl+F | Forward |
Ctrl+S | Search messages |
Ctrl+U | Toggle read/unread |
Ctrl+D | Toggle flag |
Ctrl+M | Move to folder |
Del | Delete (move to Trash / confirm permanent) |
F2 | Toggle folder tree |
F3 | Toggle preview panel |
F4 | Toggle read mode (full-width reader with message strip) |
Ctrl+B | Toggle message strip in read mode |
F5 | Sync all accounts |
F8 | Toggle layout (Classic ↔ Wide) |
Ctrl+, | Settings |
Esc | Exit read mode / clear search / close dialog |
1-9 | Save attachment #N |
Ctrl+1-9 | Save As attachment #N |
A | Save all attachments |
Configuration
CXPost stores configuration and data in standard OS locations:
| Linux | macOS / Windows | |
|---|---|---|
| Config | ~/.config/cxpost/config.yaml | %APPDATA%/CXPost/config.yaml |
| Data | ~/.local/share/cxpost/ | %LOCALAPPDATA%/CXPost/ |
| Credentials | OS keyring or encrypted file | OS keyring |
Per-Account Settings
Each account can be configured independently via Settings → Edit Account:
- General: Display name, email, username, reply-to, password
- Server: IMAP/SMTP host, port, security (SSL/TLS/None)
- Compose: Signature (with position), auto-bcc, default-cc, reply/forward prefixes
- Sync: Interval, max messages per folder, mark-as-read on view, notifications, folder path overrides
Global Settings
- Appearance: Layout (Classic / Wide / Last Used)
- Behavior: Sync interval, notifications, startup view, confirm before quit
Building from Source
Prerequisites: .NET 10 SDK, optionally ConsoleEx checked out alongside
git clone https://github.com/nickprotop/cxpost.git
cd cxpost
# If ConsoleEx is at ../ConsoleEx, it uses the project reference automatically
# Otherwise it pulls SharpConsoleUI from NuGet
dotnet build
dotnet run --project CXPost
Install locally
./build-and-install.sh # Builds and installs to ~/.local/bin/cxpost
Release
./publish.sh patch # Bumps version, pushes tag, triggers GitHub Actions
Architecture
CXPost/
├── Models/ # Account, MailMessage, MailFolder, AttachmentInfo
├── Services/ # IMAP, SMTP, Cache, Config, Credentials, FolderResolver
├── Coordinators/ # MailSync, MessageList, Compose, Search, Notification
├── Data/ # SQLite repositories, migrations
└── UI/
├── CXPostApp.cs # Main window, layout, event handling
├── Components/ # Dashboard, StatusBar, MessageBar, HtmlConverter
└── Dialogs/ # Compose, Search, Settings, AccountSettings, Confirm
Key technologies: SharpConsoleUI (TUI framework), MailKit (IMAP/SMTP), AngleSharp (HTML parsing), SQLite (offline cache), YamlDotNet (config)
Uninstall
cxpost-uninstall.sh
# Or manually:
rm ~/.local/bin/cxpost
rm -rf ~/.config/cxpost ~/.local/share/cxpost # optional: remove data