Skip to content

Releases

JMAPJolt-v0.25

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 06 Nov 15:14

Security & privacy

  • OAuth sign-in with real 2FA — Sign-in can now go through your server's own OAuth 2.0 + PKCE page
  • Expired sessions recover cleanly — A revoked or expired OAuth grant now returns to the login screen with the account prefilled instead of leaving a dead mailbox

Mail list & reading

  • Unread mail in Sent — Sent messages now respect their real read state
  • Email bodies no longer collapse — Messages built with full-height templates now grow to their full content
  • Search back behavior — Opening a result hides the keyboard immediately; Back returns to the results with the query intact, then leaves search in one press

Compose & drafts

  • Share files into a draft — JMAPJolt now appears in Android's share sheet for any file type, filling recipients, subject and body and attaching one or more shared files

Calendar

  • Calendar validation on save — Start and end times can be changed freely while editing; Save checks the range and shows the themed in-app pill without closing the dialog or losing what you entered

Sync & push

  • Connection banner — When mail can't refresh, a themed banner explains whether you're offline, the server is unreachable or slow, the secure connection or credentials failed, or you hit a rate limit, with Retry, Sign in and a local Details log
  • Back online feedback — A successful refresh clears the banner and confirms recovery with the app's themed pill
  • Clearer offline state — A folder that can't load now says the mail couldn't be loaded instead of appearing empty
  • More reliable UnifiedPush — Registration now retries through transient failures and endpoint rotations, and Settings shows whether push is pending, verifying or failed instead of leaving it silently inactive
  • Notifications for sorted mail — On servers that support delivered-message push, mail filed into Archive or custom folders now triggers a notification instead of being missed
  • No battery prompt on launch — The battery-optimization request appears only when you enable Direct server push or allow background activity, and declining turns Direct server push off instead of leaving it degraded

Folders & selection

  • Unread and total counts in the drawer — Every category shows unread/total, with the unread number bold and accent-colored; the counts can be turned off in Display settings
  • Edit labels and folders from the drawer — Long-pressing a label or subfolder reveals a pencil that opens its edit dialog without leaving the drawer

Accessibility & UI

  • Settings index — Settings now opens on a clean index for Account, Display, Notifications, Calendar and Contacts, each with a short summary and a themed icon
  • Back follows your path — Back now walks through the folders, Calendar, Contacts and Settings you visited instead of jumping straight to the inbox, and only leaves the app when that history is spent

Performance

  • Cheaper cache writes — Marking mail read, starring or moving it now rewrites only the folders that changed instead of every cached folder

JMAPJolt-v0.24

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 20 Oct 22:18

Mail list & reading

  • Wide messages fit the screen — Fixed-width and plain-text emails used to overflow into a tiny sideways-scrolling column; they now shrink to your screen width
  • Video attachments play from the device — Videos play from a cached local copy instead of streaming from the server, so playback no longer stalls or refuses to seek
  • Conversations can be turned off — A Settings switch lists every email individually when grouping gets in the way

Compose & drafts

  • Recipients inline — To, Cc and Bcc sit in compact rows in the compose screen, with a menu to show each field

Calendar

  • Real times across the clock change — On daylight-saving days event blocks used to sit at the wrong wall-clock hour; day and week views now keep events on real time

Contacts

  • Steadier avatar editor — The avatar crop is full-screen with stable pinch and pan, so zoom gestures no longer fight the crop area

Sync & push

  • UnifiedPush only, no background polling — The 15-minute fallback sync is gone: new mail arrives instantly through UnifiedPush, so there is no periodic check draining battery in between
  • Onboarding as light as the sync — The background-activity step only appears when notifications rely on the built-in stream; with a UnifiedPush distributor installed (ntfy, …) there is nothing in this app that needs the battery exemption

Accessibility & UI

  • New app icon — JmapJolt gets new artwork

Performance

  • Cheaper calendar frames — Day and week views cut their per-frame allocations while scrolling

Under the hood

  • Toolchain and libraries refreshed — AGP 9, Kotlin 2.4 and Gradle 9.8, with UnifiedPush connector 3 and JMAP client 0.9 migrated

JMAPJolt-v0.23

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 14 Sep 23:49

Security & privacy

  • Push credentials stay on the server — While looking for the push endpoint, a redirect is only followed to the same server, so your login is never replayed to another host

