Skip to content

MailVault v2.11.1

Choose a tag to compare

@github-actions github-actions released this 03 Sep 08:52
· 174 commits to main since this release

Added

  • Folders are shown the way your server files them. A nested archive — Clients, a folder under it for each company, a Done under each of those — was listed in the sidebar as one flat alphabetical list, so a reader with ten folders called Done saw ten identical rows and nothing to tell them apart. The hierarchy was never missing from what the server sends; it was simply not drawn. The sidebar now shows folders as a tree: a folder with folders inside it carries a chevron, opening it shows what is filed beneath, and MailVault remembers which folders you left open, for each account separately. Reading a message that sits five levels down — a search hit, say — opens the folders above it on its own. The Move to folder list shows the same tree, where every folder was previously drawn at the top level under its own name alone; while you are typing a filter there the parents are filtered away, so each row names its parent instead. The Tag Cloud sidebar style nests too: a chip carries its own name and, when something is filed inside it, the same chevron; open it and its children hang beneath it while the chips after it carry on in a new row. Two rules keep the top of the tree useful: a server that files every folder under the Inbox no longer prints that prefix on each one, and the special folders a provider keeps inside a container — Gmail's [Gmail] — are listed at the top beside the Inbox rather than a level down.
  • Open a folder that has folders inside it and you see everything filed under it, and a search can be told to look there and nowhere else. Clicking a parent folder showed only the messages in that folder itself, which for a folder that exists to hold other folders is usually nothing. It now lists the whole branch — every message in that folder and in every folder beneath it — newest first, with the total the server reports for the branch, and the list fills in folder by folder rather than all at once at the end, because a twenty-folder branch takes long enough that a list arriving only at the end reads as a folder that found nothing. A folder that will not open costs you that folder alone; its siblings still list. The same message number in two folders stays two rows. The search's folder filter, which offered one folder or every folder on the server, gained an "Include subfolders" box: tick it and the search covers the chosen folder and its whole branch, on the server and in your vault, and the results header says so. "All folders" still keeps a saved message from a folder the server no longer lists, because that mail is still readable.
  • When the internet goes away, MailVault says so and stops trying to sync until it is back. A machine with no Wi-Fi reported "The server refused the sync", with an icon and a remedy pointing at your server settings, for every account, on every sync — the connection check only ran when the sync daemon was not there to ask, which is rarely — while the daemon itself kept dialling every account on every tick and waiting out a fifteen-second timeout for each. Now a banner at the top of the window says "No internet connection", that your mail is still here and MailVault is showing what is already saved on this computer, and offers "Check again"; it clears itself the moment connectivity returns, with no click. While it is up, background syncing pauses rather than failing for every account, tick after tick. An error from a mail server only ever raises a suspicion: MailVault checks the internet itself before deciding you are offline, so one provider having a bad day does not make the whole app declare the network gone. Anything you ask for yourself — opening a message, deleting one — is never held back by the banner, because a mistaken verdict must not lock you out of an action you asked for. The old check also froze the window for up to four and a half seconds while it dialled three hosts one after another; the new one dials them together, off the main thread, and answers within a second and a half.
  • Mail links in other apps can open in MailVault. Click an email address on a web page or in a document and the system hands it to whichever app is the default for mail; MailVault can now be that app. The link opens a compose window with the recipient, subject and body it carried already filled in — including when the click is what launches MailVault, where the link arrives before there is a window to show it in and would otherwise be lost. The first-run tour asks about it, and Settings gained a "Default email app" row that says whether MailVault opens mail links on this computer and, on Linux, offers to make it so. macOS only lets you choose this yourself, so there the row says where the switch lives — Mail's own Settings → General — rather than claiming a success the system refused.
  • A single message can be deleted from an open conversation, and collapsed messages say who they were sent to. Finding one reply in a thread that should go used to mean leaving the reader and hunting for its row in the list, because the reader itself had no Delete for a message inside a conversation. Each expanded message now has one, behind the same confirmation the list uses; the message leaves the conversation and the reader stays open on the rest. Deleting a reply from the list while its conversation was open used to leave it in the reader as a ghost, and deleting the newest message closed the whole conversation — the reader now keeps up, and if the server refuses the delete, the message comes back. A message that exists only in your vault keeps its Delete in the row menu, as before. Collapsed messages in a conversation also now carry a "To:" line, so you can see who each one went to without expanding it.
  • An open message can be closed. Opening a message was a one-way door: every other way out either opened something else — another row, another folder — or destroyed the message. In the stacked two-column layout that is the whole screen, because the list gives up more than half its height the moment a message opens, with no way to get it back. There is now a Close button in the reader's header, on a single message and on a conversation alike, and the list gets its space back.
  • Settings can open the folder your mail is stored in. "Where your mail is stored" and "Second copy — external cold storage", both under Settings → Backup & Restore, each gained an Open Folder button: the first shows the vault in the Finder, the second opens whatever the field above it names — the external copy when one is configured, otherwise the app's own mail folder. A refusal prints under the row rather than leaving a dead button. The Mac App Store build used to leave the storage section out entirely, because that build cannot move the vault; it now shows the path and the button, and its users are the ones with the fewest other ways to find the folder, since a sandboxed app's files sit under ~/Library/Containers, which the Finder hides and Spotlight skips.
  • The first-run tour can set the look GraphicMeat recommends in one click. The "Make it yours" step asks five questions — theme, layout, sidebar style, view and row density — before anyone has seen a message, and the answers only mean something once you have. A "GraphicMeat recommended" button sets all five to the combination the app is designed around — dark, three columns, tag cloud, list view, compact rows — the preview beside them changes as it does, and every one can still be changed afterwards, there or in Settings.
  • "Report a bug" now leads with the FAQ. The dialog offered four ways to file something and no way to just get the answer. Its rows now read in the order most people need them: the FAQ, in the language the app is set to, then the existing public discussions, then a new report, then email as the private fallback, with the feature request last, since it is not a bug.
  • The website's docs and FAQ pages search the text of every page, and the FAQ names where your mail actually is. The search box on each hub matched only the words in a question's title, so anything said in an answer was invisible to it. Both now search every guide, comparison, post and answer, and link straight to the section that matched; with scripting off, every page is still one link away. The docs index leads with the pages people arrive for — FAQ, features, changelog — groups the guides by topic, and its mobile menu works again. The FAQ's answer about where mail is stored gave the path a development build uses; the shipped app is sandboxed, so its data lives under ~/Library/Containers, which the Finder hides and Spotlight does not search. The answer now names that path and the two Linux ones, says why searching the drive finds nothing, and gives four ways to open the folder. A new answer says how often the folder list is re-read from the server.

