Years of mail, on your own disk.

Releases

What changed in each version — newest first.

MailCode is on the Mac App Store, and updates arrive the way every other App Store app's do — the App Store offers them, and installs them if you have automatic updates on. If something on this page does not match what you are seeing, MailCode → About MailCode tells you which build you have.

1.14.1 — 6 October 2026

Use an AI model on your own computer. Settings → AI → Local works with Ollama, LM Studio, Jan or llama.cpp running on your computer, and keeps translation there too — nothing about your mail goes to a cloud service. Answers appear as they are written, Cancel stops the model, and long threads are read in parts.

Send any attachment as a cloud link, whatever its size, from the attachment’s menu in compose. Better tables: borders per cell, drag an edge to resize, and a sum typed before “=” is worked out for you. Signatures follow the language of your draft.

Notifications your way. Settings → Sync can turn new-mail notifications off, or keep them and hide the sender and subject, so nothing about your mail shows on the lock screen.

Security. Mail servers on another machine must now encrypt the connection; one that offers only unencrypted IMAP or SMTP is refused instead of being sent your password. On Windows, an attachment’s name can no longer run a command when you copy or open it. MailCode’s window refuses any script that is not part of the app, and pictures in mail load only over secure connections. AI keys and integration passwords are now encrypted like account passwords. The Windows installer installs for you only and never asks for administrator rights.

Fixed: Outlook’s Turkish reply and forward prefixes (YNT:, İLT:) now join the conversation. Importing a Thunderbird profile no longer adds an empty “(no subject)” message per empty mailbox file. PDF contract clauses numbered “§ 2” or “Madde 2” stay separate when translated. File → Index EML Files… works before any account is set up, and “Re-file into the PST’s folder structure…” works again. A wrong port or SSL setting now says which to check.

1.14.0 — 1 October 2026

Import Apple Mail and Thunderbird mailboxes. File → Index EML Files… now reads Apple Mail’s exported .mbox mailboxes, the .emlx files in Apple Mail’s own library, and Thunderbird’s mbox files. Each mailbox lands as a folder named after it, with its messages and attachments, searchable with the rest of your mail.

Open winmail.dat. Mail from Outlook sometimes carries its files inside a winmail.dat that other apps cannot open. Click Open on it and MailCode shows the message inside, with every file as an ordinary attachment you can view, open or save.

Meeting details on every meeting mail. Responses and cancellations now show the meeting’s time and place, as invitations do.

Checklists in compose. A third list type beside bullets and numbers — the ☑ button or right-click — where clicking an item’s box ticks it off and strikes it through. Recipients see the same boxes.

Fixed: messages written in Outlook’s Rich Text format — in .msg files, PST imports and winmail.dat — showed an empty body. Answering an Exchange meeting invitation made it disappear from the Inbox. Translate in compose lost the draft’s formatting. The format painter switched off after one click without painting. Sharing a file from Finder while MailCode was closed opened no new message. Searching attachment names (a:) or message text (b:) found nothing when the selected account had no archived mail of its own. Archived plain-text messages showed “(no body)”, and some .msg files showed plain text instead of their formatted message.

1.13.5 — 30 September 2026

Mark passages to answer. Select text in a mail and press Mark beside Translate, or right-click → Mark, to underline it. Marks stay with the message and are drawn in the quote of your reply, so each point can be answered where it stands. Right-click a mark to remove it or clear them all; Mark Selection can be given a shortcut in Settings → Shortcuts.

Follow-up chat with the AI assistant. After a result, type an instruction such as “less formal” and it refines that answer instead of starting over from the draft. In the reading pane the answers form a conversation, each with its own Copy button. Proofread now previews its changes word by word.

Bilingual translation includes your inline comments. When you answer inside the quote, a bilingual translation of the reply now also translates your own [EY] comments there, each under its line; the sender’s text is left alone.

Choose what the explorer counts. Settings → Read / unread → Explorer count sets the number beside each folder: unread/total, unread only, total only, or none.

Fixed: links in some workflow and notification mails were dead because the sender’s markup broke the link; the address shown as the link text now opens.

1.13.4 — 28 September 2026

Flowcharts in the sketchpad. Start/end, process, decision, data, document, predefined-process and database shapes, each labelled by typing straight into it, joined by straight or right-angled connectors whose ends stay attached as you move the shapes. Triangles and regular polygons — set the number of sides — join the drawing tools, and dimensions can be continued one after another along the same line.

Rulers, zoom and snapping. The paper has rulers, and zooms with the buttons, ⌘-scroll or a trackpad pinch; Fit shows the whole sheet. Shapes snap to the grid and to other shapes’ ends, midpoints, centres and quadrants as you draw and move them. A new bar moves or copies the selection by exact distances and repeats it in rows and columns or around a centre. Escape drops a half-drawn shape and goes back to Select.

Focus rules can pick mail by flag, due date and label. A rule whose action is Show in Focus area can now pin mail that carries a flag, is overdue, is due today or in the next few days, or wears a label — so the focus area can hold what you flagged for follow-up, not only who it came from.

1.13.3 — 27 September 2026

Sketch in compose. A quick drawing used to mean another app, a screenshot and a paste. Compose now has a Sketch button: pen, line, arrow, rectangle, circle, ellipse and text, with select, move, Alt-drag copy, resize handles and undo. Dimension lines label themselves from a grid scale you set — “1 square = 0.5 m” — with R and Ø on circles, and their ends stick to a shape’s corner, midpoint or centre, so moving the shape brings the dimension with it. Type a measurement into a dimension and the shape resizes to match. The drawing goes into the message as one sharp picture on white paper, copies to the system clipboard for any other app, and can be saved as a note that reopens later with every shape still editable. No other mail client draws to scale.

Folder counts read unread / total. Live folders showed unread alone and archived ones the total alone, so the same number meant different things one account apart. Folders never opened have a total too, and an account you are not looking at refreshes on its own cadence rather than drifting out of date.

Mail server certificates are verified. Every connection — Exchange, IMAP, SMTP and CalDAV — previously accepted whatever certificate was offered, including for Gmail and Office 365, so anyone able to intercept the connection could read the mail, the password or the sign-in token. Certificates are now checked. Google and Microsoft accounts, and any account you sign in to, always verify and cannot be excused. A server of your own whose certificate does not validate can be allowed for that one account in Settings — though a chain fixed on the server is the better answer, and a missing intermediate certificate is the usual cause.

IMAP mail could go missing. Two callers discarded the server’s answer after the delta cursor had already moved, so anything in that gap was never asked for again. Each delta now sends the message ids it holds, and the server re-sends whatever is absent.

1.13.2 — 25 September 2026

A reply chain runs through your own replies. The arcs in the list and the conversation timeline drew the thread from the mail you received, and broke at every message you had sent yourself — so a conversation you had answered read as a fork, and the answer sat outside the chain it belonged to. Your replies in Sent Items now join the chain where they were written.

Sent mail ends with a small line. A short gray “by MailCode” under the closing rule, pinned so that other mail apps keep its size and colour rather than redrawing it at body size.

1.13.1 — 24 September 2026

Your own replies show inside the conversation. In a subject-grouped conversation, the messages you sent now appear among the ones you received, tinted so they stand out from the other side of the exchange. A message you had just sent also showed as “(no sender)” in Sent Items until the folder was reloaded; it carries your name from the moment it lands.

Recall, in both directions. Recalling a message sends the request Exchange actually expects, with the original subject and recipients, instead of one it quietly refused. And Honour recall requests, in Settings, takes a recalled message out of your own mailbox as long as you have not read it yet.

More ways through the Summary. Beside Today, This week and a range of your own, the board can be read over Yesterday and the last 3 days. A card opens in a pop-up carrying the whole conversation, ↑ and ↓ step from card to card, and a flag, a category or the read state can be changed without leaving it.

Fixed. Scheduled mail to Gmail, Microsoft 365 and other public providers now checks the server’s certificate, as the rest of the app always has. @mentions work when you type inside the quoted message you are replying to. Clearing the default BCC in account settings removes it, instead of keeping the address that was there.

1.13.0 — 18 September 2026

Choose the kind of account first. Add Account used to open straight onto an Exchange form, with the other kinds hidden behind tabs, and people typed a Gmail address into whichever form was in front of them. It now opens on four choices — Microsoft 365 / Outlook.com, Gmail, Exchange server and IMAP / SMTP — each saying what it needs. What you type is drawn in bright text, and each field keeps its format hint beside it after you start typing.

Gmail labels sync both ways. Labels on a Gmail account used to live on this Mac only. A label you apply, rename or remove here now appears in Gmail on the web and on your phone, and one added there appears here, with its mail: choosing a label fetches that label’s own mailbox, so older mail you never scrolled to is there too. Gmail allows several labels per message where MailCode keeps one per conversation, so a conversation shows the first — filtering by any of them still finds it.

Meetings from a Gmail or other IMAP account reach the people you invite. A calendar reached over CalDAV stores an event but tells nobody, so a meeting set up from Gmail went into your calendar alone. The invitation now goes out by mail, the way invitations travel between providers, and lands in their calendars as a meeting to accept. Answering works the same way in reverse: Accept, Tentative, Decline and Propose New Time mail the organizer. Drag your own meeting and everyone invited is sent the new time; drag one you were invited to and the organizer receives a proposal, while the meeting stays put until they accept.

