Release Notes
Added
- (gui) Wayland app id and a Linux desktop entry (#34)
- (daemon) one background daemon owns sync and IMAP; GUI, CLI and MCP are clients (#16)
- (mcp) MCP server with scopes, account filter and host install (#15)
- (gui) Backspace deletes on macOS
- (gui) Catppuccin Mocha and Latte palettes, coloured rows and the window icon
- (gui) activity and trash views with restore, and a key help window
- (gui) rules view with proposals and switches; react to rules.toml and config.toml edits
- (gui) search the account from the list with /
- (gui) show the message body with safe links, attachments and mark-read after a second
- (gui) archive, delete, move, read and flag with optimistic rows and rollback
- (gui) show per-account activity, errors and history in a status bar with a theme switch
- (gui) list threads with keyboard navigation, expansion and multi-select
- (gui) add postbode gui with the account and folder tree
- (config) add [ui] theme and save_theme that keeps comments
- (rules) add set_enabled for toggling a rule in place
- (engine) run accounts behind a lock and route commands to them
- (sync) drain commands between passes and wake IDLE for them
- (sync) add commands, command results and activity events
- (sync) fetch envelopes in resumable 500-message chunks with progress checkpoints
- (store) add initial_uid_next and thread summaries
Fixed
- (cli) show times in local time, from a shared time module (#58)
- (gui) explain startup errors in a window (#49)
- (config) refuse
password = { keyring = false } (#57)
- (service) pass POSTBODE_HOME on to the service's daemon (#55)
- (daemon) start without accounts (#47)
- (daemon) deliver a client's own action result once (#46)
- (gui) readable bold text in the dark theme (#44)
- (daemon) sync every account when rules.toml changes (#45)
- (sync) ghost rows and overwritten backups, found by model-based sync tests (#37)
- (rules) refuse blank and overlong names and folders (#32)
- store Homebrew's stable opt path for the daemon service and MCP hosts (#29)
- (gui) start the read delay when the body text appears
- (gui) keep the cursor on its thread when the thread gets new mail
- (gui) a click on the shown message opens it
- (gui) migrate the stores before the sync threads start
- (gui) open rules.toml in a text editor and log a failed opener
- (gui) offer a search hit's other folders in the move picker
- (gui) visible pane focus, cached body text and safer attachment names
- (gui) mark mail read only after the user opens it
- (gui) keep the cursor on its message across reloads
- (gui) visible focus ring on text fields and readable light-mode selection
- (gui) never link a bare scheme and keep the read timer across a fetched body
- (gui) stack optimistic edits per row and explain why actions are off
- (gui) keep progress ticks out of the history and errors on the line while offline
- (gui) keep egui widget focus out of the way of list keys
- (sync) only count synced mail as fresh so a moved-in row cannot hide mail below it
- (sync) mark mail in folders without rules as seen so a later body rule skips it
- (sync) end a full pass on a lost connection instead of skipping every folder
- (sync) clear the wake flag with acquire ordering before draining commands
- (engine) join sync threads on drop and report a failed spawn per account
- (sync) log a UIDVALIDITY change found between chunks
- (sync) persist which mail the rules have seen so aborted passes still notify
- (sync) stop draining after a lost connection and drain before INBOX-only passes
- (sync) return the real lost-connection error and test command failure paths
Other
- (gui) repaint from the client's subscription, not a relay thread (#52)
- (sync) move the sync tests into sync/tests.rs (#64)
- build Message and AccountConfig fixtures from their defaults (#62)
- (daemon) end the own-completion test at its own account's sync (#63)
- share the action, restore and approve steps of the CLI and MCP (#51)
- (store) drop the unused Message-ID index (#61)
- say what tokio is for in Cargo.toml (#60)
- one flag check and one source of account defaults (#59)
- (mail_ops) a move no longer claims to return the new uid (#56)
- (daemon) keep test-only client and sync code out of the binary (#50)
- (actions) drop fetch_bodies' unused progress callback (#48)
- describe sync and restore as the daemon does them (#43)
- (cli) print rule errors without faking an event (#54)
- (daemon) make the two timing-dependent daemon tests deterministic (#53)
- (gui) snapshot tests for the main views (#40)
- property tests for message, rules and wire parsing (#36)
- generate app icons from icon.svg with packaging/icons.sh (#33)
- (mcp) sweep every tool with junk arguments (#31)
- deny unwrap, expect and panic in shipped code (#28)
- simplify gui selection, store folder columns and sync pass state (#14)
- (gui) say in the key help that delete from Trash is permanent
- describe what delete does and what the Trash view lists
- describe the mail window and the [ui] theme
- link the docs site and community files from the README (#12)
- sharpen crate keywords and forbid unsafe code (#9)
- publish the mdBook docs to GitHub Pages (#5)
- add peach-and-mint terminal logo and app icon
- (engine) make Engine::start infallible
- (engine) retry taking an account lock that a concurrent spawn briefly inherited
- (sync) a command sent while offline runs after reconnecting
- (mail_ops) split fetch_new into search_uids and fetch_envelopes
Install postbode 0.2.0
Install prebuilt binaries via Homebrew
brew install pataar/tap/postbode
Download postbode 0.2.0