Fixed

  • A message's read state is now one fact, wherever MailVault keeps it. Marking a message read or unread changed it on the server and on screen, but the copy in your vault kept whatever state it was stored with — and it was always stored as read, whether you had read it or not. That showed up in three places: a vault message rebuilt from its file could paint as unread when it was not, switching away from a folder and back could briefly bring the old state back until the next sync corrected it, and restoring a vault to a new server uploaded every message as read. A change made on another device never reached the vault or the external backup at all. Now the vault copy is stored with the message's real state, a change made in MailVault lands on the vault file, its external backup copy and every cache in one step, and every backup run carries over changes made elsewhere for the messages it already holds.
  • The Sent folder now syncs on servers that call it something else, and a moment's loss of network no longer costs every account its sync. MailVault asked the server for the folder by the name it had been told — "Sent" — and Gmail, which serves it as "[Gmail]/Sent Mail", answered that no such folder exists, so that account's sent mail had never synced at all; a server that calls it "Sent Messages" failed the same way. When the server says a folder is missing, MailVault now looks the name up in the server's own folder list and syncs the folder the server actually serves; when the name was right, nothing changes. Separately, a network blip tore down the connection to every account at once and each lost its whole sync cycle; a connection that fails that way is now retried once. A rejected password is the server's answer and is never retried.
  • Deleting a message from the reading pane no longer puts it straight back, and a delete the server did not carry out is no longer reported as done. The delete ran on a server connection MailVault had kept open and reused, and a connection the server had quietly closed while it sat idle answered the first command with "connection lost" within milliseconds: the row came back, and the second attempt worked because it happened to get a fresh connection. A delete now notices the dead connection and asks again on a new one — safe for a delete, because deleting a number the server has already removed does nothing. Writing the check for that found the worse half. MailVault read the server's answer to a delete, and to a flag change, only far enough to see that the command had been sent; a connection that died in the middle of the reply produced no error at all, so the delete was reported done — the row taken out, the count lowered, and the message stamped "deleted from server", the app's loudest claim about custody — over a message still sitting on the server. Every delete and flag change now waits for the server's own OK, and the reading pane says why when a delete is refused instead of silently restoring the row.
  • Deleting a message from the Inbox list no longer deletes a sent message that happened to share its number. The Inbox list shows your sent messages alongside the received ones so a conversation reads whole, and a message's number is only unique inside its own folder. Ticking a received message and choosing Delete from server could delete the sent message under the same number instead: the row left the list, came back at the next sync, and the sent conversation lost a message. The selection now remembers which folder each ticked row came from, so the delete — and every other bulk action — reaches the message you ticked. Opening a sent message from the Inbox list also shows that message's own read state, not the received message's.
  • Marking a sent message unread from the Inbox list now changes that message, not another one. The Inbox list shows the messages you sent alongside the ones you received, so a conversation reads whole. A message's number is only unique inside its own folder, and marking one of those sent copies unread sent the change to the Inbox message that happened to carry the same number: your sent copy kept its read state on the server and on screen, and an unrelated received message could flip instead. The change now follows the message's own folder — on the server, in the vault and in the list.
  • Switching folders right after a delete no longer shows the previous folder's messages under the new folder's name. Every delete ends by refreshing the list it ran in, and that refresh takes as long as the server takes. Click another folder of the same account while it is still on its way — Inbox, then Archive — and the refresh landed after the switch: the list under the Archive heading was the Inbox, with the Inbox's count, and because MailVault keeps the last list it showed for each folder, the wrong one came back on the next visit to Archive until a fresh sync of that folder replaced it. A refresh now paints only the folder it was started for, and is dropped when the view has moved on to another one.
  • A folder no longer stays on "server copy not verified yet" after a sync that could not be waited for. The vault glyph on every row says whether the server still holds its copy, and it can only say so once MailVault has listed the folder's messages on the server in full. When a folder opened from a cleared list and the background sync's answer never arrived — the sync daemon timed out, restarted, or spoke an older version of its protocol — MailVault fell back to asking the server directly, saw that nothing had changed since its last visit, and stopped there: correct about the folder, silent about the list it was showing, so every row kept the unverified wording until the next successful sync. The direct path now asks the server for the folder's message list the first time it finds nothing changed while that list is still unproven, one request per folder visit and none at all once it is known. The e2e run that caught this was testing against a sync daemon built a month earlier than the app, which is also fixed: the e2e build now stages the daemon it just built as the one the app launches, rather than whatever copy was staged last.
  • Turning spellcheck off now takes away the red underlines already on the page. The button at the right of the message toolbar has always stopped new mistakes being marked, but every word already underlined kept its mark for as long as the message stayed open — so pressing it looked like it had done nothing, and the release that introduced the button said the underlines stop. They now go the moment you press it, and come back when you press it again. The underline is drawn by the system rather than by MailVault, and it belongs to the text itself rather than to the box the text sits in, so changing the setting on the box was never going to reach one that had already been drawn. MailVault now re-lays the text when the switch is flipped, which is what actually retracts the marks — without disturbing what you have written, where the cursor is, or what Undo does next.
  • A folder shows what is already saved while its sync runs, and a refresh waits for the sync it asked for. Asking the sync daemon to sync a folder and wait for the result could be answered with the result of the previous sync: once an account had synced once, every later wait was satisfied at once by the last answer, and one account's Inbox sync stood in for its Sent sync. Each sync now carries a ticket and a wait is for that sync alone, and a sync the daemon declines still answers rather than leaving the wait to time out. While a sync runs, the folder paints from what is saved on this computer and reloads when the sync lands, so an account with mail already on disk opens on that mail rather than on a spinner. Two smaller things from the same audit: the daemon writes each of its own files in one step, so being killed mid-write no longer leaves a torn file that the next save persists as empty; and a category you set on a message by hand is never overwritten by an automatic one that lands after it.
  • An exported message names its sender instead of "[object Object]". Every export carried that placeholder wherever the sender belonged — in the image's filename, in the thread document's summary, contents list and participants line, and in the From, To and Cc rows of the header card drawn into the picture itself. The export read those fields as plain text where the rest of MailVault reads them as a name and an address; it now reads them the way the rest of the app does.
  • The keyboard steps through All Inboxes again, and its unread filter no longer hides the message you are reading. In the combined list a row is known by its folder as well as its number, and the next and previous keys compared by number alone, so they never matched a row and did nothing. The unread filter compared the same way, so it dropped the open message the moment it was turned on. Both now ask the row where it lives.
  • "Delete everywhere" is no longer offered on a message MailVault holds no copy of, and the delete that replaces it says where the copies are. The row menu ended with "Delete everywhere" on every row, including a message your vault had never held: there it did exactly what "Delete from server" one line above does, under a name claiming far more, behind a confirmation promising to clear a vault and a backup drive that had never held the message. The last item now appears only where MailVault holds a copy of its own, and it is named for where the message actually is — "Delete from vault", "Delete from vault & backup", "Delete from server and vault", and so on — so what the confirmation promises is what happens.
  • The tour's Premium list shows all ten features without a scrollbar. The list was capped in height and scrolled, so the last two — "Export as image or HTML" and "Five devices" — existed only for someone who found a scrollbar nobody looks for on a first run.
  • A hovered sidebar row no longer touches the selected one. The selected account or folder is marked by a wash of colour rather than a border, and the rows were drawn flush, so a hovered row's shading sat edge to edge against it and the two read as one striped block. There is now a little space between the rows of both lists.
  • A file dropped on the compose window's "Drop here to attach file" strip is now attached. Dragging a file into a message offers two targets: the message body, which places a picture inline, and a strip beneath it that attaches the file instead. Dropping on the strip did nothing — no attachment row, no error — while the same file dropped on the body appeared as expected, so a screenshot could be placed inline but never attached. The strip is only drawn while a drag is over the window, and the window took it down in the first instant of the drop, a hair before the strip's own drop handler ran; with no target left to deliver the drop to, it was discarded. The strip now stays up until the drop has been handled. Dropping elsewhere on the window, and the paperclip button, were never affected.
  • "Archive All" on a conversation opened from All Inboxes now archives it, instead of failing every message. The combined list stands in for every account at once, so it has no folder of its own; archiving read the folder off the list rather than off the message, and asked each server for a folder by a name no server has. Every message came back an error — "Archived with 4 error(s)" on a four-message thread — and nothing was saved. Each message is now archived in its own account and its own folder, which also fixes the same failure from the row's archive button, the row menu, the keyboard shortcut and "Archive selected" whenever the selection spanned more than one folder.