Fixed. Deleting Gmail and IMAP mail now deletes it on the server — it used to vanish from the list and come back within minutes — and it goes to the account’s Trash with a copy in Recently Deleted. Moving IMAP mail to a folder works; every such move used to fail. Add Account opens in front of Settings instead of behind an open draft. Escape clears a label filter on the first press. The calendar’s day panel stays on the dates the grid is showing.

1.12.1 — 15 September 2026

Sign in to Gmail without setting anything up. Google sign-in used to need a Client ID from a Google Cloud project of your own, which almost nobody has. MailCode now brings its own, so the Gmail choice signs you in and adds your Google Calendar with the account. If you would rather use IMAP, a Google password is met with instructions instead of “check your password”: Gmail refuses account passwords in every mail app and wants an App Password, and both the error and the guide say where to make one.

Draft a reply. A button in AI Assist writes the answer to the mail you are replying to, in its language and at its level of formality. Anything already in the draft is read as your notes on what to say, and every point in them is kept. On a forward it writes a short covering note instead, and Undo brings your notes back.

Work through the Summary rather than just read it. Double-click a card, or press Enter, to read the mail over the board; ↑ and ↓ move through the cards, Clear and next takes the one you have dealt with off the board, and Reply goes straight to the composer. Right-click a card to move it to another category or file everything from that sender under one. Cards can also be sorted by topic — Commercial, Engineering, Claim, Complaint, Site & inspection and Legal, recognised from the subject in Turkish, English and Russian — and beside Today and This week there is now a range of your own.

The spell checker questions what it used to wave through. Turkish typed without ç, ğ, ı, ö, ş or ü — “degil”, “olmasi” — is underlined and the letters offered back, while real pairs like “yasa” and “yaşa” stay words. English misspellings with a real word inside them, such as “completly” or “commited”, are caught, and words typed together, such as “thankyou”, are offered split apart.

Fixed. Clicking a Summary card no longer empties the mail list. A reply arc that crosses many rows now bows out beside the tree, so its length reads at a glance.

1.12.0 — 11 September 2026

A Summary that says what today brought and what it wants from you. A sixth view, and the counterpart of Analytics: where that one answers what an archive looks like over years, this one answers what happened today — how much arrived and how that compares with your own last seven days, who sent it, which conversations moved — and then sorts the mail by what it wants from you: needs a reply, waiting on them, invitations, for information, automated. Most of that is read off the mail itself rather than judged: who spoke last, whether you were in To or in Cc, whether an invitation is attached, whether a sender has ever had a reply from you. Only the residue — mail addressed to you, last word theirs, that still asks for nothing obvious — is shown to a model, and then as sender, subject and the opening line the archive already stored, never a body; that part stays off unless you have configured a provider, and says so. The rail beside it carries your flags, the mail waiting to go out and today’s meetings.

Name the file in the sentence that talks about it. A long letter carrying nine attachments reads badly — the paragraph says “the revised offer”, the paperclip bar says nine names, and the reader is left to work out which is which. Typing § in the composer, dragging a file’s chip into the text, or right-clicking that chip puts the file’s own name into the sentence — 📎 [2] Price list.xlsx — and, if you want one, a numbered Attachments list at the foot of the letter for those references to be read against. There is deliberately no link to click: a link into another part of an email body means nothing in Outlook’s Word engine and nothing in Apple Mail, and a client that does act on one opens a browser window, which is worse. The number does that work instead, the way a paper letter has always cited its own “Ek-2”, and it reads identically in every mail client. Take a file off the letter and the reference that named it turns red and struck through, heals itself if you attach it again, and asks once before the mail goes out pointing at something it is not carrying.

A line of the message under every row, and a colour for the ones you have read. The sentence rows have always drawn a line of the message underneath, and that turns out to be the half of them most people want without the sentence: the ≡ chip beside in the list toolbar now puts one line, two lines, or none under the ordinary rows, in every grouping — under a message row, and under a conversation’s header from its newest message. Settings › Read gains Read text color beside the unread one, so read and unread mail can differ by colour alone; leave it unset and every column keeps its own colour, as before.

Read and unread keep up with Office 365. Mail marked read in MailCode could stay unread in Outlook on the web for minutes or for good, and mail read there took just as long to grey out here. Microsoft refuses a command outright when a mailbox is already serving all the connections it will give, and every one of those refusals was counted as one of the flip’s few attempts — one mark-read was refused five times in three minutes, each time before the command reached the mailbox, and was then given up on. A refusal like that now costs no attempt and is waited out. Reading through a run of mail also sent one request per message; a batch now travels as a single instruction. And the poll that notices what you did in Outlook on the web had never run for IMAP accounts at all — it now runs every twelve seconds, asking for flags and nothing else.

