Linus Rath
358bdb93ea
feat: bucket the contact index by any letter, add select-all/export, a shared-from drawer section and category rename
2026-08-29 18:04:47 +02:00
Linus Rath
8bf48f6465
docs: tick settings-store and updater items in the parity checklist
2026-08-29 18:04:44 +02:00
Linus Rath
431facef0b
feat: add update severity, quiet rate-limit backoff and lazy checksum fetch to the updater
2026-08-29 18:04:21 +02:00
Linus Rath
3d0d440673
refactor: drop dead mail layout, S/MIME and plugin controls from settings
2026-08-29 18:04:21 +02:00
Linus Rath
8deff66274
feat: validate settings on hydrate, align defaults with the webmail and add export/import/reset
2026-08-29 18:04:21 +02:00
Linus Rath
a071d0581c
feat: refetch filters and vacation on push and fan state changes out to screens
2026-08-29 18:03:24 +02:00
Linus Rath
6f747db858
fix: resolve redirects in JS for client-certificate requests and pass blob deadlines to the native path ( #627 )
2026-08-29 18:03:24 +02:00
Linus Rath
69bedf0b26
feat: manage public keys and encryption at rest through the Stalwart API
2026-08-29 18:03:23 +02:00
Linus Rath
ce97232eb2
fix: allow cleartext server URLs only on local hosts, name the mail domain as TOTP issuer and guard external links
2026-08-29 18:03:23 +02:00
Linus Rath
516c9c931a
fix: only drop exact role-folder name duplicates from the folder tree ( #771 )
2026-08-29 18:02:37 +02:00
Linus Rath
c8be383c05
fix: page the viewer over the list a unified-inbox message was opened from
2026-08-29 18:01:53 +02:00
Linus Rath
9ae91a6ab6
docs: tick the filters, vacation and files parity items
2026-08-29 18:00:36 +02:00
Linus Rath
c0e1d6b0a8
feat: files screen with search, sort, move/duplicate, multi-file upload progress, batch download, thumbnails and localization
2026-08-29 17:59:44 +02:00
Linus Rath
a0ce9258cd
feat: files API reads modified dates, decodes WebDAV names, copies/moves nodes and streams uploads ( #700 , #869 , #563 )
2026-08-29 17:59:44 +02:00
Linus Rath
1cef53af5a
feat: add contacts to groups from the detail sheet, dedupe group recipients and drop the UID when duplicating
2026-08-29 17:59:11 +02:00
Linus Rath
9800ad07c2
feat: rebuild the contact form around PartialDate, org cards, group editing and cleared-field patches ( #224 , #307 , #701 )
2026-08-29 17:58:54 +02:00
Linus Rath
3fd5f10afe
fix: gate event editing on calendar rights and keep read-only calendars out of the pickers ( #762 )
2026-08-29 17:57:54 +02:00
Linus Rath
edc26ce1ca
fix: reconnect live updates after network blips, token refresh, account switch and app resume
2026-08-29 17:57:33 +02:00
Linus Rath
032732cea1
fix: check the account-level Stalwart capability and keep the stored password in step after a change ( #47 )
2026-08-29 17:57:33 +02:00
Linus Rath
b52768e6fb
fix: keep the live session on a failed add or switch, recover from revoked sessions, refresh display names and sign in with a TOTP code ( #900 )
2026-08-29 17:57:32 +02:00
Linus Rath
e70e57bf47
docs: tick push notification items in the parity checklist
2026-08-29 17:54:17 +02:00
Linus Rath
f6f26f7950
feat: add push device list, re-register, onboarding prompt and an i18n key harvester
2026-08-29 17:53:59 +02:00
Linus Rath
00faceb25f
fix: subscribe to EmailDelivery only, use the relay's email ids and route pushes per account ( #45 )
2026-08-29 17:53:53 +02:00
Linus Rath
7f956d60f7
fix: reply to Reply-To, drop own addresses on reply-all, thread with the Message-ID and keep attachments on forward ( #234 , #703 )
2026-08-29 17:52:34 +02:00
Linus Rath
5dc40706fa
fix: send invitations with a server-scheduled organizer and match RSVPs against identities and aliases ( #731 )
2026-08-29 17:52:26 +02:00
Linus Rath
26a34d5900
feat: list shared address books, gate first-touch contact loads and add recent-recipient autocomplete data ( #907 )
2026-08-29 17:50:44 +02:00
Linus Rath
580e010b33
fix: check ContactCard/set results, re-fetch created cards, assign UIDs and paginate contact queries ( #644 )
2026-08-29 17:50:44 +02:00
Linus Rath
ccbe67c1bc
fix: check JMAP method errors in every mail call, split requests to server limits and file sent mail through Drafts ( #188 , #234 , #850 )
2026-08-29 17:49:23 +02:00
Linus Rath
506a4b1a84
feat: port the reply-recipient, subject-prefix, threading and mailbox-parsing helpers from the webmail
2026-08-29 17:49:23 +02:00
Linus Rath
b538a0e53d
feat: vacation responder sends UTC dates, edits an HTML body and is fully localized
2026-08-29 17:48:18 +02:00
Linus Rath
58a6f45c15
fix: save all-day events with the right length, a time zone and explicit nulls for cleared fields ( #805 )
2026-08-29 17:45:43 +02:00
Linus Rath
feb4affea6
docs: tick i18n locale items in the parity checklist
2026-08-29 17:44:22 +02:00
Linus Rath
3ffcef2ec1
feat: actionable vacation banner, expanded IF/THEN rule view and capability-gated filter tabs
2026-08-29 17:44:14 +02:00
Linus Rath
990cd84ee3
feat: add ICU interpolation, all 27 webmail locales and a key-parity test to i18n
2026-08-29 17:44:03 +02:00
Linus Rath
0b1c240802
fix: harden the JMAP client with request deadlines, retries, rate-limit state and method-error helpers ( #702 , #780 , #907 )
2026-08-29 17:42:32 +02:00
Linus Rath
2c0dbd15d1
fix: use a CSPRNG for OAuth state, TOTP secrets and UUIDs and validate handoff endpoints
2026-08-29 17:42:31 +02:00
Linus Rath
161baf1708
fix: edit or delete a single occurrence or the rest of a series instead of the whole series
2026-08-29 17:42:22 +02:00
Linus Rath
1c6aa680c5
feat: port the extended Sieve rules (attachment field, multi-value conditions) from the webmail
2026-08-29 17:39:43 +02:00
Linus Rath
e650cb2d0a
fix: import vCard dates as RFC 9553 PartialDate and map vendor X- extensions ( #224 , #701 )
2026-08-29 17:37:44 +02:00
Linus Rath
eb1dd6c844
feat: sort the mail list oldest-first or newest-first ( #5 )
2026-08-29 17:31:16 +02:00
Linus Rath
fb4796e188
ci: run typecheck and unit tests on push and pull request
2026-08-29 17:31:00 +02:00
Linus Rath
b84d4d8e9e
fix: mock netinfo in the vitest setup so the auth-store suite loads
2026-08-29 17:30:59 +02:00
Linus Rath
eaa8249e76
docs: add webmail parity checklist
2026-08-29 17:30:37 +02:00
Linus Rath
82b97fada4
chore: update version number to 0.1.58
0.1.58
2026-08-02 20:55:51 +02:00
Linus Rath
428a1bf03d
chore: update version number to 0.1.57
0.1.57
2026-08-02 20:54:30 +02:00
Linus Rath
09350dd1f0
refactor: polish sign-in flow UI and theme-aware QR scanner
2026-08-02 20:54:21 +02:00
Linus Rath
d2d13a37c9
fix: only say "Found your mail server" when discovery found it
2026-08-02 20:17:57 +02:00
Linus Rath
be82bfe814
feat: show shared mailboxes (group accounts) in the sidebar #37
2026-08-02 20:17:29 +02:00
Linus Rath
5c775ad82e
Merge pull request #31 from arnauda-gh/fix/swipe-action-desync
...
fix(ui): synchronize swipe action gesture handlers with latest props
2026-08-02 16:29:07 +02:00
Linus Rath
941e5ede12
refactor(ui): move swipe gesture decisions into a pure module
...
Keeps the fix — gesture handlers now read current props — but makes the
class of bug structurally impossible rather than patched case by case.
The PanResponder is created once, so its handlers closed over the props of
the render that built it. Four call sites had to be corrected individually,
and nothing stopped a fifth from being added stale. Now the decisions live
in swipe-gesture.ts as pure functions taking the config as an argument, so
there is nothing left for a handler to capture; the component keeps one
`latest` ref pointing at the current props and hands it over on each event.
Also:
- Replace the placeholder test, which asserted that assigning to a locally
declared `{current}` object works and passed against the unfixed
component, with 20 tests over the real gesture logic: claim/decline,
overshoot clamping, commit thresholds, flick velocity, reveal open/close
from an offset base, and the 'none' cases.
- Build the responder in a useMemo instead of re-running PanResponder.create
on every render of every visible row and discarding the result.
- Fold the four repeated Animated.spring calls into springTo/settle.
Beyond the reported symptom, the same staleness broke two more cases:
entering selection mode passes 'none' for both actions, but a swipe still
fired the old action; and onAction captured a handleSwipeAction from before
the mailbox ids resolved, so on a slow connection swipe silently did nothing
without anyone touching the setting — which matches the deeper problem
Arnaud suspected on the PR.
2026-08-02 16:28:48 +02:00