Mail list & reading

  • Previews from the real message — Once a message has been downloaded, its list preview is rebuilt from the message text itself.
  • Previews survive syncs and restarts — A downloaded message and its preview are kept in the offline cache. The next background sync used to put the server snippet back and drop the message from the cache
  • Unread dot — A small accent dot sits right before the time of every unread message
  • Clean sender names — Addresses glued onto a display name ("Acme 'support at acme.example'") are trimmed, so the list, the detail header, widgets and notifications show just the name
  • No stray > at the top of messages — Some HTML emails used to open with a lone > character before their content

Calendar

  • Short events stay readable — Events shorter than 30 minutes show just their colored block in day and week views instead of cramming a clipped title. Tap the block to see the title

Contacts

  • Tonal add button — The contacts "+" button uses the same tonal style as the compose button

Sync & push

  • Push on more servers — Real-time push now connects on servers where login went through /.well-known/jmap. The app used to look for the push endpoint in the site's home page instead of the JMAP session, and never received new mail in real time
  • Fallback when push can't start — If the server never provides a push endpoint, the app falls back to periodic sync instead of retrying forever while new mail waits

Accessibility & UI

  • Bottom navigation — Mail, Calendar, Contacts and Settings are one tap away in a bottom bar on every main screen, and the drawer now lists only mail folders.
  • Neutral theme grounds — Top bars, the drawer and its account block sit on the theme background instead of a solid accent block, and the accent is kept for actions and selection, in all four themes
  • Tonal compose button — The compose button uses a soft accent-tinted surface with an accent icon instead of a solid accent fill
  • Widgets follow the theme — Inbox and calendar widgets use the app's theme colors with neutral headers. Inbox widget rows show unread mail like the app list, with a bold subject and an accent dot
  • Unified inbox only when it means something — The unified inbox is offered only with two or more accounts. A widget set to unified falls back to the remaining account instead of showing a one-account "Unified inbox"

Performance

  • Instant tab switching — Coming back to Mail no longer re-downloads the folder, and Calendar and Contacts no longer redraw everything and hit the server on every visit.

JMAPJolt-v0.22

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 05 Sep 18:20

Security & privacy

  • New HTML sanitizer — The email sanitizer is now a jsoup parser-based allowlist instead of a regex chain: markup is parsed and rebuilt from permitted elements and attributes, so a malformed tag can no longer smuggle a handler past a pattern
  • Blocked remote content stays blocked — With image loading off, the WebView now refuses every sub-resource request, not just images: CSS, fonts and media can no longer phone home and act as read receipts
  • Favicons never touch the sender — Sender icons are fetched only through the DuckDuckGo proxy. The parallel direct request to https://<sender-domain>/favicon.ico is gone: it handed the sender your IP address and confirmed the address was live the moment a message appeared in the list
  • Unauthenticated push is never rendered — A push payload that fails WebPush decryption no longer produces a notification; the app syncs and shows what the server actually confirms
  • Release logs carry nothing sensitive — Debug, verbose and info logging is stripped from release builds, and the warnings and errors that do ship log only a host or a masked domain, never a push endpoint, session URL or full account address
  • Attachment cache expires — Files staged for sharing or opening in another app are cleaned up instead of sitting in the cache directory indefinitely
  • Server URL handling — A bare or non-HTTP scheme entered at login is rejected instead of being coerced into a request; credentials still travel only to same-origin HTTPS

Mail list & reading

  • Cleaner previews — Body previews strip stylesheets and layout junk, so a message that opens with a <style> block no longer previews as CSS
  • Full-bleed favicons — Sender icons fill the whole avatar circle instead of floating inside a padded ring, and decode at a resolution that stays sharp
  • Configurable mark-as-read delay — Instant through 60 seconds, or a custom value
  • Undo — Archive, spam and trash can be undone, from both the swipe and the detail view
  • Accurate new-mail notifications — Only genuinely new mail notifies; a message moved back into the inbox no longer announces itself as new

Compose & drafts

  • Drafts survive a background sync — Body, recipients, Cc, Bcc and attachments are preserved across a sync and a re-edit
  • Draft identity — A locally created draft reconciles with its server id after saving, so reopening it loads the real body and attachments

Sync & push

  • Foreground-service timeout — When the dataSync foreground budget runs out, the SSE service stops cleanly and falls back to the periodic worker instead of being killed
  • No duplicate polling — The periodic worker is cancelled once SSE connects, and re-enabled after repeated SSE failures

Folders & selection

  • Folder rename — Renames now propagate correctly over JMAP
  • Bulk spam toggle — Mark or unmark spam for a whole selection
  • Smarter swipes — Archive and spam swipes are disabled on an email already in that folder