Open an attachment from a message you opened as a file. Double-clicking a .eml or .msg — in Finder, or on a message that carries one — opens a viewer window, and its attachment rows offered a single action, Open, which ran MailCode’s own preview: a Word file became a rough rendering of itself with no way to reach Word, and a type MailCode cannot draw at all fell through into a save panel, so Open asked where to put a copy. Those rows now carry the reading pane’s three actions in its words — View, Open, Download — Open no longer deletes the file out from under the application it just handed it to, and the translate button reaches that window as well.

A reply arc across a long conversation looks like one. Hovering a row draws a curve down the connector column to the message it answers. That curve was bowed to the same narrow width however far apart the two rows sat, so across nine rows of a long thread it came out as a vertical line with a kink in it — the one shape that says nothing about what it connects. The bow now widens with the distance it crosses, so a reply to the message above looks like a short hop and a reply to something near the top of the thread visibly reaches back.

A sample inbox with a conversation worth the name. Open MailCode without adding an account and it starts in Demo mode, on a sample inbox that never touches the network. Its longest thread ran to a handful of messages, which is too few for the reply arcs, the fork marks or the conversation timeline to have any shape to draw — so the feature you were being shown was invisible in the mailbox provided to show it. The sample now holds conversations of seventeen and sixteen messages, each forking three times.

1.11.2 — 7 September 2026

The Flags timeline reads like a timeline. Every bar now carries its own date beside it — “due 8 Sep”, “done 2 Sep (2d early)”, or an overdue “due 4 Sep · 3d over” in red — instead of leaving you to count it off the ticks along the top. The planned span and the work done inside it used to be drawn as two bars with a gap between them, which read as two unrelated things rather than one inside the other; the progress bar now sits just inside its plan, so an overrun visibly pokes out of it. Bars have rounded ends, and the date axis is quieter — lighter gridlines, less weekend shading — so the bars carry the row rather than competing with a grid.

1.11.1 — 7 September 2026

Removing a mailbox now removes all of it, and the disk space comes back. Mail you had deleted was kept in Recently Deleted so it could be brought back, and that copy — the whole message, and the full bytes of every attachment on it — outlived the mailbox it belonged to. Once a mailbox was down to nothing but that, MailCode could no longer tell which mailbox the rows belonged to, so deleting it a second time found nothing, did nothing, and said it had succeeded. And even a clean removal never returned the space: the archive kept freed pages for its own later use, so the file on disk stayed exactly the size it was. Removing a mailbox now takes its Recently Deleted mail with it, hands the space back to the disk as it goes, and says how much it freed. A mailbox down to nothing but deleted mail is listed under Settings › Accounts › Leftover Data instead of being invisible. Archives created before this release need one Compact to start shrinking on their own, and MailCode says so when that is the case.

Five palettes, where there were two. Dark+ and Light+ switched the background and nothing else: the colours on top were always the editor's — a teal subject, a blue sender, a green date — and there was no way to ask for less. Settings › Appearance now offers Syntax Dark and Syntax Light, which are what those two were; Quiet Dark and Quiet Light, which keep the same ground but draw every line of a message list in one ramp of grey, leaving colour to the things that use it to mean something — the unread mark, the selection, flags, account chips; and Paper, the palette from this website. Late, failed and done keep their colours in every palette, because those say what happened rather than how it looks.

Settings › Storage keeps its Compact button when no account is set up. The archive belongs to no account, and the person with none is usually the person who has just removed their last one — whose archive is the most likely to be holding space it no longer needs. The panel now shows the database whenever there is one, says how much of it is free space a compact would give back to the disk, and tells you when an archive is old enough that compacting it once will make it shrink on its own from then on.

1.11.0 — 5 September 2026

Send from a Microsoft account whose company does not allow SMTP. Microsoft 365 arrives with SMTP switched off, and switched off a second time by the security defaults in Entra — which is most companies. Exchange then refuses the sign-in before it has looked at it, so an account that reads mail perfectly well cannot send a single message, and signing in again never helps, because nothing is wrong with the sign-in. Only a company's Exchange administrator can lift it, which for most people means a request that may never be granted. MailCode now sends through Microsoft Graph instead, which neither switch affects: grant one permission in Settings → Accounts, or simply send and accept the offer when the first message comes back refused. The message waits in the Outbox meanwhile and goes out as soon as permission is given, and scheduled mail goes the same way. This is also the path that outlives Exchange Web Services, which Microsoft begins blocking on 1 October 2026.

See what your archive actually holds. A sixth view over local mail: volume by day, week, month or year, split into what you sent and what you received; a weekday-and-hour heatmap of when mail arrives; the people, the organisations and the recipients you deal with most; what your attachments are, how big they get, and which files are the heaviest you are keeping. Every bar and every row opens the mail it counted. All of it is counted on your own machine, from your own mail, and none of it is sent anywhere.

