Built a native JMAP Android client that works with Stalwart: Sterna Mail (FOSS)

Hi all,

So I’ve been running Stalwart for a while now and I love it (migrate from Mailcow after several years), and the one thing that kept bugging me was the Android side: there’s basically no polished email client that speaks JMAP natively. You end up falling back to IMAP and missing the whole point. So… I ended up building one.

It’s called Sterna Mail. It’s a private, FOSS (GPLv3) Android client built for JMAP first with full IMAP/SMTP too, so you pick the protocol when you add an account. On a JMAP server like Stalwart you get the nice stuff: fast incremental sync, push without any Google services, less battery/data. No ads, no tracking, no analytics, nothing from Google in there.

A few things it does:

  • Multiple accounts + unified inbox (mix JMAP and IMAP/SMTP if you want)
  • Push for new mail (JMAP push, and IMAP IDLE for the legacy accounts)
  • Offline cache, conversation threading, search
  • Compose with attachments, drafts, signatures, schedule send + undo send
  • Proper HTML rendering
  • Folders, flags, archive, report-spam, configurable swipe actions
  • Remote images / tracking pixels blocked by default, biometric app lock
  • Material 3, follows your system light/dark theme, 9 languages

I test it against Stalwart myself (mail.* on my own box), so it’s not theoretical, it’s what I use daily. That said it’s young, and I’m sure there are JMAP edge cases I haven’t hit. If you run Stalwart and try it, I’d genuinely love bug reports.

Install right now via the APK on Codeberg (works nicely with Obtainium for auto-updates). It’s also in review for F-Droid at the moment.

Anyway, happy to answer anything, and thanks to the Stalwart folks for the server, it’s been a joy to build against. :bird:

emon

PS: here’s a screenshot:

1 Like

Congrats! Make sure to add your client to jmapio.github.io/pages/software.liquid at master · jmapio/jmapio.github.io · GitHub

Hi Emon. I was waiting for F-Droid to approve your app. I installed it yesterday and it works well. Nice of you to thank the K-9 (Thunderbird). I was using Thunderbird and now I have it on hold as I am using Sterna Mail.

One suggestion: add the “show headers” like in Thunderbird to see authentication, x-spam etc., to check legitimacy of email.

Big Thank you for creating this app. We needed an Android JMAP app.

Merci!

Thank you! This kind of message is really encouraging and helpful for me. Yes there are some improvements and bug fixes I need to care of. I was hoping to ship detailed header view in next release and this should be dooable within a week or so. I dont know how long frdoid team pushes updates but it should land probably within the next 10 days.

Don’t hesitate to provide more input on feature requests or bug reporting here or on codeberg.

Cheers

Hi,

Nice app. I just installed and worked flawlessly in connecting to my account.

Very nice to see Vacation responder and Filters.

What is missing (you asked for feature requests :slight_smile: )

  • I’m not seeing group mailboxes
  • Calendar

Congratulations,

Andrei

Hello,

Group mailboxes are available as sort of unified inbox. First item bellow the account line in the main drawer menu.

Calendar is currently out of scope, as it would be a very heavy feature. But if enough people wants it I might reconsider the scope.

Thanks for the feedback​:ok_hand:

Thanks for developing and sharing. I’m happy to try this.

That would be brilliant email client if you’ll add support for web push via sunup unified push distributor

P.S. Thx for reproducible builds

Sterna Mail 1.2.0 – bro, are you serious? :star::star::star::star::star:

P.S. Doesn’t work with sunup though. Is it due to mandatory VAPID on mozilla web push?

P.P.S. Doesn’t work with ntfy either

Hello,
About sunup: you are right. sunup delivers through Mozilla’s Web Push, which requires VAPID, meaning the mail server has to sign each push with a VAPID key and the subscription is created with its public key. Sterna will use a VAPID key when the JMAP server advertises one (the webpush-vapid session capability), but Stalwart does not expose one yet, so on a Mozilla-backed distributor there is no server key to register with. That one needs VAPID support on the Stalwart side; nothing the client can do alone.

ntfy is a different story, because it does work here: I tested it against Stalwart with the app closed and mail arrived in a few seconds, and another user just confirmed it on /e/OS with a self-hosted ntfy. So something specific to your setup is getting in the way. A few things would help me pin it down: which Stalwart version you run, whether your ntfy is ntfy.sh or self-hosted, and what the account’s status line shows under the notifications switch in Settings (either “Push: UnifiedPush (ntfy)” or a fallback to checking every 30 minutes). If you can grab a logcat around the moment you open the app, that would settle it quickly.

I can help you from here no problem, but If you have a Codeberg account, don’t hesitate to open an issue on the repo, it’s easier for me to manage support there, and this keep this topic open for more general questions.

Yeah, I’ve seen issue on codeberg after posting here and saw your communication with other user, who requested up beforee :wink: I’ll continue in that issue, however just to let other know: I’ve tested ntfy.sh, ntfy.yourdevice.ch and ntfy.adminforge. de on grapheneos, hyperos using stalwart hosted on mailbuxcom and reeva me. it’s saying push connecting… then direct connection

edit: most likely issue caused by stalwart managed providers vlocking web hooks

edit2: UnifiedPush works! :star::star::star::star::star:

A quick follow-up for the two of you who asked for something here.

@mailcowboy, the header view landed in 1.3.10: open a message, then “View headers” in the three-dot menu. It shows the raw headers, so authentication results and spam scoring are there to check.

@andreim, shared and delegated mailboxes have been handled properly since 1.4.0. If your login has access to someone else’s mailbox, or you run several accounts on the same server, each one now appears in the drawer with its own folders, its own notifications and its own Sent copies, and a reply goes out as that mailbox rather than as your login. My earlier answer pointing at the unified inbox was the workaround, this is the real thing.

Both of those came out of this thread, so thanks for the reports.

Confirm that is working. As I note if I have 2 accounts which are members in the same group that group is appearing twice.

Great work, thanks.

1 Like

emom - I can’t believe how you are able to put so much in 4 MiB app. Thank you for adding the “view headers” feature. It is working perfectly. I deleted Thunderbird from my Android phone and just use Sterna Mail now. I recommend Sterna Mail to Stalwart mail server users.

My setup is complete: Stalwart Mail (server), Bulwart Webmail (pc) and Sterna Mail (Android).

The programmers on contributors of these tools are on a whole different level. Thank you!

God bless!

1 Like

@andreim, thanks, I had not tried that combination. I will reproduce it here and follow up.

@mailcowboy thanks :slight_smile: