Skip to content

Releases: trafficflowhq/ohmail

android-v0.11.2

android-v0.11.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Aug 06:18

Android APK for android-v0.11.2. Built and signed by this repository's Actions from the tagged tree.

ohmail 0.11.1

Choose a tag to compare

@gillesgoetsch gillesgoetsch released this 25 Aug 05:48

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-v0.11.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Aug 20:32

Android APK for android-v0.11.1. Built and signed by this repository's Actions from the tagged tree.

android-v0.11.0

android-v0.11.0 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Aug 07:59

Android APK for android-v0.11.0. Built and signed by this repository's Actions from the tagged tree.

ohmail 0.11.0

Choose a tag to compare

@gillesgoetsch gillesgoetsch released this 21 Aug 15:56

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 through xdg-settings. Nothing writes the choice behind the
    platform's back — on Windows in particular the app never writes UserChoice, 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

android-v0.10.1 Pre-release
Pre-release

Choose a tag to compare

@gillesgoetsch gillesgoetsch released this 21 Aug 11:25

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

Choose a tag to compare

@gillesgoetsch gillesgoetsch released this 20 Aug 13:35

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 hidden ohmail/_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

Pre-release

Choose a tag to compare

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

android-v0.1.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

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

Choose a tag to compare

@gillesgoetsch gillesgoetsch released this 15 Aug 05:59

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.