Commit Graph
360 Commits
Author SHA1 Message Date
Linus Rath ae412e0cda feat: show notifications, the command palette and the account avatar in every app's phone header 2026-10-28 03:05:41 +01:00
Linus Rath 6e97ca574d fix: make switches that are off visible against the page 2026-10-28 01:50:56 +01:00
Linus Rath c355b0d552 feat: add a setting to turn off the placeholder warning 2026-10-27 22:32:38 +01:00
Linus Rath 8940f45baa fix: apply a custom calendar color picked in the system color dialog #1366 2026-10-26 20:01:09 +01:00
Linus Rath 4bfaf8abce Merge pull request #1363 from lucamzanon/feat/account-archive-restore-prompt 2026-10-26 19:26:13 +01:00
Linus Rath e99cce05fe Merge pull request #1370 from maxhaomh/feat/disable-quick-reply 2026-10-26 19:24:49 +01:00
Max Hao 7216089629 feat: add quick reply feature with toggle in settings and tests 2026-10-26 11:40:47 -04:00
Linus Rath 7da326b86e fix: keep the server's path in the fallback CalDAV address 2026-10-26 15:15:58 +01:00
lucamzanon 2f8c6e13bf feat: offer to restore the saved account list on a new device
Part 3 of 3 of the account archive (#1198). Signing in on a browser that
knows no other account, with a list saved for that account, opens a dialog
asking for the backup password and restores the list as Settings does.
Not now hides the offer for that account in this browser; the restore
stays in Settings.
2026-10-26 12:23:18 +01:00
Linus Rath cf2c27157d Merge branch 'main' into feat/stalwart-1.0
# Conflicts:
#	components/contacts/contacts-app.tsx
#	components/email/__tests__/composer-discard.test.tsx
#	components/email/calendar-invitation-banner.tsx
#	components/email/email-composer.tsx
#	components/mail/mail-app.tsx
#	components/pro/pro-compose-tab-body.tsx
#	components/pro/pro-email-tab-body.tsx
#	components/ui/__tests__/avatar.test.tsx
#	components/ui/avatar.tsx
#	hooks/use-mailbox-drop.ts
#	lib/__tests__/calendar-alerts.test.ts
#	lib/__tests__/jmap-calendar-tasks.test.ts
#	lib/__tests__/jmap-send-threading.test.ts
#	lib/demo/demo-client.ts
#	lib/demo/fixtures/calendars.ts
#	lib/jmap/client-interface.ts
#	lib/jmap/client.ts
#	lib/web-push.ts
#	stores/__tests__/contact-store.test.ts
#	stores/__tests__/email-store-thread-key.test.ts
#	stores/calendar-store.ts
#	stores/contact-store.ts
#	stores/email-store.ts
2026-10-26 10:14:12 +01:00
Linus Rath f7a4087c91 feat: split the Mountain View inbox into Unread and Everything else, as Gmail's unread first 2026-10-25 13:13:46 +01:00
Linus Rath cb663d2222 fix: keep settings switches full width next to long labels 2026-10-25 12:49:55 +01:00
ghoztyandClaude Opus 5.5 30f51e5ca4 feat: name the app with the configured APP_NAME in user-facing strings
Some user-facing strings still said "Bulwark" on a deployment with its own
APP_NAME: Settings > General > Default apps (protocol handlers), the "Open
Bulwark" notification, the rate-limit banner and toast, the plugin connect
dialog, one plugin permission text and the connector page.

These strings now take an {appName} placeholder, filled by productName():
the configured APP_NAME, or "Bulwark" when it is unset or the default
"Webmail" (the same rule as the TOTP issuer and the About card, #1160).
A stock install reads as before.

The settings search (the settings page and api.app.searchSettings) indexes
these texts with the name filled in, so "bulwark" or the configured name
finds Default apps and no result carries the raw placeholder.

Locales: the 13 keys in every locale that has "Bulwark" in them. Languages
that inflect the name (cs, et, hu, ko, ro, sk, tr) use a neutral form such
as "{appName} uygulamasında" instead of a declined "Bulwark'ta"; a native
check of those is welcome.

Not changed on purpose: the mobile app, push relay, Lite, demo and admin
texts, which speak about Bulwark itself.

Closes #1314

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 04:14:54 +03:00
Linus Rath fdf448d0b7 fix: give the calendar, contacts, files and settings sidebar headers the mail header's height 2026-10-19 20:59:44 +02:00
Linus Rath 39857a4dac fix: make the settings search box look like the mail search box 2026-10-19 20:57:59 +02:00
Linus Rath 31f4a4b4b3 feat: show one row of themes with a show all button 2026-10-19 20:49:24 +02:00
Linus Rath f5aa338556 refactor: give every settings page section an anchor for the jump row and links 2026-10-19 18:19:28 +02:00
Linus Rath 401d49471e feat: let settings links name a section and add a jump row to each page 2026-10-19 18:14:01 +02:00
Linus Rath a615f96876 refactor: regroup the settings sidebar into mail and apps with plugin pages under add-ons 2026-10-19 18:07:48 +02:00
Linus Rath dc521e11ca refactor: combine sidebar apps and plugins into add-ons, about and debug into backup and reset 2026-10-19 18:03:42 +02:00
Linus Rath 0b3bd26c9c refactor: fold download naming into reading as an advanced section 2026-10-19 17:59:30 +02:00
Linus Rath f8aca5bb25 refactor: put folders and tags on one page 2026-10-19 17:57:38 +02:00
Linus Rath c57f82f0a7 refactor: group composing into sections and fold templates and a signatures link into it 2026-10-19 17:55:12 +02:00
Linus Rath a591ae0683 refactor: merge language, default apps and the tour into a general page 2026-10-19 17:51:26 +02:00
Linus Rath 58f968a48c refactor: lead notifications with new mail, move the tab badge in and invitation parsing to calendar 2026-10-19 17:48:57 +02:00
Linus Rath d86aa1d12b refactor: group security into sign-in, other apps and devices, and encryption 2026-10-19 17:46:42 +02:00
Linus Rath b1fa88841d refactor: move identities, sub-addressing and multi-account options onto the account page 2026-10-19 17:44:11 +02:00
Linus Rath 5b1d056eef feat: split the message list out of reading and fold content and senders into it 2026-10-19 17:40:52 +02:00
Linus Rath 1025c1973d refactor: fold the layout and themes tabs into appearance as sections 2026-10-19 17:33:39 +02:00
Linus Rath 988416aa3d feat: add an advanced switch that hides power-user settings until turned on 2026-10-19 17:20:38 +02:00
Linus Rath 4c0017d0c1 feat: rework the demo around one persona with two accounts and a shared mailbox
The demo user becomes Nora Lindqvist, engineering lead at Meridian Labs,
in the week of a product launch. The fixtures tell one story across mail,
contacts, calendar, tasks and files, and exercise the features the
screenshots and the public demo should show:

- a second, mail-only login (her personal domain) and the shared Support
  mailbox delegated to the work account, so the account switcher, the
  shared section and the merged inbox have real content
- raw headers the way Stalwart writes them: the sender check fails on
  the phishing mail, newsletters carry a one-click unsubscribe, one mail
  asks for a read receipt, and spam scores show in the details
- an iMIP invitation with a served .ics, an event waiting for the answer
  on the calendar, and RSVP patches applied in the demo client
- @mentions as mailto links in a received mail, a verification code
  twelve minutes old, nested folders, named tags on the mail, contact
  groups, a scheduled message and tasks switched on
- every attachment and file backed by real bytes under public/demo,
  generated by `scripts/demo-assets/generate.mjs`; contact photos are
  bundled portraits instead of requests to randomuser.me
- folder counts computed from the mail instead of hand-kept numbers

Demo login seeds the tags, templates and merged-inbox settings once per
device and switches the cross-account gate on for the session; "Reset"
restores them. `bulwark-demo-simulate=off` in localStorage stops the
simulated incoming mail for screenshot runs.
2026-10-18 19:48:11 +02:00
Linus Rath 0ac7bcb385 feat: show the message list as columns with one-line conversation rows #262 2026-10-18 17:37:21 +02:00
Linus Rath 8791fa5176 feat: offer contacts in @ mentions and add the picked one as a recipient 2026-10-18 16:36:28 +02:00
Linus Rath 4fa22200e7 fix: keep vacation forwarding and plugin vetoes when a tag rename rewrites the filters #854 2026-10-18 15:03:20 +02:00
Linus Rath 45840e722a Merge pull request #854 from dev-hive-kazniisa/fix/keyword-rename-sieve-sync
fix: renaming a tag leaves filter rules tagging under the old id
2026-10-18 15:02:15 +02:00
Linus Rath 100da43991 Merge pull request #1247 from lucamzanon/feat/account-archive-passwords
feat: optionally keep mailbox passwords in the account list backup
2026-10-18 14:34:31 +02:00
Linus Rath 58eff0e879 Merge pull request #1258 from HOLOEYE-JZ/feat/archive-feature-gate
feat: admin policy gate to turn off archiving #1257
2026-10-18 14:29:27 +02:00
Linus Rath 8e7245b26c feat: let the theme policy set and lock the color mode #1280 2026-10-18 13:46:49 +02:00
Linus Rath b611d9c028 feat: refresh sender icons that changed on the sender's website #960 2026-10-17 19:18:18 +02:00
Linus Rath 481665b435 test: pick the role dropdown in the folder order test next to the counter menus #982 2026-10-17 19:18:17 +02:00
Linus Rath 1c3cc35a7c feat: set the counter per folder, e.g. keep the Drafts count with totals off #982 2026-10-17 19:18:16 +02:00
Linus Rath f47fe778d0 feat: add a setting to hide the account dot in the unified view #912 2026-10-17 19:18:01 +02:00
Jacob ZeitzandClaude Opus 5.5 99b0bced3b feat: admin policy gate to turn off archiving #1257
A new feature gate, archiveActionEnabled (default on), lets the admin turn the
Archive action off for installations that archive mail elsewhere, such as a
mail gateway. With it off, Bulwark offers no Archive anywhere: the viewer's
button and its overflow entry, the context menu for one or several messages,
Mountain View's selection bar, the hover and swipe actions, the E shortcut and
its help row, archiving after an export, and the archive mode setting (also in
the settings search). With it off nothing creates an Archive folder:
ensureArchiveMailbox returns null. Existing Archive folders stay ordinary
folders, moving mail into them by hand still works, and the plugin API is
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 20:48:28 +02:00
lucamzanon db38ad320e feat: optionally keep mailbox passwords in the account list backup
Part 2 of 3 of the account archive agreed in #1198. When the admin turns on
"Account List Backup: Passwords" (off by default), saving the list offers to
include the passwords of the accounts signed in here with a plain password.
They are encrypted in the browser together with the list. On restore, those
accounts are signed in to in the background, one by one, without leaving the
active account; a refused password leaves the account waiting for a sign-in by
hand, as before. OAuth and TOTP accounts are saved without a password.
2026-10-16 05:46:46 +02:00
Linus Rath 41a0716c50 Merge branch 'main' into feat/stalwart-1.0 2026-10-16 01:41:48 +02:00
Linus Rath 0e61705841 Merge pull request #1244 from lucletoffe/feat/calendar-sort-order
feat(calendar): order calendars by sortOrder and let users reorder them
2026-10-15 23:54:41 +02:00
Linus Rath 12e46bd718 Merge pull request #1245 from lucletoffe/feat/calendar-share-recipients
feat(calendar): say whom a calendar is shared with
2026-10-15 23:54:40 +02:00
lucletoffeandClaude Opus 5.5 de388a1d12 feat(calendar): order calendars by sortOrder and let users reorder them
Calendars were listed in the order the server returns them, which for
Stalwart is creation order, and the sortOrder property was never read.
Follow the JMAP Calendars rule instead: lower sortOrder first, equal
sortOrder by name (case- and accent-insensitive, numbers by value). The
store keeps the list sorted, so the sidebar, the calendar pickers and the
settings all show the same order; each account's calendars stay together.

Calendar settings gain move up / move down buttons, visible on touch
screens too, and drag and drop for the user's own calendars. A move
renumbers that account's calendars 1, 2, 3... and writes sortOrder only
where it changes. The renumbering also covers the account's calendars the
settings list does not show (iCal subscriptions), so they keep their
place relative to the others. Shared calendars are not offered for
reordering, their order is the owner's.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 22:31:07 +02:00
lucletoffeandClaude Opus 5.5 8cf6783cdb feat(calendar): say whom a calendar is shared with
The sidebar showed the same people icon for any calendar with a share,
labelled "Share calendar", and the settings badge only gave a count, so
there was no way to tell from either who could see the calendar. A share
granted to a service account read like a share with other people.

Both now carry a hint listing the recipients ("Shared with
bot@example.com (Booking robot)"), resolved from the principals the
server lists. Until every recipient is known the hint falls back to the
count. Principals are fetched only when a calendar on screen is shared.

The per-client principal cache of the attendee availability check moves
to lib/jmap/principal-cache.ts so both use it. It no longer keeps an
empty or failed answer: the next caller asks again instead of seeing
no principals for the rest of the session.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 22:19:53 +02:00
Linus Rath dd2104cdda feat: mute notifications for single folders or whole accounts #1169 2026-10-15 21:50:08 +02:00