* Upgrade Electron from 39.2.7 to 41.0.2 and address deprecations
- Bump `electron` from 39.2.7 → 41.0.2 in package.json
- Electron 40 deprecated direct clipboard API access from renderer
processes. Migrate all renderer-side `clipboard.writeText()` calls
(imported from 'electron') to the standard Web API
`navigator.clipboard.writeText()` across 9 files:
app/src/components/evented-iframe.tsx
app/src/components/participants-text-field.tsx
app/internal_packages/activity/lib/dashboard/share-button.tsx
app/internal_packages/main-calendar/lib/core/event-attendees-input.tsx
app/internal_packages/message-list/lib/message-controls.tsx
app/internal_packages/onboarding/lib/oauth-signin-page.tsx
app/internal_packages/thread-list/lib/thread-list-context-menu.ts
app/internal_packages/thread-sharing/lib/copy-button.tsx
app/internal_packages/thread-sharing/lib/thread-sharing-button.tsx
- Keep Electron clipboard.read() in composer-editor.tsx for
platform-specific format reads (public.file-url, FileNameW,
text/uri-list) which have no navigator.clipboard equivalent
- Main-process clipboard usage in application.ts is unchanged (not
subject to the renderer deprecation)
- No action needed for Electron 41 breaking changes: the PDF
WebContents change does not affect this app (PDFs are rendered via
pdf.js in a separate BrowserWindow, not via MimeHandlerViewGuest),
and the cookie change-event cause update does not affect this app
(no cookie change listeners present)
https://claude.ai/code/session_01WBGx8XkrU7X1FhuXGdMygt
* Update package-lock.json for Electron 41.0.2 upgrade
Regenerate lock file to satisfy npm ci after bumping electron from
39.2.7 to 41.0.2. Also updates transitive deps @types/node and
undici-types to versions compatible with Node 24 (bundled in Electron 41).
https://claude.ai/code/session_01WBGx8XkrU7X1FhuXGdMygt
* Fix unhandled Promise rejections and dead clipboard test spies
navigator.clipboard.writeText() is async; the previous change left all
call sites fire-and-forget. Two problems fixed:
1. All 8 non-CopyButton call sites now chain .catch() so failures are
logged to the console instead of producing unhandled rejection
warnings (e.g. when context menu callbacks fire after the window
loses focus).
2. copy-button.tsx previously showed "Copied" immediately regardless of
whether the write succeeded. The UI update and 2-second timer are now
moved into .then() so the label only changes on success. A truthy
sentinel (true) is assigned to _timeout before the async call to
block re-entry while the write is in-flight; clearTimeout(true) is a
safe no-op so componentWillUnmount is unaffected. On failure _timeout
is reset to null so the user can retry.
3. master-before-each.ts: remove dead spyOn(electron.clipboard, ...)
stubs (production code no longer calls electron.clipboard.writeText
from renderer) and replace with spyOn(navigator.clipboard, ...)
stubs that return resolved Promises, matching the async API contract.
https://claude.ai/code/session_01WBGx8XkrU7X1FhuXGdMygt
* Fix node-gyp config so better-sqlite3 finds its prebuilt for Electron 41
Two related problems:
1. app/package.json pinned electron to "39.2.7" in its resolutions field
while the root package.json (and npm_config_target in postinstall) was
already at "41.0.2". The stale pin would override the correct version in
the app's dependency subtree. Updated to "41.0.2" to stay in sync.
2. The electron npm environment in postinstall.js did not set
npm_config_node_gyp. Without it, npm falls back to its own bundled
node-gyp, which is typically older and does not recognise Electron 41 /
Node.js 22 headers. prebuild-install (used by better-sqlite3) calls
node-gyp when resolving the prebuilt binary URL; if it gets the wrong
version it fails to match the ABI and either falls back to a slow
source compile or errors out. Pointing npm_config_node_gyp at the
project's node-gyp v12 binary ensures the correct headers are fetched
and the prebuilt .node file is used.
https://claude.ai/code/session_01WBGx8XkrU7X1FhuXGdMygt
* Fix
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Add ARM64 (aarch64) Linux build support
Add the infrastructure to build, package, and test Mailspring on ARM64
Linux, following the same pattern used for x64 Linux and Apple Silicon.
Build system changes:
- postinstall.js: Add linux-arm64 mailsync S3 download path
- package-task.js: Explicitly set Linux arch via process.arch
- installer-linux-task.js: Add arm64 -> arm64 Debian arch mapping
- mkdeb: Skip execstack (x86-only tool) on non-x86 architectures
- snapcraft.yaml: Add arm64 to supported platforms
CI/CD:
- Add build-linux-arm64.yaml workflow using GitHub's native
ubuntu-24.04-arm runners for building DEB, RPM, and Snap packages
- Include installation tests on Ubuntu, and Fedora arm64 containers
The RPM spec already handles ARM64 correctly since its %else branch
(64-bit library qualifiers) applies to both x86_64 and aarch64.
Prerequisite: ARM64 mailsync binaries must be built and uploaded to
S3 at mailspring-builds/mailsync/{hash}/linux-arm64/mailsync.tar.gz
https://claude.ai/code/session_019RpF8j6PpEQ4B1ME8x3Rbn
* Update .github/workflows/build-linux-arm64.yaml
Co-authored-by: indent-staging[bot] <246363610+indent-staging[bot]@users.noreply.github.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: indent-staging[bot] <246363610+indent-staging[bot]@users.noreply.github.com>
- Bump node-abi from 3.67.0 to 3.87.0 so prebuild-install knows about
Electron 39 (ABI 140)
- Remove npm_config_build_from_source: true so npm uses prebuilt
binaries when available
- Update the nanosleep safety check to fall back to the .node shared
library when the static sqlite3.a is absent (prebuilt case)
https://claude.ai/code/session_01TXFueZPdYvdMDJFDBjGMfV
Co-authored-by: Claude <noreply@anthropic.com>
* update zh-CN localization files
* fix: Mail server configuration cannot be performed when the domain name does not have a built-in template.
Create a fallback template. When the built-in template corresponding to the domain name cannot be found, use the fallback template to configure the server.
---------
Co-authored-by: xml <xiamengliang@uniontech.com>
* feats: add script to improve localization
* fix: the script used to generate the translations didn't take certain concatenations into account.
Previously :
Many features are unavailable in plain-text mode. To create a single
Now :
Many features are unavailable in plain-text mode. To create a single plain-text draft, hold Alt or Option while clicking Compose or Reply.
-
Previously :
These features were %@ of the messages you sentin this time period, so these numbers do not reflect all of your activity. To enableread receipts and link tracking on emails you send, click the %@ or link tracking %@ icons in the composer.
Now :
These features were %@ of the messages you sent in this time period, so these numbers do not reflect all of your activity. To enable read receipts and link tracking on emails you send, click the %@ or link tracking %@ icons in the composer.
-
Previously :
To make changes to contacts in this account, you'll need to re-authorize Mailspring to access your data.\n\n
Now :
To make changes to contacts in this account, you'll need to re-authorize Mailspring to access your data.\n\nIn Mailspring's main window, go to Preferences > Accounts, select this account, and click \"Re-authenticate\". You'll be prompted to give Mailspring additional permission to update and delete your contacts.
...
* chore: improving the french and format-localizations.js executed
* feats: add templates to localizations
* fix(localization): define default template to english
* chore(localization): added explanations on how to use script files
---------
Co-authored-by: Ben Gotow <ben@foundry376.com>
* Changed postinstall.js and updated better-sqlite3 to fix Windows 11 version
* Updated Grunt build to avoid error on Windows 11
Co-authored-by: Ben Gotow <ben@foundry376.com>
* Switch to using Typescript instead of Babel
* Switch all es6 / jsx file extensions to ts / tsx
* Convert Utils to a TS module from module.exports style module
* Move everything from module.exports to typescript exports
* Define .d.ts files for mailspring-exports and component kit… Yes it seems this is the best option :(
* Load up on those @types
* Synthesize TS types from PropTypes for standard components
* Add types to Model classes and move constructor constants to instance vars
* 9800 => 7700 TS errors
* 7700 => 5600 TS errors
* 5600 => 5330 TS errors
* 5330 => 4866 TS errors
* 4866 => 4426 TS errors
* 4426 => 2411 TS errors
* 2411 > 1598 TS errors
* 1598 > 769 TS errors
* 769 > 129 TS errors
* 129 > 22 TS errors
* Fix runtime errors
* More runtime error fixes
* Remove support for custom .es6 file extension
* Remove a few odd remaining references to Nylas
* Don’t ship Typescript support in the compiled app for now
* Fix issues in compiled app - module resolution in TS is case sensitive?
* README updates
* Fix a few more TS errors
* Make “No Signature” option clickable + selectable
* Remove flicker when saving file and reloading keymaps
* Fix mail rule item height in preferences
* Fix missing spacing in thread sharing popover
* Fix scrollbar ticks being nested incorrectly
* Add Japanese as a manually reviewed language
* Prevent the thread list from “sticking”
* Re-use Sheet when switching root tabs, prevent sidebar from resetting
* Ensure specs run
* Update package configuration to avoid shpping types
* Turn eslint back on - we will opt-in to the TS rules one by one