63 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
2.1.0 - 2026-08-16
Added
-
Added the
pimdirstorage backend, Himalaya over a local pimdir store: the SQLite index and content-addressed blobs the sync engine (Neverest) populates.pimdir.rootpoints at the store directory, and for an account you already sync that single line is the whole configuration, reading it touching no network.The store is read as a possibly-partial cache. Envelopes are built from the stored meta without reading a single body, and a message whose body is not local still lists, reading as "body not fetched", the cue to sync, rather than failing. Writes are staged as replica mutations the next sync propagates:
flag set,message add,copy,moveanddeleteall go through the store's mutation seam rather than raw SQL, and an added message is content-hashed with the digest Neverest uses, so it deduplicates against a synced one.Staged writes are attributed to
pimdir.source, auto-detected from a store synced as a single source and worth setting only to disambiguate one synced from two. A write against a store never synced as that source fails loudly instead of staging a change no sync would carry. Message ids are the store's short public ids, the same integer in every mailbox a message is filed in. -
Added back the
emailanddisplay-nameaccount config fields, and the globaldisplay-name, dropped in v2 (#721).messages compose,messages replyandmessages forwardfill theFromheader from them when--fromis not passed, so the address no longer has to be repeated on every invocation. An explicit--fromstill wins whole, and an account declaring neither composes without aFromheader as before. The name is handed to the MIME builder apart from the address, so one holding a comma, a quote or a non-ASCII character is encoded rather than mangled.Both keys are also read under the spellings himalaya-tui writes,
fromandfrom-name, and himalaya-tui now readsemailanddisplay-namein turn, one configuration file backing the two binaries either way. The wizard writesemailwhen its prompt was answered with an address rather than a server URL or a folder path. -
Added back the
signatureandsignature-delimconfig fields, dropped in v2, at both the global and the account level.The composers append the signature when neither
--signaturenor--signature-fileis passed, andsignature-delimdecides what introduces it, defaulting to the RFC 3676 §4.3"-- \n"the composers used to hardcode. The delimiter is written verbatim, so one meant to stand on its own line carries its own trailing newline.signatureis the signature alone. himalaya-tui, which reads the same two keys, expected the delimiter to be written inside the value and ignoredsignature-delimentirely; it now assembles the block the same way, so one value reads the same under both binaries. -
Added
in_reply_toto the shared envelope, the message(s) a message replies to (#734).It is a list, since RFC 5322 §3.6.4 spells the header
1*msg-id, and every id is stripped of its angle brackets exactly asmessage_idis, so a reply and its parent compare byte-for-byte whatever backend returned them. It rides the JSON output, takes no column in the listing table, and costs no backend an extra request. Microsoft Graph leaves it empty,In-Reply-Toliving ininternetMessageHeaders, which a listing selection does not return. -
Added the shared
message delete <ids>command (aliasdel), following a trash-first policy.Messages are moved to the trash mailbox, unless they already are in it, in which case they are permanently removed. The trash mailbox is resolved from the backend role, then from the
mailbox.alias.trashconfig entry, and failing that the command errors. IMAP needs UIDPLUS (RFC 4315) to expunge exactly the deleted UIDs; without it the messages are only flagged\Deletedand a later expunge reclaims them. -
Added the
maildir.keywords.dovecotandmaildir.keywords.headeraccount config fields, surfacing custom Maildir keywords.Custom (non-IANA) keywords such as
NonJunkwere invisible on Maildir: the six standard info-section letters became flags and everything else was dropped, soenvelope list "flag NonJunk"matched nothing where the same search works on IMAP, JMAP and Microsoft Graph. Maildir has no single keyword convention, so which one a mailbox uses has to be named.maildir.keywords.dovecot = trueresolves the lowercase slot letters through each mailbox's owndovecot-keywordsfile (dovecot, mbsync, OfflineIMAP), andmaildir.keywords.headerreads them fromX-Keywords(comma-separated) orX-Label(space-separated, mutt and notmuch). Both default to off, leaving the flag set unchanged.Reading only, and lossy on write: no command can name a custom keyword, so
flag setreplaces the whole set and drops any keyword the message carried. -
Added the
imap.sasl-iraccount config field, forcing the RFC 4959 SASL-IR initial response on or off for every SASL mechanism:truealways inlines credentials withAUTHENTICATE,falsewaits for the server's continuation request, and leaving it unset follows the advertisedSASL-IRcapability as before.Coremail (NetEase 126.com and 163.com) advertises
SASL-IRyet answers the inline form withBAD Request not ending with, leaving those accounts unable to authenticate at all (#729). They needimap.sasl-ir = false, and usuallyimap.id.auto = trueas well since Coremail also rejectsSELECTwithout a priorID. -
Added a
--seenflag tomessage read, marking the message as seen while reading it. Without it the read stays non-mutating, the default since v2. -
Added the
configurecommand (aliaswizard), running the account wizard by name.A bare
himalayaand any command needing an account still offer it when they find no configuration. That offer is now a hook rather than a gate: the command carries on afterwards either way, where it used to exit whatever you answered. Nothing prompts when stdin is not a terminal or--jsonis set. -
Added back the
HIMALAYA_CONFIGenvironment variable, read like-cand accepting the same:-delimited list. -
Added the
--helpfooter every Pimalaya binary shares, naming the bug tracker and the sponsoring page. It endshimalaya -h,himalaya --helpand the generatedhimalaya.1man page, and is not repeated under each subcommand.
Changed
-
Made the configuration wizard discovery-only, removing the hand-entry flow entirely.
An email, a bare domain or a
scheme://server URL all run discovery, the URL scheme narrowing the results:imapandimapsto IMAP plus SMTP, an HTTP-family scheme to JMAP. A local folder path auto-detects Maildir against m2dir, prompting only when the directory is ambiguous. When nothing is discovered, the wizard stops and points at the documented sample configuration.The wizard no longer invents an SMTP host. When discovery finds IMAP but no submission endpoint, the account is IMAP-only and the user adds SMTP by hand, instead of guessing
smtp.<domain>and failing its connection test. -
Reworked
message read's plain-text output into a concise reading view.A minimal header block (Date, From, To, Cc, Subject) is followed by a per-part walk: one summary line per MIME part (
[ID] <type>[ — <filename>] (<size>)) carrying that part's ownContent-*headers, then the decoded contents of plain-text parts inlined. HTML and binary parts stay a summary, except an HTML-only mail, whose markup is printed rather than nothing readable.--rawand--jsonare unchanged. -
Right-aligned the
SIZEcolumn of the envelope listing table, its header included, so sizes line up on their unit rather than on their first digit (#723). -
Aligned the
IDinmessage read,attachments listandattachments downloadon the MIME part's 1-based position, somessage readshows the same id passed toattachments download. Attachment ids are therefore a sparse subset of the part positions (1 5 9) rather than a dense sequence. -
The first-run offer now opens with a welcome banner on stderr explaining what Himalaya is, naming the configuration file it looked for and pointing at the documented sample, replacing the comment header that used to head the generated config.
himalaya configure, asked for by name, skips it. -
The wizard now writes the account to the configuration file rather than only printing it, and never rewrites what a human wrote.
The path is no longer prompted: it is where
-corHIMALAYA_CONFIGpointed, or$XDG_CONFIG_HOME/himalaya/config.toml. A file that is not there is written whole, and one that is gets a plain text append, so comments, ordering and formatting survive. The generated account takes a free name, suffixed until it is, and claimsdefaultonly when no other account does. When stdout is redirected or in JSON mode it still prints straight to stdout. -
Bare
himalaya --account <NAME>(an account but no subcommand) now shows the help instead of dropping into the account-creation wizard. -
The wizard now offers only the IMAP authentication mechanisms the server supports, read from an unauthenticated CAPABILITY before prompting: the advertised SASL mechanisms, most preferred first and the legacy
LOGINcommand last.A server exposing no SASL AUTH and no LOGINDISABLED (a perdition-style proxy such as isae-supaero.fr) offers
LOGINalone, where the wizard previously defaulted toAUTHENTICATE PLAINand failed. On any probe failure it falls back to the full mechanism list. SMTP keeps its discovery-advertised list, since it negotiates auth over EHLO. -
The wizard's service discovery is now time-bounded, so a single unreachable endpoint (a firewalled port, a black-hole host) no longer stalls it for the operating-system connect timeout. Mechanisms still running at the deadline are abandoned and only what completed in time is offered.
-
The wizard now offers to reuse the IMAP credentials for SMTP, so they are entered once. On accept it prompts only the SMTP endpoint (host seeded from the IMAP host, encryption, port); on decline it runs the full SMTP prompts.
-
gmail messages get --headerandgmail threads get --headernow narrow the rendered headers under every format, not only--format metadata. Gmail honours itsmetadataHeadersparameter for the metadata format alone and returns every header otherwise, so the filter is applied to the response as well. Names match case-insensitively, repeated headers keep their order, and passing no--headerstill renders them all. -
imap rawnow sends a byte-verbatim batch of tagged commands.The command argument decodes literal
\r/\nescapes into real CRLF, so a CRLF-separated batch (each command carrying its own tag) can be pipelined from the shell, e.g.himalaya imap raw 'a1 SELECT INBOX\r\na2 SEARCH ALL\r\n', and the reply is read until every command is acknowledged (possibly out of order).smtp rawgains the same escape decoding but stays a single command line, rejecting batched input since the exchange reads exactly one reply. Both accept the command via stdin.
Fixed
-
Fixed
configure --jsonemitting a payload no schema described:json-schema <DIR>now writeshimalaya-configure.json, like every other command returning data. -
Fixed
--fromspelling out a display name producing aFrom: <Alice <alice@example.org>>no SMTP server accepts, the send failing with501 5.1.7 Bad sender address syntax(#727).The value is now parsed as a mailbox, the name reaching the MIME builder apart from the address exactly as the configured
display-namedoes. A bare address is unaffected, and one that parses to no address at all errors instead of composing a broken header. -
Fixed commands dying mid-exchange with a bare
Resource temporarily unavailable (os error 35)(#731, #732).A blocking socket is not supposed to report
EAGAIN, yet it surfaced on large mailboxes, the more readily the longer the exchange ran. The transport underneath every backend now retries a stream that reports it is not ready, for a minute before giving up and saying so. It also arms a socket read deadline at connect time, so a server that goes silent on an otherwise healthy connection ends the command instead of hanging forever. -
Fixed lean cargo feature combinations failing to compile. Every combination now builds.
The config schema no longer reaches for the
io-imap,io-smtpandio-jmapALPN defaults when those backends are disabled, and the cross-protocol commands are feature-gated by what they need:mailboxes,envelopes,flags,attachmentsand the storage message subcommands (add,copy,move,read,reply,forward) require a storage backend, whilemessages composeandmessages sendonly need a send backend. A backend-less build drops the shared surface entirely. Theattachmentscommands also reached the Gmail, Microsoft Graph and m2dir backends, previously IMAP, JMAP and Maildir only. -
message read --raw --jsonno longer errors: the two combine, emitting the raw RFC 5322 bytes as a JSON{ "message": "…" }string (lossily decoded) instead of bailing with "--rawand--jsoncannot be combined". -
Fixed the Gmail and Microsoft Graph
getcommands wrapping their data in amessagestring under--json, which left the output unparseable and--headerwithout visible effect (#730).Gmail
messages get,drafts get,threads get,history listand thesettingsreaders now serialize their data, as does Microsoft Graphmessage get, each with a published JSON Schema. Text output is unchanged, except that Gmailmessages getandthreads getprint the headers they already fetched, andhistory listreports the affected message ids rather than per-record counts. -
Fixed
gmail drafts get --format rawdiscarding the raw message it had fetched and printing the draft summary instead. It now writes the RFC 5322 bytes, likegmail messages get --format raw.
Removed
-
Removed the
assets/himalaya.desktopentry, and the Nix install line copying it intoshare/applications. Packagers installing it by hand should drop it too.Every functional line of it had stopped working:
Exec=himalaya %Uanswers amailto:link withunrecognized subcommand, its Compose action passes the same URL tomessage write, which takes no positional argument, and thex-scheme-handler/mailtoandmessage/rfc822types it claimed are not handled at all. Claiming the scheme was the harmful part, a desktop being free to route every mail link to a command that then errors out.mailto:handling belongs to a wrapper of your own, as MIGRATION.md describes.
2.0.0 - 2026-07-26
Added
-
Added Gmail REST API support: a
[gmail]account backend behind the shared mail commands (--backend gmail), plus a protocol-specificgmailcommand exposing the full REST surface (profile, labels, messages, attachments, drafts, threads, history, settings). Authenticates with a single OAuth 2.0 bearer token (gmail.auth.token.raw/.command), the only authorization Gmail's REST API accepts. -
Added Microsoft Graph REST API support: a
[msgraph]account backend behind the shared mail commands (--backend msgraph), plus a protocol-specificmsgraphcommand exposing the Graph mail surface (profile, mail-folder, message, attachment). Mirrors[gmail], authenticating with a single OAuth 2.0 bearer token. -
Restored the RFC 2971
ID-after-auth quirk asimap.id.{auto, fields}, replacing the v1.2.0imap.extensions.id.send-after-authflag dropped during the v2 migration. -
Brought the
m2dirbackend to CLI feature parity withmaildir(messages, flags, envelopes). Mailboxrenameand messagecopy/movestill await io-m2dir support. -
Added
--save <MAILBOX>tomessages send, mirroring the flag onmessages compose/reply/forward. -
Added
--sendtomessages add(aliasmessages save), mirroringmessages send --save. -
Added raw passthrough commands
imap raw <command>andsmtp raw <command>. -
The wizard now pre-fills
mailbox.alias.*from the server, so a generated account has a working default mailbox (theinboxalias, which backs commands that omit-m/--mailbox) and known Sent/Drafts/Trash/… targets without hand-editing ids. JMAP reads the RFC 8621 mailbox roles live over the tested connection. Gmail and Microsoft Graph map their fixed system-label ids (INBOX,SENT, …) and well-known folder names (inbox,sentitems, …). IMAP pins the reservedINBOXonly. The other special-use roles await LISTRETURN (SPECIAL-USE)support in io-imap (upstream imap-codec has none yet). -
Added the
json-schema <DIR>command, which writes one JSON Schema file per structured-output command (himalaya-<cmd>-<subcmd>.json) describing its--jsonpayload, so downstream tooling can validate and type Himalaya's machine output. Only the schemas for compiled-in backends are emitted (#547). -
The discovery wizard now falls back to the system DNS resolver (/etc/resolv.conf on unix, the network adapters on windows) before the Cloudflare default, making the resolution chain
HIMALAYA_DNS_RESOLVERthen system then1.1.1.1. This avoids leaking the email domain to a third-party resolver and works around networks that block the default. -
Added local socket-proxy support:
imap.server/smtp.servernow accept aunix:///pathscheme to connect through a pre-authenticated session proxy such as sirup. No SASL is negotiated over the socket (the session arrives already authenticated), and a single-session proxy can back the storage backend without Himalaya opening a second connection (#264).
Changed
-
Flattened the
imapcommand tree into top-level verbs mirroring the protocol's flat command list (select,create,append,store,fetch, …), replacing the formermailbox/envelope/message/flagsubgroups. -
Unified raw-message input across the
messages,imap,maildir,jmap,msgraphandsmtpsend/add commands behind a singleMessageArg(file path, inline raw, or piped stdin), and removed the legacy--fileflag onmessages add. -
Split the merged
Accountout of every client wrapper: subcommands now receiveaccountandclientas sibling arguments instead of reaching throughclient.account. -
Breaking: changed bare
himalaya(no subcommand) to run the account wizard instead of listing the default account's envelopes. Himalaya is now a lower-level tool: envelope listing lives under its explicit commands, and the bare invocation is the natural entry point for setting up an account. -
Changed the wizard to print the generated account as a ready-to-save TOML document on stdout instead of writing it to disk, mirroring ortie. Redirect it into your config file yourself (e.g.
himalaya > ~/.config/himalaya/config.toml). It runs on barehimalayaand is still proposed when a command finds no config, while a config that exists but lacks the requested account is now a hard error rather than a wizard trigger.The account's connection is tested before the config is printed, so a bad credential or endpoint stops the wizard instead of yielding a config that cannot connect. The output is compact: only the
[accounts.<name>]table stays a section header, every other table is flattened into dotted keys (imap.sasl.plain.username = …), and empty tables and defaulted values (starttls,alpn,id.auto) are dropped. -
Reworked the wizard's account-setup flow. The discovery list now shows one entry per reachable service (IMAP + SMTP, JMAP, Gmail, Microsoft Graph), and the authentication method is chosen in a second, service-specific prompt: the SASL mechanism (
PLAIN,LOGIN,SCRAM-SHA-256,OAUTHBEARER, …) for IMAP + SMTP, the HTTP scheme (Basic / Bearer) for JMAP. OAuth 2.0 is no longer a dead-end list entry: it folds into the "API token" credential prompt, which now offers the OS keyrings and the OAuth token brokers (Ortie, pizauth, oama) together, the brokers appearing only when the service advertises OAuth. -
The wizard now tests IMAP and SMTP as it configures them: the IMAP connection is validated first, then it asks whether SMTP reuses the same credentials (the two may advertise different auth), re-running the SASL prompt for a distinct one, and tests SMTP last.
-
The wizard no longer prompts for an account name. It is derived from the input (the domain's first label, or the folder name). Rename it by editing the printed
[accounts.<name>]table key.
Fixed
-
Fixed compilation error when the
wizardfeature was disabled (#634). -
Fixed mailbox-alias resolution to apply across every shared
messagessubcommand (add,read,reply,forward,copy,move) and the--saveflag oncompose/reply/forward, so aliases likemailbox.alias.sentare honoured before the backend call. -
Fixed swapped save/send success messages ("saved" printed after a pure send, "sent" after a pure save).
Removed
-
Removed the
[message.composer.*]/[message.reader.*]config tables and thecompose-with/reply-with/forward-with/mailto/read-withsubcommands. Richer composition now chains standalone tools such as mml intomessages send/add.The "stdout = MIME draft" contract was incompatible with composers spawning an interactive editor, whose UI inherited the parent's piped stdout.
-
Dropped
HIMALAYA_CONFIGenvironment-variable support.-c/--configstill accepts one or more:-separated paths. -
Removed the
account configurecommand (aliasaccount edit) and its per-field edit wizard. Account setup now goes through the barehimalayadiscovery wizard, leavingaccount listandaccount checkfor inspection.
1.2.0 - 2026-02-19
Added
- Added
--quietflag (#545). - Added support for custom TLS certificate.
- Added support for multiple config files via
HIMALAYA_CONFIG=path1:path2:…(#612). - Added
-d|--downloads-dirargument toattachment downloadcommand (#559). - Added
ViewandView MIMEpost edit choices (#486). - Made
message sendandtemplate sendreturn id (#627). - Enabled shell expansion for email, IMAP and SMTP login fields, which allows usage of environment variables (#632).
Fixed
- Bumped all deps, fixing
rustls-platform-verifiercompatibility version issue. - Fixed invalid fetch with NIL body encoding (#525).
- Fixed freeze when sending large attachments (#593).
- Fixed abusive warn logs from IMAP libs (#552).
- Downgraded
toml@0.8due to regression (#611).
1.1.0 - 2025-01-11
Added
- Added
-y|--yesflag forfolder purgeandfolder deletecommands (#469).
Changed
-
Put back
warnthe default log level (#522).Since logs are sent to
stderr, warnings can be easily discarded by prepending commands withRUST_LOG=offor by appending commands with2>/dev/null. -
Changed
message.send.save-copydefault totrue(#536). -
Changed default downloads directory. core#1
Fixed
- Fixed permissions issues when using
install.sh(#515). - Fixed de/serialization issues of backends'
nonevariant (#523). - Fixed list envelopes out of bound error when empty result (#535).
- Fixed macOS x86_64 builds (#538).
1.0.0 - 2024-12-09
The Himalaya CLI scope has changed. It does not include anymore the synchronization, nor the envelope watching. These scopes have moved to dedicated projects:
- Neverest CLI, CLI to synchronize, backup and restore emails
- Mirador CLI, CLI to watch mailbox changes
Due to the long time difference with the previous v1.0.0-beta.4 release, this changelog may be incomplete. The simplest way to upgrade is to reconfigure Himalaya CLI from scratch, using the wizard or the config.sample.toml.
Himalaya CLI will now try to adopt the conventional commits specification. Tools like git-cliff may help us generating more accurate changelogs in the future.
Added
-
Added
message editcommand to edit a message. To edit on place (replace a message), use--on-place. -
Added
account.list.table.presetglobal config option,accounts.<name>.folder.list.table.presetandaccounts.<name>.envelope.list.table.presetaccount config options.These options customize the shape of tables, see examples at
comfy_table::presets. Defaults to"|| |-||| ", which corresponds tocomfy_table::presets::ASCII_MARKDOWN. -
Added
account.list.table.name-colorconfig option to customize the color used for the accounts'NAMEcolumn (defaults togreen). -
Added
account.list.table.backends-colorconfig option to customize the color used for the folders'BACKENDScolumn (defaults toblue). -
Added
account.list.table.default-colorconfig option to customize the color used for the folders'DEFAULTcolumn (defaults toreset). -
Added
accounts.<name>.folder.list.table.name-coloraccount config option to customize the color used for the folders'NAMEcolumn (defaults toblue). -
Added
accounts.<name>.folder.list.table.desc-coloraccount config option to customize the color used for the folders'DESCcolumn (defaults togreen). -
Added
accounts.<name>.envelope.list.table.id-coloraccount config option to customize the color used for the envelopes'IDcolumn (defaults tored). -
Added
accounts.<name>.envelope.list.table.flags-coloraccount config option to customize the color used for the envelopes'FLAGScolumn (defaults toreset). -
Added
accounts.<name>.envelope.list.table.subject-coloraccount config option to customize the color used for the envelopes'SUBJECTcolumn (defaults togreen). -
Added
accounts.<name>.envelope.list.table.sender-coloraccount config option to customize the color used for the envelopes'FROMcolumn (defaults toblue). -
Added
accounts.<name>.envelope.list.table.date-coloraccount config option to customize the color used for the envelopes'DATEcolumn (defaults todark_yellow). -
Added
accounts.<name>.envelope.list.table.unseen-characcount config option to customize the char used for unseen envelopes (defaults to*). -
Added
accounts.<name>.envelope.list.table.replied-characcount config option to customize the char used for replied envelopes (defaults toR). -
Added
accounts.<name>.envelope.list.table.flagged-characcount config option to customize the char used for flagged envelopes (defaults to!). -
Added
accounts.<name>.envelope.list.table.attachment-characcount config option to customize the char used for envelopes with at least one attachment (defaults to@).
Changed
-
Refactored the
account configurecommand: this command stands now for creating or editing account configurations from the wizard. The command requires thewizardcargo feature. -
Improved the
account doctorcommand: it now checks the state of the config, and the new--fixargument allows you to configure keyring, OAuth 2.0 etc. -
Improved long version
--version(#496). -
Improved error messages when missing cargo features. For example, if a TOML configuration uses the IMAP backend without the
imapcargo features, the errormissing "imap" featureis displayed ([#20]).(https://github.com/pimalaya/core/issues/20) -
Normalized enum-based configurations, using the internally tagged representation
type =. It should reduce issues due to misconfiguration, and improve othe error messages. Yet it is not perfect, se ([#802]).(https://github.com/toml-rs/toml/issues/802):-
imap.*,maildir.*andnotmuch.*moved tobackend.*:# before imap.host = "localhost" imap.port = 143 # after backend.type = "imap" backend.host = "localhost" backend.port = 143 -
smtp.*andsendmail.*moved tomessage.send.backend.*:# before smtp.host = "localhost" smtp.port = 25 # after message.send.backend.type = "smtp" message.send.backend.host = "localhost" message.send.backend.port = 25 -
pgp.backendrenamedpgp.type:# before pgp.backend = "commands" pgp.encrypt-cmd = "gpg --encrypt --quiet --armor <recipients>" # after pgp.type = "commands" pgp.encrypt-cmd = "gpg --encrypt --quiet --armor <recipients>" -
{imap,smtp}.authmoved as well:# before imap.password.cmd = "pass show example" smtp.oauth2.method = "xoauth2" # after backend.auth.type = "password" backend.auth.cmd = "pass show example" message.send.backend.auth.type = "oauth2" message.send.backend.auth.method = "xoauth2"
-
-
Moved IMAP and SMTP
encryptiontoencryption.type.This change prepares the config to accept different TLS providers with their options. The
trueandfalsevariant have been removed as well:# before backend.encryption = "none" # or false backend.encryption = "start-tls" message.send.backend.encryption = "tls" # or true # after backend.encryption.type = "none" backend.encryption.type = "start-tls" message.send.backend.encryption.type = "tls"
Fixed
- Fixed pre-release archives issue (#492).
- Fixed mailto parsing issue. core#10
- Fixed
Answeredflag not set when replying to a message (#508).
Removed
- Removed systemd service from
assets/folder, as Himalaya CLI scope does not include synchronization nor watching anymore.
1.0.0-beta.4 - 2024-04-16
Added
- Added systemd service in
assets/folder. - Added configuration option
message.delete.stylethat can be eitherfolder(deleted messages are moved to the Trash folder, default style) orflag(deleted messages receive the Deleted flag). - Added
--debugas an alias forRUST_LOG=debug. - Added
--traceas an alias forRUST_LOG=traceandRUST_BACKTRACE=1. - Added notes about
--debugand--tracewhen error occurs.
Changed
- Added back the search feature: you can now give an optional filter and sort query at the end of the
envelope listcommand. Seeenvelope list --helpor pimalaya.org for more detail on the search API. - Changed the
envelope listfolder argument due to the search query: it became a flag--folder|-f. - Made the global
--config|-coption repeatable: the first option is considered the path to the main config, and successive options are considered partial override ([#184]). - Refactored error management: error should be more clear, colored and can now contain spantrace and backtrace.
- Made
--helpcontent wrapping properly thanks to theclapcargo featurewrap_help. - Improved
template {new,reply,forward}command JSON output: they return now a JSON object with 3 properties:content: the content of the templatecursor.row: the row at which the cursor should be placed by the interface using the templatecursor.col: the column at which the cursor should be placed by the interface using the template
Fixed
- Fixed watch IMAP envelopes when folder was empt ([#179]).
- Prevented parsing of undefined config option ([#188]).
- Fixed
In-Reply-Toheader being skipped from mailto URL ([#194]). - Fixed error page out of bounds when filtering envelopes returned an empty resul ([#195]).
1.0.0-beta.3 - 2024-02-25
Added
- Added
account check-upcommand. - Added wizard warning about google password ([#41]).
Changed
-
Removed account configurations flatten level in order to improve diagnostic errors, due to a bug in clap. This means that accounts need to be prefixed by
accounts:[my-account]becomes[accounts.my-account]. It also opens doors for interface-specific configurations. -
Rolled back cargo feature additions from the previous release. It was a mistake: the amount of features was too big, the code (both CLI and lib) was too hard to maintain. Cargo features kept:
imap,maildir,notmuch,smtp,sendmail,account-sync,account-discovery,pgp-gpg,pgp-commandsandpgp-native. -
Moved
sync.strategytofolder.sync.filter. -
Changed location of the synchronization data from
$XDG_DATA_HOME/himalaya/<account-name>to$XDG_DATA_HOME/pimalaya/email/sync/<account-name>-cache. -
Changed location of the synchronization cache from
sync.dirto$XDG_CACHE_HOME/pimalaya/email/sync/<hash>/. -
Replaced id mapping database
SQLitebysled, a pure key-val store written in Rust to improve portability of the tool. Therefore, id aliases are reset. -
Improved pre and post edit choices interactio ([#58]).
-
Improved account synchronization performances, making it 50% faster than
mbsyncand 370% faster thanOfflineIMAP. -
Changed
envelope.watch.{event}.{hook}: hooks can now be cumulated. For example it is possible to send a system notification and execute a shell command when receiving a new envelope:envelope.watch.received.notify.summary = "New message from {sender}" envelope.watch.received.notify.body = "{subject}" envelope.watch.received.cmd = "echo {id} >> /tmp/new-email-counter"
Fixed
- Fixed bug that was preventing watch placeholders to be replaced when using shell command hook.
- Fixed watch IMAP envelopes issue preventing events to be triggered.
- Fixed DNS account discovery priority issues.
- Fixed SMTP messages not properly sent to all recipient ([#172]).
- Fixed backend feature badly linked, leading to reply and forward message error ([#173]).
1.0.0-beta.2 - 2024-01-27
Added
- Added cargo feature
wizard, enabled by default. - Added one cargo feature per backend feature:
accountincludingaccount-configure,account-list,account-syncand theaccount-subcmdfolderincludingfolder-add,folder-list,folder-expunge,folder-purge,folder-deleteand thefolder-subcmdenvelopeincludingenvelope-list,envelope-watch,envelope-getand theenvelope-subcmdflagincludingflag-add,flag-set,flag-removeand theflag-subcmdmessageincludingmessage-read,message-write,message-mailto,message-reply,message-forward,message-copy,message-move,message-delete,message-save,message-sendand themessage-subcmdattachmentincludingattachment-downloadand theattachment-subcmdtemplateincludingtemplate-write,template-reply,template-forward,template-save,template-sendand thetemplate-subcmd
- Added wizard capability to autodetect IMAP and SMTP configurations, based on the Thunderbird Autoconfiguration standard.
- Added back Notmuch backend features.
Changed
- Renamed
folder createtofolder addin order to better match types. An alias has been set up, so bothcreateandaddstill work.
Fixed
- Fixed default command: running
himalayawithout argument lists envelopes, as it used to be in previous versions. - Fixed bug when listing envelopes with
backend = "imap",sync.enable = trueandenvelope.watch.backend = "imap"led to unwanted IMAP connection creation (which slowed down the listing). - Fixed builds related to enabled cargo features.
1.0.0-beta - 2024-01-01
Few major concepts changed:
- The concept of Backend and Sender changed. The Sender does not exist anymore (it is now a backend feature). A Backend is now a set of features like add folders, list envelopes or send raw message. The backend of every single feature can be customized in the configuration file, which gives users more flexibility. Here the list of backend features that can be customized:
backend(required): the backend used by default by all backend features (maildir,imapornotmuch)folder.add.backend: override the backend used for creating folders (maildir,imapornotmuch)folder.list.backend: override the backend used for listing folders (maildir,imapornotmuch)folder.expunge.backend: override the backend used for expunging folders (maildir,imapornotmuch)folder.purge.backend: override the backend used for purging folders (maildir,imapornotmuch)folder.delete.backend: override the backend used for deleting folders (maildir,imapornotmuch)envelope.list.backend: override the backend used for listing envelopes (maildir,imapornotmuch)envelope.get.backend: override the backend used for getting envelopes (maildir,imapornotmuch)envelope.watch.backend: override the backend used for watching envelopes (maildir,imapornotmuch)flag.add.backend: override the backend used for adding flags (maildir,imapornotmuch)flag.set.backend: override the backend used for setting flags (maildir,imapornotmuch)flag.remove.backend: override the backend used for removing flags (maildir,imapornotmuch)message.send.backend(required): override the backend used for sending messages (sendmailorsmtp)message.read.backend: override the backend used for reading messages (maildir,imapornotmuch)message.write.backend: override the backend used for adding flags (maildir,imapornotmuch)message.copy.backend: override the backend used for copying messages (maildir,imapornotmuch)message.move.backend: override the backend used for moving messages (maildir,imapornotmuch)
- The CLI API changed: every command is now prefixed by its domain following the format
himalaya <domain> <action>. List of domain available by runninghimalaya -hand list of actions for a domain by runninghimalaya <domain> -h. - TOML configuration file options use now the dot notation rather than the dash notation. For example,
folder-listing-page-sizebecamefolder.list.page-size. See the changed section below for more details.
Added
- Added cargo feature
maildir(not plugged yet). - Added cargo feature
sendmail(not plugged yet). - Added watch hooks
envelope.watch.received(when a new envelope is received) andenvelope.watch.any(for any other event related to envelopes). A watch hook can be:-
A shell command:
envelope.watch.any.cmd = "mbsync -a" -
A system notification:
envelope.watch.received.notify.summary = "📬 New message from {sender}": customize the notification summary (title)envelope.watch.received.notify.body = "{subject}": customize the notification body (content)
Available placeholders: id, subject, sender, sender.name, sender.address, recipient, recipient.name, recipient.address.
-
- Added watch support for Maildir backend features.
Changed
- Renamed cargo feature
imap-backend→imap. - Renamed cargo feature
notmuch-backend→notmuch. - Renamed cargo feature
smtp-sender→smtp. - Changed the goal of the config option
backend: it is now the default backend used for all backend features. Valid backends:imap,maildir,notmuch. - Moved
folder-aliasesconfig option tofolder.alias(es). - Moved
folder-listing-page-sizeconfig option tofolder.list.page-size. - Moved
email-listing-page-sizeconfig option toenvelope.list.page-size. - Moved
email-listing-datetime-fmtconfig option toenvelope.list.datetime-fmt. - Moved
email-listing-datetime-local-tzconfig option toenvelope.list.datetime-local-tz. - Moved
email-reading-headersconfig option tomessage.read.headers. - Moved
email-reading-formatconfig option tomessage.read.format. - Moved
email-writing-headersconfig option tomessage.write.headers. - Move
email-sending-save-copyconfig option tomessage.send.save-copy. - Move
email-hooks.pre-sendconfig option tomessage.send.pre-hook. - Moved
syncconfig option tosync.enable. - Moved
sync-dirconfig option tosync.dir. - Moved
sync-folders-strategyconfig option tosync.strategy. - Moved
maildir-*config options tomaildir.*. - Moved
imap-*config options toimap.*. - Moved
notmuch-*config options tonotmuch.*. - Moved
sendmail-*config options tosendmail.*. - Moved
smtp-*config options tosmtp.*. - Replaced options
imap-ssl,imap-starttlsandimap-insecurebyimap.encryption:imap.encryption = "tls" | true: use required encryption (SSL/TLS)imap.encryption = "start-tls": use opportunistic encryption (StartTLS)imap.encryption = "none" | false: do not use any encryption
- Replaced options
smtp-ssl,smtp-starttlsandsmtp-insecurebysmtp.encryption:smtp.encryption = "tls" | true: use required encryption (SSL/TLS)smtp.encryption = "start-tls": use opportunistic encryption (StartTLS)smtp.encryption = "none" | false: do not use any encryption
Removed
- Disabled temporarily the
notmuchbackend because it needs to be refactored using the backend features system (it should be reimplemented soon). - Disabled temporarily the
searchandsortcommand because they need to be refactored, se ([#39]). - Removed the
notifycommand (replaced by the newwatchcommand). - Removed all global options except for
display-name,signature,signature-delimanddownloads-dir.
0.9.0 - 2023-08-28
Added
- Added 3 new cargo features:
pgp-commands: enables the commands PGP backend (enabled by default, same behaviour as before)pgp-gpg: enables the GPG backend (requires thegpgmelib on the system)pgp-native: enables the native PGP backend
- Added account configuration
pgpto configure the way PGP operations are performed.
Changed
- Moved
email-writing-encrypt-cmdtopgp.encrypt-cmd. - Moved
email-reading-decrypt-cmdtopgp-decrypt-cmd. - Moved
email-writing-sign-cmdtopgp.sign-cmd. - Moved
email-reading-verify-cmdtopgp.verify-cmd.
0.8.4 - 2023-07-18
Fixed
- Fixed windows releases due to cargo deps typo.
0.8.3 - 2023-07-18
Fixed
- Fixed windows releases due to
coredumpcrate compilation error. - Fixed macos releases due to macos 12 System Integrity Protection.
0.8.2 - 2023-07-18
Changed
- Made the code async using the tokio async runtime.
- On Linux, made the kernel keyring the default one (the one based on keyutils).
Fixed
- Fixed the way folder aliases are resolved. In some case, aliases were resolved CLI side and lib side, which led to alias error ([#95]).
0.8.1 - 2023-06-15
Added
- Implemented OAuth 2.0 refresh token flow for IMAP and SMTP, which means that access tokens are now automatically refreshed and is transparent for users.
- Added
imap-oauth2-redirect-hostandsmtp-oauth2-redirect-hostoptions to customize the redirect server host name (default:localhost). - Added
imap-oauth2-redirect-portandsmtp-oauth2-redirect-portoptions to customize the redirect server port (default:9999). - Added
email-listing-datetime-fmtto customize envelopes datetime format. See format spec here. - Added
email-listing-local-datetimeto transform envelopes datetime's timezone to the user's local one. For example, if the user's local is set toUTC, the envelope date2023-06-15T09:00:00+02:00becomes2023-06-15T07:00:00-00:00.
Fixed
- Fixed missing
<and>aroundMessage-IDandIn-Reply-Toheaders.
0.8.0 - 2023-06-03
Added
- Added keyring support, which means Himalaya can now use your system's global keyring to get/set sensitive data like passwords or tokens.
- Added required IMAP option
imap-authand SMTP optionsmtp-auth. Possible values:passwd,oauth2. - Added OAuth 2.0 support for IMAP and SMTP.
- Added passwords and OAuth 2.0 configuration via the wizard.
- Added
email-sending-save-copyoption to control whenever a copy of any sent email should be saved in thesentfolder defined infolder-aliases. - Imported id mapper from the lib, which means that the id mapping is now done by the CLI.
- Added
BackendConfigtoAccountConfig::backendto match sender implementation. - Added support for pipeline commands, which means commands can be either a single command (string) or piped commands (list of strings). It applies for:
email-writing-verify-cmdemail-writing-decrypt-cmdemail-writing-sign-cmdemail-writing-encrypt-cmd
Changed
-
Changed release archive extensions from
.tar.gzto.tgz. -
Moved
wizardmodule into domains (config, account, backend…). -
[BREAKING] Changed the way secrets are managed. A secret is a sensitive data like passwords or tokens. There is 3 possible ways to declare a secret in the config file:
{ raw = <secret> }for the raw secret as string (unsafe, not recommended),{ cmd = <secret-cmd> }for command that exposes the secret,{ keyring = <secret-entry> }for entry in your system's global keyring that contains the secret.
This applies for:
imap-passwdimap-oauth2-client-secretimap-oauth2-access-tokenimap-oauth2-refresh-tokensmtp-passwdsmtp-oauth2-client-secretsmtp-oauth2-access-tokensmtp-oauth2-refresh-token
Fixed
- Fixed Windows releases corrupted archives.
Removed
- [BREAKING] Removed
-s|--sanitizeoption. It is done by default now, except if the-t|--mime-type htmlis set. - [BREAKING] Removed
native-tlssupport,rustls-tlsis now the only TLS provider available. Removed in consequencenative-tls,rustls-tlsandrustls-native-certscargo features.
0.7.3 - 2023-05-01
Fixed
- Fixed Windows releases (due to typo in the github action script).
- Fixed unit tests.
0.7.2 - 2023-05-01
Added
-
Added
createanddeletefolder command ([#54]). -
Added generated completions and man pages to release ([#43]).
-
Added new account config option
sync-folders-strategywhich allows to choose a folders synchronization strateg ([#59]).:sync-folders-strategy = "all": synchronize all existing folders for the current accountsync-folders-strategy.include = ["folder1", "folder2", …]: synchronize only the given folders for the current accountsync-folders-strategy.exclude = ["folder1", "folder2", …]: synchronizes all folders except the given ones for the current account
Also added new
account syncarguments that override the account config option:-A|--all-folders: include all folders to the synchronization.-F|--include-folder: include given folders to the synchronization. They can be repeated-F folder1 folder2or-F folder1 -F folder2.-x|--exclude-folder: exclude given folders from the synchronization. They can be repeated-x folder1 folder2or-x folder1 -F folder2.
-
Added cargo features
native-tls(default),rustls-tlsandrustls-native-certs.
Changed
- Made global options truly global, which means they can be used everywhere (not only before commands but also after ([#60]).
- Replaced reply all
-aargument with-Abecause it conflicted with the global option-a|--account. - Replaced
himalaya-libbypimalaya-email. - Renamed feature
vendoredtonative-tls-vendored. - Removed the
developbranch, all the development is now done on themasterbranch.
Fixed
- Fixed config deserialization issue with
email-hooksandemail-reading-format. - Fixed flags case sensitivity.
0.7.1 - 2023-02-14
Added
- Added command
folders expungethat deletes all emails marked for deletion.
Changed
- Changed the location of the documentation.
Fixed
- Fixed broken links in README.md.
Removed
- Removed the
maildir-backendcargo feature, it is now included by default. - Removed issues section on GitHub, now issues need to be opened by sending an email at ~soywod/pimalaya@todo.sr.ht.
0.7.0 - 2023-02-08
Added
- Added offline support with the
account synccommand to synchronize a backend to a local Maildir backend. - Added the flag
--disable-cacheto not use the local Maildir backend. - Added the email composer (from its own repository).
- Added Musl builds to releases.
- Added
himalaya mancommand to generate man page.
Changed
- Made commands
read,attachments,flags,copy,move,deleteaccept multiple ids. - Flipped arguments
idsandfolderfor commandscopyandmovein order the folder not to be considered as an id.
Fixed
- Fixed missing folder aliases.
Removed
- Removed the
-a|--attachmentargument fromwrite,replyandforwardcommands. Instead you can attach documents directly from the template using the syntax<#part filename=/path/to/you/document.ext>. - Removed the
-e|--encryptflag fromwrite,replyandforwardcommands. Instead you can encrypt and sign parts directly from the template using the syntax<#part type=text/plain encrypt=command sign=command>Hello!<#/part>. - Removed the
-l|--log-leveloption, use instead theRUST_LOGenvironment variable (see the wiki)
0.6.1 - 2022-10-12
Added
- Added
-s|--sanitizeflag for thereadcommand.
Changed
- Changed the behaviour of the
-t|--mime-typeargument of thereadcommand. It is less strict now: if no part is found for the given MIME type, it will fallback to the other one. For example, giving-t htmlwill show in priority HTML parts, but if none of them are found it will show plain parts instead (and vice versa). - Sanitization is not done by default when using the
readcommand, the flag-s|--sanitizeneeds to be explicitly provided.
Fixed
- Fixed empty text bodies when reading html part on plain text email.
0.6.0 - 2022-10-10
Changed
-
Separated the CLI from the lib module.
The source code has been split into subrepositories:
-
[BREAKING] Renamed
-m|--mailboxto-f|--folder -
[BREAKING] Refactored config system.
The configuration has been rethought in order to be more intuitive and structured. Here are the breaking changes for the global config:
namebecomesdisplay-nameand is not mandatory anymoresignature-delimiterbecomessignature-delimdefault-page-sizehas been moved tofolder-listing-page-sizeandemail-listing-page-sizenotify-cmd,notify-queryandwatch-cmdshave been removed from the global config (available in account config only)folder-aliaseshas been added to the global config (previously known asmailboxesfrom the account config)email-reading-headers,email-reading-format,email-reading-decrypt-cmd,email-writing-encrypt-cmdandemail-hookshave been added
The account config inherits the same breaking changes from the global config, plus:
imap-*requiresbackend = "imap"maildir-*requiresbackend = "maildir"notmuch-*requiresbackend = "notmuch"smtp-*requiressender = "smtp"sendmail-*requiressender = "sendmail"pgp-encrypt-cmdbecomesemail-writing-encrypt-cmdpgp-decrypt-cmdbecomesemail-reading-decrypt-cmdmailboxesbecomesfolder-aliaseshooksbecomesemail-hooksmaildir-dirbecomesmaildir-root-dirnotmuch-database-dirbecomesnotmuch-db-path
0.5.10 - 2022-03-20
Fixed
- Fixed flag commands.
- Fixed Windows build.
0.5.9 - 2022-03-12
Added
- SMTP pre-send hook
- Customize headers to show at the top of a read message
Changed
- Improve
attachmentscommand
Fixed
In-Reply-Tonot set properly when replying to a messageCcmissing or invalid when replying to a message- Notmuch backend hangs
- Maildir e2e tests
- JSON API for listings
0.5.8 - 2022-03-04
Added
- Flowed format support
- List accounts command
- One cargo feature per backend
Changed
- Vim doc about mailbox pickers
Fixed
- Some emojis break the table layout
- Bad sender and date in reply and forward template
0.5.7 - 2022-03-01
Added
- Notmuch support
Fixed
- Build failure due to
imapversion - No tilde expansion in
maildir-dir - Unknown command SORT
Changed
- [BREAKING] Replace
inbox-folder,sent-folderanddraft-folderby a generic hashmapmailboxes - Display short envelopes id for
maildirandnotmuchbackends
0.5.6 - 2022-02-22
Added
- Sort command
- Maildir support
Fixed
- Suffix to downloaded attachments with same name
0.5.5 - 2022-02-08
Added
- Contributing guide
- Notify query config option
- End-to-end encryption
Fixed
- Multiple recipients issue
- Cannot parse address
0.5.4 - 2022-02-05
Fixed
- Add attachments with save and send commands
- Invalid sequence set
0.5.3 - 2022-02-03
Added
- Activate rust-imap logs when trace mode is enabled
- Set up cargo deployment
0.5.2 - 2022-02-02
Fixed
- Blur in list msg screenshot
- Make inbox, sent and drafts folders customizable
- Vim plugin get focused msg id
- Nix run issue
- Range not displayed when fetch fails
- Blank lines and spaces in
text/plainparts - Watch command
- Mailbox telescope.nvim preview
Removed
- The wiki git submodule
0.5.1 - 2021-10-24
Added
- Disable color feature
--max-width|-wargument to restrict listing table width
Fixed
- Error when receiving notification from
notifycommand
Changed
- Remove error when empty subject
- Vim plugin does not render anymore the msg by itself, it uses the one available from the CLI
0.5.0 - 2021-10-10
Added
- Mailto support
- Remove previous signature when replying/forwarding a message
- Config option
signature-delimiterto customize the signature delimiter (default to-- \n) - Expand tilde and env vars for
downloads-dirandsignature
Changed
- [BREAKING] Folder structure, message management, JSON API and Vim plugin
- Pagination for list and search cmd starts from 1 instead of 0
- Errors management with
anyhow
Fixed
- Panic on flags command
- Make more use of serde
- Write message vim plugin
- Invalid encoding when sending message
- Pagination reset current account
- New/reply/forward from Vim plugin since Tpl refactor
0.4.0 - 2021-06-03
Added
- Add ability to change account in with the Vim plugin
- Add possibility to make Himalaya default email app
Changed
- [BREAKING] Short version of reply
--allarg is now-Ato avoid conflicts with--attachment|-a - Template management
Fixed
\Seenflag when moving a message- Attachments arg for reply and forward commands
- Vim doc
Removed
Content-Typefrom templates
0.3.2 - 2021-05-08
Added
- Mailbox attributes
- Wiki entry about new messages counter
- Copy/move/delete a message in vim
Changed
- Get signature from file
- [BREAKING] Split
idlecommand into two commands:notify: Runsnotify-cmdwhen a new message arrives to the serverwatch: Runswatch-cmdswhen any change occurs on the server
Removed
.exeextension from release binaries
0.3.1 - 2021-05-04
Added
- Send message via stdin
Fixed
- Table with subject containing
\r,\nor\t - Overflow panic when shrink column
- Vim plugin empty mailbox message
0.3.0 - 2021-04-28
Fixed
- IDLE mode after network interruption
- Output redirected to
stderr - Refactor table system
- Editon file format on Linux
- Show email address when name not available
Removed
--log-level|-larg (replaced by defaultRUST_LOGenv var fromenv_logger)
0.2.7 - 2021-04-24
Added
- Default page size to config
- Custom config path
- Setting idle-hook-cmds
Changed
- Plain logger with
env_logger - Refresh email list on load buffer
Fixed
- Improve config compatibility on Windows
- Vim table containing emoji
0.2.6 - 2021-04-17
Added
- Insecure TLS option
- Completion subcommands
- Vim flags to enable telescope preview and to choose picker
Changed
- Make
install.shPOSIX compliant
Fixed
- SMTP port
- Save msg upon error
- Answered flag not set
- Panic when downloads-dir does not exist
- Idle mode incorrect new message notification
0.2.5 - 2021-04-12
Fixed
- Expunge mbox after
moveanddeletecmd - JSON output
0.2.4 - 2021-04-09
Added
- Wiki entry for Gmail users
- Info logs for copy/move/delete cmd + silent mode
--rawarg forreadcmd
Changed
- Refactor output system + log levels
0.2.3 - 2021-04-08
Added
- Telescope support
Fixed
- Unicode chars breaks the view
- Copy/move incomplete (missing parts)
0.2.2 - 2021-04-04
Added
walias forwritecmd
Fixed
attachmentscmd logs- Page size arg
searchcmd
0.2.1 - 2021-04-04
Added
- IDLE support
- Improve choice after editing msg
- Flags management
- Copy feature
- Move feature
- Delete feature
- Signature support
- Add attachment(s) to a message (CLI)
Changed
- Errors management with
error_chain
Fixed
- Missing
FLAGScolumn in messages table - Subtract with overflow if next page empty
0.2.0 - 2021-03-10
Added
- STARTTLS support
- Flags
Changed
- JSON support
0.1.0 - 2021-01-17
Added
- Parse TOML config
- Populate Config struct from TOML
- Set up IMAP connection
- List new emails
- Set up CLI arg parser
- List mailboxes command
- Text and HTML previews
- Set up SMTP connection
- Write new email
- Write new email
- Reply, reply all and forward
- Download attachments
- Merge
EmailwithMsg - List command with pagination
- Icon in table when attachment is present
- Multi-account
- Password from command
- Set up README