A file too big to send is offered a link wherever it arrives, not only when you attach it. A large file could always be uploaded to your own cloud storage and sent as a link — but only if it came from the paperclip. Anything already on the message went unmeasured: a forward carrying the original's files, "Reply with attachments", a restored draft, a message dragged in, a file copied from another mail. Not even the 25 MB limit applied to those, so the one file you had not chosen yourself was the one you could do nothing about. All of them are now measured and offered the same link, largest first, and each says why the limit is what it is. Accepting takes the file off the message before it uploads, so the link does not go out beside the file it replaces, and an upload that fails puts the file back.

Compacting the archive no longer looks like a frozen app. It used to rewrite the database in place — one long operation with nothing to show for itself, behind a message that said "this can take a few minutes" whatever the size of the archive. On a 46 GB archive that was over twelve minutes with no sign of progress, and no way to tell a working compact from a stuck one. It now writes a compacted copy alongside and swaps it in at the end, which changes three things: it says up front how large the job is and roughly how long it will take, it counts the copy up as it is written, and your archive is not touched until that copy is finished — so interrupting it, quitting, or losing power costs the time and nothing else. It also needs half the free disk space it did before. Mail still cannot be read or synced while it runs; that part is unavoidable.

Delete an imported folder tree in one action. Right-clicking the top of an import — the level that holds no mail itself, only the folders beneath it — offered no delete at all, so clearing an import meant deleting its subfolders one at a time. It now offers to delete everything under it, and names the folders it will take before it does. Deleting a folder has always taken everything beneath it; this one row was simply left out.

1.10.30 — 4 September 2026

Reply keeps the attachments, and a forward can leave them behind. Each verb had exactly one behaviour: a reply never took the original's files, a forward always did. Both are wrong often enough to matter — answering "here it is again, signed" meant attaching the file by hand, and passing a thread along meant sending eight megabytes of spreadsheets nobody asked for. Right-click Reply or Forward and the other behaviour is there, naming what is at stake before you commit to it ("2 attachments · 7.8 MB"). On a message with no attachments the row is still there but greyed, so the absence is an answer rather than a missing menu.

A mail attached to a mail arrives as mail. Two separate faults sent it as a plain file instead. An attached message opened in a compose window with a Send button, because every message Exchange creates is marked unsent however finished it looks — it is now marked read and sent where that flag actually lives. And when a compose autosave landed in the middle of the upload, Exchange refused the attachment over a stale key; MailCode read that as "this server cannot carry embedded messages" and downgraded to the very file the feature exists to avoid. The two refusals are now told apart: a key conflict re-sends the same attachment against the current key, and only a genuine refusal falls back to a file.

Editing a date near the bottom of the Gantt keeps your place. The chart is redrawn whenever anything on it changes, and only the horizontal position was carried across — so changing a date on a row near the bottom dropped the view back to the top of the chart.

A reopened tab no longer wears the last search's warnings. The banner that says some accounts could not be searched describes one particular answer. Restoring a tab cleared its results but not those flags, so a tab with no search in it could still be warning about one.

1.10.29 — 3 September 2026

Download an attachment from a meeting invitation. MailCode asked Exchange for attachment bytes using an element name that does not exist in the protocol, and Exchange answered every such request with "an internal server error occurred" and nothing more. It read as a broken mail server, so MailCode had long since stopped asking and fell back to downloading the whole message and cutting the file out of it — which works for ordinary mail, and is why nobody noticed. A meeting invitation is the one thing it cannot work for: Exchange hands those back as a calendar entry with no attachments in it at all, so a deck attached to an invitation could not be reached from the mail or from the calendar. The request is now correct, which also means every attachment is fetched directly instead of pulling an entire message down to get one file.

Open a meeting's attachment instead of being asked where to save it. In the calendar, a file MailCode already held offered an Open button that ran the preview — and for a type it cannot draw, such as a PowerPoint deck, the preview quietly turned into a Save As. The reading pane never did this. Both now behave the same way: Open hands the file to the application that opens it, View appears only for the types MailCode can draw itself, and Download still saves a copy.

Ordinary Russian is no longer underlined as misspelt. A word list cannot hold Russian, because one noun is a dozen written forms and one verb far more. Measured over four thousand Russian mails from a real archive, 38.4% of every Russian word was underlined — and almost none of it was unusual. "отправителя", "вложений", "ссылок", "документации" are ordinary business Russian, and the base words they are built from were in the list all along. MailCode now works out how a word was formed rather than looking for it whole, so a correctly inflected word is accepted even though no list could have held it.

Mail addressed to you is recognised under any of your addresses. The badge that marks a message as addressed to you personally compared a single address — the one belonging to whichever account was selected — so it was wrong three ways. Mail imported from a PST was the worst: internal Exchange mail carries no email address in its recipient list, only display names, so mail plainly addressed to you could never match. On one archive 14,897 messages had no address anywhere in their To line, and 3,677 of those named the mailbox owner. Aliases never counted either, nor did anything in All Mail or the Local Archive, where messages belong to other mailboxes or to none. Every address and name you are known by, across every account, now counts.

1.10.28 — 31 August 2026

A trial lasts fourteen days, and a purchase you have already made is found. The countdown was kept in a single file inside the app's own storage, so deleting that storage began a fresh fourteen days on a trial that had already been used — and, the other way round, someone who had paid could come back to a locked app until they thought to look for Restore Purchases. Both are now answered from the App Store receipt inside the app, which macOS rewrites on every purchase and checks before the app is allowed to start: it carries the date the trial was first taken, which no reinstall can move, and the record of the unlock. The old file is still read and still answers on its own — a receipt MailCode cannot make sense of must never be the reason someone is locked out of mail they have paid for.

A purchase that does not go through says why. A payment the App Store refused was reported nowhere: the button went on saying "Contacting the App Store…" for the rest of the session, and the reason never left the log. The card that offers the purchase during a trial was never redrawn, so an answer arriving while it was open had nowhere to appear; the failure carried no words to show even if it had; and nothing put a limit on the waiting, so a purchase awaiting approval on a parent's device — which can take days — looked exactly like one that had died. A refusal is now explained in words you can act on, a purchase waiting for approval says so, and a button still waiting after ninety seconds stops and tells you that nothing has been charged.

Deleting imported mail now frees the space it was using. Mail imported from a PST keeps its text in a file beside the archive. Deleting the message removed it from the list and left that file behind, and nothing in MailCode could see the difference — compacting the archive frees space inside the database and cannot touch these at all, so an archive could report three gigabytes while occupying eighteen. One real archive held 8,398 such files, fifteen gigabytes, with not one message pointing at any of them. Deleting mail now takes its file too, for a single message and for a whole folder; mail sent to Recently Deleted keeps its file, because that is what restoring it reads. Settings ▸ Storage has a new line for archives this has already happened to: it counts the files nothing points at any more and offers to reclaim them, naming the amount before anything is deleted. Files from an import that reads them where they already sit are never touched — those are yours, and MailCode never copied them.

1.10.27 — 30 August 2026

Opening a message no longer waits for the download running behind it. While MailCode fills its local copy of a mailbox it writes each batch of messages to disk in one go, and everything else — opening a mail, opening a folder — had to wait its turn behind that write. On a large mailbox the wait reached nine seconds and the message gave up with "the archive is still busy", which read as though the message itself were the problem. It was not: the work of opening it took under a millisecond once it started. MailCode now pauses between writes so anything you click is answered straight away.

A folder opens while the download is still running. Some mail servers allow only one connection at a time, and Outlook narrows to one when it decides a client is asking for too much. MailCode always meant to keep a connection free for you and hand the rest to the background download — but with only one to divide, the download took it, and a click waited for a whole batch of messages to finish arriving. The download now stands aside when there is nothing to spare and you are waiting, and carries on if you are not.

An attachment you have already opened opens instantly. Opening a message quietly fetches its attachments, so that the Open button means the file is already here. It did fetch them — and then threw them away, so every click fetched the same file again from the mail server. A 3.6 MB spreadsheet cost ten seconds each time, including going back to a message opened minutes earlier. The bytes are now kept, and Open uses them.

Opening a mail attached to a mail no longer gives up. An attached message had thirty seconds to arrive, where every other kind of attachment had two minutes. On a slow or busy connection that ran out, and the failure blamed the local archive for a wait that was really the mail server's. It now has the same two minutes as everything else.

1.10.26 — 28 August 2026

A meeting is sent at the hour you set it. A meeting created from the New Meeting form went out three hours late in Turkey, and by however far its own clock runs ahead of Greenwich anywhere else. The form wrote the time as plain wall-clock text with nothing to say which clock it had been read from, and Exchange reads a time with no zone on it as UTC — so a 14:00 meeting invited everyone to 17:00, the organiser's own copy included. The time now carries its offset. Updating a meeting, dragging one to a new slot, a reminder invitation and the New Meeting form opened from a message were all already correct, which is what made this look like a server's doing rather than MailCode's.

Signing in no longer sends you to your browser. Adding a Microsoft or Google mailbox used to open your default browser, leave MailCode behind it, and rely on you finding your way back. It now happens in the system's own sign-in window, drawn over MailCode: the same page from Microsoft or Google, on the same Safari session, so a mailbox you are already signed in to on this Mac does not ask for the password again. Your password is still typed on the provider's page and MailCode still never sees it. On Windows the browser is still the right window, and nothing there changes.

A Google sign-in no longer ends on a security warning. Google hands a "Desktop app" client one way back into the app — a plain http address on your own computer — and Safari's "Use secure connections" setting interrupts that at the very last step with a red This Connection Is Not Secure panel. The sign-in had in fact worked; it simply did not look like it. Google's iOS client type comes back on an address of its own, which the sign-in window recognises and closes on, so no web page is loaded at any point. Settings → Sync now describes making one, and tells the two apart by the secret: an iOS client has none, so leaving that box empty is what chooses the new route. A client you already set up goes on working unchanged, and is still the route Windows uses.

Microsoft accounts settle in faster, and say less that is not true. A mailbox talks to the server over one connection at a time, and MailCode keeps a second one so that what you click never waits behind what it is doing in the background — but the wrong things were on it. Opening a folder, marking mail read, flagging, deleting, moving and filing a sent copy all queued behind the first-time archive crawl, while the twelve-thousand-header warm-up that runs when an account is added sat on the lane the clicks were on. Everything a click starts now goes on the responsive connection and the background work goes on the other. Three things that were merely alarming are gone with it: a newly added mailbox that Microsoft has not finished opening is described as not open yet rather than accused of having no IMAP access; a sign-in the server rejects no longer tells someone with no password to check their password; and a folder being copied locally shows its progress on the account it belongs to, instead of on whichever account you happened to be looking at.

Mail the server only asked us to wait for is no longer written off. When Microsoft holds a mailbox off — it does this readily on a new account — MailCode waits a minute and picks up on its own. The first-time archive crawl did not know that, and treated the refusal as the fetch having failed: it spent all nine of its attempts inside the first ten seconds of that minute, wrote the messages off as unfetchable, and reported itself finished. On one Sent folder that was 33 messages recorded as missing from a mailbox that was working perfectly well. Related, and quieter: the table mapping a folder to its name on the server was shared between accounts and only refilled for the folders each account has, so on a mailbox whose folder list would not load, MailCode asked it for a folder belonging to a different account entirely.

A saved file asks where it should go. Three saves wrote straight into your Downloads folder without asking — the report from Report a Problem when sending it fails, an attachment saved from the window that opens for a double-clicked .eml or .msg, and an attached message that is not a .eml. Each now opens the same save panel every other save in MailCode opens, so the file lands where you want it and the app can tell you where that was.

1.10.25 — 26 August 2026

Translation works again. MailCode translates a message through Google's free translation endpoint, which is reached with an undocumented key. On 24 August the key MailCode had used since the feature shipped began refusing every request — the first one of an idle session, from a machine with nothing in front of it — and it has not answered since. Nothing about MailCode had changed: the same machine, in the same second, was answered normally on two other keys, so what was blocked was the key and not you. MailCode now keeps a list of them and moves on the moment one refuses, remembering for the rest of the session which one answered, so a long document pays for that discovery once rather than on every page. A translation that fails still leaves the pages already done alone. The failure used to be silent — the translation simply did not appear — so it now records a line when it happens.

1.10.24 — 25 August 2026

Your local archive now stays on your own machine. MailCode keeps your mail in a database in its own process and reads it over an HTTP port that only its own window is meant to use — but that port was opened without naming an address, which on every platform means every address. It answered anything that could reach the computer: another device on the café Wi-Fi, a guest on the office network, whatever else is on the VPN. Nothing had to be guessed but a port number, and what answered was the whole archive — search, message bodies, attachments, and the routes that send mail. It now listens on the loopback address alone, so the port exists only inside your computer and a request arriving from anywhere else is refused before it is read. Nothing about how the app works changes, and no setting ever turned this on.

1.10.23 — 25 August 2026

An Outlook or Hotmail mailbox now says what it is doing while it sits empty. Microsoft rate-limits IMAP per mailbox and refuses calls with a suggested backoff — and on a mailbox you have just added, where the folder list, the first page of mail and the push connection all want the one connection at once, that meant the first page timed out and the once-a-minute folder poll walked back into the same window every minute for the next five. The status bar said "sync error"; the log said "Command failed", which is the one phrase the IMAP library reports every refusal as. The server's own words are read now, so a rejected command says which command and why, a throttle is answered with a plain sentence and a rate-limited, retrying state rather than an error, and the window is remembered per mailbox so everything waits it out together instead of taking turns re-arming it. An expired sign-in hiding behind the same three words now reaches the authentication banner it always should have. Gmail, which does not throttle this way, is untouched.

A custom accent colour follows the theme. The colour you picked was written straight through, so one chosen in Light+ stayed near-black after switching to Dark+ and took the folder names, the unread markers and the selection with it — and a pale one picked in Dark+ disappeared into white in Light+. The hue you picked is kept, and its lightness is walked toward the readable side of whichever background you are on until it clears the contrast bar for text. An accent that already read stays exactly as it was. Both themes remember the same pick.

