Fixed · The iOS app could load its login screen and do nothing else
Its in-app WebView runs at a different origin than the website, and that origin wasn't on the list the API accepts requests from — so every request after the login screen loaded, including the login itself, was silently blocked. The iOS app works end to end again.
Fixed · Deleting your account is reliable now
The delete-account page runs a third-party check that verifies a real visitor is submitting the form, and getting that integration working took several rounds. Two submit handlers were firing at once, so a deletion could go through unverified while the page still showed an error. The verification token the third-party service issues was longer than the API allowed, so a legitimate submission was flatly rejected. The verification call itself was misrouted and always failed silently, quietly falling back to weaker protection with no indication that had happened. And the spam classifier reading the submitted reason was scoring ordinary sentences — explaining you're consolidating email providers, for instance — as spam, refusing real customers on custom domains more than a third of the time. Deletion now goes through cleanly, and that classifier has been set to record rather than block until it can be retrained.
Fixed · Blog posts rendering raw Markdown instead of formatted text
Some posts were showing literal, unconverted Markdown — stray ###, **bold**, bare --- lines — instead of formatted text, because the sanitizer that cleans incoming post bodies only understands HTML tags and had no idea that syntax needed converting at all. A converter now runs both when a post is first published and whenever an existing post is re-rendered, so every affected post self-heals without anyone touching it individually.
Fixed · Billing and other server errors now reach the browser
A server error — most visibly, anything going wrong while choosing a billing plan — used to vanish before it reached the browser. The app and the API run on separate domains in production, and the response describing what went wrong was built in a way that never carried the header letting the browser actually read it, so it just looked like nothing happened. Server errors, a Stripe outage, and rate-limit responses now all reach the browser with an actual message instead of a silent failure.
Fixed · A deleted message could come back as a ghost
A quirk in how message actions were saved meant that archiving, restoring, or deleting a letter that had already been permanently removed elsewhere — in another open tab, say — could bring it back to life as an empty, sender-less row, still counted in your inbox. Those actions now correctly do nothing if the letter is already gone.
Fixed · A search with no results used to strand you
Searching the inbox for something that matched nothing made the search box itself disappear, along with the Clear button and every filter chip — leaving no way to recover except reloading the whole page. The search box, and a working way to clear the search, now both stay on screen when a search comes up empty.
Fixed · The Deliverability dashboard's DMARC advice, and a layout gap
The Ready to tighten suggestion always recommended moving a domain's DMARC policy toward quarantine, even for a domain that had already reached the strictest reject setting — so a domain in its most protected state could be told, incorrectly, to loosen its own policy. It now reads the domain's actual published policy and recommends the real next step, or nothing at all once there is no next step. Separately, a shorter card sitting next to a taller one no longer gets stretched to match it, which used to leave a blank gap under the shorter card's own content.
Fixed · A broad accessibility pass
Every form control now has a real accessible name rather than relying on placeholder text alone — that included the account-deletion field, of all things. A keyboard-only user can now attach a file in Compose, which previously required clicking an unlabeled drop zone with a mouse. The footer's nameplate link no longer has a screen-reader label that contradicts what it visibly says. And text contrast was corrected across the admin dashboard, the AWS WorkMail migration timeline, and every place the site's sage-green accent color is used as text — 44 places across 20 files were all failing the same contrast check off one shared color value.
Fixed · Adding an existing alias no longer overwrites it
Adding an email alias that already existed on a domain used to silently succeed and overwrite the existing row — quietly un-blocking an alias someone had deliberately blocked from Operations, or exposing a domain's internal DMARC-report collector as a regular, sendable identity in Compose. Creating an alias that already exists is now refused outright instead of clobbering it.
Fixed · Remote images in a letter, and what they can see
An image embedded in an incoming letter could silently fail to load if the sender's server set a strict cross-origin policy, with no explanation to the reader. Remote images are now fetched by Folio's own servers and re-served from our origin instead of being loaded directly by your browser — which also closes a real privacy gap: a tracking pixel in a marketing email can no longer see your IP address, device, or location, because your browser never contacts the sender at all. (Correction, 11 October 2026: this entry first said the pixel could not see when you opened the letter. It can, roughly, because Folio fetches the image at that moment.) Folio's privacy and trust pages now say this plainly, since it was true and undocumented.
Fixed · The AWS WorkMail importer, and its migration wizard
The tool that imports mail from AWS WorkMail wasn't verifying the TLS certificate on the connection it opens to fetch your mailbox — meaning anyone positioned to intercept that connection could have read your WorkMail password off the wire. That connection is now properly certificate-verified. Separately, the migration wizard's region picker offered five AWS regions that WorkMail has never actually run in; picking one meant entering your credentials and then waiting out a connection failure. The picker now only offers the three regions that are real.
Fixed · Deleted domains, and what evaluation accounts can do
Deleting a domain could leave behind a residual internal alias — the one that collects DMARC reports for that domain — which caused two problems downstream. Mail kept arriving at that address and landing in an account that no longer owned the domain, which is now cleaned up on delete. And an account whose only domain was ever deleted could get permanently locked out of activating Folio's free instant address, because the leftover alias looked like proof the account had already been set up; that's fixed too. Separately, a limit was added on how many distinct strangers a brand-new evaluation account can email in total — previously only total send volume was capped, letting one account import a scraped list and mail twenty unrelated strangers within a few minutes without tripping anything.
Fixed · The head-to-head comparison pages now state Folio's price
The pages comparing Folio against Migadu, Purelymail, Fastmail and Zoho Mail never actually said what Folio costs, and buried the section on where Folio doesn't fit under a note calling it not a sales pitch. Both now open with the price stated plainly, and say clearly which competitor is the better buy for a given use case.
Improved · A round of iPhone-specific fixes
The header no longer draws underneath the status bar or Dynamic Island — on the native app and, once a second gap in the fix was found, on the mobile website too. Compose no longer tells a touchscreen user to press keyboard shortcuts it can't use. And small-caps labels across the site — footer credits, comparison links, captions — are now large enough to read on a phone instead of sitting at 9-10px regardless of screen size.
Improved · The deliverability test-send tool asks where the letter landed
Folio's test-send tool checks your domain's authentication, then asks you to send yourself a test letter. If it landed in spam, the tool used to just point you back at the same authentication check, which had already passed and could never explain anything further. It now asks directly where the test letter landed and answers accordingly: proof of a working setup if it reached the inbox, a plain explanation that authentication isn't the issue if it landed in spam, or troubleshooting steps if it never arrived.
Fixed · A broken essay or doc link now shows a real 404
Following a stale or mistyped link to an essay or a doc page loaded the correct not-found content for a moment, then silently swapped it for the section's full index once the page's JavaScript took over. An unknown slug now consistently shows a real not-found page instead.
Fixed · Cleaner blog URLs and page structure
A handful of older blog posts covering overlapping topics have been consolidated onto one canonical post each, with the old URLs redirecting rather than sitting around as near-duplicates. Separately, one post's body content was reusing heading IDs the page template also relies on for its own Related guides and Sources sections, which broke in-page anchor links and confused screen readers; that's now prevented for good.
New · A free deadline checker for AWS WorkMail migrations
A free tool now checks your domain's DNS and tells you, honestly, whether you're actually on AWS WorkMail and need to plan around its shutdown, or whether the similar-looking records belong to something else entirely. The migration guide was also rewritten to lead with AWS's own recommended alternatives — including ones that aren't Folio, for anyone who needs shared or corporate mailboxes we don't offer — before making the case for switching, with a dated timeline instead of a countdown.
New · Two more independent host comparisons
Migadu vs. Zoho Mail, and Purelymail vs. Fastmail — completing the full set of pairings across the four services Folio is most often compared against.