Accessibility & UI

  • Screen reader support — Every icon carries a label
  • Touch targets — Interactive elements meet the 48dp minimum
  • Reduced motion — Animations respect the system setting
  • Type scale — Text sizes moved into dimens, so the app scales consistently
  • Contextual empty states — Each folder explains its own emptiness
  • Haptics — A tick on a committed swipe and on entering or leaving selection mode
  • Theme tokens everywhere — Colors come from one semantic token set; hardcoded hex is gone from the layouts, the email detail WebView and the in-code dialogs, so all four themes (Legacy, Snow, OLED, Iris) stay consistent
  • Swipe surfaces — Grey no longer leaks through behind the detail and row swipe backgrounds

Performance

  • Faster infinite scroll — The mail list asks the server for the next page by position and appends it, instead of re-querying the folder from zero with a bigger limit. Reaching page five used to re-download the four pages already on screen
  • Lighter list queries — List rows no longer pull message bodies; the body is fetched when an email is opened
  • Cheaper cache writes — Starring or archiving one message used to rewrite every cached folder, full bodies included. Only the folders that actually changed are written now, and a burst of swipes is coalesced into a single write
  • Faster cold start — The one-off WebView cache purge no longer starts Chromium on every launch, encrypted preferences warm up off the main thread, and the encrypted cache database is built off the main thread
  • Smoother list updates — When the contact photo index lands, only the visible rows are repainted instead of the entire list

Under the hood

  • One HTTP stack — Mail, SSE, calendars, contacts and favicons share a single OkHttp client with explicit timeouts and one connection pool, replacing four separate clients and two raw HttpURLConnection call sites
  • Unit tests — 78 JVM tests now cover the HTML sanitizer, WebPush decryption, server URL trust and normalization, quote collapsing, preview cleanup and domain parsing
  • Smaller source files — The largest files were split along feature lines, with no behavior change

JMAPJolt-v0.21

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 08 Aug 15:44

Contacts (new)

  • Address book — New Contacts panel backed by two sources at once: JMAP (JSContact ContactCard) and contacts synced by DAVx5 into the system provider
  • Contact photos — Photos sync as JSContact media data URIs (JMAP) and ContactsContract blobs (DAVx5), and show up in the address book rows, the email list (a known sender's photo beats the domain favicon) and the compose recipient picker
  • Contact editor — Full editor for names, emails, phones, organization, addresses, categories and notes
  • Multi-select — Select several contacts to delete or share at once, with A–Z index letters down the list
  • vCard import/export — New Contacts category in Settings: import .vcf files and export the whole address book
  • Recipient picker — Compose offers a searchable contact picker
  • Backend scope — New "Show" setting: Both / Only JMAP / Only DAVx5. With an "only" choice the All/JMAP/DAVx5 chip bar disappears and the new-contact editor drops the "Save to" picker, saving straight to the pinned backend

Calendar

  • Time format — System default / 24-hour / 12-hour (AM/PM)
  • Time zone — Automatic or an explicit zone
  • Fixed all-day events — Corrected RFC 5545 duration parsing; all-day events now render in their own band instead of distorting the timeline

Search & folders

  • Create folders from the folder editor — Accent "+ Create new folder" row at the bottom of the Edit folders dialog
  • Fixed deleting non-empty folders — Mailbox/set destroy now passes onDestroyRemoveEmails; without it servers refused to destroy any folder still holding mail
  • Restore trashed mail from search — The top-right action now follows the selected email's own origin folder instead of the folder you searched from, so a trashed hit offers "Move to Inbox"; mixed selections apply the right action per email
  • Permanent delete from search — Deleting a hit that already sits in Trash asks for the permanent-delete confirmation, and no longer overwrites the Trash cache with whatever list was on screen
  • Search from other tabs — Typing in the search bar from Settings brings the mail list forward instead of filtering a hidden one.

Accounts & login

  • App passwords — Supported, with typed auth errors that tell wrong credentials apart from server and network failures
  • Account section in Settings — Profile row (avatar, nickname, address) with "Edit name and avatar" and "Add account", mirroring the drawer; the account color dot and swatch only appear with 2+ accounts
  • Floating-label outlined inputs — Login and add-account fields redesigned, theme-aware across all themes

UI

  • Settings spacing — Row dividers removed in favor of uniform 10dp spacing

Security

  • Hardened vCard import — Imported PHOTO payloads capped at 5 MB of base64, and .vcf files read through a bounded reader that rejects anything past 20 MB instead of slurping the stream into memory
  • Export cleanup — Previously shared .vcf files are cleared from the cache directory before writing a new one, so exported contact data doesn't linger on disk
  • HTML sanitizer fix — The unquoted on*-handler strip regex now allows whitespace around =, closing an onclick =value bypass

Compatibility

  • 32-bit ARM devices — New armeabi-v7a APK alongside the existing arm64-v8a one; pick the file matching your phone

JMAPJolt-v0.20

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 31 Jul 14:11

Search

  • Cross-folder search — Search now defaults to scanning every folder and subfolder ("All" scope) instead of just the current one, with subfolder chips added to the scope bar
  • Origin badges — Search results from a subfolder show a small colored folder icon matching that folder's assigned color
  • Search bar redesign — The search bar now shows the current folder name (Inbox, Favourite, labels, etc.) instead of a static "Search mail" label; tapping it starts a search with an animated "Searching." → ".." → "..." hint until you type
  • Keyboard fixes — Back arrow now reliably dismisses the keyboard even right after the search input is hidden

UI redesign

  • Settings screen — Modernized to Material 3 grouped-list cards, theme-aware background per Iris/OLED/Snow theme instead of one fixed gray
  • Sidebar/drawer — Modernized to M3 pill styling
  • In-app toasts — Pill-shaped M3 toasts for move/archive/junk actions
  • Compose screen — Fixed Iris theme showing a plain dark-gray background instead of the theme's violet tone
  • Email detail title bar — Now collapses in a smooth 1:1 scroll-linked slide (follows the page instead of snapping away past a threshold)

Reliability & sync

  • Foreground SSE — While the app is open, email updates now arrive instantly via a direct SSE connection instead of waiting for the next 10s poll
  • Smarter polling — The fallback poll now checks a lightweight per-account state token first and only runs a full refetch when something actually changed, cutting idle network traffic significantly
  • Fixed a crash — Background sync service could crash on Android 15 when its foreground-service time budget ran out; it now degrades gracefully instead
  • Fixed calendar reminders — Reminders stopped firing after the app had been running a long time

Storage

  • Reduced cache footprint — Capped the email detail WebView's disk cache (previously growing unbounded) and removed the old duplicate flat-file email cache in favor of the single encrypted Room store

JMAPJolt-v0.19

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 21 Jul 19:34

JMAP subfolders, faster list updates, and a smarter cross-folder search.

Subfolders

  • Subfolder support — User-created mailboxes now appear in the drawer
  • Scoped browsing — Emails fetch and display scoped to a subfolder, with a stable offline cache keyed by the server's mailboxId
  • Drag-to-reorder — Subfolders can be dragged to reorder within their own section; order persists per account
  • Manage Folders — New Settings → Labels → Manage Folders screen: rename (local display override), recolor via hue wheel, reorder, and delete
  • Live mailbox refresh — Mailbox list re-fetched each sync cycle (diffed by id/name/parent/role, not list order) so new or renamed folders appear promptly without fighting a local drag reorder

Search

  • Subfolder chips — Scope chips now include every subfolder alongside Inbox/Favorite/Archive/Sent/Trash
  • Origin badges — Search results from a subfolder show a small colored folder icon matching that folder's assigned color
  • Smarter background warm-up — Folders/subfolders not yet opened this session are pulled from the offline cache in the background so "All" search actually covers them
  • Search stays open on auto-refresh — Periodic background sync no longer resets an active search back to the plain inbox view
  • Keyboard behavior fixed — Enter/search action now dismisses the keyboard; back press dismisses the keyboard first, then exits search on a second press; a back-arrow icon (replacing the menu icon while searching) exits search directly

Bug Fixes

  • Fixed a crash (Called attach on a child which is not detached) that could occur while searching or right after a background sync
  • Fixed a stale "›" conversation-thread indicator leaking into search results and reappearing after exiting search
  • Fixed calendar reminders never firing for DAVx5/provider-synced events (scheduler was reading the wrong store, and reminder times weren't read back from the calendar provider)

Performance

  • Row updates for read/favorite/label toggles now patch only the changed rows instead of rebinding the entire list

JMAPJolt-v0.18

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 27 Jun 09:26

Calendar widget, threading improvements, notification reliability and security hardening.

Calendar Widget

  • Agenda widget — Added a home-screen widget displaying upcoming calendar events
  • Auto-refresh — Widget automatically refreshes 30 minutes after an event ends so past events disappear without manual action
  • Tap navigation — Tapping a widget event navigates directly to the related email

Threading

  • Subject-based threading — Replies and forwards (Re:/Fwd:) now group under the same conversation even when the server assigns different thread IDs
  • Paged expansion — Long threads expand page by page instead of loading all messages at once

Notifications & Reliability

  • Battery optimization prompt — App now requests exemption from battery optimization on first sync so OEM battery killers cannot terminate the background service
  • SSE streaming fix — Push notification service now correctly receives server-sent events in the background; the previous implementation buffered the stream and never delivered events
  • SSE wakeup fix — Push notification service now restarts correctly when the device is in deep sleep
  • SSE reconnect fix — SSE loop no longer permanently stops for an account after a transient network error; retries with exponential backoff instead
  • Per-email notifications — Each new email now appears as a separate notification; multiple arrivals accumulate instead of replacing each other
  • Notification sender name — Notification title shows a friendly sender name (display name, or the domain label when the local-part is generic
  • Notification body — Subject line (Re:/Fwd: prefixes stripped) followed by the message body; forwarded headers, quoted lines, leaked CSS and URLs are removed from the preview
  • WorkManager interval corrected — Fallback polling interval corrected to 15 minutes

Settings & UI Refinements

  • Debug mode toggle — Hidden switch in Settings → Information shows/hides the debug status bar
  • Improved debug messages — Status bar messages now include [HH:mm:ss] timestamps, folder name and email count at a glance
  • Theme-aware switch effects — Debug mode toggle ripple and aura effects follow the selected accent color
  • Favicon confirmation — Favicon toggle now asks for confirmation before enabling, explaining the external DuckDuckGo service used

Performance

  • APK size — Reduced ~36% via R8 minification and resource shrinking
  • Memory — Favicons downsampled to max 96px to reduce memory usage
  • Build — Cache and parallel compilation enabled for faster build times

Bug Fixes

  • Fixed CancellationException being swallowed in sync worker and JMAP client, causing stuck retry chains
  • Fixed crash on fast email swipe gesture (null pointer dereference)
  • Fixed SSE service restart alarm firing late under Doze mode (setExactAndAllowWhileIdle replaces inexact alarm)
  • Fixed SSE service not restarting when killed while the app was backgrounded

Security

  • URL validation now checks port matching in addition to scheme and host
  • Push notifications on lock screen no longer show email content preview
  • Account email address redacted from debug logs

JMAPJolt-v0.17

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 23 Jun 18:12

Chat-style conversation threading in the email list, encrypted offline cache, and infinite scroll.

Conversations

  • Threaded list — Emails are grouped into conversations by JMAP thread; a thread collapses into a single head row instead of repeating every message
  • Thread pill — Head rows show an accent pill (message count + reply icon) aligned to the date line
  • Expand/collapse — A slim accent chevron beside the favicon expands a conversation; replies render indented like a chat
  • Cross-folder — Replies you sent (in Sent) attach to the received message via JMAP Thread/get

Performance & Storage

  • Encrypted offline cache — Emails are cached locally with Room + SQLCipher for fast, offline-first opening
  • Infinite scroll — Removed the 50-email cap; the list pages in more messages as you scroll

JMAPJolt-v0.16

Choose a tag to compare

@FalseEnvironment FalseEnvironment released this 20 Jun 12:51

Full calendar app (JMAP & DAVx5), drawer-based account management, and JMAP interoperability fixes.

Calendar

  • Full calendar — New Month, Week, Day and Agenda views, each fitting a single screen
  • Drawer integration — Calendar lives in the navigation drawer (under Trash) and opens in-app, keeping the account drawer available
  • Events — Create, edit and delete events with per-event reminders (notification N minutes before) and daily/weekly/monthly/yearly recurrence
  • Themed editor — Floating-style dialog with rounded inputs, accent toggle and themed reminder/repeat dropdowns

Calendar Navigation & UX

  • Finger-drag paging — Drag to move between periods: vertical for Month, horizontal for Week and Day, with the next period following your finger
  • Current-time line — Accent-colored "now" indicator in Week and Day views
  • Overflow menu — Go to… (date picker), Import .ics, and Add CalDAV account

Calendar Providers

  • Provider selection — Choose between JMAP Calendar and DAVx5 (CalDAV) from a themed dropdown
  • Enable toggle — Turn the calendar on or off; when off it is hidden from the drawer
  • DAVx5 integration — Reads and writes through the system calendar; a button launches DAVx5 (with F-Droid fallback) and shows the connected account
  • JMAP sync — Native JMAP calendar sync with local caching and recurrence expansion
  • Onboarding permission — Optional Calendar permission added to the onboarding screen, themed and explained

Cleanup

  • Streamlined accounts — Removed the standalone Accounts settings tab; account management now lives entirely in the navigation drawer