Whatever you opened last comes to the front, and clicking either one raises it. A composer is a window and every dialog sat beneath it, so Settings opened while a draft was up came out behind the draft — and clicking it did nothing, because the compose window was still the top layer. Minimizing the draft was the only way to reach the dialog. Now the two behave like windows: the newest is in front, a click raises either, including a click inside the quoted message where a reply is usually written, and a raised dialog gives up its backdrop so that click can land. Panels that Settings itself opens — the storage panel, What's New, Report a Problem — also put Settings back when they close, on the tab and at the scroll position you left, instead of dropping you into the mailbox.

1.10.22 — 24 August 2026

Read mail in the language you actually read in. Translation used to mean English, and only English. Now Settings → AI Assistant → Translate mail into sets the language, and the Translate button, a passage you highlight and a previewed attachment all follow it. The language a message is already in is still detected rather than asked for. The strip above a translated message carries the same list, so one mail can be turned into another language on the spot without going near Settings, and a translated attachment you download is named for the language it is in — (EN), (TR) — so two translations of one file no longer land on top of each other. Translating a draft you are writing stays a separate choice, made in the composer each time: reading someone's mail and writing back to them are opposite directions.

Take a translation back out. A translated message keeps its translation, which is what makes opening it again cost nothing — but until now Show Original only hid it, and there was no way to say a mail was finished with. The Translation strip now carries a Remove button that puts the mail back and forgets the translation, a passage you translated by hand comes out from a right-click on it, and Settings clears every saved translation at once. Both buttons ask once before they act. The message itself is never modified, either way.

Replies go out as replies. Messages sent from MailCode carried no In-Reply-To or References header. Inside Exchange nothing looked wrong, because Outlook threads on its own index — but in Gmail or Apple Mail each reply arrived looking like an unrelated message, and the copy filed in Sent Items came back with no parent, so MailCode's own conversation view could not chain your replies either. Both headers are now written on the way out, over Exchange and over SMTP, and they survive a message that waits in the Outbox or goes out on a schedule. Replies sent before this version carry nothing to recover; a forward still carries neither, deliberately, so it stays a line of its own rather than becoming a reply to mail its recipients never saw.

A crash that leaves nothing behind is now written down. A tester's Windows app vanished mid-gesture and left no trace anywhere: nothing in the app's own log, nothing in Event Viewer. A fault below the app runs none of the app's code, so nothing inside it was left to record its own death. Two witnesses now outlive it — a crash dump written by a handler process, and a session marker that proves the last session never reached its exit and says to within a minute when it stopped. Together they tell a crash apart from a kill. Report a Problem carries that history, and a dump is offered there rather than taken: it is a copy of the app's memory and can hold message text, so nothing is attached until you press the button, and nothing is ever uploaded on its own.

Also: a message the reading pane could not measure — one whose own layout is pinned to the window — had its tail clipped with no scrollbar to reach it. Height is now read from the mail's content, and a frame that still cannot hold the message hands the scrollbar back rather than hiding text. Hovering a row in the list, or a marker on the conversation timeline, now draws the message it answers and the messages that answered it. And the AI panel keeps the selection it was opened on, instead of quietly switching to the whole draft.

1.10.21 — 23 August 2026

The beta expiry is judged against the download host's clock rather than the machine's, so winding the system clock back no longer walks past it. Both checks fail open when you are offline.

1.10.20 — 22 August 2026

The beta window was extended to 1 December 2026. The previous build was made nine days before its own expiry and would have refused to launch on 1 September — and because an expired build quits before it can check for an update, it could not have fixed itself. Update if you are on 1.10.19 or earlier.

1.10.19 — 22 August 2026

Translate an attachment and keep the page it came on. A Word document, a spreadsheet or a PDF opened in the preview can be translated as a document: the preview redraws with its headings, tables and styles intact, each block of translated text sits over the block it replaces, and the translated copy can be saved as a real .docx, .xlsx or PDF beside the untouched original.

1.10.18 — 20 August 2026

1.10.17 — 19 August 2026

1.10.16 — 18 August 2026

An exported .eml now carries the message's own identity, so mail exported to disk keeps its threading and its place in the duplicate check when it is indexed on another computer.

1.10.15 — 18 August 2026

PST import recovers what it had been quietly dropping: attached emails, which arrived as unopenable 8-byte rows; real sender and recipient addresses instead of Exchange directory names; the read state; RTF-only bodies; and distinct messages the duplicate check had been collapsing into one.

Earlier in 1.10 — 7 to 17 August 2026

Something in a new build behaving worse than the last one? Help → Report a Problem inside the app attaches the technical details for you — or write, and a human will read it.

© 2026 MailCode. Made in Ankara. MailCode Releases Support Privacy Terms Disclaimer Contact