Releases: trafficflowhq/ohmail
Release list
android-v0.11.2
Android APK for android-v0.11.2. Built and signed by this repository's Actions from the tagged tree.
ohmail 0.11.1
Deleting mail is safe for synced devices now, the Cloud mirror survives its own
first sync, and the folders you keep on your own mail server can join the menu —
off unless you turn them on.
Deleting mail no longer stalls a synced device
- Deleting a message that other messages replied to could wedge the app's local
mirror of a Cloud account: the sync page carrying the delete aborted on a
reply's reference to the deleted message, the same page was retried forever, and
new mail stopped arriving with no error on screen. - Deletes now detach the surviving replies instead of aborting — on the
single-message path and the whole-thread path alike — and every detachment is
announced through the same sync feed. An install that had already hit this
starts moving again on its first sync after the update: the page that used to
abort now applies.
The Cloud mirror survives its own first sync
- An interrupted first sync resumes where it stopped instead of starting over.
- Every sync request carries a deadline, so a hung connection fails and
retries instead of freezing the mirror behind it. - Being signed out shows as signed out, with the door to sign back in — not as
a false "offline" banner over a network that is fine. An expired session is
detected and named instead of masquerading as an outage. - The wake channel backs off when the server asks it to, instead of retrying
into the same refusal.
The hosted door re-earns its answer
The gate that decides whether the desktop's hosted client is signed in re-checks
whenever the engine changes, and cancelling the sign-in overlay re-asks the
engine before any mail is shown — a stale "signed in" cannot survive a cancelled
sign-in any more.
Rules before mail
A first sync loads the account's screening decisions before its mail, so senders
you have already let in never flash as unscreened while the backlog downloads.
Your mail server's own folders (opt-in)
- Settings → "Use folders" shows the folders you keep on your mail server in
the menu, each opening as its own list with unread counts. It only shows what
already exists — nothing is moved — and turning it off hides them again without
touching your mail. - Delete, in the reading pane. With folders on, the message goes to your
server's own Trash, behind a confirmation that says exactly that. - In the hosted web client the Screener's Spam view also gains a Junk segment
— a live window into the mailbox's own Junk folder, with "Not junk" moving a
message back to your inbox on your own server. The desktop app keeps its
verdict-based Spam pile for now.
Sending and attachments
- A just-sent message shows its attachments immediately, and a forwarded
message's sent copy lists the files it inherited. - The picture-quality dial re-encodes pictures that are already attached, and
its refusals name the limit that actually fired: an unreadable file gets its own
sentence, a mixed batch states both failures, and a removed file stays removed.
Parked mail returns where it belongs
Mail taken back out of Parked, Answer Later or a scheduled resurface returns at
its own chronological position instead of wherever an old reading stamp put it,
and answering a resurfaced message completes the resurface — the pin no longer
stays up over mail you just replied to.
The full list is in CHANGELOG.md.
Install notes are unchanged: nothing is signed on any platform yet — see the
README's install notes for the Gatekeeper, SmartScreen and AppImage steps.
Installed 0.11.0 and 0.10.0 apps will offer this update themselves.
android-v0.11.1
Android APK for android-v0.11.1. Built and signed by this repository's Actions from the tagged tree.
android-v0.11.0
Android APK for android-v0.11.0. Built and signed by this repository's Actions from the tagged tree.
ohmail 0.11.0
ohmail can be your computer's mail app now — and the app carries no demo mail any
more: it opens empty, and you connect a mailbox.
Your default mail app
- Click an email address anywhere and a new message opens here, prefilled. ohmail
registers as a mail-app candidate on all three platforms — the macOS bundle's URL
types, the Linux desktop entry's scheme handler, and on Windows the installer's
capability keys, which put ohmail on Settings → Default apps → Email. - Becoming the default stays your choice, made the way each platform sanctions.
You press the app's own "Make default"; then macOS confirms with its own dialog or
applies the change directly, Windows opens the Default-apps page for you to pick,
and Linux goes throughxdg-settings. Nothing writes the choice behind the
platform's back — on Windows in particular the app never writesUserChoice, it
reads it, to show you which app currently has the job. - The app asks once. After a mailbox is connected, one card offers to make ohmail
the default; either answer is remembered and the question does not come back.
Settings → General keeps the row — the live-detected state and the same action —
for whoever changes their mind later. - mailto links become the compose form, safely. One parser reads them (RFC 6068:
recipients, cc, bcc, subject, body), defensively — every field is plain bounded
text, control characters cannot ride into single-line fields, unknown headers are
dropped rather than honored, and a list of recipients splits the same way the send
path splits it. A click that starts the app still lands: the shell holds the link
until the window claims it, exactly once. Who you write to is never logged.
No demo mail in the app
- The fixtures-only "interface preview" artifact and the in-app sample mailbox are
retired. Every desktop artifact now carries the real mail engine. The app has two
states — not connected, and your own mail — and the demo lives at
ohmail.app/demo. - The artifact scan proves it in both directions: the sample world absent from the
emitted bytes of every shipped bundle, the real sync client present.
One version on every platform
- Desktop moves to 0.11.0 in every file that states a version, so what the app
reports, what the installers are named and what the update feeds advertise agree. - The Android app's 0.10.1 pairing flow works unchanged against this release.
Also
- Replying from a conversation's per-message menu now answers that message rather than
doing nothing, and forwarding happens inline in the thread instead of leaving for the
compose screen. Recipients are always yours to pick, never derived, and a forwarded
message is not marked read — forwarding a message is not answering it. - Settings panes are addressable places: a pane resolves from the address bar, can be
linked to, and the Back button walks out of it. The open message lives in the URL the
same way, so a reload returns to what you were reading. - Windows reports its default-mail state honestly: a missing registry key now reads as
an answer rather than as a failure, which is what it is.
Built by CI run 32498578956
from this repository's own tree; the run's summary prints the SHA-256 of every artifact
attached here. Full detail in the
changelog.
android-v0.10.1
The Android app now wakes for new mail — through a push distributor you choose,
with no Google or Apple push service anywhere in the path.
This supersedes the android-v0.1.0-beta.* builds. The version number is now
shared with the desktop line (0.10.x): it says which product line this build
belongs to, not that the app is finished. It is still a pre-release.
New-mail wake
Your server sends a fifteen-byte signal — no subject, no sender, no count —
encrypted to this specific device and signed with your server's own key. The app
receives it and fetches your mail over its own connection, exactly as it does
when you open it.
The signal travels through a UnifiedPush distributor:
a separate app you install and choose yourself. Settings lists the distributors
found on your phone and lets you pick one, or says so plainly when there are
none. The app ships no Firebase or APNs client at all, and the release build is
checked for that — the workflow inspects the compiled APK, not just the build
configuration.
It works while ohmail is running, open or in the background. If you swipe the
app away, mail arrives the next time you open it. Foreground sync and
pull-to-refresh remain the floor underneath all of it. Waking a closed app needs
work that is not done yet, and this build does not pretend otherwise.
Your server needs a signing key for a wake to be renderable. The hosted service
has one. A self-hosted install generates its own with
node scripts/vapid-keygen.mjs — never copy another install's, since whoever
holds a private key can send wakes that install's phones will accept. Without a
key, Settings says so instead of showing a control that cannot work.
Also in this build
The first-run and connection fixes from the 0.1.0 beta line ride along.
Installing
Download ohmail-android.apk and install it. Android will warn about installing
outside the Play Store; that is expected for a sideloaded build. This APK is
signed with the project's release key and built by this repository's own Actions
from the tagged tree.
ohmail 0.10.0
Your computer as the host for your other devices
- Settings → Devices turns a desktop install into the host for your other devices. Your phone's
browser opens the same ohmail client through your own computer — the Ohbox, the Screener, reading
and filing real mail — while that computer is awake. No cloud in the path. - Nothing is opened to the internet. The mail engine listens on this computer only, and
Tailscale — a private tunnel between your own devices — carries the
connection under a real HTTPS address. The pane detects whether Tailscale is installed, running
and signed in, and says what to do in plain words. - Adding a device is a QR code. Scan it with the device's camera and it opens your mail and
pairs in one step. Codes work once and expire in five minutes; paired devices are listed and
revocable at any moment, and relaunching or updating the desktop app does not unpair anything. - While hosting, closing the window hides the app (the tray brings it back), quitting from the
tray really quits, and start-at-login is offered as a visible choice. With host mode off, none of
this machinery exists — no listener, no tray, the exact lifecycle earlier releases had. - A same-network door for apps rather than browsers can be opted into: a plain-HTTP address on
one interface you choose, for API clients on your own network.
Your settings live in the mailbox, and move with it
- The senders you've screened in, your rules, notification rules, away reply and tag names are
stored in the mailbox itself — a few kilobytes of versioned JSON in the hiddenohmail/_meta
folder. Connect the same mailbox from another ohmail — a fresh desktop install, the hosted
service, a server you run — and it finds them and asks before importing. Declining is remembered;
found settings win only for the entries they actually name. - The format is public: docs/organizer-profile.md.
Natural keys only, unknown fields tolerated, never any credential. If you stop using ohmail, the
document is still yours, in your own mailbox, readable by anything that parses JSON.
The Screener
- "Not spam" now releases the sender, not just the message. When a rule you once made held a
sender in spam, the release buttons moved the messages but left the rule standing, so the sender's
mail kept coming back. Releasing a sender now rewrites or removes the holding rule, moves only the
mail that is physically present, and re-files the sender's backlog. The confirmation names the
rule it rewrote.
Also
- A failed permission-tightening on the configuration file is now an error rather than a silent
success — the file names your mail server and username, and is owner-only on Unix. - This repository is AGPL-3.0 now (0.9.x shipped under GPL-3.0), and it carries the server source
behind ohmail.app beside the desktop app. Contributions need no CLA — a DCO sign-off is enough.
Built by CI run 32373356302
from this repository's own tree; the run's summary prints the SHA-256 of every artifact attached
here. Full detail in the changelog.
ohmail for Android 0.1.0-beta.2
The second Android beta. Three changes, all from first-device feedback:
- First run opens with connecting. The app shows one welcome screen — what it is, then straight into pairing: scan the QR from your desktop's Devices screen or your self-hosted server's setup page, paste the pairing link, or type the address. A paired phone boots straight to mail.
- The demo dataset is gone. The app opens empty and shows only the mail of the server it is connected to. Features that are not built yet (compose, search, tags) are named as arriving later instead of being mocked.
- The launcher icon renders at the right size. The adaptive icon's mark now sits inside Android's safe circle instead of filling the whole mask.
The workflow attaches ohmail-android.apk (signed with the project's release key) to this release once the build completes. Installing over beta.1 keeps your pairings.
android-v0.1.0-beta.1
The first Android build of the ohmail phone client, as a developer-signed APK.
What it does today
- Pairs with a desktop install or a self-hosted ohmail server: scan the QR from the desktop's Settings → Devices, paste a pairing link, or type the server address — over your LAN or a tailnet.
- Syncs mail into an on-device, per-account mirror and reads and triages it: Ohbox, Reads, Receipts and the Screener are live. Mark-read, screening decisions, releases and piles round-trip to your server and survive an app kill.
- Without a pairing it renders the built-in demo world, which makes no network requests.
Honest edges
- Search and Settings still render the demo world, even while paired — the screens say so in place.
- Compose/reply, tags and attachment-open are not live yet.
- ohmail.app (the managed service) does not offer device pairing yet.
- Sync is foreground polling plus pull-to-refresh; there is no push wake.
Install
Download ohmail-android.apk below and install it (your browser may ask you to allow the install). The APK is built and signed by this repository's own Actions from the tagged source; Android verifies later updates against the same signature.
This is a pre-release of the Android app only — it is not a desktop release.
ohmail 0.9.8
If you are on 0.9.7, download and install this by hand
0.9.7 quits a few seconds after you open it, on every platform, every launch. This release fixes
that. The crash happens before the app reaches its own update check, so a copy of 0.9.7 can never
fetch this release for itself — there is no version of waiting that works. Download the installer
for your platform below and install it over what you have. Your mail, your account and your settings
live in your data directory, not in the app, and reinstalling does not touch them.
On 0.9.6 or earlier, nothing is required of you. Those builds reach their update check normally
and will offer this release the way they always have. Only 0.9.7 is stranded, and only because it
cannot stay running long enough to ask.
The launch crash
- The app no longer quits at launch over the window's link and attachment permissions. 0.9.7
granted the window two commands — "open this link in your browser" and "open this attachment" —
without declaring either of them in the build's own manifest of what the app is allowed to do. The
framework resolves a window's permissions against that manifest while the window is being created,
and a permission it cannot find there is a failure it does not return from: these builds abort the
process instead. So the failure was total and immediate rather than partial and quiet, the same on
macOS, Windows and Linux, and unaffected by anything in your mailbox or your settings. - Both commands are now declared, and the grant is checked before the framework is asked for
anything: a permission the compiled manifest cannot resolve is dropped and named in the engine log
rather than handed over to be aborted on. A failed grant is also no longer treated as fatal — a
window short one command still draws, still has its menus, and still reaches the update feed. That
last property is what decides whether a release like this one can be delivered at all, so it is now
a behaviour with a test on it rather than a hope.
Mail on your own server
- A folder is no longer reported as fully downloaded when the server quietly held a message back.
A mail server may answer a request for a batch of messages with fewer messages than were asked for,
with no error and nothing marking which are missing. The download pass did not check: it compared
what came back against its own size limits, found neither reached, and concluded the folder had
drained — so a withheld message produced nothing at all, and the folder marker moved past it as
though it had arrived. A folder in that state looks finished to everything downstream, including
the mark that says a mailbox's first import is done. - What triggers it is a header the sender chose. A message identifier may legally be written as a
quoted string, and at least one large provider cannot assemble its summary reply for such a message,
so it omits the row rather than failing the command. Checked against a live account one command at
a time: search, flags, size, date and the full body all return the message. Only the summary does
not. - Because the body is available, the message is recovered rather than lost. Both download paths now
compare what came back against what they asked for and re-issue the shortfall without the summary,
reading the message identifier out of the raw headers instead. Anything still unanswered gets a
durable record written before any folder marker moves, and the marker is held where it is if that
record cannot be written. The targeted retry path had the same fault with a worse ending — it
treated a skipped message as deleted from the server — and is fixed with it.
Full detail in the changelog.