Compare commits

...

1663 Commits
7.50.x ... main

Author SHA1 Message Date
Fedor Indutny
c0019a1079 v8.19.0-alpha.1
Some checks failed
CI / Danger (push) Has been cancelled
CI / Dependencies (push) Has been cancelled
CI / Lint (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
CI / Storybook (push) Has been cancelled
CI / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
CI / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
CI / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
CI / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
CI / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (arm64, ubuntu-22.04-arm64-4-cores) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
CI / Linux (x64, ubuntu-22.04-8-cores) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Auto Merge Ready (push) Has been cancelled
2026-06-24 15:22:46 -07:00
Fedor Indutny
21f819184d Update DNS fallback
Some checks failed
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
CI / Danger (push) Has been cancelled
CI / Dependencies (push) Has been cancelled
CI / Storybook (push) Has been cancelled
CI / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
CI / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
CI / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
CI / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
CI / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (arm64, ubuntu-22.04-arm64-4-cores) (push) Has been cancelled
CI / Linux (x64, ubuntu-22.04-8-cores) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Auto Merge Ready (push) Has been cancelled
2026-06-24 15:22:45 -07:00
Fedor Indutny
3ee1058f7f Update strings 2026-06-24 15:22:39 -07:00
Fedor Indutny
8107ab3ad8 Release notes for 8.17 2026-06-24 15:22:39 -07:00
Jamie
92012b3546
Init update-signal-symbols script 2026-06-24 14:58:51 -07:00
ayumi-signal
79004c7727
Add donation permit support 2026-06-24 13:58:26 -07:00
ayumi-signal
4492e2f799
Fix deprecated name field in donation config 2026-06-24 20:26:43 +00:00
Fedor Indutny
d553336adc
Fix crash on Linux when calling memoryUsage 2026-06-24 13:24:03 -07:00
Fedor Indutny
86d105dea0
Update copy and UI for MAS 2026-06-24 13:20:50 -07:00
trevor-signal
83617e3ff3
Improve incoming call start behavior 2026-06-24 09:44:42 -07:00
ayumi-signal
3dfc580a92
Ensure consistent sticker pack order when importing from storage 2026-06-24 08:58:20 -07:00
trevor-signal
21bca063a7
Improve handling of invalid title transition and contact messages 2026-06-24 13:39:34 +00:00
andrew-signal
93cbb121f1
Update libsignal to v0.96.3 2026-06-24 01:41:08 +00:00
Fedor Indutny
5331862e44
Update singleArchFiles 2026-06-23 12:34:25 -07:00
trevor-signal
d829a84af9
Quill custom blot improvements 2026-06-24 05:09:59 +10:00
trevor-signal
7c467ef85c
Update pinnedMessageLimit flag name 2026-06-23 18:53:37 +00:00
Fedor Indutny
c6e087b842
Include .node files from updated mac-screen-share 2026-06-23 18:41:15 +00:00
ayumi-signal
83dcbfb143
Update libsignal to v0.96.2 2026-06-24 03:06:35 +10:00
Jamie
72afecc4f3
Wrap labels in AxoStackedButton 2026-06-22 12:23:36 -07:00
Fedor Indutny
2edee6f807
Update mac-screen-share/windows-notifications
Co-authored-by: Backport Bot <backport-bot@signal.org>
2026-06-22 11:13:41 -07:00
Jamie
dfec1ef0fb
accessibility: silence relative timestamp screen reader announcements
Co-authored-by: UlisesMilani <ulisesmilani@gmail.com>
Co-authored-by: Backport Bot <backport-bot@signal.org>
2026-06-22 11:01:24 -07:00
Jamie
eab19262cb
Upgrade audit deps 2026-06-22 10:48:25 -07:00
Fedor Indutny
a36e7aad48
Update sqlcipher to 3.3.9 2026-06-18 10:55:51 -07:00
trevor-signal
90ae26db67
Fix test-electron glob to include .tsx files 2026-06-18 11:47:18 -04:00
trevor-signal
4c4b2aa353
Update local call history when call is auto-rejected 2026-06-17 16:59:46 -07:00
ayumi-signal
240a262285
Fix MediaEditor CompositionInput enter key so it saves changes 2026-06-17 16:59:28 -07:00
Jamie Kyle
c6996e6184 v8.18.0-alpha.1
Some checks failed
CI / Dependencies (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
CI / Danger (push) Has been cancelled
CI / Storybook (push) Has been cancelled
CI / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
CI / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
CI / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
CI / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
CI / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (arm64, ubuntu-22.04-arm64-4-cores) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Linux (x64, ubuntu-22.04-8-cores) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
CI / Auto Merge Ready (push) Has been cancelled
2026-06-17 16:03:57 -07:00
Jamie Kyle
c80b7e2744 Update DNS fallback
Some checks failed
CI / Dependencies (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
CI / Danger (push) Has been cancelled
CI / Storybook (push) Has been cancelled
CI / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
CI / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
CI / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
CI / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
CI / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (arm64, ubuntu-22.04-arm64-4-cores) (push) Has been cancelled
CI / Linux (x64, ubuntu-22.04-8-cores) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
CI / Auto Merge Ready (push) Has been cancelled
2026-06-17 16:03:57 -07:00
Jamie Kyle
55c5c00e26 Update strings 2026-06-17 16:03:02 -07:00
Jamie Kyle
9be0fabd94 Update release notes 2026-06-17 16:03:02 -07:00
trevor-signal
97721dff60
Update to latest AccountRecord proto 2026-06-17 14:57:36 -04:00
trevor-signal
4aca3b9445
Avoid toasting on remote config changes when linking as new device 2026-06-17 14:54:38 -04:00
Jamie
80fb55fed0
Add toast for sticker creator for invalid file formats 2026-06-17 11:51:16 -07:00
Jamie
cb4fac7bb4
Fix highlight when scrolling to unloaded pinned message 2026-06-17 11:17:36 -07:00
Fedor Indutny
49d87a5f6f
Re-enable requestSingleInstanceLock for MAS 2026-06-17 17:30:58 +00:00
Jamie
6c37a4005b
Remove plaintextExport feature flag 2026-06-17 10:18:04 -07:00
Jamie
86c2a8420d
Fix jumbomoji for messages with whitespace 2026-06-17 10:17:13 -07:00
Fedor Indutny
d0235ff8f1
Fix dependency errors 2026-06-17 10:14:25 -07:00
trevor-signal
cfe2193db0
Harden attachment file ref-counting when reusing files on disk 2026-06-17 12:52:25 -04:00
trevor-signal
7b1db7325c
Request backfill and skip queueing for undownloadable attachments 2026-06-17 13:55:11 +00:00
Jamie
39a851c4c4
Fix sticker creator localization
Co-authored-by: Fedor Indutny <indutny@signal.org>
2026-06-17 05:18:46 +00:00
Jamie
734f710345
Disable text selection in sticker creator
Co-authored-by: Fedor Indutny <indutny@signal.org>
2026-06-17 05:15:08 +00:00
Fedor Indutny
12ba35bcd5
Update yauzl to 3.4.0 2026-06-16 22:31:29 +00:00
trevor-signal
9ba4145f00
Pin node-gyp to fix windows CI
Co-authored-by: Fedor Indutny <indutny@signal.org>
2026-06-16 22:18:49 +00:00
trevor-signal
a23020d18a
Fix document ordering in All Media gallery 2026-06-15 15:36:12 -07:00
Fedor Indutny
4c3ec21815
More localization strings for MAS 2026-06-15 15:35:47 -07:00
Fedor Indutny
e74e4d1e02
Simplify CI dependencies 2026-06-15 15:19:14 -07:00
Fedor Indutny
128e6e1e5e
Get/push MAS strings 2026-06-15 13:45:30 -07:00
Fedor Indutny
8853dead2b
Fix boolean condition in remove-strings 2026-06-15 13:42:13 -07:00
Fedor Indutny
fd1e60d46e
Add package.json version tag for MAS builds
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2026-06-15 12:47:30 -07:00
trevor-signal
04a18e7812
Show system contact icon in GroupMembershipList 2026-06-13 04:34:03 +10:00
trevor-signal
ab91e69cac
Respect global pinned chat remoteConfig value 2026-06-13 04:13:30 +10:00
Fedor Indutny
8140261b5b
Support building for MAS 2026-06-12 09:59:04 -07:00
Fedor Indutny
01dde9aac3
Move windows-ucv into the monorepo 2026-06-11 16:05:04 -07:00
trevor-signal
1db0ad06b2
Simplify recovery key warning dialogs 2026-06-11 13:13:25 -07:00
ayumi-signal
12c7df49f3
Refresh StickerManager to use design system components
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2026-06-11 13:13:13 -07:00
Fedor Indutny
108241e477 v8.17.0-alpha.1
Some checks failed
Benchmark / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
CI / Dependencies (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
Stories / Storybook (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (arm64, ubuntu-22.04-arm64-4-cores) (push) Has been cancelled
CI / Linux (x64, ubuntu-22.04-8-cores) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
2026-06-10 14:38:25 -07:00
Fedor Indutny
f5020bde61 Update DNS fallback
Some checks failed
Benchmark / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
CI / Dependencies (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
Stories / Storybook (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (arm64, ubuntu-22.04-arm64-4-cores) (push) Has been cancelled
CI / Linux (x64, ubuntu-22.04-8-cores) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
2026-06-10 14:38:25 -07:00
Fedor Indutny
16239c00b8 Update strings 2026-06-10 14:37:50 -07:00
Fedor Indutny
a4888e69bf Release notes for 8.15 2026-06-10 14:37:50 -07:00
Fedor Indutny
2a437ce2e2
Revert "Update electron to 42.4.0" 2026-06-10 18:44:44 +00:00
trevor-signal
8d32b9cf9d
Autofocus on close button when opening lightbox 2026-06-09 22:56:26 -04:00
trevor-signal
4e6edd921a
Require confirmation on recovery key paste 2026-06-09 22:43:36 -04:00
andrew-signal
cb9b9cacaf
Update libsignal to v0.95.0
Co-authored-by: Fedor Indutny <indutny@signal.org>
2026-06-10 00:46:27 +00:00
emir-signal
e11f4e8651
Update to RingRTC v2.69.3 2026-06-09 17:16:05 -07:00
ayumi-signal
48f7e72cbd
Linux AppImage: Use static runtime 2026-06-09 14:28:07 -07:00
Fedor Indutny
6d47e89e38
Update electron to 42.4.0 2026-06-09 13:56:21 -07:00
trevor-signal
6a31fbc05c
Improve error dialogs during local backups setup 2026-06-09 16:36:09 -04:00
Jamie
8c5073512f
Add SKIP_VERIFY_DEPS_BEFORE_RUN option to pnpm tasks 2026-06-09 12:49:00 -07:00
Fedor Indutny
d7082bad17
Add 5% jitter to CheckScheduler 2026-06-09 18:51:28 +00:00
trevor-signal
bd9a23c5ef
Improve call screen header buttons and context menu 2026-06-09 12:39:14 -04:00
Jamie
6914bf38f9
Fix padding of edit history dialog 2026-06-09 11:11:23 +10:00
Jamie
21e2b03a92
Upgrade pnpm 2026-06-08 13:12:24 -07:00
trevor-signal
e1e09e3a8b
Fix isPermanentlyUndownloadable check for outgoing attachments 2026-06-08 12:29:36 -07:00
ayumi-signal
ffd3b9ea35
Save JPEG files with jpg extension and update default filename 2026-06-08 14:33:30 -04:00
trevor-signal
2f772e96ab
Add warning dialog when copying recovery key 2026-06-05 13:38:53 -04:00
ayumi-signal
4eddde9922
Fix padding in CallLinkEditModal 2026-06-05 13:36:38 -04:00
trevor-signal
add9b36540
Use libsignal API for 1:1 sends 2026-06-05 09:18:33 +10:00
ayumi-signal
34dd2c7f70
[signalapp/Signal-Desktop#7904] Skip edit-previous shortcut during IME composition
Co-authored-by: ayu <ayu@ayu.dev>
2026-06-04 11:17:10 -07:00
ayumi-signal
8e1728ff63
[signalapp/Signal-Desktop#7202] Add Linux arm64 to CI pipeline
Co-authored-by: Dennis Ameling <dennis@dennisameling.com>
2026-06-04 10:33:07 -07:00
ayumi-signal
37b5b39a3e
Update sticker pack link preview in chat and composer
Co-authored-by: Jamie Kyle <jamie@signal.org>
2026-06-03 17:47:08 -07:00
ayumi-signal
a0af83d748 v8.16.0-alpha.1
Some checks failed
Benchmark / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
CI / Lint (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
Stories / Storybook (push) Has been cancelled
Benchmark / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
2026-06-03 14:40:46 -07:00
ayumi-signal
9103655a00 Update DNS fallback
Some checks failed
Benchmark / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
Stories / Storybook (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
2026-06-03 14:40:46 -07:00
ayumi-signal
2239a46163 Update strings 2026-06-03 14:40:46 -07:00
ayumi-signal
3a9a8bf7a8 Release notes for 8.14 2026-06-03 14:40:45 -07:00
Fedor Indutny
f39a576b67
Add usernameChangeSyncMessage capability 2026-06-03 10:50:23 -07:00
Scott Nonnenberg
866ca8e830
getConversationForTargetMessage: Search in-memory messages first 2026-06-03 09:51:26 -04:00
andrew-signal
f00b79e3e2
Bump libsignal-client to 0.94.4 2026-06-02 15:36:11 -07:00
ayumi-signal
1dbb748c9c
Adjust background color of hand icons in CallingRaisedHandsList 2026-06-01 16:16:57 -07:00
Fedor Indutny
9daca313d3
Update macos actions runner to 26 2026-06-01 13:31:59 -07:00
Fedor Indutny
851d8bf39f
Use svg icon on macOS 2026-06-01 12:46:37 -07:00
trevor-signal
b88af5db21
Avoid quoting message on double-click in reaction picker 2026-06-01 13:58:15 -04:00
andrew-signal
fa3634c6d9
Bump to libsignal v0.94.3 2026-06-01 10:33:18 -07:00
trevor-signal
706c0020cc
Don't show lonely-in-group messages as read 2026-06-01 09:35:04 -04:00
ayumi-signal
2ddc8fc5fd
Update sticker preview modal and fix usage in sticker manager 2026-05-29 15:22:17 -07:00
trevor-signal
99f704363d
Guard against invalid extensions during chat export 2026-05-30 06:30:36 +10:00
trevor-signal
89550b31fe
Refactor attachment download error states 2026-05-29 10:57:54 -07:00
trevor-signal
433437df27
Filter out unknown recipients in storage service records 2026-05-30 03:46:39 +10:00
trevor-signal
b5bfaff82d
Improve proxy agent log 2026-05-29 10:36:34 -07:00
trevor-signal
7ec0d0e577
Ensure emoji picker is clickable when dialogs are open 2026-05-29 10:00:10 -04:00
trevor-signal
0e2c07324f
Properly encode cdnKey as URI component 2026-05-28 14:52:13 -04:00
trevor-signal
a11ba29c48
Improve too-long message body checks 2026-05-28 10:57:28 -07:00
Fedor Indutny
a1dfc702d9
Update electron-builder to 26.11.1 2026-05-27 16:42:09 -07:00
Scott Nonnenberg
bd36b19a84 v8.15.0-alpha.1
Some checks failed
Benchmark / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
Commits Check / Commit Title Check (push) Has been cancelled
Stories / Storybook (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
2026-05-27 14:10:16 -07:00
Scott Nonnenberg
42097d7bd8 Update DNS fallback
Some checks failed
Commits Check / Commit Title Check (push) Has been cancelled
Benchmark / Benchmark (convoOpen, 100, ts/test-mock/benchmarks/convo_open_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (send, 100, ts/test-mock/benchmarks/send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (startup, 10, ts/test-mock/benchmarks/startup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (10, 500, 500, 2, 500, largeGroupSendWithBlocks, 50, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, 50, 2, 500, largeGroupSend, 20, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (500, groupSend, 100, ts/test-mock/benchmarks/group_send_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (backup, ts/test-mock/benchmarks/backup_bench.node.js) (push) Has been cancelled
Benchmark / Benchmark (callHistorySearch, 100, ts/test-mock/benchmarks/call_history_search_bench.node.js) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Sticker Creator (push) Has been cancelled
Stories / Storybook (push) Has been cancelled
CI / MacOS (push) Has been cancelled
CI / Linux (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI / Mock Tests (0) (push) Has been cancelled
CI / Mock Tests (1) (push) Has been cancelled
CI / Mock Tests (2) (push) Has been cancelled
CI / Mock Tests (3) (push) Has been cancelled
CI / Check Min OS Version (macos-latest) (push) Has been cancelled
CI / Check Min OS Version (ubuntu-latest) (push) Has been cancelled
CI / Check Min OS Version (windows-latest) (push) Has been cancelled
2026-05-27 14:10:15 -07:00
Scott Nonnenberg
55f73e702c Update strings 2026-05-27 14:10:15 -07:00
Scott Nonnenberg
88f989cba5 Release notes for 8.13 2026-05-27 14:10:15 -07:00
Scott Nonnenberg
ca0990c001
sendProfileKey: Send in response to fewer incoming messages 2026-05-28 04:31:09 +10:00
Fedor Indutny
8aea456151
Update electron to 42.3.0 2026-05-27 11:15:14 -07:00
adel-signal
4ab8ef745d
Update to RingRTC v2.69.1
Co-authored-by: Fedor Indutny <indutny@signal.org>
2026-05-26 16:45:07 -07:00
trevor-signal
d4720fec1e
Bring StorageProto.AccountRecord up-to-date 2026-05-26 14:49:30 -07:00
Jamie
5088d02e01
Setup scheduled WAL checkpoints 2026-05-26 14:26:43 -07:00
trevor-signal
02bd907768
Preserve reactions for view once messages 2026-05-26 13:54:43 -07:00
Fedor Indutny
865d37de64
Update protopiler to 4.0.2 2026-05-26 09:48:51 -07:00
trevor-signal
0353eaf61f
Avoid rename across partitions during local backup 2026-05-27 02:05:54 +10:00
Jamie
2524f83079
Fix type errors and disable typescript incremental mode 2026-05-26 09:45:19 -04:00
Jamie
2c3ddcd6b9
Migrate more dialogs to new design system 2026-05-22 09:34:34 -07:00
Jamie
c83efc3b6e
Update all type methods to use property syntax 2026-05-22 07:12:56 -07:00
trevor-signal
a7e78e9a7f
Check directly for selection in isStyleEnabledInSelection 2026-05-21 13:58:36 -07:00
Jamie
0cc5bb1b50
Init AxoStackedButton 2026-05-20 14:55:20 -07:00
trevor-signal
a8f91c2c20 v8.14.0-alpha.1 2026-05-20 15:56:31 -04:00
trevor-signal
d7e25ff415 Update DNS fallback 2026-05-20 15:56:30 -04:00
trevor-signal
ff358a59d1 Update strings 2026-05-20 15:56:29 -04:00
trevor-signal
ab4d2190e8 Release notes for 8.12 2026-05-20 15:56:29 -04:00
Jamie
e2628dc7f3
Revert quill keybindings using codes 2026-05-20 15:44:43 -04:00
trevor-signal
ca5100f602
Fix quill behavior on blur 2026-05-20 12:58:18 -04:00
trevor-signal
410216e2ae
Update KT failure and unavailable modal strings 2026-05-20 09:46:45 -07:00
ayumi-signal
5ee6a0c1b6
Reproducible builds action: add contents read access 2026-05-20 10:32:04 -04:00
trevor-signal
3f871dcbaa
Update download click area for visual attachments 2026-05-20 08:20:47 +10:00
Jamie
a949293617
Upgrade tinykeys and fix cmd+backspace creating bold text 2026-05-20 07:53:24 +10:00
trevor-signal
7055569291
Reset KT fields when username or E164 change 2026-05-20 07:51:47 +10:00
trevor-signal
5806c75882
Fix callscreen flash in light mode 2026-05-19 10:04:26 -07:00
Jamie
89f418b11f
Upgrade build dependencies 2026-05-19 07:53:50 +10:00
Jamie
1ffe46f587
Remove group send endorsement toasts 2026-05-18 14:40:54 -07:00
gram-signal
ef970f74c8
Remote config for requirePqRatio 2026-05-18 16:23:50 -04:00
Jamie
57aa58506d
Init build:db-schema script 2026-05-18 10:42:50 -07:00
andrew-signal
4bd35d7378
Bump libsignal-client to 0.94.1 2026-05-18 10:01:28 -07:00
trevor-signal
81130ec712
Add internal toast on remote config changes 2026-05-18 09:50:17 -07:00
ayumi-signal
ac252557ac
Add raised hand order to raised hands list 2026-05-18 09:45:58 -07:00
trevor-signal
0c4b7fc537
Add toggle raised hand shortcut in group calls 2026-05-18 09:40:43 -07:00
trevor-signal
65db74055d
Improve release note channel behavior 2026-05-18 10:50:23 -04:00
trevor-signal
fd19b59561
Update headers on websocket requests 2026-05-18 10:48:27 -04:00
trevor-signal
a106a82488
Sync release note channel metadata in storage service 2026-05-16 08:07:32 +10:00
Jamie
da8bed8b23
Allow AxoTooltip to be disabled 2026-05-15 16:49:35 -04:00
ayumi-signal
e1a624bde5
Create issues when reproducible builds fail 2026-05-15 10:51:19 -07:00
Jamie
1cfc6c572b
Fix quill keybindings on non-US keyboard layouts 2026-05-15 09:25:02 +10:00
Jamie
8a6dd0b11a
Fix link previews after emoji 2026-05-15 09:22:13 +10:00
Jamie Kyle
0304dbc5a6 v8.13.0-alpha.1 2026-05-14 12:05:08 -07:00
Jamie Kyle
8686ed8f27 Update DNS fallback 2026-05-14 12:05:08 -07:00
Jamie Kyle
20586294d4 Update strings 2026-05-14 12:05:07 -07:00
Jamie Kyle
d25e9b6bff Update release notes 2026-05-14 12:05:07 -07:00
Jamie
6b6bd053be
Remove adminKey assert in toCallLinkRecord 2026-05-14 11:20:53 -07:00
Jamie
5fc45209f9
Fix contact nickname in story reaction notification 2026-05-14 11:13:32 -07:00
trevor-signal
58be82c01a
Update file path redactions 2026-05-14 11:08:06 -07:00
Jamie
3951a058a8
Allow fonts from 'asset:' urls in created windows
Signed-off-by: Marcin Serwin <marcin@serwin.dev>
Co-authored-by: Marcin Serwin <marcin@serwin.dev>
2026-05-14 11:01:40 -07:00
Jamie
bf4bfbdaad
Fix emoji search ranking for default short name 2026-05-14 11:29:09 -04:00
Jamie
90194e39c2
Update composition area buttons and menus with axo components 2026-05-13 22:47:57 -07:00
Jamie
346c483787
Fix pnpm patch failures 2026-05-13 17:36:07 -07:00
Jamie
958f754c96
Make call link notice text unselectable 2026-05-14 09:36:49 +10:00
trevor-signal
38304b2146
Improve CompositionArea behavior in strict mode 2026-05-13 15:51:12 -07:00
Jamie
44332410d8
Always hide voice note record button with edit 2026-05-13 14:57:09 -07:00
ayumi-signal
0ea3b1bbc7
Add experimental support for building Linux ARM64
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2026-05-13 10:21:25 -07:00
Jamie
00e5282361
Fix emoji rendering and copying issues 2026-05-12 15:32:20 -07:00
ayumi-signal
0aa27d3d9b
Fix and deprecate usePrevious hook and update raised hands button 2026-05-12 14:37:58 -07:00
trevor-signal
6482dff544
Fixup mute options and clarify setMuteDuration 2026-05-12 16:31:26 -04:00
Scott Nonnenberg
de4ce71aba
Storage: Only take profileKey/profileName if no data or first sync 2026-05-12 12:40:53 -04:00
trevor-signal
6cf6d2ebee
Adjust date header styles 2026-05-11 17:01:26 -04:00
Fedor Indutny
568925f0f7
Further improvements for voice recording 2026-05-11 13:24:12 -07:00
andrew-signal
03dd5f2b9f
Bump libsignal-client to 0.94.0 2026-05-11 11:27:19 -07:00
Fedor Indutny
55b24e25af
Fix StoryViewer not progressing 2026-05-11 10:15:42 -07:00
adel-signal
d47554abdd
Bump RingRTC version to v2.69.0 2026-05-11 10:01:00 -07:00
trevor-signal
e15c3adddc
Improved relink prompt
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2026-05-11 10:30:56 -04:00
Jamie
e0ef26bb4f
Migrate simple modals to Axo dialogs 2026-05-08 13:50:18 -07:00
Scott Nonnenberg
c8acf86e6f
ourProfileKey.doGet: Wait no more than 30 seconds for blocking promises 2026-05-09 06:14:10 +10:00
Jamie
1bf2664b58
Migrate Alert to AxoConfirmDialog 2026-05-08 13:12:11 -07:00
trevor-signal
7c68acfb1e
Use CORS for more images 2026-05-08 09:48:20 -07:00
trevor-signal
37341680a6
Ensure static stickers load with CORS 2026-05-08 12:10:31 -04:00
Scott Nonnenberg
1b2a3e7b28 v8.12.0-alpha.1 2026-05-07 15:22:47 -07:00
Scott Nonnenberg
6f1a6ace98 Update DNS fallback 2026-05-07 15:22:46 -07:00
Scott Nonnenberg
6441519468 Update strings 2026-05-07 15:22:46 -07:00
Scott Nonnenberg
b73d17d69d Release notes for 8.10 2026-05-07 15:22:46 -07:00
Scott Nonnenberg
eecb7bf966
sendToGroup: Ensure endorsements are fetched with alreadyInQueue=true 2026-05-08 08:06:55 +10:00
ayumi-signal
b0ed5f4a9b
Fix local video preview no video icon 2026-05-07 13:03:22 -07:00
Fedor Indutny
659fb39d28
Voice note recorder improvements 2026-05-07 11:04:16 -07:00
Jamie
9ba7277c72
Init AxoConfirmDialog and replace ConfirmationDialog 2026-05-07 09:52:50 -07:00
Fedor Indutny
d5f8c1a71a
Show live preview of voice note during recording 2026-05-07 08:55:54 -07:00
Fedor Indutny
54b5772536
Fix cursor in emoji blot 2026-05-06 15:12:43 -07:00
andrew-signal
be3c6f307d
Bump to libsignal-client v0.93.2
Co-authored-by: Marc <marc@signal.org>
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2026-05-07 07:44:42 +10:00
Fedor Indutny
d33119891e
Fix check-min-os-version 2026-05-06 13:07:07 -07:00
Fedor Indutny
2f2f2aab37
Name CI jobs for easier configuration 2026-05-06 11:58:44 -07:00
trevor-signal
0c907cdc8a
Don't follow disallowed redirects in link previews 2026-05-06 11:34:11 -07:00
trevor-signal
d2b13b8cbd
Make path redaction more resilient 2026-05-06 14:00:30 -04:00
ayumi-signal
432c2ae47a
Show raised hand order in group calls 2026-05-06 10:38:59 -07:00
Jamie
d7ee96cc04
Axo improvements and documentation 2026-05-06 10:37:35 -07:00
trevor-signal
2ed50fa045
Fix image editing in MediaEditor 2026-05-06 09:37:19 -04:00
Jamie
47ea47a914
Fix recent emoji list 2026-05-05 15:44:37 -07:00
Fedor Indutny
77d48f5565
Fix AudioWorklet reuse 2026-05-05 14:12:56 -07:00
trevor-signal
97106e0d6e
Add confirmation dialog when linking to new account 2026-05-05 15:57:18 -04:00
Scott Nonnenberg
de6a50a972
sendCallUpdate: Remove inner queueJob call 2026-05-06 04:36:40 +10:00
Fedor Indutny
8335c1263e
Make VBR quality configurable 2026-05-04 16:40:51 -07:00
Jamie
592e1b4476
Init new emoji data/api 2026-05-04 16:14:53 -07:00
Scott Nonnenberg
71fe87c611
groupSendEndorsements: Ensure that group updates happen on queue
Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com>
2026-05-05 08:45:10 +10:00
Fedor Indutny
d6aad9d6c8
Fix test-node not finding all tests 2026-05-04 15:40:22 -07:00
Jim Gustafson
836eb19aef
Update to RingRTC v2.68.1 2026-05-04 14:08:36 -07:00
Fedor Indutny
52cf12170b
Revert "Add status trigger to backport workflow" 2026-05-04 13:21:55 -07:00
trevor-signal
328dc05de3
Improvements to local backup UI 2026-05-04 16:01:51 -04:00
Scott Nonnenberg
a8722716c1
Delete All Data: Delete account when device is standalone
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2026-05-05 05:16:48 +10:00
Fedor Indutny
71a3e5788b
Add status trigger to backport workflow 2026-05-04 11:34:39 -07:00
Fedor Indutny
d707a220cb
Improve auto-download logic 2026-05-04 11:03:22 -07:00
Fedor Indutny
9b9dd9f867
Upgrade electron to 41.5.0 2026-05-04 09:59:27 -07:00
ayumi-signal
a90dca4e81
Fix localization of badge dialog text 2026-05-04 08:57:45 -07:00
trevor-signal
321a2feed6
Bump electron to 41.4.0 2026-05-02 09:52:15 +10:00
Fedor Indutny
93e3cd1311
Remove await from audio worklet 2026-04-30 16:30:26 -07:00
Jamie
674471e633
Fix typescript errors 2026-04-30 14:49:02 -07:00
Jamie
f799036e39
Init AxoTextField 2026-04-30 13:16:50 -07:00
Jamie
43f6b17c66
Migrate to react-jsx 2026-04-30 11:41:57 -07:00
Scott Nonnenberg
120e359768
Preferences/Privacy: Show blocked users and groups 2026-05-01 03:18:02 +10:00
ayumi-signal
2dea157233
Linux: Auto migrate safeStorage backend between kwallet5 and kwallet6 2026-04-30 10:15:17 -07:00
ayumi-signal
04d9a109b2
Add group call participant menu to participant grid tiles 2026-04-30 09:56:12 -07:00
ayumi-signal
7eaad06b30
Fix call remote mute receive when in pip 2026-04-30 11:09:24 -04:00
Fedor Indutny
54c436c48b
Recompile audio worklet code for size/speed 2026-04-29 22:58:24 -07:00
ayumi-signal
f71f793411
Fix donate PayPal button style 2026-04-29 14:55:09 -07:00
trevor-signal
7745835143
Updates to release note details pane 2026-04-29 13:41:05 -04:00
Fedor Indutny
3ab39b61b7
Use AudioWorklet for encoding voice notes 2026-04-29 09:50:58 -07:00
trevor-signal
1902d88de9
Hide member labels for conversations in message request state 2026-04-29 11:56:44 -04:00
trevor-signal
1fa5a98e44
Release note channel UI updates 2026-04-28 22:04:18 -04:00
Fedor Indutny
6b3bb33386
Fix composition area overflow 2026-04-28 17:05:15 -07:00
Scott Nonnenberg
781a60cc65
VideoSupport: Remove black bars with minimal DOM updates 2026-04-28 10:14:06 -04:00
Scott Nonnenberg
4b79efa033
RelinkDialog: Show something different when primary device 2026-04-28 09:54:53 -04:00
Scott Nonnenberg
d791bb880c
maybeForwardMessages: Compute and queue universal timer before sends 2026-04-28 07:27:08 +10:00
trevor-signal
ec4a696d59
New safety tips dialog 2026-04-27 16:13:27 -04:00
trevor-signal
37e50ea8ec
Update message request action UI and notification 2026-04-27 16:12:38 -04:00
ayumi-signal
3409302ee3
Group call participant menu 2026-04-27 12:40:15 -07:00
trevor-signal
a8b620b23b
Avoid attempting incremental playback on undownloadable attachments 2026-04-27 14:01:27 -04:00
Scott Nonnenberg
dcc64d35cb
Fix width of too-narrow chat color picker 2026-04-27 09:05:52 -07:00
Scott Nonnenberg
bd4bb8ddff
Don't allow attachment backfill when primary device 2026-04-27 08:59:47 -07:00
Scott Nonnenberg
4b6be6f27d
TimePicker: Fix check for empty spacers 2026-04-27 08:55:22 -07:00
Fedor Indutny
9c24615058 v8.11.0-alpha.1 2026-04-26 10:49:01 -07:00
Fedor Indutny
35d8fe53d7 Update DNS fallback 2026-04-26 10:49:01 -07:00
Fedor Indutny
8606182c21 Update strings 2026-04-26 10:49:00 -07:00
Fedor Indutny
db01cc2a64 Release notes for 8.9 2026-04-26 10:49:00 -07:00
Jamie
f0b7f604f1
Fix emoji locales loading 2026-04-22 09:35:25 +10:00
Fedor Indutny
aa19f771b5
Update electron to 41.2.2 2026-04-21 11:27:19 -07:00
ayumi-signal
6dc2420f81
Fix donation receipt saving 2026-04-21 11:13:15 -07:00
Fedor Indutny
754c3cca58
Do less in start.preload.ts 2026-04-21 11:06:32 -07:00
Fedor Indutny
4fcfc2d754
Fix White Large Square not showing as emoji 2026-04-21 10:45:56 -07:00
Scott Nonnenberg
6f1915c424
CollapseSet: Include 'verified-change' messages 2026-04-21 10:04:31 -07:00
trevor-signal
5a592f95c7
Updates to message request styles 2026-04-21 09:59:56 -07:00
Fedor Indutny
281de1b6ca
Bump rolldown to rc.16 2026-04-21 08:56:05 -07:00
Fedor Indutny
593f73c51a
Show internal toast on high heap size 2026-04-20 17:24:57 -07:00
Fedor Indutny
d3892510a9
Drop END_SESSION receive support 2026-04-21 09:36:00 +10:00
Fedor Indutny
ccf899f70d
Relax document requirements for media gallery 2026-04-20 16:01:51 -04:00
Miriam Zimmerman
5f6edbdaae
calling: verify audio device persistence 2026-04-20 13:40:08 -04:00
Fedor Indutny
4b2d27dcb0
Ignore additional crash report type 2026-04-20 13:04:14 -04:00
Scott Nonnenberg
f4cdf08bbc
A few updates for the standalone registration flow 2026-04-21 03:00:57 +10:00
Fedor Indutny
0122ae3c9a
Handle UploadTooLarge error code 2026-04-20 12:34:20 -04:00
trevor-signal
bb9bb142eb
Track verified group name hash 2026-04-17 13:20:36 -07:00
Scott Nonnenberg
dd19ab4777
Preferences: Allow more options to be changed 2026-04-18 01:39:29 +10:00
Fedor Indutny
40a9c9387b
Fix debugging in Dev Tools 2026-04-17 08:10:08 -07:00
Jamie
92d6c38d07
Init AxoTheme 2026-04-16 16:51:18 -07:00
adel-signal
3be6b65f1a
Update to RingRTC v2.68.0 2026-04-16 15:19:23 -07:00
Fedor Indutny
2a3f51e250
Use chat.getUploadForm from libsignal 2026-04-16 13:20:20 -07:00
Fedor Indutny
88ec0a7b88
Cleanup patches and html preloads 2026-04-16 12:48:09 -07:00
Fedor Indutny
5fe6a8212f
Remove loading screen 2026-04-16 14:37:43 -04:00
ayumi-signal
8433e9a33d
Update electron to 41.2.1 2026-04-16 11:34:00 -07:00
Fedor Indutny
d680b7c5e2
Use rolldown for WebAudioRecorderMp3 2026-04-16 10:42:49 -07:00
Fedor Indutny
6050b239eb
Make components .dom.tsx only 2026-04-16 10:39:52 -07:00
ayumi-signal
530973ad09
Update wait-on to 9.0.5 2026-04-16 10:24:24 -07:00
trevor-signal
1b1f33d505
Updated conversation hero UI & profile name warning 2026-04-16 12:51:33 -04:00
andrew-signal
8a6b993825
Bump libsignal to 0.92.2. 2026-04-16 12:11:52 -04:00
Fedor Indutny
b0d49f77d2
Fix contenteditable="false" 2026-04-15 13:46:08 -07:00
Fedor Indutny
862162b8fa
Make prepareFileUrl synchronous 2026-04-15 13:45:53 -07:00
ayumi-signal
272465e1b2 v8.10.0-alpha.1 2026-04-15 13:28:44 -07:00
ayumi-signal
e605a2ff14 Update DNS fallback 2026-04-15 13:28:43 -07:00
ayumi-signal
e11519ec7e Update strings 2026-04-15 13:28:43 -07:00
ayumi-signal
56bf08738f Release notes for 8.8 2026-04-15 13:28:43 -07:00
ayumi-signal
4a22305de2
Update unused strings script to consider scripts 2026-04-15 12:40:42 -07:00
Jamie
817337129b
Fix emoji sort order in emoji picker 2026-04-15 10:47:13 -07:00
ayumi-signal
bd81cf103a
Fix calls tab call button showing for terminated groups 2026-04-15 09:35:28 -04:00
andrew-signal
7bd835561a
Bump libsignal to 0.92.1
Co-authored-by: Fedor Indutny <indutny@signal.org>
2026-04-14 17:59:48 -07:00
Fedor Indutny
bb07abb8b1
Remove emoji-datasource-apple 2026-04-14 16:39:11 -07:00
Scott Nonnenberg
09b7cebb6b
Clean up sync message sends
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2026-04-15 07:43:40 +10:00
ayumi-signal
f265acc99a
Update copy for outgoing view once media toast 2026-04-14 10:01:59 -07:00
marc-signal
26905a67ab
Add option to run mocktests in background 2026-04-14 09:50:18 -07:00
ayumi-signal
e48c948baf
Save serverGuid for call messages from non-accepted chats 2026-04-13 15:09:33 -07:00
Jamie
1d53ccfee1
Setup knip 2026-04-13 12:50:00 -07:00
trevor-signal
a28d941ee9
Improve disabling of drag regions
Co-authored-by: Jamie Kyle <jamie@signal.org>
2026-04-13 14:39:36 -04:00
Fedor Indutny
400fd7ded1
Fix message rendering in RTL 2026-04-13 09:51:09 -07:00
trevor-signal
d281b60ee7
Fix fonts in storybook 2026-04-13 08:40:06 -07:00
Scott Nonnenberg
cb2b0708fb
A few improvements for the save attachment workflow 2026-04-10 16:54:54 -04:00
ayumi-signal
eedbe099b4
Improve file handler check to add path separator 2026-04-10 15:46:26 -04:00
trevor-signal
77455b5217
Tighten itemStorage types with default values
Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com>
2026-04-10 09:01:23 -04:00
Scott Nonnenberg
bba214676b
GroupMemberLabelEditor: No confirm discard when missing permissions 2026-04-10 09:20:47 +10:00
trevor-signal
f0cc24a2df
Add monospace font for recovery key viewing 2026-04-09 14:21:46 -07:00
trevor-signal
2e3a80b556
Simplify file referencing when deleting quoted thumbnail 2026-04-09 16:34:52 -04:00
ayumi-signal
2bdfc4979e
Always allow reporting chats as spam 2026-04-10 02:30:14 +10:00
Jamie Kyle
60a1e12545 v8.9.0-alpha.1 2026-04-08 15:25:07 -07:00
Jamie Kyle
453d56986e Update DNS fallback 2026-04-08 15:25:07 -07:00
Jamie Kyle
2979366c2e Update strings 2026-04-08 15:25:06 -07:00
Jamie Kyle
b3c84eb21c Update release notes 2026-04-08 15:25:06 -07:00
Jamie
d0bf922b6d
Update CollapseSet button style and ARIA structure 2026-04-09 08:06:42 +10:00
Fedor Indutny
91e0f526da
Introduce AssetService 2026-04-08 11:14:04 -07:00
trevor-signal
662e10831d
Simplify sync message author check 2026-04-08 14:13:29 -04:00
Fedor Indutny
977712cbe4
Make sure manifest numbers are monotonic 2026-04-08 08:59:13 -04:00
Fedor Indutny
7d7c1d0249
Use protopiler in sticker creator 2026-04-08 00:56:05 -07:00
Fedor Indutny
159712ee24
Fix schema of whoami response 2026-04-07 11:21:01 -07:00
Fedor Indutny
ed14685c58
Remove urlpattern-polyfill 2026-04-07 09:42:45 -07:00
Scott Nonnenberg
2bea0fdf6d
Input: Truncate too-long pasted text instead of dropping entirely 2026-04-08 02:35:58 +10:00
Scott Nonnenberg
0605a1afb8
Prevent forward of at-mentions, don't render in 1:1 conversations 2026-04-08 02:17:34 +10:00
Scott Nonnenberg
e68b9d81a6
Update Contributing.md 2026-04-08 01:33:55 +10:00
Jamie
dc56d2656d
Add reason strings to noop actions 2026-04-07 09:05:40 -04:00
trevor-signal
230af12965
Improve resiliency of backup folder deletion 2026-04-06 14:05:47 -07:00
trevor-signal
8bfd6a7475
Improve broken image behavior in ImageGrid 2026-04-06 12:31:27 -07:00
Fedor Indutny
f644c06474
Use code-splitting across more bundles 2026-04-06 12:24:48 -07:00
Fedor Indutny
11d5256a1c
Fix screensharing button click handler 2026-04-06 11:49:13 -07:00
Fedor Indutny
367c745d4c
Faster Windows CI 2026-04-07 04:11:44 +10:00
Scott Nonnenberg
e18638325b
Fix race condition in ConversationController tests 2026-04-03 17:38:43 -07:00
Fedor Indutny
9fe65f3d3b
Run username resolution through grpc in mocks 2026-04-03 17:16:48 -07:00
Fedor Indutny
229ac20549
gRPC mock tests 2026-04-03 16:29:20 -07:00
Scott Nonnenberg
0dcdbd9f23
Composer: Remove unneeded messageCompositionId field 2026-04-04 08:49:08 +10:00
Jamie
38799c5db7
Upgrade dependencies 2026-04-03 14:26:33 -07:00
trevor-signal
70608fbc41
Fix sizing of recovery key textarea 2026-04-03 13:22:36 -07:00
trevor-signal
0ab2412202
Cap number of incremental macs sent in a message 2026-04-03 15:28:27 -04:00
trevor-signal
54fde1dc96
Improve normalization of profile names 2026-04-03 13:36:27 -04:00
ayumi-signal
d454fe0fef
Mock test for group terminate 2026-04-03 11:17:49 -04:00
Jamie
6cbd3b9334
Enable more oxlint typescript rules 2026-04-02 16:30:34 -07:00
trevor-signal
3d624fc6d0
Fix recovery key string 2026-04-03 07:21:20 +10:00
Fedor Indutny
af73cf5094
A bit faster pnpm install in CI 2026-04-02 14:19:10 -07:00
Fedor Indutny
0dbadcbbbb
Update Electron to 41.1.1 2026-04-02 14:12:03 -07:00
Jamie
f3595e0784
Migrate scripts to ESM and ts-check 2026-04-02 13:20:15 -07:00
Fedor Indutny
5e683b0c1a
Update to mock-server@19 2026-04-02 11:52:30 -07:00
Fedor Indutny
a45114f8ad
Add pnpm script for no delay releases 2026-04-02 11:29:32 -07:00
Fedor Indutny
83764b81b2
Fix sticker creator 2026-04-03 03:04:44 +10:00
trevor-signal
e88bf72c73
Fix local backup backupId iv and counter mechanism 2026-04-02 09:41:37 -07:00
Scott Nonnenberg
0cecca0e0b v8.8.0-alpha.1 2026-04-01 16:43:36 -07:00
Scott Nonnenberg
ab52c4cd27 Update DNS fallback 2026-04-01 16:43:35 -07:00
Scott Nonnenberg
0d696b15ac Update strings 2026-04-01 16:43:35 -07:00
Scott Nonnenberg
1a9f7064bf Release notes for 8.6 2026-04-01 16:43:35 -07:00
Scott Nonnenberg
41bff2f5b9
Update libsignal to 0.91.0 2026-04-02 09:24:46 +10:00
dependabot[bot]
de0d430b72
Bump actions/checkout from 5.0.0 to 6.0.2
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2026-04-02 04:45:55 +10:00
dependabot[bot]
9ff4e75b22
Bump actions/cache from 4.3.0 to 5.0.4
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-02 04:35:49 +10:00
trevor-signal
f79e3ede2b
Add separate remote config flag to control max video size 2026-04-01 14:01:13 -04:00
dependabot[bot]
774522cfc9
Bump actions/setup-node from 6.0.0 to 6.3.0
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-02 03:29:15 +10:00
dependabot[bot]
9c68f2a747
Bump actions/upload-artifact from 4.6.2 to 7.0.0
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-02 03:26:21 +10:00
Scott Nonnenberg
ceca70301d
Fix danger/pnpm-lock.yaml 2026-04-02 03:12:31 +10:00
dependabot[bot]
8bd2caccf9
Bump js-yaml from 4.1.0 to 4.1.1 in /danger
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-02 02:59:11 +10:00
Jordan Rose
c11d503240
Provide full IdentityKeyPair to libsignal 2026-04-02 02:25:14 +10:00
ayumi-signal
9e5bd39b3f
Fix DoE received in terminated groups to match UI behavior 2026-03-31 17:57:35 -07:00
Scott Nonnenberg
245c98b875
CollapseSet: Size limit, some new message types added/excluded 2026-03-31 17:56:21 -07:00
ayumi-signal
9d26bd5ed2
Fix disappearing messages select in direct chat ConversationDetails 2026-03-31 15:30:19 -07:00
ayumi-signal
3229859157
Fix sending receipts to terminated groups 2026-03-31 15:30:04 -07:00
Fedor Indutny
83b7305258
Fix RTL rendering of delete for everyone message 2026-03-31 13:19:49 -07:00
Scott Nonnenberg
64b2247f1d
Timeline: Include all item types in Select Mode 2026-04-01 05:26:54 +10:00
Fedor Indutny
0f3f0cb0fb
Move one more dependency cleanup file list 2026-03-31 14:22:25 -04:00
trevor-signal
236470da22
Improved orphaned attachment debugging 2026-04-01 02:56:26 +10:00
trevor-signal
31ae6a1e44
Update local backup OS auth strings 2026-03-31 12:54:13 -04:00
ayumi-signal
77367df528
Don't use send endorsements when fetching profiles in ended groups 2026-03-31 09:53:47 -07:00
trevor-signal
5dbdfaf5c5
Enable local backups after unlink 2026-03-31 09:26:07 -04:00
Fedor Indutny
99da687995
Further ASAR size reduction 2026-03-30 18:53:52 -07:00
Jamie
3d04a8ba0b
Upgrade danger setup and add tailwind deps rule 2026-03-30 17:26:23 -07:00
Fedor Indutny
f665b35478
Remove unused patch 2026-03-30 17:13:31 -07:00
Fedor Indutny
fc12ea015a
Use *-proxy-agent modules directly 2026-03-30 16:59:57 -07:00
Fedor Indutny
d8ef296bc3
Update got to 14.6.6 2026-03-30 14:31:58 -07:00
Fedor Indutny
a10783f4e0
Enable import/extensions lint rule 2026-03-30 14:24:45 -07:00
Jamie
2dd05d0221
Upgrade Tailwind packages to same version 2026-03-31 07:16:04 +10:00
ayumi-signal
bb284b6829
Update strings for group terminate 2026-03-30 16:20:22 -04:00
Fedor Indutny
bb111a3107
Bundle everything with rolldown 2026-03-30 11:54:59 -07:00
ayumi-signal
e158261fea
Fix actions available on ended groups 2026-03-28 10:51:26 +10:00
ayumi-signal
b7ca8f278a
Prevent poll voting in ended groups 2026-03-27 15:13:09 -07:00
Jamie
caa10d02c3
Switch from eslint to oxlint 2026-03-27 13:40:46 -07:00
Scott Nonnenberg
224bb811e1
CollapseSet: Improve animation
Co-authored-by: Jamie Kyle <jamie@signal.org>
2026-03-27 16:34:07 -04:00
trevor-signal
d8df1e2869
Exclude invalid source-less incoming messages 2026-03-27 16:30:15 -04:00
trevor-signal
cb8886ebd9
Add recovery key changed modal 2026-03-27 15:29:13 -04:00
Fedor Indutny
f1f2055058
Update libsignal to 0.90.0 2026-03-27 12:13:14 -07:00
trevor-signal
35328c39ed
Update strings for recovery key 2026-03-27 15:03:59 -04:00
Fedor Indutny
d4b1c1c9f7
Update electron to 40.8.5 2026-03-27 15:03:22 -04:00
trevor-signal
346876171d
Improve performance of test-electron 2026-03-27 11:40:59 -07:00
Fedor Indutny
a048f83dbc
Remove use of __dirname from main process 2026-03-27 10:55:37 -07:00
trevor-signal
70f111e868
Fix some flaky test-electron tests 2026-03-28 03:42:53 +10:00
ayumi-signal
f975d864c7
Linux: Fix development auth prompts 2026-03-27 13:19:30 -04:00
trevor-signal
6d072b4546
Improve processing of mentions in direct conversations 2026-03-26 15:34:42 -04:00
Fedor Indutny
df99252d82
Fix some import cycles 2026-03-26 10:25:51 -07:00
ayumi-signal
e7544a5565
Init group terminate 2026-03-25 17:00:48 -07:00
Fedor Indutny
61095cc0a1
Update protopiler to 3.2.4 2026-03-25 15:46:30 -07:00
ayumi-signal
e8efc3c660 v8.7.0-alpha.1 2026-03-25 14:36:35 -07:00
ayumi-signal
dad6e5553d Update DNS fallback 2026-03-25 14:36:35 -07:00
ayumi-signal
a8bb86bb39 Update strings 2026-03-25 14:36:34 -07:00
ayumi-signal
68f41e7072 Release notes for 8.5 2026-03-25 14:36:34 -07:00
trevor-signal
3ff9acdcfc
Strip visual attachment filenames for local device 2026-03-25 14:16:21 -04:00
Fedor Indutny
141d5be379
Add profileName to left pane search terms 2026-03-25 10:13:09 -07:00
Fedor Indutny
0e1e4d42ec
Simplify TaskWithTimeout further 2026-03-25 10:05:10 -07:00
andrew-signal
b2b9f78993
Bump to libsignal v0.89.2 2026-03-24 15:59:24 -07:00
trevor-signal
3a25597873
Allow incremental playback for attachments with plaintextHash 2026-03-25 07:23:02 +10:00
Scott Nonnenberg
c353d41794
Collapsing Items: A few improvements 2026-03-25 07:00:02 +10:00
Fedor Indutny
97cf9a90fb
Serialize sql args/results 2026-03-24 12:13:39 -07:00
Fedor Indutny
c6e9f5668a
Simplify esbuild script 2026-03-24 10:02:13 -07:00
Fedor Indutny
e42c58667e
Update protopiler to 3.2.3 2026-03-24 12:14:06 -04:00
Fedor Indutny
b8cca2c49c
Simplify TaskWithTimeout
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2026-03-24 09:08:36 -07:00
trevor-signal
c050a0c8c2
Mark accepted or outgoing callHistory as seen 2026-03-25 01:15:22 +10:00
trevor-signal
8ad63966ae
Update local backups availability during rollout 2026-03-24 07:47:38 +10:00
Fedor Indutny
f88b6fc293
Update protopiler to 3.2.2 (#12533) 2026-03-23 14:10:05 -07:00
trevor-signal
1ead5dc14a
Handle unregistered actions when prompting for OS auth 2026-03-23 12:34:27 -07:00
Scott Nonnenberg
3cf38b1b40
Collapse items into multi-day sets, handling start/end incomplete days 2026-03-21 07:15:42 +10:00
Scott Nonnenberg
27ad6f3294
Collapse already-seen sets of timeline items 2026-03-21 02:58:24 +10:00
Fedor Indutny
3f34ef9693
Show update progress bar on force update with QR 2026-03-20 09:53:38 -07:00
Fedor Indutny
c863dfa66b
Ignore expireTimerVersion=0 messages 2026-03-20 12:40:04 -04:00
Fedor Indutny
100db18701
Fix text story background color 2026-03-19 16:54:17 -07:00
Fedor Indutny
1d884929ea
Add background to .dmg file 2026-03-19 10:32:38 -07:00
adel-signal
8b510c3b30
calling: add internal preferences for DRED, bitrate, VP9, sfu url 2026-03-19 09:46:33 -07:00
andrew-signal
b624e48cf1
Bump to libsignal v0.89.1 2026-03-19 12:12:17 -04:00
trevor-signal
284c10973d
Include prefix for PNI serviceIds on export 2026-03-19 11:50:11 -04:00
Fedor Indutny
d34506f400
Check imported dlls in CI
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2026-03-19 08:37:46 -07:00
trevor-signal
a8118faf08 v8.6.0-alpha.1 2026-03-19 09:41:27 -04:00
trevor-signal
9875a1e2fb Update DNS fallback 2026-03-19 09:41:27 -04:00
trevor-signal
fed02558c5 Update strings 2026-03-19 09:41:26 -04:00
trevor-signal
4b072217b2
Exclude chatItems without an author during export 2026-03-18 17:21:42 -07:00
Fedor Indutny
edf6161b77
Disable keepNames in esbuild script 2026-03-18 13:09:39 -07:00
Jamie
27d46c0e6e
Fix scrollbar offsetWidth warning when starting storybook 2026-03-18 13:57:35 -04:00
Jamie
6a6a1d1ec2
Update admin delete confirm modal description during rollout 2026-03-18 13:55:52 -04:00
trevor-signal
68d43aa3e1
More backup export fixes 2026-03-18 13:53:27 -04:00
Fedor Indutny
36f1e20400
Cleanup released remote config flags 2026-03-17 18:34:29 -07:00
Jamie
d8113d4d12
Fix hasDraft length checks 2026-03-18 10:47:38 +10:00
Fedor Indutny
2c5cc6ae39
Update electron to 40.8.3 2026-03-17 15:26:18 -07:00
Jamie
023ae37492
Replace typescript compiler with native tsgo compiler 2026-03-17 14:38:10 -07:00
Jamie
3851a3905a
Upgrade other react dependencies 2026-03-17 13:42:29 -07:00
trevor-signal
fcafec550e
Refactor recipient tracking during export 2026-03-17 15:18:24 -04:00
trevor-signal
5233849d05
Add feature flag for local backups 2026-03-17 11:52:20 -07:00
Jamie
f21f83de01
React 19 2026-03-17 11:14:02 -07:00
trevor-signal
257fb4843b
Fix PNI serviceId bytes on export 2026-03-17 12:35:39 -04:00
trevor-signal
5662cae9a7
Drop empty story replies and misattributed 1:1 messages 2026-03-16 17:06:53 -04:00
trevor-signal
4f9bb8f820
Make export test resilient to out-of-order handling 2026-03-16 13:37:07 -07:00
trevor-signal
4f3d25c4c5
Fix optimization path for unicodeSlice 2026-03-16 13:21:35 -07:00
trevor-signal
8d6738127a
More backup export improvements 2026-03-16 16:20:53 -04:00
Fedor Indutny
b45db69a03
Call maybeSetPendingUniversalTimer at forward 2026-03-16 12:49:21 -07:00
emir-signal
ddbf0be73b
Update to RingRTC v2.67.0 2026-03-16 11:49:07 -07:00
Jamie
41da8af0b5
Fix getBytesForPeerId logging warning 2026-03-16 11:47:45 -07:00
trevor-signal
178e93924f
Make explicit storage item preserve/remove behavior on unlink 2026-03-16 12:33:49 -04:00
Fedor Indutny
e024df318e
Relax migration schema a bit 2026-03-16 09:20:17 -07:00
andrew-signal
17ef1c93cc
Bump to libsignal v0.88.3 2026-03-17 00:47:21 +10:00
trevor-signal
5acdb2f287
Support pollTerminateNotification in backups 2026-03-13 16:39:42 -04:00
Fedor Indutny
54053d7ff6
Fix default value population in ducks 2026-03-13 16:34:02 -04:00
trevor-signal
691eecc8b3
Bump libsignal to v0.88.2 2026-03-13 12:47:58 -04:00
trevor-signal
a6bb694a51
Fix range header parsing 2026-03-13 09:47:39 -04:00
Fedor Indutny
d85dd18458
Update protopiler to 3.2.0 2026-03-12 16:45:22 -07:00
Jamie
1d45a52da7
Enable tsconfig noUncheckedIndexedAccess 2026-03-12 16:24:01 -07:00
trevor-signal
34b0f9cd50
Prevent errant timeline scroll 2026-03-12 16:30:14 -04:00
Scott Nonnenberg
2dade00356
A few small Timeline fixes 2026-03-13 06:26:05 +10:00
Fedor Indutny
58cc046dd0
Fix backup export of broken link previews 2026-03-12 13:20:23 -07:00
Fedor Indutny
bee5fc374a
Fix system name processing in storage service 2026-03-12 11:57:23 -07:00
trevor-signal
6c28e066cd
Improve username validity checks 2026-03-12 09:38:14 -07:00
Fedor Indutny
1e7d5ec614
Use iterator with backpressure for export 2026-03-12 09:24:51 -07:00
Fedor Indutny
312b68103e
Fix group link toggle 2026-03-12 08:34:09 -07:00
Fedor Indutny
6e0ec380b6
Fix backup export concurrency model 2026-03-12 10:50:36 -04:00
Fedor Indutny
979497cea3
Improve backup export speed 2026-03-11 17:12:27 -07:00
Fedor Indutny
52ba69a6f2
Remove protobufjs 2026-03-11 16:35:04 -07:00
Fedor Indutny
dd3111a472 v8.5.0-alpha.1 2026-03-11 14:04:18 -07:00
Fedor Indutny
179011728a Update DNS fallback 2026-03-11 14:04:18 -07:00
Fedor Indutny
ad900b5664 Update strings 2026-03-11 14:04:18 -07:00
Fedor Indutny
a07668ed0e Release notes for 8.3 2026-03-11 14:04:18 -07:00
Fedor Indutny
0bb9198ce9
Update mock server to 18.2.0 2026-03-11 13:11:40 -07:00
Scott Nonnenberg
d085f96756
applyGroupChange: Ensure that accessControl updates are saved 2026-03-11 13:10:17 -07:00
Fedor Indutny
00a8e02a4f
Fix value overflow on iOS 2026-03-11 09:52:56 -07:00
Jamie
600b91d867
Add confirm dialog before discarding draft on edit 2026-03-12 02:46:06 +10:00
Scott Nonnenberg
8ae5cb8dcb
decryptGroupState: Allow for missing member label permission 2026-03-11 12:43:49 -04:00
trevor-signal
626647ae1e
Update storage proto and handle invalid callHistory messages 2026-03-11 08:15:58 -07:00
adel-signal
75659bf6df
Add downloading and caching calling assets to startup 2026-03-10 15:58:57 -07:00
Fedor Indutny
c4ee32e9ee
Use protopiler for protocol buffers
Co-authored-by: Jamie Kyle <jamie@signal.org>
2026-03-10 15:31:29 -07:00
trevor-signal
b0e19f334e
Improve export handling of body ranges and storyReactions 2026-03-10 15:01:51 -04:00
trevor-signal
0e9f93785e
Allow disabling local backups 2026-03-10 14:51:23 -04:00
Scott Nonnenberg
59d561a457
preferContactAvatars: Only force re-rendering if initial sync complete 2026-03-11 04:00:43 +10:00
trevor-signal
220b642ff2
Improve post-import handling of new group permission 2026-03-10 12:42:51 -04:00
trevor-signal
7533a53f8e
Bump CI backup tests 2026-03-11 02:17:37 +10:00
trevor-signal
cf94e08a8c
Update local backup strings 2026-03-10 12:17:25 -04:00
trevor-signal
3bd11cf215
Improvements to local import testing 2026-03-10 12:01:01 -04:00
andrew-signal
a03229349e
Bump to libsignal v0.88.1 2026-03-10 08:12:19 -04:00
adel-signal
26fd31a01a
Update RingRTC to v2.66.0 2026-03-09 15:36:16 -07:00
trevor-signal
a292aaaa9f
Prune local backups to retain the most recent two 2026-03-09 16:08:16 -04:00
Fedor Indutny
c4b465eb3b
Use DelimitedStream in backup validator 2026-03-09 12:35:58 -07:00
trevor-signal
c7b7a0a9b6
Exclude erased messages from backup 2026-03-09 12:35:30 -07:00
Fedor Indutny
f1c5f73b39
Simplify ContactsParser 2026-03-09 12:08:02 -07:00
Fedor Indutny
fcf067303a
Simplify localBackup media parsing 2026-03-09 15:07:33 -04:00
Fedor Indutny
ea4279f481
Simplify json export mode 2026-03-09 11:50:19 -07:00
Scott Nonnenberg
2e418d96e8
Use all group members when calculating group colors 2026-03-09 14:28:20 -04:00
Scott Nonnenberg
7d8e4c5fb0
Move open/close from showConversation to ChatsTab effect 2026-03-10 03:40:39 +10:00
Fedor Indutny
0465c14d54
Update electron to 40.8.0 2026-03-09 13:12:12 -04:00
trevor-signal
1d5034a784
Update backup export behavior for member labels and group updates 2026-03-09 07:58:03 -07:00
Scott Nonnenberg
351235cbeb
Update icon for member label permission timeline update 2026-03-06 15:20:02 -08:00
Jamie
e503b9dac5
Fix app hanging if runAllSyncTasks() throws an error 2026-03-06 13:56:40 -08:00
yash-signal
1224cdf1f1
Gate settings profile QR code button on having a username 2026-03-06 12:42:09 -08:00
Fedor Indutny
4cd792f28d
Update mock server to 18.0.0 2026-03-06 10:59:31 -08:00
trevor-signal
2e85efb008
Local backup validation improvements 2026-03-06 13:38:10 -05:00
Fedor Indutny
3c816cbb1e
Make sure prekey ids are non-zero 2026-03-07 03:17:26 +10:00
ayumi-signal
6270a40e8b
Fix view once media send to not include message body or bodyRanges 2026-03-05 14:01:20 -08:00
Fedor Indutny
4c266e0291
Fix sync message serialization 2026-03-05 11:31:31 -08:00
trevor-signal
9b51b8f0f0
Keep mention repository up to date 2026-03-05 11:29:17 -08:00
Fedor Indutny
ff019a2490
Simplify prekey id generation 2026-03-05 11:11:57 -08:00
yash-signal
1a70c794e4
View Once UI Updates 2026-03-05 13:01:26 -06:00
Jim Gustafson
295b480329
Update to RingRTC v2.65.3 2026-03-05 10:23:11 -08:00
Scott Nonnenberg
1212f569cb Restore a few previously-deleted strings 2026-03-05 09:00:30 -08:00
Scott Nonnenberg
909896d65c
Introduce new permission for group member labels 2026-03-05 11:18:39 +10:00
ayumi-signal
095e24327b
Fix raised hand list icon hiding on hover 2026-03-04 16:32:49 -08:00
Jamie Kyle
036d5adb93 v8.4.0-alpha.1 2026-03-04 14:47:37 -08:00
Jamie Kyle
b47080e738 Update DNS fallback 2026-03-04 14:47:37 -08:00
Jamie Kyle
b80cc479f0 Update strings 2026-03-04 14:47:36 -08:00
Jamie Kyle
2ab3abc8b9 Update release notes 2026-03-04 14:47:36 -08:00
Jamie
79ae10dfc6
Reverse alert dialog actions when stacked 2026-03-04 14:01:24 -08:00
trevor-signal
d2f769296d
Update folder structure for local backups 2026-03-04 15:59:33 -05:00
ayumi-signal
ed8d4bca32
Add feature flag for call remote mute send 2026-03-04 11:18:11 -08:00
ayumi-signal
51c45f7178
Move Call link remove from call into ContactModal and Show menu icon in call participant list 2026-03-04 10:26:35 -08:00
trevor-signal
a149309ae6
Align chat color gradients to backup definitions 2026-03-04 09:25:22 -08:00
Richard Russo
f1bf48b069
Send zero speakerHeight when someone is presenting
Co-authored-by: trevor-signal <trevor@signal.org>
2026-03-04 11:41:12 -05:00
Jamie
07b7de6d4f
Update UI for own admin delete on incoming message 2026-03-04 09:31:06 -05:00
Fedor Indutny
0c76e68d87
Update mock server 2026-03-03 16:44:01 -08:00
yash-signal
0b5b7dc137
Improve behavior in macOS sandbox 2026-03-03 17:24:12 -06:00
trevor-signal
f1c285f58e
Simplify message deduplication 2026-03-03 16:04:04 -05:00
Jamie
864b4f2bfb
Prevent deleted messages from being pinned 2026-03-03 11:23:42 -08:00
Jamie
c2fc732ed6
Fix copy quote content from deleted messages 2026-03-03 09:37:57 -08:00
andrew-signal
4724635944
Bump to libsignal v0.88.0 2026-03-03 10:20:23 -05:00
ayumi-signal
23aecdd3f9
Fix toast and megaphone overlay 2026-03-02 17:56:54 -08:00
ayumi-signal
a984ab5e08
Bump AppImage updater min glibc to 2.34 2026-03-02 12:03:58 -08:00
Jamie
6706732814
Fix re-prompting to register as default client for protocols if we already are
Signed-off-by: Alex Lowe <alex.lowe@canonical.com>
Co-authored-by: Alex Lowe <alex.lowe@canonical.com>
2026-03-02 10:12:02 -08:00
Jamie
bcd6d18d6f
Fix chat folder sync with serviceIdBinary
Co-authored-by: Hužva <huzvanec@email.cz>
2026-03-02 09:58:15 -08:00
trevor-signal
2fd81f721e
Remove backup feature flags 2026-03-02 09:48:46 -08:00
Chris Eager
e9eab761fa
Remove Datadog release event and installer size metric
Co-authored-by: trevor-signal <trevor@signal.org>
2026-02-27 15:18:43 -05:00
Jamie
e424610cc2 Admin Delete 2026-02-27 14:12:13 -06:00
Chris Eager
b71b5570d3 Remove DD_API_KEY from benchmark action 2026-02-27 14:12:13 -06:00
Scott Nonnenberg
5a94a3389f Repeat 8.0 release notes for 8.1 2026-02-27 14:12:13 -06:00
Scott Nonnenberg
051a8a0eef Allow all group members to have labels, no permission required 2026-02-27 14:12:13 -06:00
yash-signal
e3560adbcf Add mac sandbox build support 2026-02-27 14:12:04 -06:00
ayumi-signal
54e5b64ab0
Send remote mute requests in group calls and call links 2026-02-27 10:36:15 -08:00
ayumi-signal
b155aa1cfb
AppImage updater: Add minGlibcVersion check 2026-02-27 10:20:18 -08:00
Scott Nonnenberg
636f37eb14
Member Labels: A few small changes 2026-02-27 08:49:36 -05:00
trevor-signal
4221933fe1
Update types for message.errors 2026-02-27 07:53:16 +10:00
yash-signal
6db6aba90c
Polls: allow multiple votes by default 2026-02-26 16:38:28 -05:00
andrew-signal
b03222b8a5
Update to libsignal v0.87.4 2026-02-26 11:10:04 -08:00
trevor-signal
aee04c7b28
Improve thumbnail accounting for quotes 2026-02-26 09:03:05 -05:00
yash-signal
ff53e3a156
Remove poll feature flag gates 2026-02-25 18:53:37 -06:00
Scott Nonnenberg
b9d7364182 v8.3.0-alpha.1 2026-02-25 15:08:37 -08:00
Scott Nonnenberg
d536565377 Update DNS fallback 2026-02-25 15:08:36 -08:00
Scott Nonnenberg
9e28c04a6a Update strings 2026-02-25 15:08:36 -08:00
Scott Nonnenberg
668e67237f Release notes for 8.1 2026-02-25 15:08:36 -08:00
yash-signal
f09d582dec
Send View Once Messages 2026-02-25 13:48:45 -06:00
Jamie
1abce3b627
Fix outgoing sticker metadata text color 2026-02-26 04:16:13 +10:00
Scott Nonnenberg
1a0ddaada5
GroupMemberLabelEditor: After save, ensure dirty = false before navigate 2026-02-25 08:13:23 +10:00
yash-signal
02ee971043
Polls: Support sending polls in 1:1 conversations 2026-02-24 13:25:05 -06:00
Scott Nonnenberg
92af6626fe
getProfile: When no name in response, keep previous name 2026-02-25 04:08:23 +10:00
trevor-signal
239b57576f
Reuse recent CDN locators 2026-02-24 12:58:17 -05:00
Scott Nonnenberg
d38277e2ce
GroupMemberLabelEditor: Don't show 'you', show your profile name 2026-02-24 11:50:25 -06:00
trevor-signal
a9f64ce94e
Improve ordering of file cleanup 2026-02-23 15:34:32 -06:00
trevor-signal
2b243bb457
Reuse files on disk for outgoing messages 2026-02-23 15:35:11 -05:00
ayumi-signal
491de86ad3
Internal tool to test megaphone 2026-02-23 13:13:49 -05:00
Scott Nonnenberg
b61c2029c4
GroupMemberLabelEditor: Deep links, warn on navigate away 2026-02-24 03:48:13 +10:00
adel-signal
772c3c22ad
Update RingRTC to 2.65.2
Co-authored-by: emir-signal <emir@signal.org>
2026-02-22 23:53:57 -08:00
Jamie
b4c5cf9a7b
Fix AxoAvatar.ClickToView symbol 2026-02-20 15:52:00 -06:00
Scott Nonnenberg
2ce5f92693
Move understanding of Chats tab location into Nav 2026-02-21 06:49:02 +10:00
trevor-signal
e7d1efbf99
Treat replies similarly to mentions for notifications 2026-02-21 04:31:09 +10:00
Scott Nonnenberg
e4486fffba
Member Labels: Show label in quotes of your own messages 2026-02-20 09:26:53 -05:00
yash-signal
ef2c9ad788
Update symbols font 2026-02-19 14:02:12 -05:00
trevor-signal
de214384e0
Limit embedded groupChange size 2026-02-19 12:20:27 -06:00
trevor-signal
b9f88c1b65
Refactor avatar fetching and updating logic 2026-02-19 10:19:57 -05:00
Fedor Indutny
84eb5c57e3
Fix flaky edit test 2026-02-18 15:00:36 -08:00
ayumi-signal
2684557c66 v8.2.0-alpha.1 2026-02-18 14:21:20 -08:00
ayumi-signal
62f1c4d50c Update DNS fallback 2026-02-18 14:21:20 -08:00
ayumi-signal
8fa578c529 Update strings 2026-02-18 14:21:19 -08:00
ayumi-signal
2838c7a5bc Release notes for 8.0 2026-02-18 14:21:19 -08:00
yash-signal
c8619bc42b
Send viewed receipt for view-once opens 2026-02-18 10:28:16 -08:00
ayumi-signal
6aca6a278a
Fix megaphone check for dontShowBeforeEpochMs 2026-02-18 10:27:25 -08:00
Fedor Indutny
55ffb28481
Update Electron to 40.4.1 2026-02-18 09:50:12 -08:00
Fedor Indutny
c9786c4d31
Add feature flag for binary service id use 2026-02-18 09:09:59 -08:00
Scott Nonnenberg
360faed3cc
Member Labels: A few visual tweaks 2026-02-19 02:26:30 +10:00
Fedor Indutny
3ec6d86759 Revert "Add feature flag for binary service id use"
This reverts commit 5a9adcca2c.
2026-02-17 16:45:09 -08:00
ayumi-signal
ba9f720a90
Update megaphone design 2026-02-17 16:43:41 -08:00
ayumi-signal
fb07103b0e
Hide standard_donate megaphone after getting a badge 2026-02-17 14:57:30 -08:00
Fedor Indutny
46a0d5a341
Split off an instance of icu:view 2026-02-17 13:29:42 -08:00
Fedor Indutny
5a9adcca2c
Add feature flag for binary service id use 2026-02-17 13:06:34 -08:00
Fedor Indutny
668c5e76ec
Remove duplicate header on websocket requests 2026-02-17 10:52:38 -08:00
Scott Nonnenberg
2557e1d521
Group Member Labels: A few tweaks
Co-authored-by: Jamie Kyle <jamie@signal.org>
2026-02-14 07:58:06 +10:00
trevor-signal
4a78b284e8
Add debug message option to MessageContextMenu 2026-02-13 14:07:18 -06:00
Fedor Indutny
cd29c96a89
Handle Envelope.serverGuidBinary 2026-02-13 10:15:18 -06:00
andrew-signal
5655b0d502
Switch to libsignal's accountExists. 2026-02-12 20:49:02 -05:00
Jamie
ce95b6dfce
Init AvoAvatar primitive 2026-02-12 16:30:30 -08:00
ayumi-signal
03369af6b4
Add donation timeout for Paypal 2026-02-13 09:10:45 +10:00
trevor-signal
ffd962fd50
Improve ref counting when deduplicating attachments on disk 2026-02-12 17:34:12 -05:00
Fedor Indutny
ef9e437362
All Media Context Menu 2026-02-12 13:33:46 -08:00
ayumi-signal
42a2f0054a
Update PayPal return URI handler for redirect landing page 2026-02-12 11:55:36 -08:00
Yash
8f38791b90 v7.92.0-alpha.1 2026-02-12 11:54:04 -06:00
Yash
8ff53b5a15 Update DNS fallback 2026-02-12 11:54:04 -06:00
Yash
4ea4a3df2e Update strings 2026-02-12 11:54:04 -06:00
Yash
9e98f18af4 release notes 2026-02-12 11:54:04 -06:00
trevor-signal
ae90a74cef
Deduplicate incoming stickers from installed sticker packs 2026-02-12 09:36:53 -08:00
trevor-signal
95f131efbf
Better accounting of orphaned attachments 2026-02-13 01:27:57 +10:00
Jamie
c2a51791d2
Exclude our code from react ref lint-deps rules 2026-02-11 16:35:11 -08:00
Fedor Indutny
12e9013572
Add extra checks for OptionalResourceService 2026-02-11 16:13:17 -08:00
Scott Nonnenberg
cca7be8f16
GroupMemberLabelEditor: Show all other members with group labels 2026-02-12 09:05:32 +10:00
Scott Nonnenberg
0ba17756d5 Refactor conversation panels types, and remove obsolete event
Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com>
2026-02-11 12:47:29 -08:00
trevor-signal
41b2d4728c
Update Signal Artist Series sticker packs 2026-02-11 13:34:40 -06:00
ayumi-signal
d673781f5e
Fix draggable text and images in donations paypal and badge dialog 2026-02-11 12:43:03 -06:00
Fedor Indutny
eb7231e390
Fix visibility of KT in settings 2026-02-11 10:20:48 -08:00
Jamie
bb3dfdc8a5
Fix go to pinned message targeting outgoing messages 2026-02-11 09:42:45 -08:00
trevor-signal
8d2706bf25
Reuse calculated height & width when deduplicating attachments 2026-02-11 08:51:38 -08:00
ayumi-signal
09b006e14b
Handle multiple visits to Paypal approval return URI 2026-02-11 09:15:13 -05:00
trevor-signal
291000f297
Avoid race when downloading group avatars post-import 2026-02-11 08:55:26 -05:00
ayumi-signal
ff9d247cb2
Fix megaphone donate cta to navigate to amount picker and cache config in redux 2026-02-10 15:45:25 -08:00
Fedor Indutny
f48a5f4b57
Fix some Key Transparency strings 2026-02-10 12:54:16 -08:00
Fedor Indutny
9fb47847d5
Update localized emoji, fix search 2026-02-10 12:46:45 -08:00
ayumi-signal
3463b5bec7
When deleting megaphones ensure they are removed in redux 2026-02-10 09:05:41 -08:00
andrew-signal
ffb169df33
Bump to libsignal v0.87.1 2026-02-10 10:23:00 -05:00
ayumi-signal
1a5640c770
Fix donate payment selection when Paypal is not supported 2026-02-10 09:36:00 -05:00
andrew-signal
e6c2a9c28a
Switch batchIdentityCheck to unauth socket 2026-02-09 21:16:32 -08:00
Jamie
d34ebaab46
Init AxoTooltip component 2026-02-09 14:26:46 -08:00
trevor-signal
b11bf88244
Improve call link admin UI transition 2026-02-09 16:52:07 -05:00
ayumi-signal
a6df1d3515
Update donation faq dialog 2026-02-09 13:49:26 -08:00
Fedor Indutny
cdd14aa518
Fix proto syntax in Migrations.proto 2026-02-09 12:52:19 -08:00
Scott Nonnenberg
a45eabc7aa
GroupMemberLabelEditor: Show dialog on save or permissions error 2026-02-09 10:33:26 -08:00
Fedor Indutny
74e0e245c4
Simplify link preview image fetching 2026-02-09 10:00:34 -08:00
Scott Nonnenberg
648b3ad279
ContactModal: Show full label, even if very long 2026-02-07 10:28:46 +10:00
Scott Nonnenberg
a56698f480
Show dialog if any non-admin labels when changing group info permission 2026-02-07 07:36:56 +10:00
ayumi-signal
ef071ccb36
Update text in cancel PayPal dialog 2026-02-06 14:36:23 -06:00
Jamie
3786123124
Add new tailwind curved-* util for superellipses 2026-02-06 10:08:14 -05:00
Scott Nonnenberg
2398edf1b7
Limit member label width 2026-02-06 10:08:34 +10:00
trevor-signal
834f0c7775
Deduplicate incoming attachments on disk 2026-02-05 14:48:31 -05:00
Scott Nonnenberg
85cc412b40
Render group member labels in quotes 2026-02-05 11:43:06 -08:00
Fedor Indutny
c5ba980fdd
Fix safeStorage use in CI 2026-02-05 10:13:16 -08:00
Fedor Indutny
59762be55d
Better Windows Store installation process 2026-02-06 02:38:09 +10:00
ayumi-signal
6cc517b9b9
Update text on paypal discard dialog 2026-02-04 14:12:01 -08:00
trevor-signal
a9063ec0c3 v7.91.0-alpha.1 2026-02-04 15:54:59 -05:00
trevor-signal
52e9b61310 Update DNS fallback 2026-02-04 15:54:59 -05:00
trevor-signal
b37e480873 Update strings 2026-02-04 15:54:58 -05:00
trevor-signal
406112a965 Release notes for 7.89 2026-02-04 15:54:58 -05:00
Jamie
4b58e2ca68
Fix sticker message metadata color in dark mode 2026-02-04 15:38:30 -05:00
yash-signal
9f5d723a41
Emoji reply in 1:1 conversation should not discard reply text 2026-02-04 14:27:58 -05:00
ayumi-signal
8dc36374ca
Add feature flag for remote megaphone 2026-02-04 11:09:11 -08:00
yash-signal
9185ec0d7b
Fix donation receipt sorting to show most recent year first 2026-02-04 10:37:53 -08:00
Fedor Indutny
fa60a257be
Update electron to 40.1.0 2026-02-04 10:31:45 -08:00
Scott Nonnenberg
785a695ad5
storageRecordOps.toRecipient: Allow for missing recipients 2026-02-05 04:27:16 +10:00
Scott Nonnenberg
e6278fded7
Group member label improvements 2026-02-04 12:17:50 -05:00
Fedor Indutny
f9bd84445c
Follow up Key Transparency changes
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2026-02-04 06:59:44 -08:00
ayumi-signal
0cd77e1081
Update release note fetcher to delete unknown saved megaphones 2026-02-04 09:53:00 -05:00
Jim Gustafson
b897d5b6a8
Update to RingRTC v2.64.1 2026-02-04 08:41:32 -05:00
yash-signal
e40855cc4f
Fix admin pin permissions in groups with admin-only edit settings 2026-02-03 10:24:18 -08:00
trevor-signal
1f8e2b0d24
Update group info permissions string 2026-02-03 07:40:16 -05:00
ayumi-signal
1ccf65b3d0
Update PayPal cancel handling 2026-02-02 16:14:00 -08:00
Scott Nonnenberg
09c71ad356
Support for Group Member Labels 2026-02-02 13:06:25 -05:00
yash-signal
d173db816b
Fix non-renderable media files losing filename on upload 2026-01-30 14:19:14 -06:00
ayumi-signal
5df33ff635
Add support for PayPal donations 2026-01-30 11:53:06 -08:00
trevor-signal
c24f721de0
Update sidebar layout visibility in group calls 2026-01-30 11:10:12 -08:00
Scott Nonnenberg
55300c0453
A few CSS tweaks and storybook fixes 2026-01-30 10:40:56 -08:00
Fedor Indutny
134246fb7d
Switch provisioning to libsignal 2026-01-30 10:36:41 -08:00
Scott Nonnenberg
a59c298aa1
Update to the latest Group and Backups protos 2026-01-31 02:37:46 +10:00
yash-signal
f5efbdc25f
Migrate sharedGroupNames from model attribute to Redux selector 2026-01-30 08:36:21 +10:00
Jim Gustafson
010e83063b
Update to RingRTC v2.63.0 2026-01-29 11:18:08 -08:00
Fedor Indutny
b01894fd04
[signalapp/Signal-Desktop#7693] Make formatting text with keyboard shortcuts irrespective of Caps Lock
Co-authored-by: DGrothe-PhD <dag_fs@t-online.de>
2026-01-29 11:13:36 -08:00
Fedor Indutny
b775afcd01 v7.90.0-alpha.1 2026-01-28 13:56:57 -08:00
Fedor Indutny
3870b86366 Update DNS fallback 2026-01-28 13:56:56 -08:00
Fedor Indutny
e12370a252 Update strings 2026-01-28 13:56:56 -08:00
Fedor Indutny
369d1a3fdd
Fix placeholder in Key Transparency string 2026-01-28 13:34:44 -08:00
Fedor Indutny
b5d7179ae8
Key Transparency 2026-01-28 12:40:51 -08:00
ayumi-signal
0c7fcfdaef
Donation data workflows for PayPal
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2026-01-27 16:29:27 -08:00
Jamie
7e6661db14
Switch from Tenor to Giphy for GIF search 2026-01-27 12:13:47 -06:00
trevor-signal
69f11c7f31
Update copy highlighting nonprofit status 2026-01-27 12:12:36 -05:00
Jamie
721035b821
Fix go to pinned message ambiguous sql column 2026-01-22 12:07:35 -08:00
Fedor Indutny
a6b5894443
Better grafana env variables for benchmarks 2026-01-22 11:25:21 -08:00
Fedor Indutny
ba4b43038a
Add extra API key for benchmarks 2026-01-22 09:23:31 -08:00
ayumi-signal
753766e4de v7.89.0-alpha.1 2026-01-21 14:34:20 -08:00
ayumi-signal
0689392b24 Update DNS fallback 2026-01-21 14:34:20 -08:00
ayumi-signal
d3e53d2f73 Update strings 2026-01-21 14:34:19 -08:00
ayumi-signal
35686f742e Release notes for 7.87 2026-01-21 14:34:19 -08:00
yash-signal
2451eaccbd
Update CQS logic: remove duration thresholds and add test mode 2026-01-21 15:52:26 -06:00
Jamie
bf2b257736
Fix pin message dialog submit with no warning step 2026-01-21 12:06:26 -08:00
ayumi-signal
a801862ef0
Fix lightbox image zoom on click 2026-01-21 11:21:24 -08:00
Jamie
79a273d9a0
Add warning when pinning disappearing message 2026-01-21 11:03:23 -08:00
yash-signal
95354c768c
Add call_diagnostic.html to packaged app build files 2026-01-21 10:53:19 -08:00
Jamie
bb9b328f6b
Fixes for unpin sync message 2026-01-21 10:45:55 -08:00
Jamie
5f8208a012
Fix pin targeting based on edited timestamp 2026-01-21 09:45:51 -08:00
Jamie
50793418a2
Animate pinned messages bar 2026-01-21 09:45:08 -08:00
trevor-signal
9342aab3e4
Cleanup after canceled local backup export 2026-01-20 15:49:35 -08:00
Fedor Indutny
65b2021a2f
Show profile name in about contact more often 2026-01-20 13:52:06 -08:00
trevor-signal
20644761b0
Conditionally show sidebar view in group calls 2026-01-20 09:29:25 -08:00
yash-signal
680304f9d2
Add diagnostic information window to Call Quality Survey 2026-01-16 16:25:19 -06:00
ayumi-signal
d6fc5ac6e3
Ability to click megaphone in narrow sidebar to expand sidebar 2026-01-16 14:22:18 -08:00
trevor-signal
1c8b7fc45d
Bind remote config to libsignal-net 2026-01-16 16:20:36 -05:00
trevor-signal
3f98b4cc8f
Update local backup export UI 2026-01-17 06:36:06 +10:00
Scott Nonnenberg
094f41fcbc
Update to libsignal v0.86.12 2026-01-16 09:42:50 -05:00
Jim Gustafson
28acdad7db
Update to RingRTC v2.62.0 2026-01-16 03:40:58 +10:00
ayumi-signal
1cfda1f210
Implement megaphone conditional standard_donate with local device createdAt 2026-01-15 09:40:22 -08:00
Scott Nonnenberg
5528cd37c0 v7.88.0-alpha.1 2026-01-15 08:33:53 -08:00
Scott Nonnenberg
2fd4fe0e6a Update DNS fallback 2026-01-15 08:33:53 -08:00
Scott Nonnenberg
0f18638f53 Update strings 2026-01-15 08:33:52 -08:00
Scott Nonnenberg
f78213c6d3 Release notes for 7.86 2026-01-15 08:33:52 -08:00
Jamie
15c7f7347b
Update context menu strings for pin/unpin 2026-01-14 12:41:24 -08:00
Jamie
da279446c4
Sync and update UI when pinned messages expire 2026-01-14 11:12:32 -08:00
trevor-signal
d938215b07
Mark window inactive immediately when blurred 2026-01-14 12:47:00 -05:00
Jamie
040b3fe7b8
Add expire timers to pin/unpin data messages 2026-01-14 08:35:24 -08:00
Scott Nonnenberg
3fe00d80ea
Reintroduce black bars around 1:1 remote video 2026-01-13 16:40:30 -05:00
Scott Nonnenberg
91f8176c12
Make date-rendering consistent: show year if older than six months 2026-01-13 12:01:53 -08:00
Jamie
560224f516
Pinned messages UI fixes 2026-01-13 12:01:07 -08:00
Scott Nonnenberg
a27a87a934
sendToGroup: Move to libsignal typed API 2026-01-13 14:46:09 -05:00
ayumi-signal
078cce6b10
Fix raised hand count showing 0 2026-01-13 11:27:46 -08:00
Jamie
897c051c99
Add expiration timer to pinned message notification 2026-01-13 13:12:10 -05:00
Jamie
8ca20a37ad
Add backup support for pinned messages
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2026-01-12 14:04:23 -08:00
Scott Nonnenberg
e64ea74e11
Update Electron to v39.2.7
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2026-01-10 07:25:22 +10:00
trevor-signal
77ddee4ff2
Fix focus state when forwarding 2026-01-09 09:52:05 -08:00
trevor-signal
b6f9c17bea
Improve focus management for AxoContextMenu 2026-01-08 13:19:51 -08:00
trevor-signal
928dfbd6bf
Exclude mentionAciBinary in processedRange 2026-01-08 21:04:58 +01:00
Fedor Indutny
4431d0cc7b
Add option to sort by file size in Media Gallery 2026-01-08 20:59:44 +01:00
yash-signal
c36c329645
View-once media: backend send support 2026-01-08 12:49:46 -06:00
Scott Nonnenberg
c9281f7f95
CallScreen: On ringing screen, remove Avatar in center of screen 2026-01-09 01:44:28 +10:00
Jamie Kyle
91d6502270 v7.87.0-alpha.1 2026-01-07 15:12:20 -08:00
Jamie Kyle
a51fb8c891 Update DNS fallback 2026-01-07 15:12:20 -08:00
Jamie Kyle
4b9519b0dd Update strings 2026-01-07 15:12:20 -08:00
Jamie Kyle
6c491e87ec Update release notes 2026-01-07 15:12:19 -08:00
Jamie
3a2dafd2b3
Add view-once media support for pinned messages bar 2026-01-07 14:28:24 -08:00
Jamie
66e46b750a
Remove outline/highlight shadow from chat header 2026-01-07 12:30:19 -08:00
Fedor Indutny
a500ee9a0f
Fix crash report stack traces 2026-01-07 19:04:38 +01:00
Fedor Indutny
992bfbf0e7
Clear thumbnail/screenshot when forwarding media 2026-01-06 23:18:41 +01:00
Fedor Indutny
e7b111e107
Contacts in documents tab of Media Gallery 2026-01-06 19:58:57 +01:00
trevor-signal
413ec4b7ac
Add timeouts for TUS uploads 2026-01-06 10:26:58 -08:00
jimio
18c21e5959
Update twitter -> X in sticker creator share sheet
Co-authored-by: jimio <jimio@jimio-m3-max.local>
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2026-01-06 19:10:19 +01:00
trevor-signal
71c82e1b1e
Ensure composition input is focused when clicking to edit or reply to message 2026-01-06 13:04:09 -05:00
Jamie
fd4a55ef42
Rework conversation panel layout and sub-header styles 2026-01-06 11:14:26 -05:00
Jamie
7a2008a48c
Fix logging of handleAttachmentsProcessing error 2026-01-07 01:39:56 +10:00
yash-signal
ee8019348a
Add z-index to AxoBaseDialog to fix Call Quality Survey placement 2026-01-05 16:15:04 -06:00
jimio
0400da993c
Polls: Longer question length and 1:1 Receive Support
Co-authored-by: jimio <jimio@jimio-m3-max.local>
Co-authored-by: Yash <yash@signal.org>
2026-01-05 16:00:42 -06:00
Scott Nonnenberg
8030284a40
resolveUsernameByLink: Move to libsignal typed API 2026-01-06 07:00:18 +10:00
Scott Nonnenberg
df85bcf2a5
Ensure setLocalPreviewContainer is called when video is enabled 2026-01-06 04:59:27 +10:00
Scott Nonnenberg
d635d426b1
Improved logging: sync messages and outgoing sends 2025-12-31 09:27:57 +10:00
Scott Nonnenberg
38c42f17b2
Resize calling video containers on video aspect ratio changes 2025-12-31 09:27:43 +10:00
trevor-signal
4bfdc0719a
Skip conversation save when applying MRR from storage service 2025-12-30 05:43:29 +10:00
Jamie
963c94a2a2
Fix pinned messages state syncing 2025-12-29 20:36:07 +01:00
Jamie
b405e3d83d
Prepare for upgrade to React 19
Co-authored-by: ayumi-signal <ayumi@signal.org>
2025-12-23 13:42:56 -08:00
adel-signal
fe94991ea2
Remove calling dev tools 2025-12-24 04:46:37 +10:00
Jamie
7fd8a440c3
Fix foreign key error pinning in-memory messages 2025-12-24 03:50:43 +10:00
Jamie
17c08f7c81
Fix redux memo dev warning in getModeSpecificProps 2025-12-22 16:55:02 +01:00
ayumi-signal
90f9786f31
Init remote megaphone UI 2025-12-19 14:04:51 -08:00
Scott Nonnenberg
f6bc8078a5
When checking files, handle trailing whitespace 2025-12-19 09:59:31 -08:00
Scott Nonnenberg
b65b08c02f
CallScreen: Fix 1:1 display where container aspect ratio exceeds video 2025-12-20 03:11:35 +10:00
yash-signal
9fb5839116
Update Prettier 2025-12-19 10:16:43 -06:00
Scott Nonnenberg
9bc369a607
1:1 calls: Show blurred avatar instead of black bars 2025-12-18 14:39:47 -08:00
trevor-signal
6bab0eb9fb
Trigger apt-get update if install fails on CI 2025-12-18 14:28:27 -05:00
Fedor Indutny
aaea3bee6a
Fix sticker creator 2025-12-18 12:43:28 -05:00
trevor-signal
a3173f6ae3 v7.86.0-alpha.1 2025-12-18 09:45:21 -05:00
trevor-signal
9542b6784f Update DNS fallback 2025-12-18 09:45:21 -05:00
trevor-signal
adcd1c80de Update strings 2025-12-18 09:45:20 -05:00
trevor-signal
1dcada3c47 Release notes for 7.84 2025-12-18 09:45:20 -05:00
yash-signal
df0549d13b
Use remote config value for Call Quality Survey threshold, upgrade RingRTC 2025-12-18 08:56:04 -05:00
Ehren Kret
dffa3ed506
Fix styling of URLs in Group Description 2025-12-17 17:07:20 -05:00
Alex Bakon
d28e3a783a
Use libsignal-net typed Chat API for lookup by username
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2025-12-18 03:25:37 +10:00
Scott Nonnenberg
ec9a31007b
Notification Profiles: Fix scrollbars in the time picker 2025-12-18 02:44:29 +10:00
trevor-signal
11b1b30ca6
Add clipboard utility to copy text temporarily 2025-12-17 10:47:16 -05:00
trevor-signal
07f14f3ed0
Continue toasting for recently received attachments that are missing from backup tier 2025-12-17 10:47:01 -05:00
Jamie
c9457f31db
Fix notification text for incoming pinned message 2025-12-17 10:23:14 -05:00
trevor-signal
1f4522cd7d
Simplify group call peeking logic 2025-12-16 11:57:07 -08:00
Fedor Indutny
9bd89bb2a5
Update rezip-electron to 3.0.2 2025-12-16 20:25:22 +01:00
Jamie
910f95a6c5
Update description for unpin all confirmation dialog 2025-12-16 12:39:46 -05:00
Jamie
649ae55fca
Schedule expiration of pinned messages 2025-12-16 11:10:12 -05:00
Jamie
ed279cd8f5
Render message preview in single line 2025-12-16 10:48:51 -05:00
Jamie
0a12e1ec17
Add pinned message notifications 2025-12-16 10:47:46 -05:00
Jamie
5ec3f763cd
Add alert dialog to confirm replacing oldest pinned message 2025-12-16 10:43:04 -05:00
Jamie
377d272841
Allow unpinning all pinned messages 2025-12-16 10:39:50 -05:00
Jamie
7df788814c
Fix sending pin/unpin messages to groups 2025-12-15 15:44:57 -08:00
ayumi-signal
aef5ddf5a3
Gh action: Add retry to reproducible builds 2025-12-15 14:43:10 -08:00
Fedor Indutny
e934885ccb
Minimize processing of forwarded attachments 2025-12-15 22:40:05 +01:00
Jamie
4cdf52c77b
Update current pinned message on scroll 2025-12-15 13:25:43 -08:00
Jamie
b10b6624d9
Add pinned messages receive/send flags 2025-12-15 13:25:35 -08:00
Jamie
acc9fd604f
Integrate pinned messages bar/panel 2025-12-15 10:14:20 -08:00
Fedor Indutny
8edbe6ac78
Better order of files in ASAR 2025-12-12 23:43:02 +01:00
Fedor Indutny
47ec5f9ebc
Update rezip-electron/better-blockmap 2025-12-12 22:34:15 +01:00
Fedor Indutny
f5db694c27
Don't include preload/dom files in ASAR 2025-12-12 22:30:29 +01:00
trevor-signal
dab0dc1403
Improve performance of saveMessagesIndividually 2025-12-12 10:19:29 -08:00
yash-signal
a7f4a0eba7
Polls animations 2025-12-11 17:02:21 -06:00
trevor-signal
66837d0c2b
Deduplicate usernames 2025-12-11 21:53:43 +01:00
Fedor Indutny
711b27917f
Use semibold font for media gallery headings 2025-12-11 11:57:56 -08:00
Jamie Kyle
4c82a179da v7.85.0-alpha.1 2025-12-10 14:52:41 -08:00
Jamie Kyle
0915d48a59 Update DNS fallback 2025-12-10 14:52:38 -08:00
Jamie Kyle
df380a6c2c Update strings 2025-12-10 14:52:32 -08:00
Jamie Kyle
2fc1488103 Update release notes 2025-12-10 14:52:31 -08:00
Jamie
db4845100a
Setup pin/unpin actions and mark messages pinned in timeline 2025-12-10 14:01:17 -08:00
yash-signal
1338eadf6f
Call Quality Survey Integration 2025-12-10 14:05:46 -06:00
trevor-signal
4b2f6af4ad
Avoid persisting DOE message in first pass 2025-12-10 14:58:25 -05:00
Miriam Zimmerman
ee50edaf6c
Clean up callMessages_test 2025-12-10 09:53:14 -08:00
Miriam Zimmerman
a1b386724a
Clarify purpose of getAndResetMaxAudioLevel 2025-12-09 11:01:41 -08:00
ayumi-signal
2bd254e70f
Fix logging when cleaning up megaphone files 2025-12-09 13:31:59 -05:00
Miriam Zimmerman
b449b6f4e7
Add regression test for mute consistency 2025-12-09 10:21:37 -08:00
trevor-signal
b638f4d5f2
Improve reliability of keyboard shortcuts for composer 2025-12-09 07:53:43 -08:00
trevor-signal
bdc056a7c9
Improve message content cleanup behavior 2025-12-09 09:40:00 -05:00
Jamie
c014fbdc51
Remove most emoji is valid assertions 2025-12-08 15:49:19 -08:00
Jamie
f1aef55d0c
Support sending pin/unpin messages 2025-12-08 15:00:10 -08:00
trevor-signal
d61f96a1c1
Improve scroll behavior when pressing enter from search input 2025-12-08 14:24:08 -08:00
ayumi-signal
0ab15a1cd8
Init local state for remote megaphones 2025-12-08 12:03:55 -08:00
trevor-signal
62b7950b7e
Simplify URL handling 2025-12-08 19:17:46 +01:00
trevor-signal
fc38003652
Update toast behavior for backup attachments 2025-12-08 10:24:52 -06:00
trevor-signal
5d41b9c1ef
Improve ordering of getRecentStoryReplies 2025-12-08 10:23:46 -06:00
Fedor Indutny
f78b36c46a
Update tabs UI in MediaGallery 2025-12-06 14:39:40 +01:00
Miriam Zimmerman
62cd5cdd63
Update to ringrtc v2.60.7 2025-12-05 15:47:03 -08:00
trevor-signal
c254eab90c
Simplify getUnreadReactionsAndMarkRead query 2025-12-05 12:27:07 -05:00
trevor-signal
465cf7af41
Improve handling of group story replies 2025-12-04 14:06:25 -08:00
Jamie
efe2c8de71
Add receive support for pin/unpin message 2025-12-04 12:47:19 -08:00
Yash
1b03cc4b9b v7.84.0-alpha.1 2025-12-03 16:37:07 -06:00
Yash
ddb8ed18b9 Update DNS fallback 2025-12-03 16:37:07 -06:00
Yash
41dd4b7e4f Update strings 2025-12-03 16:37:07 -06:00
Yash
3d5db31270 release notes 2025-12-03 16:37:07 -06:00
Fedor Indutny
b51d5938ce
Fix loading more audio in media gallery 2025-12-03 13:10:08 -08:00
Fedor Indutny
c9cd864012
Interact with Windows notifications from a thread 2025-12-03 10:24:24 -08:00
Jim Gustafson
d1e4f2245c
Update to RingRTC v2.60.5 2025-12-03 11:09:38 -05:00
Fedor Indutny
3aee841847
Fix grid scaling in media gallery 2025-12-01 13:52:07 -08:00
Fedor Indutny
deaca14240
Fix layout issues in MediaGallery 2025-12-01 13:04:21 -08:00
Fedor Indutny
d25ec282c5
Disable consecutive audio playback in Media Gallery 2025-12-01 11:48:36 -08:00
Fedor Indutny
7dae047d53
Fix use of Date.now() in test 2025-12-01 10:58:32 -08:00
ayumi-signal
7d253817f8
Use separate user data dir for AppImage builds 2025-12-01 10:58:08 -08:00
ayumi-signal
b97bd75486
Upgrade electron to 39.2.4 2025-12-01 09:52:17 -08:00
Fedor Indutny
62ebf8e9c9
Fix lint in AxoDialog 2025-12-01 09:33:42 -08:00
Jamie
f9fb9a2839
Init Call Quality Survey UI 2025-11-26 14:55:42 -06:00
Jim Gustafson
e0000ab520
Update to RingRTC v2.60.4 2025-11-26 11:49:28 -08:00
trevor-signal
d5ca3d4631
Improve DOE behavior for poll messages 2025-11-24 16:47:50 -05:00
trevor-signal
89caa70824
Improvements to plaintext export 2025-11-24 15:44:02 -05:00
Fedor Indutny
b3e83e6952
Further tweaks for media gallery 2025-11-24 12:34:56 -08:00
trevor-signal
b3a93ffab4
Trim body on export if body attachment remains 2025-11-24 11:58:42 -05:00
trevor-signal
cff3796ba7
Only fetch CDN object metadata for remote backups 2025-11-21 14:54:27 -05:00
trevor-signal
362dbe429d
Drop invalid keyChange messages on export 2025-11-21 10:36:30 -08:00
emir-signal
1ed551b99a
Add call summary support for all calls
Co-authored-by: Miriam Zimmerman <mutexlox@signal.org>
Co-authored-by: Jim Gustafson <jim@signal.org>
2025-11-21 09:53:07 -08:00
trevor-signal
82a08d6339
Drop recipient without any identifier 2025-11-21 09:08:57 -08:00
Jamie
43a7b02df6
Add UI for more message types in PinnedMessagesBar 2025-11-21 10:28:27 -05:00
Jamie
954bb8591b
PinnedMessagesPanel: Add footer with Unpin all messages button 2025-11-21 10:13:05 -05:00
Fedor Indutny
025d5d5011
More Media Gallery fixes 2025-11-20 14:41:48 -08:00
Jamie
9f8c3cd765
Init PinnedMessagesPanel 2025-11-20 13:18:31 -08:00
Fedor Indutny
60bb04a4fc
Media Gallery improvements 2025-11-20 10:52:17 -08:00
ayumi-signal
879d5946fa
Fix zoom reset on app init by removing preferred size handler 2025-11-20 10:51:54 -08:00
trevor-signal
a73133e534
Update behavior for soon-to-expire attachments on backup CDN 2025-11-20 13:12:15 -05:00
trevor-signal
42af9b5c3d
Optimize getUnreadByConversationAndMarkRead 2025-11-20 12:49:49 -05:00
Fedor Indutny
bd69748a3d
Remove references to missing .svg files 2025-11-20 09:28:41 -08:00
Fedor Indutny
c674353dcc
Fix missing string 2025-11-20 11:59:34 -05:00
Jamie
8e68e2051b
Remove "Paste & match style" on plain text inputs 2025-11-20 07:52:12 -08:00
Yash
90c0fc7da9 v7.83.0-alpha.1 2025-11-19 18:08:46 -06:00
Yash
4568521099 Update DNS fallback 2025-11-19 18:08:46 -06:00
Yash
a778174d84 Update strings 2025-11-19 18:08:46 -06:00
Yash
21f7163472 release notes 2025-11-19 18:08:46 -06:00
yash-signal
4fa2cae3de
[signalapp/Signal-Desktop#7526] Image disappears after first undo in media editor
Co-authored-by: HreshchyshynT <hreshchyshyn.t@gmail.com>
2025-11-19 16:54:48 -06:00
Fedor Indutny
6f77be57e0
Clicking media gallery date should show message 2025-11-19 14:39:23 -08:00
Miriam Zimmerman
c016a6591b
Tear down all audio devices 2025-11-19 15:57:39 -05:00
Fedor Indutny
4a4cd8a28f
Fix polkit template file 2025-11-19 12:28:53 -08:00
ayumi-signal
c6fa4c0c73
Init AppImage support 2025-11-19 12:00:37 -08:00
Jamie
7c12a1d3de
Setup pinned messages types and table
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-11-19 11:12:29 -08:00
Jamie
710a54d43f
Init PinnedMessagesBar UI 2025-11-19 10:55:47 -08:00
Fedor Indutny
10a9e40a2b
Support consecutive playback in all media 2025-11-18 17:20:08 -08:00
Jamie
745472cc4b
Fix react picker positioning in narrow window 2025-11-18 15:45:51 -08:00
Scott Nonnenberg
05c3966dd6
Config: Remove unneeded downloads path 2025-11-19 09:08:15 +10:00
Fedor Indutny
5745cc0083
Audio tab in media gallery 2025-11-18 14:40:01 -08:00
yash-signal
3592bbf9f2
Polls UI Enhancements 2025-11-18 12:34:22 -08:00
Fedor Indutny
ad503717fa
Fix another instance of media gallery update 2025-11-18 12:33:26 -08:00
Scott Nonnenberg
a7a3868208
Update export description string 2025-11-19 03:08:41 +10:00
Scott Nonnenberg
c4378d9c24
Support for exporting chats to disk 2025-11-18 11:12:04 -05:00
Jamie
6b16d75036
Add pin message item to message context menu 2025-11-17 17:21:59 -05:00
Fedor Indutny
024d467745
Fix media gallery updates on message change 2025-11-17 13:58:31 -08:00
Jamie
5bde700d4c
Add pinned message chat event 2025-11-17 12:44:14 -08:00
Fedor Indutny
1d8242bba6
Update electron to 39.2.1 2025-11-17 09:50:02 -08:00
Fedor Indutny
252d38e002
Link previews in all media 2025-11-14 10:35:51 -08:00
Fedor Indutny
11aa120c87
FIx initial background of main window 2025-11-14 09:04:38 -05:00
Fedor Indutny
8fde5d75e6
Update electron to 39.2.0 2025-11-14 08:55:20 -05:00
Fedor Indutny
0c65bc5284
Fix starting background color of about window 2025-11-13 13:47:58 -08:00
trevor-signal
c2422fd2fd
Fix loading screen theme 2025-11-13 13:37:53 -08:00
Jamie
e6b297da74
Fix emoji picker closing when using pen/touch 2025-11-13 11:01:43 -08:00
Jamie
32320a0d2e
Fix header menu keys 2025-11-13 11:01:16 -08:00
trevor-signal
616fd1a536
Improve speed of getUnreadByConversationAndMarkRead query 2025-11-13 11:00:35 -08:00
Jamie
8e79bb5050
Highlight chat folder with open context menu 2025-11-13 13:51:15 +10:00
Jamie Kyle
b29aedf1c8 Add new axo checkbox square variant 2025-11-12 17:03:46 -08:00
Jamie Kyle
bf9d36f2f0 Add onClick handlers to all axo dialog buttons 2025-11-12 17:03:46 -08:00
Jamie Kyle
4cd7ae33cb Remove dead code in axo dialog 2025-11-12 17:03:45 -08:00
Jamie Kyle
3609f11f11 Remove unnecessary aria-hidden in badge 2025-11-12 17:03:45 -08:00
Jamie Kyle
c41efe7f59 Make AxoSymbol.Icon center in non-inline parents 2025-11-12 17:03:44 -08:00
Jamie Kyle
3af0bde568 v7.82.0-alpha.1 2025-11-12 15:18:02 -08:00
Jamie Kyle
4cbf39d904 Update DNS fallback 2025-11-12 15:18:01 -08:00
Jamie Kyle
2200b9dd20 Update strings 2025-11-12 15:18:01 -08:00
Jamie Kyle
de7a1002b5 Update release notes 2025-11-12 15:18:00 -08:00
yash-signal
a279d0bcc8
Update poll create placeholder text, fix test flake 2025-11-12 14:52:50 -06:00
Fedor Indutny
7e58363ea4
Downgrade electron to 39.1.1 2025-11-12 11:59:25 -08:00
Jamie
714e161671
Migrate react-contextmenu menus to axo menus
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-11-12 09:31:52 -08:00
Jamie
7d52f761e3
Fix scrollbars for all macOS settings 2025-11-13 02:53:50 +10:00
trevor-signal
fe2a012bc8
Expire poll terminate chat events 2025-11-12 11:02:36 -05:00
yash-signal
7dd865904e
Poll notifications and read syncs 2025-11-12 09:26:16 -06:00
trevor-signal
7a8f208854
Avoid orphaning quoted attachment thumbnails 2025-11-12 10:11:44 +10:00
yash-signal
677404e82d
Send and receive polls with latest protocol version 2025-11-11 16:08:37 -06:00
Jamie
44d412bc06
Init AxoIconButton 2025-11-11 08:56:03 -08:00
Fedor Indutny
5260600efa
Update electron to 39.1.2 2025-11-11 11:03:44 -05:00
trevor-signal
2b99aed14d
Add pending poll vote UI state
Co-authored-by: Yash <yash@signal.org>
2025-11-10 19:18:30 -06:00
Jamie
3dbab74378
Implement backup support for chat folders 2025-11-10 15:27:32 -08:00
yash-signal
d328b45a28
Add ability for poll author to terminate a poll 2025-11-10 14:18:31 -05:00
Fedor Indutny
30548a6a3c
Fix findStoryMessage for in-memory messages 2025-11-07 19:35:18 +10:00
Fedor Indutny
ef5dabed83
Don't clear link preview on text selection 2025-11-06 15:27:42 -05:00
Jamie
fbffca4f8e
Fix chat folder migration 2025-11-06 15:26:46 -05:00
Fedor Indutny
a0fc414361
Simplify GumVideoCapturer 2025-11-07 06:04:06 +10:00
ayumi-signal
7998e6c8bd
Add byte length checks to poll question and options during create 2025-11-06 11:03:17 -08:00
Fedor Indutny
92f253f756
[signalapp/Signal-Desktop#7571] Fix duplicate word in bug report template
Co-authored-by: jdev-02 <jgoohs02@gmail.com>
2025-11-06 09:37:20 -08:00
Jamie
1fcb4d1041
Axo dialog design updates & aria checks 2025-11-05 15:15:46 -08:00
Fedor Indutny
28388578ce v7.81.0-alpha.1 2025-11-05 13:54:36 -08:00
Fedor Indutny
8504e77bb8 Update DNS fallback 2025-11-05 13:54:36 -08:00
Fedor Indutny
84116cc023 Update strings 2025-11-05 13:54:33 -08:00
Fedor Indutny
52356e9af9 Release notes for 7.79 2025-11-05 13:54:33 -08:00
Scott Nonnenberg
1925044e9d
Chat folders: for unread, check setting and active notification profile 2025-11-05 13:06:52 -08:00
yash-signal
aa78798be6
Update poll receive feature flags 2025-11-05 14:28:08 -06:00
Scott Nonnenberg
94ae691fcd
Fix spacing when a View Once message is viewed 2025-11-05 10:05:31 -08:00
Jim Gustafson
4ed4a9b668
Update to RingRTC v2.59.4 2025-11-04 15:25:06 -08:00
Scott Nonnenberg
fcf32fe658
ConversationController: Send changes to redux only if conversation in lookups 2025-11-04 15:11:52 -08:00
ayumi-signal
8b779b9d54
Fix multiple choice polls to use unique voters as denominator 2025-11-04 16:55:42 -06:00
Fedor Indutny
7bf1944ad3
Fix order of muteStateChange update 2025-11-04 14:01:26 -08:00
Fedor Indutny
fe3a453cc7
Update to electron 39.0.0 2025-11-04 12:02:22 -08:00
Jamie
fe3ffebf6a
Fix non-qualified emoji values rendering as emoji in composer 2025-11-04 11:37:33 -08:00
trevor-signal
9ee49cbfdc
Prevent editing or forwarding polls 2025-11-04 11:54:58 -05:00
trevor-signal
6869245b89
Allow poll questions to be searchable 2025-11-04 10:48:33 -06:00
Jim Gustafson
7bb7c2c67c
Update to RingRTC v2.59.3 2025-11-03 16:27:16 -08:00
yash-signal
612aa2b8c8
Poll create modal 2025-11-03 15:03:11 -06:00
Fedor Indutny
4436184f95
Use binary proto fields in staging 2025-11-03 10:41:49 -08:00
yash-signal
6bf79848c1
Add backup support for polls 2025-11-03 11:51:21 -05:00
trevor-signal
64d5eb99b7
Disable redux action logging by default 2025-11-01 05:34:18 +10:00
yash-signal
332f19ac78
Fix reply/quoting breaking for poll messages 2025-10-31 12:01:10 -05:00
trevor-signal
c6a79d2207
Ensure reactions are handled in order 2025-10-31 12:25:42 -04:00
trevor-signal
ab2b74e774
[signalapp/Signal-Desktop#7512] Improve copy-paste formatting inheritance
Co-authored-by: Brian Harder <briankharder@gmail.com>
2025-10-31 11:48:32 -04:00
trevor-signal
c7bf8555c0
Fix lint 2025-10-31 11:25:03 -04:00
trevor-signal
0a5f3ccccc
Refactor backup import/export options 2025-10-31 09:16:33 -04:00
Fedor Indutny
644702199a
Fix freeze in mute-state-change 2025-10-30 15:07:28 -07:00
Jamie Kyle
3b4ca5eb26 v7.80.0-alpha.1 2025-10-30 14:53:44 -07:00
Jamie Kyle
ce0d1578a3 Update DNS fallback 2025-10-30 14:53:43 -07:00
Jamie Kyle
b947a7d100 Update strings 2025-10-30 14:53:43 -07:00
Jamie Kyle
c4cd500d89 Update release notes 2025-10-30 14:53:43 -07:00
trevor-signal
52a32f1dca
Fix typing indicators for 1:1 conversations 2025-10-30 16:18:45 -04:00
Fedor Indutny
ba61f87696
Run test-release in a temporary folder 2025-10-30 13:10:48 -07:00
Fedor Indutny
9b07c417df
Show contact modal on click when reviewing 2025-10-30 12:38:37 -07:00
Jamie
ac38ab92a7
Fix scrollbar styles across the app 2025-10-30 11:55:58 -07:00
Jamie
9bf7d1423f
Temporarily downgrade libsignal from 0.85.1 to 0.83.0 2025-10-29 15:33:58 -07:00
Jamie
da78a101a3
Chat folder fixes 2025-10-29 14:44:27 -07:00
trevor-signal
1b4c3abe7f
Fix backup group update test cases 2025-10-29 13:07:10 -07:00
Jamie
7d364e1db1
Fix chat folder settings title when editing folder 2025-10-29 13:06:14 -07:00
Scott Nonnenberg
aa50386dea
Notification Profiles: Exclude silenced conversations from badge count 2025-10-30 05:58:41 +10:00
trevor-signal
d1e6087488
Show draftTimestamp in left pane preview 2025-10-30 05:57:44 +10:00
Fedor Indutny
1f7ea7d088
Use emoji sheet with fallback 2025-10-29 12:39:47 -07:00
Fedor Indutny
06448ea80e
Fix uncaught error in AttachmentCrypto 2025-10-29 12:39:37 -07:00
Fedor Indutny
363aff5330
Update emoji-picker-react in sticker creator 2025-10-29 11:52:00 -07:00
Jamie
21b5ae0145
Init AxoAlertDialog 2025-10-29 10:21:15 -07:00
Fedor Indutny
7b48f59f59
Allow .tsx files to be .std.tsx 2025-10-28 14:22:36 -07:00
Fedor Indutny
14360b2ed7
Exclude our own conversation from connection count 2025-10-28 14:12:04 -07:00
Fedor Indutny
00e9343c71
Import WindowsNotifications unconditionally 2025-10-28 12:58:33 -07:00
Jamie
a5b90fdca9
Fix badge counts for include muted setting 2025-10-28 12:44:56 -07:00
trevor-signal
a2aab8c920
Avoid incorrect use of preload cache 2025-10-28 14:46:38 -04:00
Fedor Indutny
11d5880d1d
Revert electron-builder to 26.0.14 2025-10-28 09:28:52 -07:00
ayumi-signal
dcbe9cb3ca
Fix app icon for Linux adhoc builds 2025-10-27 15:53:19 -07:00
yash-signal
4fc8560103
Add message preview for polls 2025-10-27 15:52:56 -07:00
Fedor Indutny
39081785d4
Upgrade electron to 38.4.0, electron-builder to 26.1.0 2025-10-27 14:59:40 -07:00
Fedor Indutny
80cb9fbc0a
Improve calling preload script 2025-10-27 14:36:20 -07:00
Scott Nonnenberg
540bb99632
Find by username: Don't automatically add .01 discriminator 2025-10-28 06:27:39 +10:00
Fedor Indutny
2ab224b0eb
Use v2 endpoints for groups WebAPI 2025-10-27 13:08:16 -04:00
Jamie
884139150a
Fix initial all chats folder params 2025-10-24 14:39:18 -07:00
trevor-signal
a7303477a1
Simplify edit handling of attachments 2025-10-24 15:58:25 -04:00
Scott Nonnenberg
4199c2cb5c
Fix reference to build-localized-display-names script 2025-10-25 03:53:12 +10:00
trevor-signal
ddae8f9397
Ensure last message text is always updated 2025-10-25 03:43:11 +10:00
trevor-signal
2ad2907cf9
Remove invalid quotes from conversation 2025-10-24 12:53:59 -04:00
Scott Nonnenberg
fb566c48e0 v7.79.0-alpha.1 2025-10-23 10:43:22 -07:00
Scott Nonnenberg
d0a8d9d35e Update DNS fallback 2025-10-23 10:43:22 -07:00
Scott Nonnenberg
5d7ab870a3 Update strings 2025-10-23 10:43:22 -07:00
Scott Nonnenberg
2866876cf5 Release notes for 7.77 2025-10-23 10:43:22 -07:00
trevor-signal
423b3257cf
Fix lint for mute-state-change package 2025-10-23 11:57:28 -04:00
Fedor Indutny
c0ab63a2ce
Ensure all deps are categorized in file-suffix 2025-10-22 18:08:49 -07:00
trevor-signal
2e2f346101
Increase concurrency of profile & key fetches 2025-10-22 17:08:04 -07:00
trevor-signal
e347f190aa
Improve screenreader experience with timestamps in chat list 2025-10-22 17:05:45 -07:00
ayumi-signal
a986cbc0a5
Fix lost drafts when restoring chat scroll position 2025-10-22 15:17:02 -07:00
Fedor Indutny
1270a5cf81
Help debugging muteStateChange issues 2025-10-22 14:01:00 -07:00
Fedor Indutny
91a6547199
Support muting from AirPods on macOS
Co-authored-by: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com>
2025-10-22 11:47:03 -07:00
trevor-signal
96f6e6f4cc
Adjust conversation search rankings for archived conversations 2025-10-22 13:54:56 -04:00
trevor-signal
90835d51d4
Improve marking messages read after wheel event when unfocused 2025-10-22 13:33:43 -04:00
Jamie
3e42da2b4d
Update symbols font 2025-10-22 10:16:52 -07:00
Scott Nonnenberg
fd12f18cee
Notification Profiles: Normalize ids 2025-10-21 18:55:38 -05:00
yash-signal
77d8758e2c
Add ability to send poll votes 2025-10-22 08:09:51 +10:00
yash-signal
1ddb81e053
Add ability to send poll create messages 2025-10-21 16:40:10 -05:00
ayumi-signal
9d34375bb7
Adjust timeline message scroll targeting to use scrollIntoView
Co-authored-by: trevor-signal <trevor@signal.org>
2025-10-21 12:22:14 -04:00
Jim Gustafson
74eb1c9bb9
Update to RingRTC v2.59.2 2025-10-20 13:51:28 -07:00
trevor-signal
b30d2f7bab
Improve timeline layout rendering 2025-10-20 15:27:26 -04:00
ayumi-signal
dc95d1b460
Remember scroll position in chats 2025-10-20 10:02:53 -04:00
Jamie
7f5af1a698
Add shortcuts for add/remove chat to chat folder 2025-10-17 13:40:00 -07:00
ayumi-signal
f26919d399
Update action reproducible build scheduler to not clone repo 2025-10-17 13:00:50 -07:00
Jamie
0906da9806
Migrate all preferences buttons to axo button 2025-10-17 12:43:08 -07:00
Fedor Indutny
5d1a9d22f0 Suffix lint rule and fixes 2025-10-16 23:46:00 -07:00
Fedor Indutny
44076ece79 Rename files 2025-10-16 23:45:44 -07:00
Fedor Indutny
3387cf6a77 Prepare for adding file suffixes 2025-10-16 23:45:44 -07:00
trevor-signal
3330dd72ce
Disable chat folder filtering when feature is disabled 2025-10-16 09:42:53 -07:00
trevor-signal
df27e4c4e8
Improve profile key validation 2025-10-16 09:07:11 -07:00
ayumi-signal
69aa0b3e30 v7.78.0-alpha.1 2025-10-15 14:36:18 -07:00
ayumi-signal
649c3ca2de Update DNS fallback 2025-10-15 14:36:18 -07:00
ayumi-signal
d21c5c5c8e Update strings 2025-10-15 14:36:18 -07:00
ayumi-signal
4b2f0e2bfc Release notes for 7.76 2025-10-15 14:36:17 -07:00
ayumi-signal
2a2d110826
Fix Linux wm class for alpha 2025-10-15 13:37:13 -07:00
Fedor Indutny
9ccb9e5ed8
Reenable actions/setup-node cache 2025-10-15 13:33:09 -07:00
dependabot[bot]
11c4247ed7
Update github action versions
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-10-15 13:08:12 -07:00
ayumi-signal
6ed97e5e60
Linux: Fix X11 app icon by updating desktopName and wm_class 2025-10-15 13:04:01 -07:00
ayumi-signal
469e6dc39a
Fix typo in notification profiles setting 2025-10-16 05:26:58 +10:00
Fedor Indutny
42f7bfe34e
Setup dependabot for github-actions 2025-10-15 10:30:27 -07:00
trevor-signal
6ec7272d4e
Refactor backup subscription UI 2025-10-15 11:05:59 -04:00
ayumi-signal
dbaf2f5e68
Linux: Fix StartupWMClass to fix app icon 2025-10-14 14:24:32 -07:00
yash-signal
df93632f0a
Refine signal connections definition 2025-10-14 14:18:48 -07:00
ayumi-signal
4596e50778
Action to schedule Linux reproducible builds 2025-10-14 14:16:36 -07:00
Jamie
e2072f83d7
Fix context menu trigger on chat folders overview 2025-10-14 12:56:56 -07:00
trevor-signal
512eccda88
Re-use standard attachments on edit 2025-10-15 05:55:26 +10:00
Fedor Indutny
531d1ffac4
Update emoji search index to version 15 2025-10-14 12:54:11 -07:00
Fedor Indutny
24baaf33b7
Fix calling dev tools window 2025-10-14 12:02:51 -07:00
trevor-signal
2b4f5ec516
Improve attachment handling of edits 2025-10-15 02:55:18 +10:00
Jamie
1f3fa9bd59
Chat folders bugfixes & ui updates 2025-10-10 15:34:28 -07:00
Fedor Indutny
bfb390e644
Remove window.getAccountManager 2025-10-10 14:38:51 -07:00
Fedor Indutny
9a8f8ffe5f
Add extra calling error modal 2025-10-10 14:09:18 -07:00
Fedor Indutny
41a6cfaf63
Remove window.i18n in favor of SignalContext.i18n 2025-10-10 13:48:40 -07:00
Fedor Indutny
40c31e138b
Remove window.Signal.Migrations 2025-10-10 13:37:38 -07:00
trevor-signal
17cb59b64c
Increase sender certificate expiration buffer 2025-10-10 13:15:20 -07:00
Fedor Indutny
7dfeb38129
Use mp4san 2025-10-10 15:44:42 -04:00
Fedor Indutny
079bc0bc7b
safePoll shouldn't produce error messages 2025-10-10 12:36:48 -05:00
Fedor Indutny
87c12a7634
Remove a bunch more global variables 2025-10-09 23:44:06 -07:00
Scott Nonnenberg
f7d5a91772
Log when we clear profile name 2025-10-09 16:49:38 -07:00
Fedor Indutny
290d2f3b4b
Remove window.Signal.Services.storage 2025-10-09 15:09:47 -07:00
Fedor Indutny
bcac163e73
Remove window.textsecure global 2025-10-09 13:03:13 -07:00
Scott Nonnenberg
4e2827af4b
Make verified notifications consistent 2025-10-10 04:09:12 +10:00
trevor-signal
75269adfe1
Improve typing indicator sending/receiving behavior 2025-10-10 03:28:30 +10:00
Yash
872580fdae v7.77.0-alpha.1 2025-10-08 18:35:11 -05:00
Yash
f01b17f68a Update DNS fallback 2025-10-08 18:35:11 -05:00
Yash
6a6f1a3e85 Update strings 2025-10-08 18:35:10 -05:00
Yash
5af49427fb release notes 2025-10-08 18:35:10 -05:00
Scott Nonnenberg
cba499e1b1
MessageDetail: Increase padding between label and value 2025-10-09 06:53:52 +10:00
ayumi-signal
f74d14a296
Remove donations flags 2025-10-08 09:29:00 -07:00
Scott Nonnenberg
99682a4981
Support for Notification Profiles
Co-authored-by: trevor-signal <trevor@signal.org>
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-10-08 10:06:24 +10:00
Jamie
b73563ad9d
Remove old emoji and sticker pickers 2025-10-07 12:01:24 -07:00
trevor-signal
8b8f9a8f91
Fix emojification of release note 2025-10-07 13:10:38 -04:00
Fedor Indutny
911133decd
Move SignalProtocolStore off window 2025-10-07 10:02:13 +10:00
Fedor Indutny
065017ce52
Fallback to emoji-datasource for unlocalized emoji 2025-10-06 14:17:33 -07:00
Jamie Kyle
dd4844788b
Fix duplicate all chats folder 2025-10-06 14:16:50 -07:00
Fedor Indutny
780f39c285
Faster incremental builds 2025-10-06 12:23:41 -07:00
Miriam Zimmerman
7ab12f3d7a
Resolve flakiness in calling mock test 2025-10-07 05:17:50 +10:00
dependabot[bot]
da70ee3234
Bump electron from 38.2.0 to 38.2.1
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-06 11:30:47 -07:00
Fedor Indutny
b3b470bebd
Update pnpm to 10.18.1 2025-10-06 13:48:53 -04:00
Jamie Kyle
dea3e11379
Init AxoMenuBuilder 2025-10-06 12:39:19 -05:00
gram-signal
290c8fec5b
Update to libsignal 0.83.0, remove passed-in requests for SPQR (now on by default) 2025-10-06 10:33:54 -07:00
ayumi-signal
e912fad9c9
Add script for linux build targets 2025-10-06 10:13:10 -07:00
ayumi-signal
2af0795347
Revert Linux GTK version workaround 2025-10-06 10:02:21 -07:00
trevor-signal
bc8fba61ea
Centralize message attachment file path logic 2025-10-04 02:06:10 +10:00
trevor-signal
d028fc296d
Avoid regenerating thumbnail or screenshot on edit 2025-10-03 11:30:22 -04:00
ayumi-signal
c4b98ef258
Reproduce linux build with github action 2025-10-03 10:25:58 -04:00
Fedor Indutny
f6df564aa9
Simplify source file dependency graph 2025-10-02 13:43:11 -07:00
trevor-signal
fac6b39784
Fix typo in unblock group modal 2025-10-02 13:57:37 -04:00
trevor-signal
15d180a785
Avoid deadlock when processing deletes and edits concurrently 2025-10-02 12:28:35 -04:00
Fedor Indutny
a6d4145c51
Don't include Server.js in Interface.js 2025-10-02 07:52:51 -07:00
trevor-signal
4809351f5b v7.76.0-alpha.1 2025-10-02 10:26:20 -04:00
trevor-signal
1c247b36ea Update DNS fallback 2025-10-02 10:26:20 -04:00
trevor-signal
4effb96054 Update strings 2025-10-02 10:26:19 -04:00
trevor-signal
f3c425e473 Release notes for 7.74 2025-10-02 10:26:19 -04:00
Fedor Indutny
9003c1ff73
Speed up TypeScript type checking 2025-10-01 17:01:43 -07:00
Jamie Kyle
4973b9b204
Fix missing all chat folder on startup without new manifest 2025-10-01 16:59:29 -07:00
Fedor Indutny
bf217a8513
Update jumbomoji to version 12 2025-10-01 16:38:33 -07:00
Miriam Zimmerman
dd1b7e6fc1
Remove last use of Buffer in ringrtc API
Co-authored-by: Jim Gustafson <jim@signal.org>
2025-10-01 13:57:39 -07:00
trevor-signal
3b67d00c85
Update accounting of backed up attachments 2025-10-01 13:52:04 -04:00
Fedor Indutny
947ad18020
Simplify get-jumbomoji script 2025-10-01 08:34:24 -07:00
Fedor Indutny
c25ba3f2a4
Add transaction support to kyber triples 2025-09-30 15:53:46 -07:00
Fedor Indutny
b2f1639146
Update emoji-datasource to 16.0.0 2025-09-30 13:28:52 -07:00
ayumi-signal
7bb8a35839
Ensure file permissions when building for Linux and set sha length for test builds 2025-09-30 13:17:29 -07:00
Fedor Indutny
8fee01054a
Mitigate macOS 26 performance issues 2025-09-30 09:51:18 -07:00
Fedor Indutny
658a63cfe6
Introduce kyber pre key triple table 2025-09-29 16:23:41 -07:00
ayumi-signal
af55cf4682
Test safeStorage in Flatpak environments 2025-09-29 15:58:14 -07:00
Jamie Kyle
ec7d07269d
Init Chat Folders UI 2025-09-30 08:34:24 +10:00
Jamie Kyle
726234a27b
Fix styles for ordered lists after css reset 2025-09-29 14:37:06 -07:00
Fedor Indutny
b1e56bfe6b
Fix closure of libsignal socket on reconnect 2025-09-30 07:20:10 +10:00
trevor-signal
d456077b26
Internationalize backup cost string 2025-09-29 12:15:52 -07:00
Fedor Indutny
cb22552cad
Update outgoing message size calculation 2025-09-30 03:55:14 +10:00
Jamie Kyle
0afe6863a4
Fix tailwind sources and prefers-contrast theme 2025-09-29 10:50:10 -07:00
Fedor Indutny
d6e6869fad
Update electron to 38.2.0 2025-09-29 09:43:10 -07:00
andrew-signal
0134573390
Separate out experimental and production remote config for permessageDeflate 2025-09-29 09:15:28 -07:00
yash-signal
6d09f06874
Read-only Poll UI 2025-09-26 15:21:32 -05:00
Jamie Kyle
410f53ae57
Update symbols font 2025-09-26 11:10:52 -07:00
Elias Zamaria
2fb73bd753 Fix link previews for messages with emojis 2025-09-26 10:17:46 -07:00
Fedor Indutny
fd9f7a9fba
Fix string value for all media button 2025-09-26 10:34:15 -04:00
Fedor Indutny
32f65e86a3
Better draft attachment management logic 2025-09-26 07:36:47 +10:00
trevor-signal
7fde9a311f
Avoid logging an error when weakly referenced attachment is missing 2025-09-25 13:23:40 -07:00
Fedor Indutny
11498482a1
[signalapp/Signal-Desktop#7496] Respect user-entered file extension when saving
Co-authored-by: Teledar <lmartin1920@outlook.com>
2025-09-25 12:28:29 -07:00
Fedor Indutny
e3474f468f
Add min OS version check to CI 2025-09-25 12:26:46 -07:00
Scott Nonnenberg
3af511fb5d
Fix the remaining PNP mock tests 2025-09-25 13:31:23 -04:00
Fedor Indutny
57c7714e5f
Improve getUnusedFilename parsing 2025-09-25 10:26:58 -07:00
Fedor Indutny
a6e07ba60e
Update minimum macOS version to match Electron 38 2025-09-25 07:31:08 -07:00
Fedor Indutny
de003fe0c2 v7.75.0-alpha.1 2025-09-24 15:10:52 -07:00
Fedor Indutny
a22a936dfd Update DNS fallback 2025-09-24 15:10:52 -07:00
Fedor Indutny
0fe910d92d Update strings 2025-09-24 15:10:51 -07:00
Fedor Indutny
da5fb105ea Release notes for 7.73 2025-09-24 15:10:51 -07:00
trevor-signal
d76b16aae1
Fix lightbox mock tests 2025-09-25 05:39:27 +10:00
Miriam Zimmerman
0eabffe3cf
Add calling test that exercises virtual audio 2025-09-24 13:41:37 -04:00
trevor-signal
0bdc96f0a9
Fix attachment backfill mock tests 2025-09-25 02:33:39 +10:00
Scott Nonnenberg
1c9b09fd7c
readSync mock test: look for visibility of last item 2025-09-25 02:33:02 +10:00
Scott Nonnenberg
e54648a13f
Fail mock test runs if tests fail 2025-09-25 02:09:10 +10:00
trevor-signal
74e327a6c4
Limit unnecessary thumbnail generation 2025-09-25 00:55:08 +10:00
Fedor Indutny
9c97d3e73c
Show ready-to-download documents in media gallery 2025-09-23 11:53:41 -07:00
Alex Bakon
e9ea20bb73
Upgrade libsignal to v0.81.1, enable websocket compression via remote config 2025-09-23 09:57:23 -04:00
trevor-signal
6e8928b3c5
Update handling of aborted attachment download jobs 2025-09-23 09:49:15 -04:00
trevor-signal
5bfb87ef03
Fix attachment ciphertext size calculations for backup tier downloads 2025-09-23 08:14:20 +10:00
Fedor Indutny
b2d54e1227
Fix suggested names for saved attachments 2025-09-23 07:49:05 +10:00
Fedor Indutny
af1125d4e4
Improve delivery receipt processing 2025-09-22 13:02:55 -07:00
trevor-signal
2c1cb5ac4e
Toast on main process errors 2025-09-19 16:00:46 -07:00
Fedor Indutny
40eaf078cc
Qualify CJS-only module imports 2025-09-19 13:05:51 -07:00
Jordan Rose
140241b83f
Allow hardcoding a captcha response in the config files 2025-09-19 12:30:24 -07:00
trevor-signal
55e8e4376b
Allow empty inviteeAci field when importing GroupInvitationDeclinedUpdate update messages 2025-09-19 13:26:01 -05:00
Fedor Indutny
2bcc43369e
Update icon in MediaPermissionsModal 2025-09-19 10:53:59 -07:00
Fedor Indutny
d7f074eb1e
Final fixes for storybook after ESM prep 2025-09-19 08:25:29 -07:00
Miriam Zimmerman
a8b1f5e685
Update to ringrtc v2.58.1 2025-09-18 14:53:44 -07:00
Fedor Indutny
753d34ee6b
Fix storybook 2025-09-18 11:56:10 -07:00
yash-signal
93ae2a4c48
Initial Poll message receive support 2025-09-18 11:06:43 -05:00
trevor-signal
976a3135e5 v7.74.0-alpha.1 2025-09-18 10:15:59 -04:00
trevor-signal
24625111a9 Update DNS fallback 2025-09-18 10:15:59 -04:00
trevor-signal
0eed21ee7c Update strings 2025-09-18 10:15:58 -04:00
trevor-signal
37fa65e893 Release notes for 7.72 2025-09-18 10:15:58 -04:00
trevor-signal
4dccbdb5fb
Improve handling of invalid incrementalMac during backup import 2025-09-17 18:51:21 -04:00
trevor-signal
c98a346b0c
Avoid foreign key error if message is deleted before saving attachments 2025-09-17 10:38:34 -07:00
yash-signal
234d238786
Update clean-transpile command to remove eslint cache 2025-09-17 11:24:31 -05:00
Fedor Indutny
f8db88a0cd
Update electron to 38.1.2 2025-09-17 09:07:42 -07:00
trevor-signal
60827ade25
[signalapp/Signal-Desktop#7453] Update conversation list styles when dragging
Co-authored-by: Brian Harder <briankharder@gmail.com>
2025-09-17 11:35:46 -04:00
andrew-signal
ce890cacce
Bump to libsignal v0.81.0 2025-09-16 22:23:25 -07:00
Fedor Indutny
c02565eaa8
Enforce node: schema for builtins, import extensions 2025-09-16 17:39:03 -07:00
Jamie Kyle
cc6b8795b8
Fix emoji stories and add inline emoji story 2025-09-16 17:51:52 -04:00
Miriam Zimmerman
ec3acac38e
Immediately handle audio device changes 2025-09-16 10:53:32 -07:00
yash-signal
ecca208b87
Update badge information correctly when updating user profile 2025-09-15 17:06:33 -04:00
Jordan Rose
1da1f9da84
Update to libsignal v0.80.3, add future sealed sender trust roots
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-09-15 10:58:02 -07:00
Fedor Indutny
976f792001
Show video duration in all media UI 2025-09-15 10:37:40 -07:00
dependabot[bot]
a1171ee8e1
Bump electron from 38.0.0 to 38.1.0
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-11 13:11:27 -07:00
Fedor Indutny
f765612f43
Fix MediaGridItem for undownloaded GIFs 2025-09-11 12:35:40 -07:00
Alex Bakon
b284dc47be
Remove unused CDSI remote config keys 2025-09-12 03:22:02 +10:00
trevor-signal
0589e760df
Update local backups visibility 2025-09-12 03:15:48 +10:00
trevor-signal
61ab375308
Advertise new link and sync capability 2025-09-11 08:09:31 -07:00
Fedor Indutny
f6f67dec52
Fix lint 2025-09-11 09:00:47 +10:00
Scott Nonnenberg
ed76a9541e v7.73.0-alpha.1 2025-09-10 15:44:39 -07:00
Scott Nonnenberg
b6839e5dd5 Update DNS fallback 2025-09-10 15:44:39 -07:00
Scott Nonnenberg
f22b2b9cfb Update strings 2025-09-10 15:44:38 -07:00
Scott Nonnenberg
8451092f89 Release notes for 7.71 2025-09-10 15:44:38 -07:00
Jamie Kyle
58f2dd94d2
Init AxoSwitch/AxoCheckbox & forced-colors mode 2025-09-10 13:25:46 -07:00
Fedor Indutny
53d1650844
Update styles for MediaGallery 2025-09-10 13:25:21 -07:00
trevor-signal
11e612f57b
Add media granularity to backup attachment download source 2025-09-10 16:16:46 -04:00
trevor-signal
2432631fb9
Clarify resumable download paths 2025-09-10 12:34:25 -04:00
trevor-signal
4bb3825cb7
Update backups feature flags 2025-09-10 07:57:28 -07:00
trevor-signal
1845931358
Add debugging toast when attachment download from backup tier fails 2025-09-09 16:37:31 -04:00
ayumi-signal
fb3f281c45
Fix calling video device selection by using getUserMedia deviceId.exact 2025-09-08 17:10:04 -07:00
trevor-signal
b92c0e95e8
Discard invalid incrementalMacs 2025-09-08 16:19:17 -04:00
Fedor Indutny
ebdf651dca
Support symlinked stickers.noindex folder 2025-09-09 05:44:44 +10:00
trevor-signal
87704409c3
Improve message attachment parsing 2025-09-08 11:09:17 -07:00
trevor-signal
c85ad2b867
Improve handling of backup CDN read credentials 2025-09-08 11:00:18 -07:00
trevor-signal
0c5f5aaaf9
Update backups branding 2025-09-08 13:36:57 -04:00
trevor-signal
a3b7f7d044
Fix benchmark CI misattribution & flake 2025-09-08 10:35:18 -05:00
Jim Gustafson
f3237eec13
Update to RingRTC v2.57.1 2025-09-05 15:21:45 -07:00
trevor-signal
ab3dfc2d87
Simplify undownloadable attachment states 2025-09-05 14:00:28 -07:00
ayumi-signal
265ab4a732
Fix donations toast to show only on resume after restart 2025-09-05 23:35:09 +10:00
ayumi-signal
6152cd049f
Fix position of currency select dropdown caret 2025-09-04 17:22:40 -07:00
Alex Bakon
0ed00f409f
Remove non-libsignal-net Chat websocket 2025-09-04 10:43:12 -07:00
dependabot[bot]
5c9fd39aa7
Bump electron from 37.4.0 to 38.0.0
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-09-04 09:28:58 -07:00
Alex Bakon
a99055ca9f
Upgrade libsignal-client to 0.79.1 2025-09-03 15:34:08 -07:00
ayumi-signal
a32503043a v7.72.0-alpha.1 2025-09-03 15:06:15 -07:00
ayumi-signal
6e6171b427 Update DNS fallback 2025-09-03 15:06:15 -07:00
ayumi-signal
44bb4c672d Update strings 2025-09-03 15:06:14 -07:00
ayumi-signal
1a19d629cd Release notes for 7.70 2025-09-03 15:06:14 -07:00
ayumi-signal
40bdb34fd4
Use toLowerCase for config values 2025-09-03 14:36:01 -07:00
ayumi-signal
e122a106a3
Fix Donation payment card fields in RTL 2025-09-03 11:46:35 -07:00
ayumi-signal
deb62b8578
Use donations prod flag 2025-09-04 03:53:10 +10:00
ayumi-signal
a29aef5ebe
Localize payment card expiration date 2025-09-03 10:49:12 -07:00
ayumi-signal
14e0086943
Fixes for donation amount picker 2025-09-03 10:47:19 -07:00
ayumi-signal
c09dc17867
Fix remote config for configs with unspecified on-off values 2025-09-02 16:42:04 -07:00
ayumi-signal
e98bb0750c
Upgrade electron to 37.4.0 2025-09-02 10:57:22 -07:00
ayumi-signal
90e734a137
Fix stuck in-call close dialog overlay when cancelling 2025-09-02 10:49:44 -07:00
Jamie Kyle
b4da619b3c
Create AriaClickable component 2025-09-02 10:31:58 -07:00
Fedor Indutny
10e1953ae3
Fix image spinner 2025-09-02 08:03:48 -07:00
Jordan Rose
a0633efece
Remove sealed sender proto file in favor of libsignal types 2025-08-30 07:07:28 +10:00
yash-signal
0e4cdfc566
Donations: show modal when we can't apply the user's badge 2025-08-29 12:29:53 -07:00
Fedor Indutny
f0488dff25
Merge ProgressCircle into SpinnerV2 2025-08-29 11:55:52 -07:00
ayumi-signal
418a0a0aa3
Fix flaky test models/messages getNotificationData 2025-08-29 11:42:59 -07:00
ayumi-signal
df21a22fc5
Donations dialogs visual fixes 2025-08-28 13:25:48 -07:00
Fedor Indutny
1b4aecd2f0
Improve left pane search bar behavior 2025-08-28 11:36:19 -07:00
ayumi-signal
bc33de9149
Update text in donations discard dialog 2025-08-28 09:47:01 -07:00
Fedor Indutny
f1faca416e
Add .screenshot() method to mock tests 2025-08-28 09:44:44 -07:00
Jamie Kyle
a832bafc04 v7.71.0-alpha.1 2025-08-27 13:45:26 -07:00
Jamie Kyle
1722076af5 Update DNS fallback 2025-08-27 13:45:26 -07:00
Jamie Kyle
3d60910d89 Update strings 2025-08-27 13:45:25 -07:00
Jamie Kyle
6749692a8e Update release notes 2025-08-27 13:45:25 -07:00
trevor-signal
37ec000831
Enable backfilling of attachments without message_attachment rows 2025-08-26 20:20:14 -07:00
trevor-signal
f4c1d9334f
Keep messages in their own transaction in saveMessagesIndividually 2025-08-26 17:17:16 -04:00
ayumi-signal
b0bbf4189e
Fix donations custom amount input caret and lost currency symbols 2025-08-26 12:36:44 -07:00
Jamie Kyle
1df2dc6151
Implement sync for chat folders
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2025-08-25 18:02:05 -07:00
trevor-signal
435dc2acf7
Update profile sharing when added to group 2025-08-26 00:26:49 +10:00
trevor-signal
5e44de3bd7
Fix quote copying from original image 2025-08-25 10:20:04 -04:00
yash-signal
80b5ebd68b
Show donations confirm discard modal when clicking back button twice 2025-08-22 14:10:38 -07:00
Alex Bakon
1d37db78d2
Switch remote config fetching to use new endpoint 2025-08-22 10:20:57 -05:00
ayumi-signal
8305ad160f
Fix logging on initialization 2025-08-21 17:24:13 -07:00
ayumi-signal
277ea13093
Fix donations processing dialog on retry and add onEnter handler to form inputs 2025-08-21 16:41:30 -05:00
ayumi-signal
332936a938
Fix donations settings pane 2025-08-21 09:39:59 -07:00
Jamie Kyle
ae7c2c09a4
Create internal db debugger 2025-08-20 13:00:14 -07:00
Yash
31544d68a2 Update strings 2025-08-20 14:14:05 -05:00
Yash
cec6e36287 release notes 2025-08-20 14:13:58 -05:00
trevor-signal
5ba8071aa7
Ensure incrementalMac consistency when exporting 2025-08-20 14:39:21 -04:00
Fedor Indutny
22a3aa0ed7
Introduce FileThumbnail component 2025-08-20 11:28:59 -07:00
gram-signal
8ab0014ab2
Add SPQR to capabilities upload. 2025-08-20 11:28:12 -07:00
Miriam Zimmerman
2a53922300
Calling Buffer->Uint8Array updates
Co-authored-by: Jim Gustafson <jim@signal.org>
2025-08-20 11:18:31 -07:00
trevor-signal
ed5cdae7c5
Wait to confirm keys sync message 2025-08-20 09:25:41 -07:00
Alex Bakon
8c6afeb955
Upgrade libsignal to v0.78.3 and add chat noise shadowing 2025-08-20 11:58:04 -04:00
trevor-signal
58db5754b6
Update behavior on timeout retrieving archive 2025-08-19 12:44:18 -07:00
trevor-signal
4ac3f21268
Add support for OutgoingMessageDetails.dateReceived 2025-08-19 12:44:07 -07:00
Fedor Indutny
203a1cc5e3
Update electron to 37.3.1 2025-08-19 10:44:53 -04:00
ayumi-signal
63a170511f
Donations flow visual fixes 2025-08-18 18:51:16 -05:00
ayumi-signal
b66c557afd
Fix donation receipts list noMouseClose 2025-08-18 18:34:29 -05:00
trevor-signal
a7e22b14b3
Update retry behavior for backed-up attachments 2025-08-18 10:53:04 -07:00
Fedor Indutny
ac89fe894a
Update @signalapp/sqlcipher to 2.4.4 2025-08-18 10:03:55 -07:00
yash-signal
9f7298c666
Simplify interaction with updater and main process 2025-08-18 09:38:13 -07:00
Fedor Indutny
27fd03f5f0
Disable background throttling 2025-08-16 08:26:49 +10:00
yash-signal
ea33f3d262
Donations: Fix x and download buttons not working on receipt modal 2025-08-16 02:26:12 +10:00
Fedor Indutny
1a975fe61b
Fix sleep() during background throttling 2025-08-16 00:49:27 +10:00
ayumi-signal
eb8569aba4
Fix linux build file permissions to fix reproducible builds 2025-08-14 14:47:50 -07:00
Fedor Indutny
0f23c9e3af
Update @signalapp/sqlcipher to 2.4.3 2025-08-13 20:54:31 -07:00
Fedor Indutny
1019942475
Update @signalapp/sqlcipher to 2.3.0 2025-08-13 15:36:47 -07:00
Fedor Indutny
4571e7ab09 v7.69.0-alpha.1 2025-08-13 14:34:41 -07:00
Fedor Indutny
5c3a49c1c1 Update DNS fallback 2025-08-13 14:34:41 -07:00
Fedor Indutny
9661d6a867 Update strings 2025-08-13 14:34:41 -07:00
Fedor Indutny
7b8fb8a141 Release notes for 7.67 2025-08-13 14:34:41 -07:00
ayumi-signal
f30324b834
Begin Donations testing 2025-08-13 14:20:28 -07:00
Alex Bakon
34b22fc6ce
Upgrade mock-server to v13.2.2 2025-08-13 11:27:29 -07:00
Fedor Indutny
fb6f5235ad
Add existence check to addStickerPackReference 2025-08-13 11:01:54 -07:00
yash-signal
0d0e0f5eb4
Release notes fetcher test flake fix 2025-08-13 12:14:40 -05:00
Fedor Indutny
6fc31c4c2e
Use fully qualified keys in ConversationList 2025-08-13 09:43:50 -07:00
Fedor Indutny
4493f3f439
Fix attachment key in AttachmentList 2025-08-13 09:23:44 -05:00
yash-signal
78c1559f76
Post Donate Badge Toggle Modal 2025-08-12 19:35:52 -05:00
ayumi-signal
ae3e7cfc41
Add in progress donation placeholder badge to donations home 2025-08-13 06:49:40 +10:00
Scott Nonnenberg
509777e9a8
ConversationController: Listen for updates and update unread count 2025-08-12 10:06:37 -07:00
yash-signal
a455275d01
Add setting for "keep muted chats archived" 2025-08-12 08:50:25 -05:00
Jamie Kyle
b798a4f927
Get Tailwind ready for general usage 2025-08-11 16:46:23 -07:00
Scott Nonnenberg
237e239e05 Remove backbone as a dependency
Co-authored-by: Yash <yash@signal.org>
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
Co-authored-by: Jamie Kyle <113370520+jamiebuilds-signal@users.noreply.github.com>
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-08-11 14:06:34 -07:00
Jamie Kyle
4fc9793cae
Add license-comments eslint rule 2025-08-11 12:55:09 -07:00
ayumi-signal
00bdba0d62
Linux builds: Use ubuntu 22 image 2025-08-11 12:52:52 -07:00
trevor-signal
64dfe6432e
Treat 403 from CDN0 the same as a 404 from others CDNs 2025-08-11 12:21:21 -07:00
ayumi-signal
eac9a69e20
Use ErrorBoundary for donations 2025-08-11 11:44:10 -07:00
Alex Bakon
26b289a4ae
Upgrade libsignal to v0.78.2 2025-08-11 11:24:54 -07:00
Jamie Kyle
3e857b9a99
Fix image thumbnail cover size 2025-08-11 10:22:54 -07:00
Fedor Indutny
5dfd779649
Key ConversationList by mode in left pane 2025-08-11 10:15:37 -07:00
Fedor Indutny
c7ea1882ba
Revert react-virtualized key changes 2025-08-11 09:45:56 -07:00
Scott Nonnenberg
b35acc2396
getConversation: first/familyName should use nickname if set 2025-08-12 02:39:41 +10:00
Fedor Indutny
c59f9d08de
Fix check in wasGroupCallRingPreviouslyCanceled 2025-08-08 12:34:46 -07:00
Fedor Indutny
63cac44853
Remove unused capabilities 2025-08-08 11:31:08 -07:00
trevor-signal
bc62e05532
Fix backup thumbnail encryption when downloading 2025-08-08 14:06:54 -04:00
Fedor Indutny
906822131d
Fix quote annotation for GIFs 2025-08-09 02:52:03 +10:00
Fedor Indutny
521d64ac71
Fix benchmark name 2025-08-08 08:07:41 -07:00
Fedor Indutny
f13378588f
Use larger windows runner in CI 2025-08-07 15:47:42 -07:00
Jamie Kyle
8eaec167f7
Filter out SMS conversations with no messages from the contact results
Co-authored-by: Wyatt Childers <wchilders@nearce.com>
2025-08-07 12:32:14 -07:00
emir-signal
ebf2892039
Add support for call link epochs
Co-authored-by: trevor-signal <trevor@signal.org>
2025-08-07 15:12:56 -04:00
Fedor Indutny
ee45891d35
Update @signalapp/sqlcipher to 2.2.2 2025-08-07 11:40:14 -07:00
ayumi-signal
4e2e9106d2
Fix calls tab mark read error when adhoc call is the latest 2025-08-07 11:01:50 -07:00
Fedor Indutny
ec8d6a7359
Faster CI runs 2025-08-07 10:33:21 -07:00
ayumi-signal
109c3036c9
Update electron to 37.2.6 2025-08-07 10:27:59 -07:00
Fedor Indutny
40b7a02141
Update pino to 9.8.0 2025-08-07 10:24:25 -07:00
yash-signal
5d4beb277d
Fix self badge retrieval 2025-08-07 09:59:40 -07:00
Jamie Kyle
00efbb321b v7.68.0-alpha.1 2025-08-06 14:27:08 -07:00
Jamie Kyle
3589874563 Update DNS fallback 2025-08-06 14:27:07 -07:00
Jamie Kyle
0b113f23e9 Update strings 2025-08-06 14:27:07 -07:00
Jamie Kyle
3b16911ddb update release notes 2025-08-06 14:27:06 -07:00
trevor-signal
dae0ac1498
Group message reactions by parentKey 2025-08-06 14:41:37 -04:00
trevor-signal
26e09e2a63
Enable remote backups UI on nightly builds 2025-08-06 14:31:58 -04:00
Fedor Indutny
e6809c95db
Simplify database migrations 2025-08-06 10:32:08 -07:00
ayumi-signal
46d5b06bfc
Disable donations while offline 2025-08-06 09:40:30 -07:00
Fedor Indutny
20ac4e9a4e
Run lint in parallel 2025-08-05 14:24:31 -07:00
Jamie Kyle
6baba018c0
Fix attachment list image thumbnail 2025-08-05 13:42:04 -07:00
Fedor Indutny
98ba28d726
Fix lightbox mock test 2025-08-05 13:37:47 -07:00
Fedor Indutny
f80aef0ba4
Fix aspect ratio of ImageOrBlurhash 2025-08-05 11:13:10 -07:00
ayumi-signal
60796d30f3
Fix donation receipt generator for rtl languages 2025-08-05 10:49:34 -07:00
ayumi-signal
d737383612
Improve amount picker custom input and sort currency list 2025-08-04 16:22:22 -07:00
Jamie Kyle
0d99f8bca2
Init Axo design system 2025-08-04 13:35:20 -07:00
Scott Nonnenberg
7553a85b1c
SignalProtocolStore: Make preKeys and kyberPreKeys zone-aware 2025-08-05 05:19:24 +10:00
Fedor Indutny
313d832542
Introduce ImageOrBlurhash component 2025-08-04 09:16:54 -07:00
ayumi-signal
85f472741b
Fix icon for preferences donations 2025-08-01 14:31:16 -07:00
ayumi-signal
0b63aa9aa5
Show one time badge icon in donation receipt list 2025-08-01 13:14:05 -07:00
ayumi-signal
a4ef26877d
Style donations card form 2025-08-01 07:48:12 +10:00
trevor-signal
a7cd27f3cf
Skip queueing old attachments on non-media-enabled backup import
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2025-08-01 06:21:59 +10:00
Scott Nonnenberg
0b598bef96
Preferences: QR code button now takes you to username link screen
Co-authored-by: Jamie Kyle <113370520+jamiebuilds-signal@users.noreply.github.com>
2025-07-31 12:02:02 -07:00
trevor-signal
d5c18f2810
Backups: remove legacy locators 2025-07-31 10:53:15 -04:00
Scott Nonnenberg
2d2d83f982 v7.67.0-alpha.1 2025-07-30 17:02:07 -07:00
Scott Nonnenberg
05cf50df3d Update DNS fallback 2025-07-30 17:02:07 -07:00
Scott Nonnenberg
f7155e52b9 Update strings 2025-07-30 17:02:07 -07:00
Scott Nonnenberg
8adcb82778 Release notes for 7.65 2025-07-30 17:02:06 -07:00
Scott Nonnenberg
fd794ae90d
Donations: Introduce timeouts in early stages of the workflow 2025-07-31 07:15:59 +10:00
trevor-signal
7ef40c64c4
Update max message length check 2025-07-30 10:09:38 -05:00
Scott Nonnenberg
cde504957a
Contact Sync: Retry failed contacts sync downloads; don't try if offline 2025-07-30 08:18:16 -05:00
Scott Nonnenberg
004dfb0af4
Donations: Show confirmation toast on startup at INTENT_METHOD
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-07-30 07:35:10 +10:00
trevor-signal
0aec0e0f18
Fix scroll positioning after viewing archive 2025-07-29 12:22:45 -07:00
ayumi-signal
2e9950bdb4
Fix call link refresh on CallLinkUpdate sync for metadata changes 2025-07-29 11:11:56 -07:00
Jamie Kyle
69646275c4
Fix emoji picker error toast on escape 2025-07-29 10:42:17 -04:00
Scott Nonnenberg
d01ae5c510
AttachmentDownloadManager: Don't log errors/warnings in common cases 2025-07-29 10:30:42 -04:00
Scott Nonnenberg
048b075c70
Donations: Select default currency via user's phone number 2025-07-29 02:08:05 +10:00
Jim Gustafson
02912bd7c7
Update to RingRTC v2.56.0 2025-07-25 14:09:14 -07:00
yash-signal
413b731b24
Catch top-level errors thrown in electron tests 2025-07-25 13:44:28 -07:00
Jamie Kyle
56223905da
Reduce number of log.error calls
Co-authored-by: ayumi-signal <ayumi@signal.org>
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2025-07-24 10:18:29 -07:00
trevor-signal
88304103d5
Save artifacts on test-electron failures 2025-07-24 10:16:18 -07:00
ayumi-signal
405cf4aa12 v7.66.0-alpha.1 2025-07-23 16:36:54 -07:00
ayumi-signal
deed3cc0c6 Update DNS fallback 2025-07-23 16:36:54 -07:00
ayumi-signal
151c6c7af5 Update strings 2025-07-23 16:36:53 -07:00
ayumi-signal
19abd413f2 Release notes for 7.64 2025-07-23 16:36:53 -07:00
yash-signal
8fdbca9a4e
Upgrade libsignal to 0.76.7 2025-07-22 17:45:53 -05:00
ayumi-signal
bbf559019c
Upgrade libsignal to 0.76.6 2025-07-22 12:41:45 -07:00
Scott Nonnenberg
510b4f2df7
Privacy: Additional tweaks to debug log generation 2025-07-22 11:08:36 -07:00
Scott Nonnenberg
9fc0cedebb
Donations: Show progress, error and verify dialogs 2025-07-22 07:21:41 +10:00
Scott Nonnenberg
387fb8bfc1
Privacy.ts: Additional safety for debug logs 2025-07-22 06:44:08 +10:00
trevor-signal
75c867ee1f
Mark messages read on delay when timeline becomes visible 2025-07-21 12:32:50 -07:00
yash-signal
0fda377326
sendSyncMessageOnly: Keep timer if it exists 2025-07-21 13:43:49 -05:00
ayumi-signal
4557182654
Style donation amount picker 2025-07-22 03:55:21 +10:00
trevor-signal
96099da737
Inline long-text messages in the backup proto 2025-07-21 12:49:34 -05:00
Jamie Kyle
977a6f2719
Fix space key opening lightbox on image reactions 2025-07-21 09:29:04 -05:00
trevor-signal
a8a7dc8965
Refactor backup media download progress tracking 2025-07-18 14:21:15 -04:00
Jamie Kyle
3775aa7ae4
Init donations card form validation 2025-07-17 14:38:19 -07:00
trevor-signal
f471b75a5f
Stop round-tripping wallpaper data 2025-07-17 11:20:00 -04:00
Miriam Zimmerman
e6a57f69d8
RingRTC: Conversions from Buffer->Uint8Array 2025-07-17 10:38:35 -04:00
yash-signal
56e40928e4
Fixes and improvements to Donations Home Page 2025-07-17 09:54:27 +10:00
Yash
07a05f3dd6 v7.65.0-alpha.1 2025-07-16 17:58:12 -05:00
Yash
a5ed182c01 Update DNS fallback 2025-07-16 17:58:12 -05:00
Yash
0202059287 Update strings 2025-07-16 17:58:12 -05:00
Yash
72992201e0 release notes 2025-07-16 17:58:11 -05:00
Scott Nonnenberg
e17bcb2409
Donations: Show toasts when resuming after startup
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-07-17 04:33:41 +10:00
trevor-signal
ea3a7f70b6
Avoid race condition when marking messages read 2025-07-16 12:47:07 -05:00
trevor-signal
eb9476c291
Increase max displayable image dimensions 2025-07-16 13:44:43 -04:00
trevor-signal
149b7d4f8b
Allow passing newest read message explicitly 2025-07-16 11:34:37 -05:00
Fedor Indutny
b30c53d291
Use react-dom/client createRoot 2025-07-15 16:32:11 -07:00
ayumi-signal
26933bf8d7
Initial donation amount picker
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-07-15 09:52:56 -07:00
trevor-signal
2579dfd9d9
Only queue backfilled attachments after backfill response 2025-07-15 10:42:57 -04:00
Scott Nonnenberg
e938e68c7d
Introduce new DonationErrorModal component
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-07-15 09:06:25 +10:00
Scott Nonnenberg
cb8edb4888
Introduce new donation progress modals
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-07-14 14:31:17 -07:00
andrew-signal
a972bde459
Update libsignal-client to v0.76.4 2025-07-15 05:31:06 +10:00
Scott Nonnenberg
3d2acb775d
Update to signalapp/windows-ucv v1.0.1 2025-07-15 04:18:21 +10:00
gram-signal
fcf19e2c42
Use non-global flag for usePqRatchet 2025-07-14 12:58:48 -04:00
Scott Nonnenberg
44bb4acf9b
Introduce new DonationVerificationModal to kick off 3ds verification 2025-07-11 15:38:42 -07:00
Miriam Zimmerman
b95161859e
Add integration test for call decline 2025-07-11 11:48:31 -04:00
Scott Nonnenberg
cf03754d2f
Message.tsx: Show expiring metadata when rendering generic attachments 2025-07-10 13:29:48 -04:00
Scott Nonnenberg
470cd1624d
Donations: Finish wiring up the 3ds validation flow 2025-07-10 10:13:32 -07:00
Scott Nonnenberg
9ee1680ce7 v7.64.0-alpha.1 2025-07-09 18:56:32 -07:00
Scott Nonnenberg
94df85c3e0 Update DNS fallback 2025-07-09 18:56:31 -07:00
Scott Nonnenberg
cfe8c1eb11 Update strings 2025-07-09 18:56:31 -07:00
Scott Nonnenberg
841d4f728c Release Notes for 7.62 2025-07-09 18:56:31 -07:00
Scott Nonnenberg
437e791573
Donations: Make workflow more robust 2025-07-10 07:34:42 +10:00
Jordan Rose
b440aec88c
Set Accept-Language at the connection level for chat connections 2025-07-09 10:57:01 -07:00
Fedor Indutny
3063262730
Fix contact sync for aci-less contacts 2025-07-09 09:14:25 -07:00
ayumi-signal
6ec9dd60b1
Fix linux post upgrade script polkit action handling 2025-07-08 10:37:01 -07:00
trevor-signal
bce305e3d0
Preserve conversation list ordering for message request response events 2025-07-08 13:12:36 -04:00
yash-signal
70162be74e
Start Donations Receipt Flow UI 2025-07-07 16:53:46 -07:00
yash-signal
b04d3a9c7b
Staging indicator for donation receipts
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-07-07 10:24:04 -07:00
Fedor Indutny
6b41d1f891
Revert "Update electron to 37.1.0" 2025-07-08 03:15:53 +10:00
trevor-signal
fc67ac8e7b
Add backup media download progress to settings pane 2025-07-03 14:30:13 -04:00
Miriam Zimmerman
9963daf3bf
Adapt bootstrap to support two clients 2025-07-02 16:11:41 -07:00
Fedor Indutny
5044b3ca3b v7.63.0-alpha.1 2025-07-02 16:02:28 -07:00
Fedor Indutny
0d665455b9 Update DNS fallback 2025-07-02 16:02:28 -07:00
Fedor Indutny
69352341ff Update strings 2025-07-02 16:02:27 -07:00
Fedor Indutny
de951740ba Release notes for 7.61 2025-07-02 16:02:27 -07:00
Fedor Indutny
02b2ef1183
[signalapp/Signal-Desktop#7403] use fromSeconds when setting universalExpireTimer
Co-authored-by: odpay <odpay@odpay.net>
2025-07-02 09:58:49 -07:00
Fedor Indutny
2e620496ef
Fix debuglogs window 2025-07-01 15:32:20 -07:00
Fedor Indutny
2a813804e9
Update @signalapp/sqlcipher to 2.1.0 2025-07-01 14:34:39 -07:00
Scott Nonnenberg
6db7bedc8c
Simplify donation receipts 2025-07-02 06:33:36 +10:00
Jamie Kyle
199dbaf49d
Disable fun error boundary toast in prod 2025-07-01 11:34:43 -07:00
Fedor Indutny
489efd1aec
Dev tools grepping 2025-07-01 11:09:38 -07:00
trevor-signal
708a1bb51f
Restrict message attachments shown in gallery & lightbox 2025-07-01 13:14:28 -04:00
ayumi-signal
bcb1a614ea
Fix db error from concurrent processing of call link update sync 2025-06-30 16:58:26 -07:00
trevor-signal
746b22d3dc
Backups: update integration tests 2025-06-30 16:54:21 -05:00
adel-signal
0771075a75
Update to RingRTC v2.54.1
Co-authored-by: Miriam Zimmerman <mutexlox@signal.org>
2025-06-30 13:32:52 -07:00
trevor-signal
3e24e510e6
Limit linked device interaction with backup service 2025-06-30 13:18:52 -07:00
trevor-signal
4aecd47727
Improve saveAttachmentDownloadJob error handling 2025-06-30 15:02:18 -04:00
Fedor Indutny
e4e8fadb0f
Update libsignal-client to 0.76.0 2025-06-30 11:43:41 -07:00
Jordan Rose
e55efbd6ee
Link previews for image URLs 2025-06-30 12:41:09 -04:00
Jordan Rose
a1b10d1eff
Link previews: return the image content type *after* transcoding 2025-06-30 10:17:48 -04:00
ayumi-signal
f2241cf613
Initial workflow for donations
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2025-06-27 13:48:50 -07:00
Fedor Indutny
f62c53fdee
Update electron to 37.1.0 2025-06-26 09:35:10 -07:00
trevor-signal
843f545ceb
Reorganize test cases 2025-06-26 09:24:07 -07:00
gram-signal
3a745f2b6e
Remote Config flag for PQ ratchet 2025-06-26 09:22:52 -07:00
Fedor Indutny
48bfde3c41
Demote sender key error in Signal Protocol Store 2025-06-26 07:54:59 -07:00
yash-signal
2028c95d08
Donations UI Receipt Generation 2025-06-25 16:16:46 -07:00
Jamie Kyle
ffc34d5080 v7.62.0-alpha.1 2025-06-25 15:03:30 -07:00
Jamie Kyle
c9d0d5f463 Update DNS fallback 2025-06-25 15:03:29 -07:00
Jamie Kyle
7a94b6ef1d Update strings 2025-06-25 15:03:29 -07:00
Jamie Kyle
824f1e7b2e Update release notes 2025-06-25 15:03:29 -07:00
trevor-signal
ab29fc7953 Avoid foreign index constraint error when saving message attachments 2025-06-25 14:40:24 -07:00
Fedor Indutny
34336ff284
Update mock-server to 13.0.1 2025-06-25 12:52:27 -07:00
trevor-signal
2e9dae6b1f
Backups: subscription info improvements 2025-06-25 14:56:52 -04:00
Fedor Indutny
8251720444
Use new compact representations in protobufs
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-06-25 10:30:40 -07:00
Jamie Kyle
157496f822
Init Chat Folders Settings UI 2025-06-25 10:17:33 -07:00
Jamie Kyle
791ccda7aa
Hide deprecated unicode family emoji from picker 2025-06-24 12:32:17 -07:00
trevor-signal
9f22445e93 v7.61.0-alpha.1 2025-06-20 07:42:12 -04:00
trevor-signal
5b8deee2b3 Update DNS fallback 2025-06-20 07:42:11 -04:00
trevor-signal
425fd51bed Update strings 2025-06-20 07:42:11 -04:00
ayumi-signal
ab475fa4b2 Release notes for 7.59 2025-06-20 07:42:11 -04:00
ayumi-signal
e69c036c4b
Test: Add Linux GTK version switch for electron to fix test-node 2025-06-18 15:15:30 -04:00
trevor-signal
fb0c414702
Backups: use new locatorInfo & mediaName (#10627) 2025-06-18 13:16:29 -04:00
ayumi-signal
099f94a809
Update string for join group link error 2025-06-17 14:14:07 -07:00
andrew-signal
56c70697c9
Rotate experimentalTransportEnabled.prod to .2 2025-06-17 15:57:43 -04:00
ayumi-signal
37422e41f5
Add OS auth to local backup key viewer 2025-06-16 16:38:53 -07:00
Fedor Indutny
cae8bd482f
Fix double-wrap of MessageReceiver pino instance 2025-06-16 17:02:05 -05:00
Fedor Indutny
77c7c8d6ed
Fix creation of pino children 2025-06-16 16:36:59 -05:00
Fedor Indutny
353eafceb8
Add colors to Dev Tools 2025-06-16 13:39:49 -07:00
Scott Nonnenberg
9ffee9d290
Initial donationReceipts data types 2025-06-16 12:33:00 -07:00
Fedor Indutny
4347964030
Scope pino lines with filename 2025-06-16 11:59:31 -07:00
Fedor Indutny
f6c19c548e
Better usage of pino 2025-06-16 09:47:18 -07:00
trevor-signal
58f006aac2
Upload new set of PQ keys if too many exist 2025-06-13 14:05:12 -07:00
Scott Nonnenberg
e8e5312717
Initial settings donation pane 2025-06-13 10:38:09 -07:00
yash-signal
0904608b2f
Skip flaky release notes fetcher service test 2025-06-13 10:16:03 -04:00
Fedor Indutny
a3187f1527
Fix uncaught errors from ResizeObserver 2025-06-12 12:18:56 -07:00
Fedor Indutny
896a82653d
Fix backdrop for video stories in StoryCreator 2025-06-13 03:40:00 +10:00
trevor-signal
c7eb8ff327 v7.60.0-alpha.1 2025-06-11 15:17:09 -04:00
trevor-signal
2b4634e7cf Update DNS fallback 2025-06-11 15:17:08 -04:00
trevor-signal
00cd3667e7 Update strings 2025-06-11 15:17:08 -04:00
trevor-signal
01fa22466b Release notes for 7.58.x 2025-06-11 15:17:08 -04:00
Scott Nonnenberg
cdd77d8869
Don't go to settings after showing ProfileMovedModal 2025-06-11 14:40:05 -04:00
Fedor Indutny
5f5eee3ed8
Enable GPU use on Linux 2025-06-11 10:51:18 -07:00
Fedor Indutny
6297e12803
Linkify untruncated text 2025-06-10 18:13:42 -05:00
yash-signal
8ea030074e
Release notes bug fixes, unit tests 2025-06-10 16:33:00 -05:00
Scott Nonnenberg
3570653172
Settings Tab: Show updates dialog in all states but None 2025-06-10 13:36:50 -07:00
Scott Nonnenberg
c3b2c7af27
When a profile fetch fails, warn and don't log callstack 2025-06-10 16:16:26 -04:00
Fedor Indutny
9a4972d59e
Refactor build expiration checks 2025-06-10 12:17:07 -07:00
Fedor Indutny
b0634f9a9d
Replace buffer.slice() with buffer.subarray() 2025-06-09 14:37:30 -07:00
yash-signal
4a6e2d297b
Strip filenames for visual media attachments during upload 2025-06-09 09:46:55 -07:00
trevor-signal
9d5ab04195
Cleanup logging levels in WebAPI 2025-06-09 10:58:40 -05:00
trevor-signal
08aa3c1365
[signalapp/Signal-Desktop#7347] Update input padding for edit group modal
Co-authored-by: Brian Harder <briankharder@gmail.com>
2025-06-09 08:54:36 -04:00
Scott Nonnenberg
54d4c2240e
Settings Tab: Educate user about change to bottom-left profile icon 2025-06-07 10:26:09 +10:00
Scott Nonnenberg
974c29fd41
Settings Tab: Better layout for narrow windows 2025-06-06 15:16:40 -07:00
yash-signal
9e3f397032
Add "This Message" reactions 2025-06-06 12:44:38 -05:00
trevor-signal
ac58f3178e
[signalapp/Signal-Desktop#7348] Prefer user's own reaction variant in ReactionViewer
Co-authored-by: Brian Harder <briankharder@gmail.com>
2025-06-06 12:57:00 -04:00
Fedor Indutny
820fc3eced
Show error on invalid username links 2025-06-05 09:44:17 -07:00
Alex Bakon
c521568610
Start separating calls made to chat service 2025-06-05 08:28:07 +10:00
ayumi-signal
5b25de10f1
Add settings for local backups 2025-06-04 13:42:00 -07:00
Fedor Indutny
c36b8d3b6b
Fix focus UI for ListTile 2025-06-04 13:15:36 -07:00
Scott Nonnenberg
c42f59f10e
Show bottom-left profile photo in nightly builds and in development 2025-06-04 13:14:20 -04:00
Fedor Indutny
30bc3c14a8
Fix button label for save dialog 2025-06-04 09:14:07 -07:00
Fedor Indutny
c2ff41b520
Unify shared group computation logic 2025-06-03 15:43:26 -07:00
Fedor Indutny
13430f84e4
Better state teardown in tests 2025-06-04 08:25:52 +10:00
Scott Nonnenberg
14c4b4ac1b
Settings Tab: Allow resizing the left pane 2025-06-03 15:49:07 -05:00
Jim Gustafson
eb670fb89a
Update to RingRTC v2.53.0 2025-06-03 11:56:23 -07:00
Scott Nonnenberg
925298b17b
Update windows image used for github actions runs 2025-06-03 11:54:45 -07:00
Scott Nonnenberg
6ca0cd73b9
Settings Tab: When settings change, make proper updates 2025-06-04 04:05:30 +10:00
trevor-signal
7e40d7d887
Fix scrollbar border colors and positioning 2025-06-03 13:37:02 -04:00
Alex Bakon
cad30bd216
Always use the websocket for chat requests 2025-06-03 12:39:06 -04:00
Jamie Kyle
06ff9fa09e
Fix FunLightbox and FunTooltip 2025-06-03 09:29:51 -04:00
trevor-signal
0a91232634
[signalapp/Signal-Desktop#7345] Update primary device description
Co-authored-by: Kesara Rathnayake <kesara@fq.nz>
2025-06-03 09:23:47 -04:00
Scott Nonnenberg
799a0dcc54
Move Profile Editor into the new Settings Tab 2025-06-03 09:46:52 +10:00
yash-signal
829b84a54e
Remove Release Notes Feature Flag 2025-06-02 16:37:00 -07:00
trevor-signal
c9c16e17e2
Centralize notification logic 2025-06-02 17:21:32 -04:00
trevor-signal
46bf933e72
Add message schema version section to internal settings 2025-06-02 17:20:06 -04:00
trevor-signal
115b79e4ac
Update message attachment migration 2025-06-02 14:16:37 -07:00
ayumi-signal
a034045935
Fix main window not showing on Linux with Wayland 2025-06-02 11:38:25 -07:00
Jordan Rose
12bedb5d1c
Improve use of libsignal for decryption 2025-06-02 10:52:22 -07:00
Alex Bakon
1598105f5b
Enable libsignal TLS 1.3 enforcement via config 2025-05-30 16:58:44 -04:00
Fedor Indutny
8be2e8e527
Delay storage service sync until empty
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-05-30 10:39:39 -04:00
dependabot[bot]
10f7e7e442
Bump electron from 36.2.1 to 36.3.2
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-29 11:52:55 -07:00
trevor-signal
a2f0f4c8a4
Migration to normalize all attachments 2025-05-29 14:50:14 -04:00
andrew-signal
a2c50b1895
Improve Error Handling from LibSignal's WebSocket Opens 2025-05-29 10:36:18 -07:00
trevor-signal
010c38ae9b v7.59.0-alpha.1 2025-05-28 14:53:51 -04:00
trevor-signal
1f47d08cc9 Update DNS fallback 2025-05-28 14:53:51 -04:00
trevor-signal
db76bccdcd Update strings 2025-05-28 14:53:50 -04:00
trevor-signal
cc8c211a35 Release notes for 7.57 2025-05-28 14:53:50 -04:00
Scott Nonnenberg
cc8793362d
onUnregistered: Split contact even if we don't have pni 2025-05-28 11:33:17 -07:00
trevor-signal
60f55f1749
Show error toast on database errors 2025-05-28 11:24:11 -07:00
ayumi-signal
c38e871ca9
Don't show reactions from call participants who have recently left 2025-05-28 11:38:06 +10:00
Fedor Indutny
15eeaa189a
Fix localization of "New call" view header 2025-05-27 15:13:26 -07:00
Fedor Indutny
136740840a
Drop pni call messages 2025-05-27 15:00:06 -07:00
trevor-signal
15263c2d16
Ensure consistency in forwarding logic 2025-05-27 16:59:50 -04:00
Fedor Indutny
38666fe0a4
Update minimum ubuntu version 2025-05-27 10:20:09 -07:00
Fedor Indutny
edd9a5e254
Update size of audio playback button 2025-05-23 11:12:34 -05:00
trevor-signal
d6e81eee11
Normalize message attachments 2025-05-22 18:09:54 -07:00
Fedor Indutny
8d8e0329cf
Be more lenient to misplaced pni in conversations 2025-05-22 11:59:12 -07:00
Fedor Indutny
54b5f8a393
Propagate CLI option to Settings UI 2025-05-22 14:36:22 -04:00
Jim Gustafson
2491292fae
Update to RingRTC v2.52.2 2025-05-22 11:22:08 -07:00
Fedor Indutny
d0dc1747da
Allow exporting pni-only contacts 2025-05-22 11:06:37 -07:00
Fedor Indutny
770b01de6a
Be more lenient with profile change export 2025-05-22 10:42:55 -07:00
Fedor Indutny
d2e35569ec
Add a new CLI flag 2025-05-22 13:01:51 -04:00
Fedor Indutny
6ab849400d
Simplify message receiver event 2025-05-22 09:39:45 -07:00
Fedor Indutny
e80db63e6b v7.58.0-alpha.1 2025-05-21 14:05:07 -07:00
Fedor Indutny
2a3585c582 Update DNS fallback 2025-05-21 14:05:07 -07:00
Fedor Indutny
fa20298279 Update strings 2025-05-21 14:05:06 -07:00
Fedor Indutny
37a0c4bfa4 Release notes for 7.56 2025-05-21 14:05:06 -07:00
Scott Nonnenberg
86d44e96c2
Settings Tab: A few visual tweaks 2025-05-22 06:24:33 +10:00
trevor-signal
3828cf276c
Fix subscription response schema 2025-05-21 12:21:43 -04:00
yash-signal
388e145ed6
Do not show avatars for call notifications when "no name or content" setting is enabled 2025-05-20 18:34:53 -05:00
Scott Nonnenberg
ffb2f3cb7e
Settings Tab: Ensure that navigation to it is handled elsewhere 2025-05-20 16:03:31 -07:00
trevor-signal
15c826bc63
Refactor idle download state 2025-05-21 08:27:10 +10:00
Fedor Indutny
49161b7e17
Reorder getSendTarget logic for clarity 2025-05-20 15:40:16 -04:00
ayumi-signal
c10d59458f
Add dev menu to import local backup 2025-05-19 16:32:06 -07:00
trevor-signal
efa9102a1b
Improve pasted image filenames 2025-05-19 14:23:22 -07:00
Alex Bakon
33c1c39da4
Require PQ pre-keys from the server 2025-05-20 00:45:43 +10:00
Fedor Indutny
70cdf8c537
Fix additional backup export validation errors 2025-05-16 14:40:14 -07:00
ayumi-signal
720b91ad8c
Fix backup export error for pending direct calls 2025-05-16 14:32:08 -04:00
Alex Bakon
76047abb3c
Bump libsignal-client to 0.72.1 2025-05-16 11:16:28 -07:00
yash-signal
3db7bbb476
Only log zod when there's an error 2025-05-17 04:14:16 +10:00
ayumi-signal
40fab38a4b
Upgrade electron to 36.2.1 2025-05-16 11:03:44 -07:00
trevor-signal
8f672bb79a
Fallback to global media tier CDN number 2025-05-16 09:31:04 -07:00
trevor-signal
e37c95bddf
Improve logging when falling back to transit tier for attachment downloads 2025-05-16 09:17:01 -07:00
yash-signal
fca742b37b
Add Standardized Zod Validation to WebAPI
Co-authored-by: Jamie Kyle <jamie@signal.org>
2025-05-17 02:11:09 +10:00
Alex Bakon
05a6f0e927
Switch registration to use libsignal client 2025-05-15 16:56:26 -05:00
trevor-signal
f98203aba6
Adjust story buttons to not overlap window drag region 2025-05-15 14:24:06 -07:00
Scott Nonnenberg
3b1dacd203
Don't show unread count on Settings Tab icon 2025-05-15 14:11:16 -07:00
Scott Nonnenberg
f1350e4754
Settings Tab: When nav tabs collapsed, show toggle 2025-05-16 01:36:12 +10:00
ayumi-signal
a75a0f9143
Handle locally missing attachments for local backups 2025-05-15 11:27:46 -04:00
Jamie Kyle
50b34efad0
Fix gif download error with mismatching slice byte length 2025-05-15 11:25:53 -04:00
trevor-signal
718c5ef9f6
Bump libsignal-client to v0.71.1 2025-05-15 11:23:26 -04:00
Scott Nonnenberg
fe9d042e40
Introduce the new Settings tab
Co-authored-by: Jamie Kyle <jamie@signal.org>
Co-authored-by: Fedor Indutny <indutny@signal.org>
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2025-05-14 20:58:20 -07:00
ayumi-signal
0d906e88ff
Fix local backup for attachments needing reencryption 2025-05-14 09:20:18 -04:00
Fedor Indutny
6799a63736
Scope down content protection further for now 2025-05-14 10:44:46 +10:00
Jamie Kyle
ad5dadd666 v7.57.0-alpha.1 2025-05-13 14:08:55 -07:00
Jamie Kyle
463e261049 Update DNS fallback 2025-05-13 14:08:54 -07:00
Jamie Kyle
89395512b6 Update strings 2025-05-13 14:08:53 -07:00
Jamie Kyle
877e1c23df Update release notes 2025-05-13 14:08:53 -07:00
trevor-signal
ba015a779e
Send and properly receive AttachmentPointer.uploadTimestamp 2025-05-13 12:29:10 -07:00
Fedor Indutny
3702cc4d6b
Use frame-by-frame validator for testing 2025-05-13 15:06:14 -04:00
Fedor Indutny
1279278ccc
Prefix sql read/write errors with method name
Co-authored-by: Jamie Kyle <113370520+jamiebuilds-signal@users.noreply.github.com>
2025-05-13 12:04:13 -07:00
Fedor Indutny
56151d870c
Run SQL corruption check on logic error 2025-05-13 12:01:56 -07:00
Fedor Indutny
d37058bf34
Fix state after backup integration tests 2025-05-13 11:57:43 -07:00
trevor-signal
d8293d6fcb
Don't drop about-to-disappear messages 2025-05-13 11:56:53 -07:00
Fedor Indutny
354b060511
Fix runtime error in nickname equality check 2025-05-13 11:34:41 -07:00
Fedor Indutny
e8e6695ec6
Scope down content protection to Windows 11 2025-05-13 11:12:08 -07:00
dependabot[bot]
a8123f157e
Bump electron from 36.0.1 to 36.2.0
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-05-13 11:11:23 -07:00
trevor-signal
cc24f0524b
Improve reaction targeting 2025-05-13 10:46:30 -07:00
Jamie Kyle
16f9b64435
Add keyboard shortcuts to fun picker 2025-05-13 10:33:25 -07:00
Fedor Indutny
bc3b6a07bb
Add content protection checkbox to Settings window 2025-05-12 15:16:19 -07:00
ayumi-signal
a2c74c3a8b
Basic support for local encrypted backups 2025-05-12 14:15:11 -07:00
Fedor Indutny
2df601b135
Update sqlcipher to 2.0.3 2025-05-12 13:12:23 -07:00
Jamie Kyle
e04b3baed8
Add backdrop blur to image grid download button 2025-05-12 11:52:01 -07:00
Scott Nonnenberg
76b1918496
makeHttpError: Ensure response headers have lowercase names 2025-05-13 04:41:37 +10:00
Fedor Indutny
7fdd6f2b57
Attribute exported group updates to local ACI 2025-05-12 14:37:17 -04:00
Jamie Kyle
6c0b289cd7
Ignore 500s/identity key errors for GSE toast 2025-05-12 14:36:09 -04:00
Scott Nonnenberg
253d0f0a47
Notification Profiles: Ensure recently-created profiles always take precedence 2025-05-13 00:30:50 +10:00
Jim Gustafson
2cee9b8627
Fix camera state after screen sharing 2025-05-07 13:34:40 +10:00
Jamie Kyle
f647504a64
Display emoji completions with diacritics 2025-05-05 16:34:54 -07:00
Fedor Indutny
7324ddcf2c
Better context menu on macOS 2025-05-05 15:07:07 -07:00
Jamie Kyle
d91c28bae9
Fix mismatching gif response byte length
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-05-05 14:35:35 -07:00
ayumi-signal
511486c894
Add workaround to fix Linux GTK version for electron 2025-05-05 11:39:48 -07:00
trevor-signal
6d4fb10c27
Throttle unread updates 2025-05-05 11:36:11 -07:00
Jamie Kyle
deec5fc1e2
Wrap all React roots with StrictMode 2025-05-05 09:48:36 -07:00
Scott Nonnenberg
98270316c5
Introduce infrastructure for Notification Profiles 2025-05-05 10:39:04 -04:00
Jamie Kyle
80872ef15c
Fix sass deprecation warnings and make them fatal 2025-05-05 12:57:44 +10:00
Jamie Kyle
4cc088c79e
Fix conversation view from getting stale data 2025-05-02 11:14:43 -07:00
trevor-signal
ae6ffd26e7
Optimize publicKey deserialization for server trust root 2025-05-03 04:09:25 +10:00
Alex Bakon
aab1423930
Upgrade libsignal to v0.71.0 2025-05-03 02:30:49 +10:00
Fedor Indutny
ae8c6a7bed
Fix backup validation errors 2025-05-02 11:25:49 -04:00
Miriam Zimmerman
a444790bf9
Receive side of remote mute 2025-05-01 14:26:35 -04:00
Fedor Indutny
0d89e7b01a
Better update handling on Linux 2025-05-01 10:04:48 -04:00
dependabot[bot]
9e70387a9e
Bump electron from 35.1.4 to 36.0.1
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-04-30 17:01:11 -07:00
Jamie Kyle
d55c08654e v7.56.0-alpha.1 2025-04-30 11:54:35 -07:00
Jamie Kyle
4ceb0f04ac Update DNS fallback 2025-04-30 11:54:34 -07:00
Jamie Kyle
45e04cdb86 Update strings 2025-04-30 11:54:34 -07:00
Jamie Kyle
0d5546a0f8 Update release notes 2025-04-30 11:54:34 -07:00
ayumi-signal
29444004ca
Update README for reproducible-builds 2025-04-30 09:19:15 -07:00
Jamie Kyle
074fa8af4b
Fix localized emoji auto-completions 2025-04-29 16:24:14 -07:00
Jamie Kyle
dd3ab66593
Upgrade react in sticker-creator 2025-04-29 14:56:10 -07:00
trevor-signal
07a938ec98
Reset expire timer version after unlink 2025-04-29 13:35:05 -07:00
Jamie Kyle
14d098f40f
Upgrade to React 18 2025-04-29 13:27:33 -07:00
Fedor Indutny
560dcb91d9
Update electron-builder to 26.0.14 2025-04-29 11:06:32 -07:00
Fedor Indutny
956514e99d
Set CI=true in reproducible build 2025-04-29 10:15:54 -07:00
Fedor Indutny
b2a9f7c5e9
Update @signalapp/sqlcipher to 2.0.1 2025-04-28 15:25:09 -07:00
Scott Nonnenberg
93bc9e9ee1
Username search: Trim leading/trailing whitespace beforehand 2025-04-28 15:38:42 -05:00
Scott Nonnenberg
28507ccc15
Manually hoist all eslint config and plugin modules 2025-04-28 09:31:56 -07:00
Scott Nonnenberg
9a6a9f0bf6
Shutdown: Don't hang up ringing incoming calls
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
2025-04-26 06:23:44 +10:00
Fedor Indutny
eb10d6f42f
Additional fixes for backup validator 2025-04-24 17:00:47 -07:00
Jamie Kyle
d6efe16566
Add tooltips to fun picker 2025-04-24 15:17:35 -07:00
Fedor Indutny
16e877ece4
Spread the update downloads over 6 hours 2025-04-24 15:05:25 -07:00
Fedor Indutny
dcac698631
Fix some backup export issues 2025-04-24 14:53:42 -07:00
Fedor Indutny
bebdab211e
Simplify service id checks in MessageReceiver 2025-04-24 11:24:52 -07:00
Fedor Indutny
5a191b2e49
Send window activation from tray icon as well 2025-04-24 10:58:04 -07:00
Fedor Indutny
5901b79e10
Remove already enabled blink features 2025-04-24 10:11:19 -07:00
Fedor Indutny
9e2727bef6
Delay provisioner socket connection 2025-04-24 09:54:03 -07:00
Fedor Indutny
650060b898
Fix link previews in forward modal 2025-04-24 09:08:55 +10:00
Jamie Kyle
e802ea0dc7
Translate emoji completions in composer 2025-04-23 16:03:35 -07:00
Fedor Indutny
6a20d91b71
Update staged link preview styles 2025-04-23 10:39:56 -07:00
Yash
6f3d1f3696 v7.55.0-alpha.1 2025-04-23 11:36:16 -05:00
Yash
7e243998ad Update DNS fallback 2025-04-23 11:36:16 -05:00
Yash
db018f35c6 Update strings 2025-04-23 11:36:16 -05:00
Fedor Indutny
4e8f02e6e6
Provisioner improvements 2025-04-23 09:14:30 -07:00
yash-signal
ee03a10f64
Fix ConverationHero Title for 1:1 Conversations 2025-04-23 10:30:49 -05:00
yash-signal
447b1adee3
Release notes UI fixes 2025-04-22 10:33:51 -07:00
Scott Nonnenberg
c530192236
Logging improvements for sessions 2025-04-23 02:18:14 +10:00
Fedor Indutny
bd53f2891e
Simplify conflict resolution in storage service 2025-04-22 09:57:26 +10:00
Scott Nonnenberg
9919a886ca
Fix copy of emoji from message bubble 2025-04-21 10:54:17 -04:00
Jim Gustafson
89745df897
Calling: Move VideoSupport.ts to Client 2025-04-19 10:52:46 +10:00
Scott Nonnenberg
78b4bda568
Improve validation of username searches
Co-authored-by: Joris Z. van den Oever <jzvandenoever@users.noreply.github.com>
2025-04-19 08:21:10 +10:00
andrew-signal
6b496f41a2
Bump to libsignal v0.70.0 2025-04-18 11:25:52 -04:00
Alex Bakon
0853002f88
Use libsignal key types internally
Co-authored-by: trevor-signal <trevor@signal.org>
2025-04-18 10:07:35 -04:00
trevor-signal
3b51156e90
Update feature flag setup for funPicker 2025-04-17 12:03:35 -04:00
trevor-signal
4da0b9331b v7.54.0-alpha.1 2025-04-17 09:58:43 -04:00
trevor-signal
b579522703 Update DNS fallback 2025-04-17 09:58:43 -04:00
trevor-signal
04fe4e872d Update strings 2025-04-17 09:58:42 -04:00
trevor-signal
b34021a1b0 Release notes for 7.52 2025-04-17 09:58:42 -04:00
yash-signal
fcc81d9a7f
Show list of members in a group in ConversationHero 2025-04-16 18:16:41 -05:00
yash-signal
a1222d493b
Remove Release Notes Hash Check 2025-04-16 18:15:59 -05:00
Fedor Indutny
8b34f96b41
Fix backup export error for invalid serviceId 2025-04-16 15:37:13 -07:00
ayumi-signal
b9673d55ec
Upgrade electron-builder to 26.0.12 2025-04-16 15:21:53 -07:00
Fedor Indutny
0b5f0df1ca
Fix roundtripping of voice notes with body 2025-04-16 17:27:47 -04:00
trevor-signal
c9c3d24fd9
Fix out-of-disk-space test 2025-04-16 17:23:03 -04:00
ayumi-signal
5ac16a1ff8
Fix batch attachment download renaming and overwriting files 2025-04-16 12:32:50 -07:00
trevor-signal
ac80bddd85
Show low-disk-space warning during backup media download 2025-04-16 15:17:30 -04:00
Fedor Indutny
622b39b2d2
Fix digest for nsis-3.0.4.1.7z 2025-04-16 11:50:03 -07:00
Fedor Indutny
53b16c7484
Be resilient to invalid incrementalMac value 2025-04-16 14:49:49 -04:00
Alex Bakon
514509e2c7
Remove fallback CDSI implementation 2025-04-16 10:18:30 -07:00
Fedor Indutny
ffb7ae772d
Fix dynamic imports in bundled app 2025-04-16 09:38:40 -07:00
Fedor Indutny
fa2108ea3d
Use signed nsis package 2025-04-16 09:38:11 +10:00
Fedor Indutny
f68ef019a5
Add backup validation to settings 2025-04-15 16:04:30 -07:00
Scott Nonnenberg
fef6706a75
Calling PiP enhancements 2025-04-15 13:37:24 -07:00
Jamie Kyle
ecb19d5a10
Fix join group modal 2025-04-15 13:01:17 -07:00
Scott Nonnenberg
88a2f6f92e
MessageReceiver: Process messages from queue before websocket 2025-04-15 12:34:12 -04:00
Jamie Kyle
366cba9ac9
Fix flakey edits mock test 2025-04-14 14:29:07 -07:00
Fedor Indutny
e2f5712094
Simplify preload cache generation 2025-04-14 14:29:02 -07:00
Jamie Kyle
fa9522b6c1
FunPicker: Keep emoji picker open on select for composition inputs 2025-04-14 13:49:34 -07:00
Scott Nonnenberg
30708f427d
CallingLobby: Ensure your avatar is centered when camera is off 2025-04-15 01:55:30 +10:00
ayumi-signal
d60d1b379c
Update support URL for startup DB error dialog 2025-04-11 13:24:05 -05:00
Jamie Kyle
7a417ca017
Fix reaction skin tone picker 2025-04-10 14:50:00 -07:00
Fedor Indutny
15f11b8387
Fix test-electron on macos CI 2025-04-10 13:54:16 -07:00
Jamie Kyle
8301e69e05
Fun picker: Emoji skin tones picker and recent gifs 2025-04-10 12:32:36 -07:00
Fedor Indutny
b22aaaec7e
Reduce ICU book build size 2025-04-10 11:49:32 -07:00
trevor-signal
ca141a26e2
Add offline state to BackupMediaDownloadProgress 2025-04-10 11:21:46 -05:00
Fedor Indutny
775a17c677
Fix @electron/rebuild pnpm issue 2025-04-09 15:14:47 -07:00
Jamie Kyle
7783d9ed38
Wrap mention blot react root with emoji localization provider 2025-04-09 15:14:28 -07:00
Fedor Indutny
c861161f22 v7.53.0-alpha.1 2025-04-09 14:22:37 -07:00
Fedor Indutny
b4f8e3abbc Update DNS fallback 2025-04-09 14:22:37 -07:00
Fedor Indutny
361f5ecfab Update strings 2025-04-09 14:22:37 -07:00
Fedor Indutny
72d0908f05 Release notes for 7.51 2025-04-09 14:22:36 -07:00
Jamie Kyle
9337adbc20
Add danger rule to check all pnpm-lock.yaml dependencies have integrity 2025-04-09 15:42:19 -04:00
Fedor Indutny
a575597396
Fix link-and-sync cancellation 2025-04-09 12:23:08 -07:00
Jim Gustafson
44c4cebb7d
Update to RingRTC v2.50.5 2025-04-09 11:31:28 -07:00
Jamie Kyle
c722e9f277
Translate emoji names everywhere 2025-04-09 11:10:54 -07:00
trevor-signal
85bcfb2176
Add modal alert for users with critical-idle-primary-device alert 2025-04-09 10:23:34 +10:00
Fedor Indutny
e9fb9ef31c
Actually fix local preview container size 2025-04-09 06:49:08 +10:00
Jamie Kyle
06f1832f35
Disable sccache in github actions 2025-04-08 12:29:45 -07:00
trevor-signal
ef7d84b98a
Override electron/node-gyp dependency 2025-04-07 20:18:01 -04:00
Scott Nonnenberg
a623ee44c4
Calling: Improve the Picture-in-Picture popout 2025-04-07 20:11:36 -04:00
Fedor Indutny
efffc4f569
Fix local preview width 2025-04-08 09:26:49 +10:00
Scott Nonnenberg
61dc048436
Update to the latest SignalService.proto 2025-04-07 15:00:53 -07:00
Fedor Indutny
5ae1417667
Lazy-load mac-screen-share C++ addon 2025-04-07 14:51:04 -07:00
Scott Nonnenberg
1901a6cf66
Do not show emojis when displaying name only
Co-authored-by: Andrew Gaul <andrew@gaul.org>
2025-04-08 05:54:56 +10:00
Jamie Kyle
9346beca24
Add remaining features to fun picker 2025-04-07 12:47:38 -07:00
Fedor Indutny
f4185e65dc
Move websocket preconnect earlier into startup
Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
2025-04-07 12:16:06 -07:00
yash-signal
cc4470bb6f
Fix avatar color consistency 2025-04-07 09:18:05 -07:00
trevor-signal
e9e3906371
Update backup handling of messages with an expireTimer 2025-04-04 12:19:52 -04:00
Fedor Indutny
be29302e7c
Fix internal logo size 2025-04-04 11:15:21 -04:00
Fedor Indutny
d2605f9362
Update electron to 35.1.4 2025-04-04 11:09:43 -04:00
Fedor Indutny
84eb305b9a
Fix restarting provisioner loop 2025-04-03 16:34:07 -07:00
Fedor Indutny
b9e3985058
Better preload time counting 2025-04-04 08:24:35 +10:00
Fedor Indutny
f1877da8f4
Fix icu string 2025-04-03 15:13:03 -07:00
Jamie Kyle
28f4157a2e
Bump @signalapp/sqlcipher to 2.0.0
Co-authored-by: Fedor Indutny <indutny@signal.org>
2025-04-03 13:22:55 -07:00
Miriam Zimmerman
811a4c98da
Bump version of ringrtc ADM prod remote config. 2025-04-03 11:18:15 -07:00
trevor-signal
ef5c3a5bc9
Update attachment error handling for 403 status responses 2025-04-03 12:26:11 -04:00
trevor-signal
8959b727f9
Use Libsignal to validate sealed-sender certificates 2025-04-03 10:23:42 +10:00
Jamie Kyle
07b966eb05 v7.52.0-alpha.1 2025-04-02 14:05:49 -07:00
Jamie Kyle
16e9484237 Update DNS fallback 2025-04-02 14:05:49 -07:00
Jamie Kyle
53c1247fb5 Update strings 2025-04-02 14:05:48 -07:00
Jamie Kyle
325b17f966 Update release notes 2025-04-02 14:05:48 -07:00
Fedor Indutny
65ca944180
Avoid CropAndScale calls in RingRTC 2025-04-02 13:57:02 -07:00
trevor-signal
aba0e028d4
Show backup status in Settings window 2025-04-02 14:57:29 -04:00
yash-signal
51647fef95
Fix avatar not showing for new group adds with trusted contact 2025-04-02 13:52:21 -05:00
Jamie Kyle
e5473e26db
Migrate remaining emoji/sticker pickers to fun picker 2025-04-02 11:14:12 -07:00
Scott Nonnenberg
f166db97ac
[signalapp/Signal-Desktop#7242] Allow collapsing archive sidebar
Co-authored-by: lukas <lukas.walter@aceart.de>
2025-04-02 17:54:45 +10:00
Scott Nonnenberg
ef4cee63e9
Local preview: Ensure background blur is opaque to items behind it 2025-04-01 14:21:16 -07:00
trevor-signal
40e91e96fd
Update Backup Media download progress indicator for narrow left panes
Co-authored-by: Jamie Kyle <jamie@signal.org>
2025-04-01 14:20:46 -07:00
Jamie Kyle
cdfd60838c
Fix sticker rendering with bad content-type 2025-04-01 10:27:35 +10:00
Fedor Indutny
e982cd82a1 Revert "Update inter to 4.1"
This reverts commit 81065aaebd.
2025-03-31 14:51:58 -07:00
yash-signal
3b91f6d00e
Fix gradient showing instead of placeholder when Avatar URL loading fails 2025-03-31 15:16:44 -05:00
Fedor Indutny
b4b3210f47
Use transform: translate for call participants 2025-03-31 12:56:52 -07:00
Scott Nonnenberg
68ed46d3f3
Show mute icon in 1:1 calls for remote party (#10074) 2025-03-31 14:32:40 -05:00
Fedor Indutny
81065aaebd
Update inter to 4.1 2025-03-31 12:07:27 -07:00
Jamie Kyle
22fb468481
Fix rendering non/overly-qualified emoji in emojify 2025-03-28 16:01:27 -07:00
Fedor Indutny
d66ce9ad6a
Fix group link wrapping in convo details 2025-03-28 10:07:42 -07:00
dependabot[bot]
60d3e72e6b
Bump electron from 35.1.0 to 35.1.2
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-28 09:21:18 -07:00
Alex Bakon
6dd7fdb48f
Upgrade libsignal to 0.68.0 2025-03-28 09:05:59 -07:00
Scott Nonnenberg
d0734bcb29
Expanded local preview: Don't overlap controls when audio-only/reconnecting 2025-03-28 09:02:31 -07:00
Scott Nonnenberg
833e7b9269
beforeMessageSend: Properly update last message with active send 2025-03-28 08:47:55 -07:00
Fedor Indutny
ecc8eb6ddd
Parallelize get-strings 2025-03-28 13:32:24 +10:00
Fedor Indutny
d683f951a3
Improve remote participant rendering performance 2025-03-27 13:23:49 -07:00
Jim Gustafson
e22c700237
Calling: Add cache for relay server requests
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
2025-03-27 12:55:10 -07:00
Scott Nonnenberg
38d5e50175 v7.51.0-alpha.1 2025-03-27 13:16:18 +10:00
5734 changed files with 760643 additions and 593748 deletions

View File

@ -1,21 +0,0 @@
// Copyright 2019 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
module.exports = {
presets: ['@babel/preset-react', '@babel/preset-typescript'],
// Detects the type of file being babel'd (either esmodule or commonjs)
sourceType: 'unambiguous',
plugins: [
'react-hot-loader/babel',
'lodash',
'@babel/plugin-transform-typescript',
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-optional-chaining',
'@babel/plugin-proposal-nullish-coalescing-operator',
// This plugin converts commonjs to esmodules which is required for
// importing commonjs modules from esmodules in storybook. As a part of
// converting to TypeScript we should use esmodules and can eventually
// remove this plugin
process.env.SIGNAL_ENV === 'storybook' && '@babel/transform-runtime',
].filter(Boolean),
};

24
.babelrc.mjs Normal file
View File

@ -0,0 +1,24 @@
// Copyright 2019 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
/** @type {import("@babel/core").TransformOptions} */
const config = {
presets: ['@babel/preset-react', '@babel/preset-typescript'],
// Detects the type of file being babel'd (either esmodule or commonjs)
sourceType: 'unambiguous',
plugins: [
'lodash',
'@babel/plugin-transform-typescript',
// This plugin converts commonjs to esmodules which is required for
// importing commonjs modules from esmodules in storybook. As a part of
// converting to TypeScript we should use esmodules and can eventually
// remove this plugin
process.env.SIGNAL_ENV === 'storybook' &&
import.meta.resolve('@babel/plugin-transform-runtime'),
].filter(plugin => {
return typeof plugin === 'string';
}),
};
export default config;

View File

@ -1,58 +0,0 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
function isReadOnlyDeep(node, scope) {
if (node.type !== 'TSTypeReference') {
return false;
}
let reference = scope.references.find(reference => {
return reference.identifier === node.typeName;
});
let variable = reference.resolved;
if (variable == null) {
return false;
}
let defs = variable.defs;
if (defs.length !== 1) {
return false;
}
let [def] = defs;
return (
def.type === 'ImportBinding' &&
def.parent.type === 'ImportDeclaration' &&
def.parent.source.type === 'Literal' &&
def.parent.source.value === 'type-fest'
);
}
/** @type {import("eslint").Rule.RuleModule} */
module.exports = {
meta: {
type: 'problem',
hasSuggestions: false,
fixable: false,
schema: [],
},
create(context) {
return {
TSTypeAliasDeclaration(node) {
let scope = context.getScope(node);
if (isReadOnlyDeep(node.typeAnnotation, scope)) {
return;
}
context.report({
node: node.id,
message:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
});
},
};
},
};

View File

@ -1,79 +0,0 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
const rule = require('./type-alias-readonlydeep');
const RuleTester = require('eslint').RuleTester;
// avoid triggering mocha's global leak detection
require('@typescript-eslint/parser');
const ruleTester = new RuleTester({
parser: require.resolve('@typescript-eslint/parser'),
parserOptions: {
ecmaVersion: 2018,
sourceType: 'module',
},
});
ruleTester.run('type-alias-readonlydeep', rule, {
valid: [
{
code: `import type { ReadonlyDeep } from "type-fest"; type Foo = ReadonlyDeep<{}>`,
},
{
code: `import { ReadonlyDeep } from "type-fest"; type Foo = ReadonlyDeep<{}>`,
},
],
invalid: [
{
code: `type Foo = {}`,
errors: [
{
message:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
type: 'Identifier',
},
],
},
{
code: `type Foo = Bar<{}>`,
errors: [
{
message:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
type: 'Identifier',
},
],
},
{
code: `type Foo = ReadonlyDeep<{}>`,
errors: [
{
message:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
type: 'Identifier',
},
],
},
{
code: `interface ReadonlyDeep<T> {}; type Foo = ReadonlyDeep<{}>`,
errors: [
{
message:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
type: 'Identifier',
},
],
},
{
code: `import type { ReadonlyDeep } from "foo"; type Foo = ReadonlyDeep<{}>`,
errors: [
{
message:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
type: 'Identifier',
},
],
},
],
});

View File

@ -1,36 +0,0 @@
components/**
coverage/**
dist/**
release/**
# Github workflows
.github/**
# Generated files
js/curve/*
js/components.js
js/util_worker.js
libtextsecure/components.js
libtextsecure/test/test.js
test/test.js
ts/protobuf/compiled.d.ts
storybook-static/**
build/ICUMessageParams.d.ts
# Third-party files
js/Mp3LameEncoder.min.js
js/WebAudioRecorderMp3.js
js/calling-tools/**
# TypeScript generated files
app/**/*.js
ts/**/*.js
.eslintrc.js
webpack.config.ts
preload.bundle.*
preload.wrapper.*
bundles/**
# Sticker Creator has its own eslint config
sticker-creator/**

View File

@ -1,329 +0,0 @@
// Copyright 2018 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// For reference: https://github.com/airbnb/javascript
const rules = {
'comma-dangle': [
'error',
{
arrays: 'always-multiline',
objects: 'always-multiline',
imports: 'always-multiline',
exports: 'always-multiline',
functions: 'never',
},
],
// No omitting braces, keep on the same line
'brace-style': ['error', '1tbs', { allowSingleLine: false }],
curly: ['error', 'all'],
// Immer support
'no-param-reassign': [
'error',
{
props: true,
ignorePropertyModificationsForRegex: ['^draft'],
ignorePropertyModificationsFor: ['acc', 'ctx', 'context'],
},
],
// Always use === and !== except when directly comparing to null
// (which only will equal null or undefined)
eqeqeq: ['error', 'always', { null: 'never' }],
// prevents us from accidentally checking in exclusive tests (`.only`):
'mocha/no-exclusive-tests': 'error',
// encourage consistent use of `async` / `await` instead of `then`
'more/no-then': 'error',
// it helps readability to put public API at top,
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
// useful for unused or internal fields
'no-underscore-dangle': 'off',
// Temp: We have because TypeScript's `allowUnreachableCode` option is on.
'no-unreachable': 'error',
// though we have a logger, we still remap console to log to disk
'no-console': 'error',
// consistently place operators at end of line except ternaries
'operator-linebreak': [
'error',
'after',
{ overrides: { '?': 'ignore', ':': 'ignore' } },
],
quotes: [
'error',
'single',
{ avoidEscape: true, allowTemplateLiterals: false },
],
'no-continue': 'off',
'lines-between-class-members': 'off',
'class-methods-use-this': 'off',
// Prettier overrides:
'arrow-parens': 'off',
'function-paren-newline': 'off',
'max-len': [
'error',
{
// Prettier generally limits line length to 80 but sometimes goes over.
// The `max-len` plugin doesnt let us omit `code` so we set it to a
// high value as a buffer to let Prettier control the line length:
code: 999,
// We still want to limit comments as before:
comments: 90,
ignoreUrls: true,
},
],
'react/jsx-props-no-spreading': 'off',
// Updated to reflect future airbnb standard
// Allows for declaring defaultProps inside a class
'react/static-property-placement': ['error', 'static public field'],
// JIRA: DESKTOP-657
'react/sort-comp': 'off',
// We don't have control over the media we're sharing, so can't require
// captions.
'jsx-a11y/media-has-caption': 'off',
// We prefer named exports
'import/prefer-default-export': 'off',
// Prefer functional components with default params
'react/require-default-props': 'off',
// Empty fragments are used in adapters between backbone and react views.
'react/jsx-no-useless-fragment': [
'error',
{
allowExpressions: true,
},
],
// Our code base has tons of arrow functions passed directly to components.
'react/jsx-no-bind': 'off',
// Does not support forwardRef
'react/no-unused-prop-types': 'off',
// Not useful for us as we have lots of complicated types.
'react/destructuring-assignment': 'off',
'react/function-component-definition': [
'error',
{
namedComponents: 'function-declaration',
unnamedComponents: 'arrow-function',
},
],
'react/display-name': 'error',
'react/jsx-pascal-case': ['error', { allowNamespace: true }],
// Allow returning values from promise executors for brevity.
'no-promise-executor-return': 'off',
// Redux ducks use this a lot
'default-param-last': 'off',
'jsx-a11y/label-has-associated-control': ['error', { assert: 'either' }],
'jsx-a11y/no-static-element-interactions': 'error',
'@typescript-eslint/no-non-null-assertion': ['error'],
'@typescript-eslint/no-empty-interface': ['error'],
'no-empty-function': 'off',
'@typescript-eslint/no-empty-function': 'error',
'no-restricted-syntax': [
'error',
{
selector: 'TSInterfaceDeclaration',
message:
'Prefer `type`. Interfaces are mutable and less powerful, so we prefer `type` for simplicity.',
},
// Defaults
{
selector: 'ForInStatement',
message:
'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.',
},
{
selector: 'LabeledStatement',
message:
'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.',
},
{
selector: 'WithStatement',
message:
'`with` is disallowed in strict mode because it makes code impossible to predict and optimize.',
},
],
'react-hooks/exhaustive-deps': [
'error',
{
additionalHooks: '^(useSpring|useSprings)$',
},
],
};
const typescriptRules = {
...rules,
// Override brace style to enable typescript-specific syntax
'brace-style': 'off',
'@typescript-eslint/brace-style': [
'error',
'1tbs',
{ allowSingleLine: false },
],
'@typescript-eslint/array-type': ['error', { default: 'generic' }],
'no-restricted-imports': 'off',
'@typescript-eslint/no-restricted-imports': [
'error',
{
paths: [
{
name: 'chai',
importNames: ['expect', 'should', 'Should'],
message: 'Please use assert',
allowTypeImports: true,
},
],
},
],
// Overrides recommended by typescript-eslint
// https://github.com/typescript-eslint/typescript-eslint/releases/tag/v4.0.0
'@typescript-eslint/no-redeclare': 'error',
'@typescript-eslint/no-shadow': 'error',
'@typescript-eslint/no-useless-constructor': ['error'],
'@typescript-eslint/no-misused-promises': [
'error',
{
checksVoidReturn: false,
},
],
'@typescript-eslint/no-floating-promises': 'error',
// We allow "void promise", but new call-sites should use `drop(promise)`.
'no-void': ['error', { allowAsStatement: true }],
'no-shadow': 'off',
'no-useless-constructor': 'off',
// useful for unused parameters
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
// Upgrade from a warning
'@typescript-eslint/explicit-module-boundary-types': 'error',
'@typescript-eslint/consistent-type-imports': 'error',
// Future: Maybe switch to never and always use `satisfies`
'@typescript-eslint/consistent-type-assertions': [
'error',
{
assertionStyle: 'as',
// Future: Maybe switch to allow-as-parameter or never
objectLiteralTypeAssertions: 'allow',
},
],
// Already enforced by TypeScript
'consistent-return': 'off',
// TODO: DESKTOP-4655
'import/no-cycle': 'off',
};
module.exports = {
root: true,
settings: {
react: {
version: 'detect',
},
'import/core-modules': ['electron'],
},
extends: ['airbnb-base', 'prettier'],
plugins: ['mocha', 'more', 'local-rules'],
overrides: [
{
files: [
'ts/**/*.ts',
'ts/**/*.tsx',
'app/**/*.ts',
'build/intl-linter/**/*.ts',
],
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 2018,
sourceType: 'module',
},
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'airbnb-typescript-prettier',
],
rules: typescriptRules,
},
{
files: [
'**/*.stories.tsx',
'ts/build/**',
'ts/test-*/**',
'build/intl-linter/**/*.ts',
],
rules: {
...typescriptRules,
'import/no-extraneous-dependencies': 'off',
'react/no-array-index-key': 'off',
},
},
{
files: ['ts/state/ducks/**/*.ts'],
rules: {
'local-rules/type-alias-readonlydeep': 'error',
},
},
{
files: ['ts/**/*_test.{ts,tsx}'],
rules: {
'func-names': 'off',
},
},
],
rules: {
...rules,
'import/no-unresolved': 'off',
'import/extensions': 'off',
},
reportUnusedDisableDirectives: true,
};

View File

@ -21,7 +21,7 @@ body:
label: "Using a supported version?"
description: "Search issues here: https://github.com/signalapp/Signal-Desktop/issues"
options:
- label: I have searched searched open and closed issues for duplicates.
- label: I have searched open and closed issues for duplicates.
required: true
- label: I am using Signal-Desktop as provided by the Signal team, not a 3rd-party package.
required: true
@ -97,7 +97,7 @@ body:
id: primary-device
attributes:
label: Version of Signal on your phone
description: "Android: Settings->Help, iOS: Settings->General->About"
description: "Settings->Help"
placeholder:
validations:
required: false

View File

@ -3,6 +3,15 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
groups:
minor-actions-dependencies:
# GitHub Actions: Only group minor and patch updates (we want to carefully review major updates)
update-types: [ minor, patch ]
- package-ecosystem: npm
directories:
- "/"

View File

@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
token: ${{ secrets.AUTOMATED_GITHUB_PAT }}
repository: signalapp/Signal-Backport-Action-Private

View File

@ -1,234 +0,0 @@
# Copyright 2020 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
name: Benchmark
on:
push:
branches:
- development
- main
- '[0-9]+.[0-9]+.x'
pull_request:
schedule:
- cron: '0 */12 * * *'
jobs:
linux:
runs-on: ubuntu-22.04-8-cores
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && (!github.event.schedule || github.ref == 'refs/heads/main') }}
timeout-minutes: 30
steps:
- name: Get system specs
run: lsb_release -a
- name: Get other system specs
run: uname -a
- name: Clone Desktop repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
id: cache-sccache
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install xvfb and libpulse0
run: sudo apt-get install xvfb libpulse0 || (sudo apt-get update && sudo apt-get install xvfb libpulse0)
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
- name: Build typescript
run: pnpm run generate
- name: Bundle
run: pnpm run build:esbuild:prod
- name: Create preload cache
run: xvfb-run --auto-servernum pnpm run build:preload-cache
- name: Set MAX_CYCLES=2 on main
if: ${{ github.ref == 'refs/heads/main' }}
run: |
echo "MAX_CYCLES=2" >> "$GITHUB_ENV"
- name: Run startup benchmarks
run: |
set -o pipefail
xvfb-run --auto-servernum node ts/test-mock/benchmarks/startup_bench.js |
tee benchmark-startup.log
timeout-minutes: 10
env:
NODE_ENV: production
RUN_COUNT: 10
ELECTRON_ENABLE_STACK_DUMPING: on
DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/startup
- name: Run send benchmarks
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node ts/test-mock/benchmarks/send_bench.js |
tee benchmark-send.log
timeout-minutes: 10
env:
NODE_ENV: production
RUN_COUNT: 100
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/send
- name: Run group send benchmarks
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node \
ts/test-mock/benchmarks/group_send_bench.js | \
tee benchmark-group-send.log
timeout-minutes: 10
env:
NODE_ENV: production
RUN_COUNT: 100
CONVERSATION_SIZE: 500
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/group-send
- name: Run large group send benchmarks with blocks
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node \
ts/test-mock/benchmarks/group_send_bench.js | \
tee benchmark-large-group-send-with-blocks.log
timeout-minutes: 10
env:
NODE_ENV: production
GROUP_SIZE: 500
CONTACT_COUNT: 500
BLOCKED_COUNT: 10
DISCARD_COUNT: 2
RUN_COUNT: 50
CONVERSATION_SIZE: 500
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/group-send
- name: Run large group send benchmarks with delivery receipts
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node \
ts/test-mock/benchmarks/group_send_bench.js | \
tee benchmark-large-group-send.log
timeout-minutes: 10
env:
NODE_ENV: production
GROUP_SIZE: 500
CONTACT_COUNT: 500
GROUP_DELIVERY_RECEIPTS: 500
DISCARD_COUNT: 2
RUN_COUNT: 20
CONVERSATION_SIZE: 50
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/large-group-send
- name: Run conversation open benchmarks
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node \
ts/test-mock/benchmarks/convo_open_bench.js | \
tee benchmark-convo-open.log
timeout-minutes: 10
env:
NODE_ENV: production
RUN_COUNT: 100
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/convo-open
- name: Run call history search benchmarks
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node \
ts/test-mock/benchmarks/call_history_search_bench.js | \
tee benchmark-call-history-search.log
timeout-minutes: 10
env:
NODE_ENV: production
RUN_COUNT: 100
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/call-history-search
- name: Run backup benchmarks
run: |
set -o pipefail
rm -rf /tmp/mock
xvfb-run --auto-servernum node \
ts/test-mock/benchmarks/backup_bench.js | \
tee benchmark-backup.log
timeout-minutes: 10
env:
NODE_ENV: production
ELECTRON_ENABLE_STACK_DUMPING: on
# DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/backup-bench
- name: Upload benchmark logs on failure
if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
with:
name: logs
path: artifacts
- name: Clone benchmark repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
repository: 'signalapp/Signal-Desktop-Benchmarks-Private'
path: 'benchmark-results'
token: ${{ secrets.AUTOMATED_GITHUB_PAT }}
- name: Build benchmark repo
working-directory: benchmark-results
run: |
pnpm install
pnpm run build
- name: Publish to DataDog
working-directory: benchmark-results
run: |
node ./bin/publish.js ../benchmark-startup.log desktop.ci.performance.startup
node ./bin/publish.js ../benchmark-send.log desktop.ci.performance.send
node ./bin/publish.js ../benchmark-group-send.log desktop.ci.performance.groupSend
node ./bin/publish.js ../benchmark-large-group-send-with-blocks.log desktop.ci.performance.largeGroupSendWithBlocks
node ./bin/publish.js ../benchmark-large-group-send.log desktop.ci.performance.largeGroupSend
node ./bin/publish.js ../benchmark-convo-open.log desktop.ci.performance.convoOpen
node ./bin/publish.js ../benchmark-call-history-search.log desktop.ci.performance.callHistorySearch
node ./bin/publish.js ../benchmark-backup.log desktop.ci.performance.backup
env:
DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}

View File

@ -10,59 +10,85 @@ on:
- '[0-9]+.[0-9]+.x'
pull_request:
permissions:
contents: read
jobs:
audit:
name: Dependencies
runs-on: ubuntu-22.04-8-cores
timeout-minutes: 30
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
- run: node --test .pnpmfile.mjs
- run: pnpm audit --audit-level=high
- run: pnpm audit signatures
- run: pnpm dedupe --check
lint:
name: Lint
runs-on: ubuntu-22.04-8-cores
timeout-minutes: 30
steps:
- run: lsb_release -a
- run: uname -a
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Restore cached .eslintcache and tsconfig.tsbuildinfo
uses: actions/cache/restore@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
id: cache-lint
with:
path: |
.eslintcache
tsconfig.tsbuildinfo
key: lint-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**', '.eslintrc.js', '.eslint/**', 'tsconfig.json') }}
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- name: Install Sticker Creator node_modules
run: pnpm install
working-directory: sticker-creator
- name: Install libpulse0
run: sudo apt-get install -y libpulse0 || (sudo apt-get update && sudo apt-get install -y libpulse0)
- run: pnpm run generate
- run: pnpm run lint
- run: pnpm run build:db-schema --check
- run: pnpm run lint-prettier
- run: pnpm run lint-css
- run: pnpm run check:types
- run: pnpm run oxlint:ci
- run: pnpm run lint-deps
- run: pnpm run lint-license-comments
- run: pnpm run lint-intl
- run: pnpm run lint-knip:all --reporter github-actions
- run: pnpm run lint-knip:prod --reporter github-actions
- name: Check acknowledgments file is up to date
run: pnpm run build:acknowledgments
env:
@ -70,56 +96,50 @@ jobs:
- run: git diff --exit-code
- name: Update cached .eslintcache and tsconfig.tsbuildinfo
uses: actions/cache/save@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
if: github.ref == 'refs/heads/main'
with:
path: |
.eslintcache
tsconfig.tsbuildinfo
key: ${{ steps.cache-lint.outputs.cache-primary-key }}
macos:
name: MacOS
needs: lint
runs-on: macos-latest
runs-on: macos-26-arm64
if: github.ref == 'refs/heads/main'
timeout-minutes: 30
steps:
- run: uname -a
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache clang
CXX: sccache clang++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache clang
# CXX: sccache clang++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
- run: pnpm run generate
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- run: pnpm run prepare-beta-build
- run: pnpm run generate
- run: pnpm run test-node
- run: pnpm run test-electron
env:
@ -129,112 +149,119 @@ jobs:
- run: touch noop.sh && chmod +x noop.sh
- run: pnpm run build
env:
CC: sccache clang
CXX: sccache clang++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache clang
# CXX: sccache clang++
# SCCACHE_GHA_ENABLED: "true"
DISABLE_INSPECT_FUSE: on
SIGN_MACOS_SCRIPT: noop.sh
ARTIFACTS_DIR: artifacts/macos
- name: Upload installer size
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }}
run: |
node ts/scripts/dd-installer-size.js macos-arm64
node ts/scripts/dd-installer-size.js macos-x64
node ts/scripts/dd-installer-size.js macos-universal
env:
DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}
node scripts/publish-installer-size.mjs macos-arm64
node scripts/publish-installer-size.mjs macos-x64
node scripts/publish-installer-size.mjs macos-universal
- run: pnpm run test-release
env:
NODE_ENV: production
- name: Upload artifacts on failure
if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
path: artifacts
linux:
name: Linux
needs: lint
runs-on: ubuntu-22.04-8-cores
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
matrix:
include:
- os: ubuntu-22.04-8-cores
arch: x64
- os: ubuntu-22.04-arm64-4-cores
arch: arm64
steps:
- run: lsb_release -a
- run: uname -a
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install xvfb and libpulse0
run: sudo apt-get install xvfb libpulse0 || (sudo apt-get update && sudo apt-get install xvfb libpulse0)
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- run: pnpm run generate
- run: pnpm run prepare-beta-build
- run: pnpm run generate
- name: Create bundle
run: pnpm run build:esbuild:prod
- name: Create preload cache
run: xvfb-run --auto-servernum pnpm run build:preload-cache
env:
ARTIFACTS_DIR: artifacts/linux
- name: Set Linux build target architecture
run: pnpm run prepare-linux-build deb ${{ matrix.arch }}
- name: Build with packaging .deb file
run: pnpm run build:release --publish=never
if: github.ref == 'refs/heads/main'
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
DISABLE_INSPECT_FUSE: on
- name: Build without packaging .deb file
run: pnpm run build:release --linux dir
if: github.ref != 'refs/heads/main'
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
DISABLE_INSPECT_FUSE: on
- name: Upload installer size
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }}
run: node ts/scripts/dd-installer-size.js linux
env:
DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}
run: node scripts/publish-installer-size.mjs linux-${{ matrix.arch }}
- run: xvfb-run --auto-servernum pnpm run test-node
- name: Clone backup integration tests
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
repository: 'signalapp/Signal-Message-Backup-Tests'
ref: 'a743fbf8e3adc2f1a700577dd8a470beff60db3f'
ref: 'a0f900243210efbedc72f0907c5d2f140385daa4'
path: 'backup-integration-tests'
- run: xvfb-run --auto-servernum pnpm run test-electron
@ -251,51 +278,46 @@ jobs:
- name: Upload artifacts on failure
if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
path: artifacts
windows:
name: Windows
needs: lint
runs-on: windows-2019
runs-on: windows-latest-8-cores
timeout-minutes: 30
steps:
- run: systeminfo
- run: git config --global core.autocrlf false
- run: git config --global core.eol lf
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ${{ env.SCCACHE_PATH }}\.electron-gyp
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install -g node-gyp@10.0.1
- run: touch noop.js
- name: Install Desktop node_modules
run: pnpm install
env:
CHILD_CONCURRENCY: 1
NPM_CONFIG_LOGLEVEL: verbose
NPM_CONFIG_NODE_GYP: ${{ github.workspace }}\noop.js
- run: pnpm run generate
- run: pnpm run test-node
- run: copy package.json temp.json
- run: del package.json
- run: type temp.json | findstr /v certificateSubjectName | findstr /v certificateSha1 > package.json
- run: pnpm run prepare-beta-build
- run: pnpm run generate
- run: pnpm run test-node
- name: Create bundle
run: pnpm run build:esbuild:prod
- name: Create preload cache
run: pnpm run build:preload-cache
env:
@ -314,13 +336,12 @@ jobs:
- name: Upload installer size
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' && github.ref == 'refs/heads/main' }}
run: node ts/scripts/dd-installer-size.js windows
env:
DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}
run: node scripts/publish-installer-size.mjs windows
- run: pnpm run test-electron
env:
ARTIFACTS_DIR: artifacts/windows
WORKER_COUNT: 4
timeout-minutes: 5
- run: pnpm run test-release
env:
@ -328,7 +349,7 @@ jobs:
- name: Upload artifacts on failure
if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
path: artifacts
@ -342,11 +363,11 @@ jobs:
working-directory: sticker-creator
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
@ -365,11 +386,281 @@ jobs:
- name: Check Sticker Creator linting
run: pnpm run lint
- name: Run tests
run: pnpm test -- --run
mock-tests:
name: Mock Tests
needs: lint
strategy:
fail-fast: false
matrix:
workerIndex: [0, 1, 2, 3]
runs-on: ubuntu-latest-8-cores
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' }}
timeout-minutes: 30
steps:
- name: Get system specs
run: lsb_release -a
- name: Get other system specs
run: uname -a
- name: Clone Desktop repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Update apt
run: sudo apt-get update
- name: Install xvfb and libpulse0
run: sudo apt-get install -y xvfb libpulse0
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: |
pnpm install
./node_modules/.bin/install-electron
sudo chown root node_modules/.pnpm/electron@*/node_modules/electron/dist/chrome-sandbox
sudo chmod 4755 node_modules/.pnpm/electron@*/node_modules/electron/dist/chrome-sandbox
env:
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- name: Build typescript
run: pnpm run generate
- name: Create preload cache
run: xvfb-run --auto-servernum pnpm run build:preload-cache
env:
ARTIFACTS_DIR: artifacts/linux
- name: Run mock server tests
run: |
set -o pipefail
xvfb-run --auto-servernum pnpm run test-mock
timeout-minutes: 15
env:
NODE_ENV: production
DEBUG: mock:test:*
ARTIFACTS_DIR: artifacts/mock
WORKER_INDEX: ${{ matrix.workerIndex }}
WORKER_COUNT: 4
- name: Run docker mock server tests
if: ${{ matrix.workerIndex == 0 }}
run: |
set -o pipefail
sudo apt-get install -y pipewire pipewire-pulse wireplumber psmisc pulseaudio-utils
systemctl --user start pipewire.service
systemctl --user start pipewire-pulse.service
xvfb-run --auto-servernum pnpm run test-mock-docker
timeout-minutes: 10
env:
NODE_ENV: production
DEBUG: mock:test:*
ARTIFACTS_DIR: artifacts/mock-docker
- name: Upload mock server test logs on failure
if: failure()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: logs-${{ matrix.workerIndex }}
path: artifacts
check-min-os-version:
name: Check Min OS Version
needs: lint
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- run: uname -a
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install Desktop node_modules
if: matrix.os != 'windows-latest'
run: pnpm install
env:
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- run: touch noop.js
if: matrix.os == 'windows-latest'
- name: Install Desktop node_modules on Windows
if: matrix.os == 'windows-latest'
run: pnpm install
env:
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: ${{ github.workspace }}\noop.js
- run: pnpm generate:phase-0
- name: Run OS version check
run: |
node scripts/check-min-os-version.mjs
danger:
name: Danger
runs-on: ubuntu-latest
timeout-minutes: 30
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
package-manager-cache: false # Avoid cache key clashes
- name: Install danger node_modules
run: pnpm install
working-directory: danger
- name: Run DangerJS
run: pnpm run danger:ci
working-directory: danger
env:
DANGER_GITHUB_API_TOKEN: ${{ secrets.AUTOMATED_GITHUB_PAT }}
storybook:
name: Storybook
runs-on: ubuntu-latest-8-cores
timeout-minutes: 30
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# id: cache-sccache
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- run: pnpm run build:storybook
- run: ./node_modules/.bin/playwright install chromium
- run: ./node_modules/.bin/run-p --race test:storybook:serve test:storybook:test
benchmark:
name: Benchmark
strategy:
matrix:
metric:
- startup
- send
- groupSend
- largeGroupSendWithBlocks
- largeGroupSend
- convoOpen
- callHistorySearch
- backup
include:
- metric: startup
script: ts/test-mock/benchmarks/startup_bench.node.js
runCount: 10
- metric: send
script: ts/test-mock/benchmarks/send_bench.node.js
runCount: 100
- metric: groupSend
script: ts/test-mock/benchmarks/group_send_bench.node.js
runCount: 100
conversationSize: 500
- metric: largeGroupSendWithBlocks
script: ts/test-mock/benchmarks/group_send_bench.node.js
runCount: 50
conversationSize: 500
groupSize: 500
contactCount: 500
blockedCount: 10
discardCount: 2
- metric: largeGroupSend
script: ts/test-mock/benchmarks/group_send_bench.node.js
runCount: 20
conversationSize: 50
groupSize: 500
contactCount: 500
discardCount: 2
- metric: convoOpen
script: ts/test-mock/benchmarks/convo_open_bench.node.js
runCount: 100
- metric: callHistorySearch
script: ts/test-mock/benchmarks/call_history_search_bench.node.js
runCount: 100
- metric: backup
script: ts/test-mock/benchmarks/backup_bench.node.js
runs-on: ubuntu-22.04-8-cores
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' }}
timeout-minutes: 30
@ -381,63 +672,115 @@ jobs:
run: uname -a
- name: Clone Desktop repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# id: cache-sccache
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install xvfb and libpulse0
run: sudo apt-get install xvfb libpulse0 || (sudo apt-get update && sudo apt-get install xvfb libpulse0)
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- name: Build typescript
run: pnpm run generate
- name: Bundle
run: pnpm run build:esbuild:prod
- name: Create preload cache
run: xvfb-run --auto-servernum pnpm run build:preload-cache
env:
ARTIFACTS_DIR: artifacts/linux
- name: Run mock server tests
- name: Set MAX_CYCLES=2 on main
if: ${{ github.ref == 'refs/heads/main' }}
run: |
echo "MAX_CYCLES=2" >> "$GITHUB_ENV"
- name: Run ${{ matrix.metric }}
run: |
set -o pipefail
xvfb-run --auto-servernum pnpm run test-mock
xvfb-run --auto-servernum ./node_modules/.bin/tsx \
${{ matrix.script }} | tee benchmark.log
timeout-minutes: 10
env:
NODE_ENV: production
DEBUG: mock:test:*
ARTIFACTS_DIR: artifacts/startup
ELECTRON_ENABLE_STACK_DUMPING: on
DEBUG: 'mock:benchmarks'
ARTIFACTS_DIR: artifacts/${{ matrix.metric }}
GROUP_SIZE: ${{ matrix.groupSize }}
CONTACT_COUNT: ${{ matrix.contactCount }}
BLOCKED_COUNT: ${{ matrix.blockedCount }}
DISCARD_COUNT: ${{ matrix.discardCount }}
RUN_COUNT: ${{ matrix.runCount }}
CONVERSATION_SIZE: ${{ matrix.conversationSize }}
- name: Upload mock server test logs on failure
- name: Upload benchmark logs on failure
if: failure()
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: logs
path: artifacts
- name: Clone benchmark repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
repository: 'signalapp/Signal-Desktop-Benchmarks-Private'
path: 'benchmark-results'
token: ${{ secrets.AUTOMATED_GITHUB_PAT }}
- name: Build benchmark repo
working-directory: benchmark-results
run: |
pnpm install
pnpm run build
- name: Publish
working-directory: benchmark-results
run: |
node ./bin/publish.js ../benchmark.log desktop.ci.performance.${{ matrix.metric }}
env:
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_EXPORTER_OTLP_PROTOCOL: ${{ secrets.OTEL_EXPORTER_OTLP_PROTOCOL }}
OTEL_EXPORTER_OTLP_HEADERS: ${{ secrets.OTEL_EXPORTER_OTLP_HEADERS }}
auto-merge-ready:
if: ${{ github.event_name == 'pull_request' && github.repository == 'signalapp/Signal-Desktop-Private' }}
name: Auto Merge Ready
needs:
- lint
- linux
- windows
- sticker-creator
- mock-tests
- check-min-os-version
- danger
- storybook
- benchmark
runs-on: ubuntu-latest
steps:
- name: Ok
run: echo ok

View File

@ -9,6 +9,7 @@ on:
- '[0-9]+.[0-9]+.x'
jobs:
linux:
name: Commit Title Check
runs-on: ubuntu-latest
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' }}
steps:

View File

@ -1,27 +0,0 @@
# Copyright 2020 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
name: Danger
on:
pull_request:
jobs:
danger:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with:
fetch-depth: 0 # fetch all history
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: '.nvmrc'
- name: Install danger node_modules
run: cd danger && pnpm install
- name: Run DangerJS
run: pnpm run danger:ci
env:
DANGER_GITHUB_API_TOKEN: ${{ secrets.AUTOMATED_GITHUB_PAT }}

View File

@ -13,56 +13,61 @@ jobs:
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' }}
timeout-minutes: 30
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
id: cache-sccache
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
# - name: Setup sccache
# uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
# - name: Restore sccache
# uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
# id: cache-sccache
# with:
# path: ${{ env.SCCACHE_PATH }}
# key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
# CC: sccache gcc
# CXX: sccache g++
# SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
# We rebuild in `electron:install-app-deps` that doesn't look at this
# environment variable
NPM_CONFIG_NODE_GYP: echo
- run: pnpm run build:storybook
- run: ./node_modules/.bin/playwright install chromium
- run: ./node_modules/.bin/run-p --race test:storybook:serve test:storybook:test
env:
ARTIFACTS_DIR: stories/data
- run: pnpm run build:esbuild
- run: node ts/scripts/compile-stories-icu-lookup.js stories
ARTIFACTS_DIR: stories
- run: pnpm run build:rolldown
- run: node scripts/compile-stories-icu-lookup.mjs stories
- name: Upload test artifacts
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: desktop-test-icu
path: stories
compression-level: 9
- name: Upload release artifacts
if: github.event_name != 'workflow_dispatch'
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: desktop-${{ github.ref_name }}-icu
path: stories
compression-level: 9

View File

@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
token: ${{ secrets.AUTOMATED_GITHUB_PAT }}
repository: signalapp/Signal-Notes-Action-Private

View File

@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
token: ${{ secrets.AUTOMATED_GITHUB_PAT }}
repository: signalapp/Signal-Release-Notes-Action-Private

View File

@ -1,35 +0,0 @@
# Copyright 2021 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
name: On Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.*'
jobs:
create-release-event:
name: Create release event in datadog
if: ${{ github.repository == 'signalapp/Signal-Desktop-Private' }}
runs-on: ubuntu-latest
steps:
- name: Create event on DataDog
run: |
curl -X POST "https://api.datadoghq.com/api/v1/events" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: ${DD_API_KEY}" \
-d '
{
"title": "Desktop Release ${{ github.ref_name }}",
"text": "A new desktop release ${{ github.ref_name }} was just published",
"source_type_name": "git",
"tags": [
"service:desktop.ci.release",
"env:production",
"version:${{ github.ref_name }}"
]
}
'
env:
DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}

View File

@ -0,0 +1,109 @@
# Copyright 2025 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
name: Reproducible Build Scheduler
on:
workflow_dispatch:
inputs:
force:
type: boolean
description: 'Ignore version cache and reproduce the latest builds'
required: true
default: false
schedule:
- cron: '0 12 * * *'
jobs:
linux:
strategy:
matrix:
package: ['signal-desktop', 'signal-desktop-beta']
runs-on: ubuntu-latest
permissions:
actions: write
issues: write
steps:
- name: Log info
run: |
echo "inputs.force: ${{ inputs.force }}";
echo "matrix.package: ${{ matrix.package }}";
- name: Add signal desktop signing key and apt repo
run: |
wget -O- https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor > signal-desktop-keyring.gpg
cat signal-desktop-keyring.gpg | sudo tee /usr/share/keyrings/signal-desktop-keyring.gpg > /dev/null
wget -O signal-desktop.sources https://updates.signal.org/static/desktop/apt/signal-desktop.sources
cat signal-desktop.sources | sudo tee /etc/apt/sources.list.d/signal-desktop.sources > /dev/null
sudo apt-get update
- name: Restore previous version file from cache
id: restore-cache-version
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
key: ${{ matrix.package }}-version-git-ref-txt
path: ~/version-git-ref.txt
- name: Get previous version tag
id: previous-version
if: steps.restore-cache-version.outputs.cache-hit == 'true'
run: |
PREVIOUS_VERSION_GIT_TAG=$(cat ~/version-git-ref.txt)
echo "Previous git version tag: $PREVIOUS_VERSION_GIT_TAG"
echo "tag=$PREVIOUS_VERSION_GIT_TAG" >> $GITHUB_OUTPUT
- name: Get latest apt version of package and matching git tag
id: latest-version
run: |
LATEST_VERSION_APT=$(apt-cache policy "${{ matrix.package }}" | grep Candidate | awk '{print $2}')
if [ -z "$LATEST_VERSION_APT" ]; then
echo "Error: Could not get latest version of '${{ matrix.package }}' using apt-cache"
exit 1
fi
echo "Latest apt version of ${{ matrix.package }}: $LATEST_VERSION_APT"
VERSION_GIT_TAG="v$(echo "$LATEST_VERSION_APT" | tr '~' '-')"
echo "Latest git version tag: $VERSION_GIT_TAG"
echo "$VERSION_GIT_TAG" > ~/version-git-ref.txt
echo "tag=$VERSION_GIT_TAG" >> $GITHUB_OUTPUT
BRANCH_PREFIX=$(echo "$VERSION_GIT_TAG" | grep -oE '[0-9]+\.[0-9]+')
echo "git_branch=$BRANCH_PREFIX.x" >> $GITHUB_OUTPUT
- name: Determine if a build is needed
id: should-run
run: |
if ${{ inputs.force || steps.restore-cache-version.outputs.cache-hit != 'true' || steps.previous-version.outputs.tag != steps.latest-version.outputs.tag }}; then
echo "result=true" >> $GITHUB_OUTPUT
else
echo "result=false" >> $GITHUB_OUTPUT
fi
- name: Run workflow Reproducible Build using REST API
if: steps.should-run.outputs.result == 'true'
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/actions/workflows/reproducible-builds.yml/dispatches \
-d '{"ref":"main","inputs":{"package":"${{ matrix.package }}","version_tag":"${{ steps.latest-version.outputs.tag }}"}}'
- name: Cache latest version
if: steps.should-run.outputs.result == 'true'
uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
key: ${{ matrix.package }}-version-git-ref-txt
path: ~/version-git-ref.txt
- name: Open issue on failure
if: ${{ failure() && github.repository == 'signalapp/Signal-Desktop-Private' }}
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/issues \
-d '{"title":"Reproducible build scheduler failed: ${{ steps.latest-version.outputs.tag }}","body":"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"},"labels":["${{ steps.latest-version.outputs.git_branch }}"]}'

View File

@ -0,0 +1,183 @@
# Copyright 2024 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
name: Reproducible Builds
on:
workflow_dispatch:
inputs:
package:
description: 'Package name'
required: true
default: 'signal-desktop'
type: choice
options:
- signal-desktop
- signal-desktop-beta
version_tag:
description: 'Version tag (e.g. v1.2.3 or v2.0.0-beta.1)'
required: true
type: string
jobs:
linux:
name: Linux deb
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
steps:
- name: Get system specs
run: lsb_release -a
- name: Get other system specs
run: uname -a
- name: Get version info
id: app_info
run: |
echo "PACKAGE_NAME=${{ inputs.package }}" >> "$GITHUB_ENV"
echo "git_ref=${{ inputs.version_tag }}" >> $GITHUB_OUTPUT
PARSED_VERSION=$(echo "${{ inputs.version_tag }}" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+.*' | tr '-' '~')
echo "PACKAGE_VERSION=$PARSED_VERSION" >> "$GITHUB_ENV"
BRANCH_PREFIX=$(echo "${{ inputs.version_tag }}" | grep -oE '[0-9]+\.[0-9]+')
echo "git_branch=$BRANCH_PREFIX.x" >> $GITHUB_OUTPUT
echo "# Reproducing ${{ inputs.package }} Linux deb" >> $GITHUB_STEP_SUMMARY
echo "## Version: ${{ inputs.version_tag }}" >> $GITHUB_STEP_SUMMARY
- name: Add signal desktop signing key and apt repo
run: |
wget -O- https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor > signal-desktop-keyring.gpg
cat signal-desktop-keyring.gpg | sudo tee /usr/share/keyrings/signal-desktop-keyring.gpg > /dev/null
wget -O signal-desktop.sources https://updates.signal.org/static/desktop/apt/signal-desktop.sources
cat signal-desktop.sources | sudo tee /etc/apt/sources.list.d/signal-desktop.sources > /dev/null
sudo apt-get update
# Note: For beta versions, the APT version is separated by tilde e.g. v1.2.3~beta.1
# However the download URI has a dash e.g. v1.2.3-beta.1
# Thus after apt-get download we need to use the filename of the actual download
- name: Download latest deb
id: download
run: |
DOWNLOAD_URI=$(apt-get download --print-uris "$PACKAGE_NAME=$PACKAGE_VERSION" | cut -d"'" -f2)
EXPECTED_SHA512=$(apt-get download --print-uris "$PACKAGE_NAME=$PACKAGE_VERSION" | grep -oP 'SHA512:\K\s*\S+')
echo "expected_sha512=$EXPECTED_SHA512" >> $GITHUB_OUTPUT
apt-get download "$PACKAGE_NAME=$PACKAGE_VERSION"
DEB_FILE=$(ls | grep deb | tail -1)
echo "deb_file=$DEB_FILE" >> $GITHUB_OUTPUT
DOWNLOAD_SHA512=$(sha512sum $DEB_FILE | cut -d' ' -f1)
echo "Verifying $DEB_FILE"
echo "Expected SHA512: $EXPECTED_SHA512"
echo "Actual SHA512: $DOWNLOAD_SHA512"
echo "### Download from apt" >> $GITHUB_STEP_SUMMARY
echo "Verifying $DEB_FILE" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Expected SHA512: $EXPECTED_SHA512" >> $GITHUB_STEP_SUMMARY
echo "Actual SHA512: $DOWNLOAD_SHA512" >> $GITHUB_STEP_SUMMARY
if [ "$DOWNLOAD_SHA512" == "$EXPECTED_SHA512" ]; then
echo "✅ Download checksum verification successful"
echo "✅ Download checksum verification successful" >> $GITHUB_STEP_SUMMARY
else
echo "❌ Download checksum verification failed!"
echo "❌ Download checksum verification failed!" >> $GITHUB_STEP_SUMMARY
exit 1
fi
- name: Clone Desktop git repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: ${{ steps.app_info.outputs.git_ref }}
- name: Get node version for docker build arg
id: node_version
run: |
NODE_VERSION=$(cat .nvmrc)
echo "version=$NODE_VERSION" >> $GITHUB_OUTPUT
- name: Set up docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3
- name: Build docker image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
env:
DOCKER_BUILD_RECORD_UPLOAD: false
with:
context: ./reproducible-builds
file: ./reproducible-builds/Dockerfile
tags: signal-desktop:latest
load: true
push: false
build-args: |
SOURCE_DATE_EPOCH=1
NODE_VERSION=${{ steps.node_version.outputs.version }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Build Linux deb
id: build
run: |
cd reproducible-builds
# Try 3 times before the step actually fails
(./build.sh public) || \
(echo "Retry 1" && ./build.sh public) || \
(echo "Retry 2" && ./build.sh public)
- name: Get checksum of deb
id: build_checksum
run: |
cd release
BUILT_FILE=$(ls | grep deb | tail -1)
echo "built_file=$BUILT_FILE" >> $GITHUB_OUTPUT
ACTUAL_SHA512=$(sha512sum $BUILT_FILE | cut -d' ' -f1)
echo "actual_sha512=$ACTUAL_SHA512" >> $GITHUB_OUTPUT
env:
SKIP_DOCKER_BUILD: true
- name: Compare checksums
run: |
ACTUAL_SHA512="${{ steps.build_checksum.outputs.actual_sha512 }}"
EXPECTED_SHA512="${{ steps.download.outputs.expected_sha512 }}"
echo "Verifying ${{ steps.download.outputs.deb_file }}"
echo "" >> $GITHUB_STEP_SUMMARY
echo "Expected SHA512: $EXPECTED_SHA512"
echo "Actual SHA512: $ACTUAL_SHA512"
echo "### Build and verify" >> $GITHUB_STEP_SUMMARY
echo "Verifying ${{ steps.download.outputs.deb_file }}" >> $GITHUB_STEP_SUMMARY
echo "Build SHA512: $ACTUAL_SHA512" >> $GITHUB_STEP_SUMMARY
if [ "$ACTUAL_SHA512" == "$EXPECTED_SHA512" ]; then
echo "✅ Build checksum verification successful"
echo "✅ Build checksum verification successful" >> $GITHUB_STEP_SUMMARY
else
echo "❌ Build checksum verification failed!"
echo "❌ Build checksum verification failed!" >> $GITHUB_STEP_SUMMARY
exit 1
fi
- name: Run diffoscope to find diffs
if: failure()
run: |
apt-get download "$PACKAGE_NAME=$PACKAGE_VERSION"
docker run --rm -w $(pwd) -v $(pwd):$(pwd):ro \
registry.salsa.debian.org/reproducible-builds/diffoscope@sha256:51fa7187f093c4cb75b386e7e4caa38ea5783b4a9204b517dc1c91dada209421 --no-progress --max-text-report-size 5000 --max-report-size 5000 --max-diff-block-lines 100 \
release/${{ steps.build_checksum.outputs.built_file }} \
${{ steps.download.outputs.deb_file }}
- name: Open issue on failure
if: ${{ failure() && github.repository == 'signalapp/Signal-Desktop-Private' }}
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/issues \
-d '{"title":"Reproducible build failed: ${{ inputs.version_tag }}","body":"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}","labels":["${{ steps.app_info.outputs.git_branch }}"]}'

View File

@ -1,50 +0,0 @@
# Copyright 2023 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
name: Stories
on:
push:
branches:
- development
- main
- '[0-9]+.[0-9]+.x'
pull_request:
jobs:
test:
runs-on: ubuntu-latest-8-cores
timeout-minutes: 30
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4
- name: Setup node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4
with:
node-version-file: '.nvmrc'
cache: 'pnpm'
cache-dependency-path: 'pnpm-lock.yaml'
- name: Cache .electron-gyp
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
with:
path: ~/.electron-gyp
key: electron-gyp-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Setup sccache
uses: mozilla-actions/sccache-action@054db53350805f83040bf3e6e9b8cf5a139aa7c9 # v0.0.7
- name: Restore sccache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
id: cache-sccache
with:
path: ${{ env.SCCACHE_PATH }}
key: sccache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'patches/**') }}
- name: Install Desktop node_modules
run: pnpm install
env:
CC: sccache gcc
CXX: sccache g++
SCCACHE_GHA_ENABLED: "true"
NPM_CONFIG_LOGLEVEL: verbose
- run: pnpm run build:storybook
- run: ./node_modules/.bin/playwright install chromium
- run: ./node_modules/.bin/run-p --race test:storybook:serve test:storybook:test

9
.gitignore vendored
View File

@ -4,6 +4,8 @@ node_modules_bkp
coverage/*
build/curve25519_compiled.js
build/compact-locales
build/*.policy
build/emoji-data.json
stylesheets/*.css.map
/dist
.DS_Store
@ -16,17 +18,14 @@ release/
/sql/
/start.sh
.eslintcache
.stylelintcache
tsconfig.tsbuildinfo
.smartling-source.sh
# generated files
js/components.js
js/util_worker.js
libtextsecure/components.js
stylesheets/*.css
!stylesheets/webrtc_internals.css
!stylesheets/tailwind-config.css
/storybook-static/
preload.bundle.*
preload.wrapper.js
@ -35,8 +34,10 @@ ts/sql/mainWorker.bundle.js.LICENSE.txt
build/ICUMessageParams.d.ts
# React / TypeScript
build/**/*.js
app/*.js
ts/**/*.js
!ts/windows/main/tsx.js
ts/protobuf/*.d.ts
# CSS Modules

View File

@ -1,3 +1,4 @@
{
"checkLeaks": true
"checkLeaks": true,
"node-option": ["import=tsx"]
}

1
.npmrc
View File

@ -1 +0,0 @@
legacy-peer-deps=true

2
.nvmrc
View File

@ -1 +1 @@
22.14.0
24.15.0

37
.oxlint/plugin.mjs Normal file
View File

@ -0,0 +1,37 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { enforceArrayBuffer } from './rules/enforceArrayBuffer.mjs';
import { enforceFileSuffix } from './rules/enforceFileSuffix.mjs';
import { enforceLicenseComments } from './rules/enforceLicenseComments.mjs';
import { enforceTw } from './rules/enforceTw.mjs';
import { enforceTypeAliasReadonlyDeep } from './rules/enforceTypeAliasReadonlyDeep.mjs';
import { noDisabledTests } from './rules/noDisabledTests.mjs';
import { noExtraneousDependencies } from './rules/noExtraneousDependencies.mjs';
import { noFocusedTests } from './rules/noFocusedTests.mjs';
import { noForIn } from './rules/noForIn.mjs';
import { noRestrictedPaths } from './rules/noRestrictedPaths.mjs';
import { noThen } from './rules/noThen.mjs';
/** @type {import("@typescript-eslint/utils").TSESLint.Linter.Plugin} */
const plugin = {
meta: {
name: 'signal-desktop',
version: '0.0.0',
},
rules: {
'enforce-array-buffer': enforceArrayBuffer,
'enforce-file-suffix': enforceFileSuffix,
'enforce-license-comments': enforceLicenseComments,
'enforce-tw': enforceTw,
'enforce-type-alias-readonlydeep': enforceTypeAliasReadonlyDeep,
'no-disabled-tests': noDisabledTests,
'no-extraneous-dependencies': noExtraneousDependencies,
'no-focused-tests': noFocusedTests,
'no-for-in': noForIn,
'no-restricted-paths': noRestrictedPaths,
'no-then': noThen,
},
};
export default plugin;

View File

@ -0,0 +1,48 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
export const enforceArrayBuffer = ESLintUtils.RuleCreator.withoutDocs({
name: 'enforce-array-buffer',
meta: {
type: 'problem',
fixable: 'code',
messages: {
shouldUseArrayBuffer: `Should be {{replacement}}`,
},
schema: [],
defaultOptions: [],
},
create(context) {
return {
TSTypeReference(node) {
if (node.typeName.type !== 'Identifier') {
return;
}
let replacement;
if (node.typeName.name === 'Uint8Array') {
replacement = 'Uint8Array<ArrayBuffer>';
} else if (node.typeName.name === 'Buffer') {
replacement = 'Buffer<ArrayBuffer>';
} else {
return;
}
if (node.typeArguments != null) {
return;
}
context.report({
node,
messageId: 'shouldUseArrayBuffer',
data: { replacement },
fix(fixer) {
return [fixer.replaceTextRange(node.range, replacement)];
},
});
},
};
},
});

View File

@ -0,0 +1,64 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { enforceArrayBuffer } from './enforceArrayBuffer.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester();
ruleTester.run('enforce-array-buffer', enforceArrayBuffer, {
valid: [
{ code: 'type T = number;' },
{ code: 'type T = Uint16Array;' },
{ code: 'type T = Uint8Array<ArrayBuffer>;' },
{ code: 'type T = Uint8Array<SharedArrayBuffer>;' },
{ code: 'type T = Uint8Array<ArrayBufferLike>;' },
{ code: 'type T = Uint8Array<U>;' },
{ code: 'function f(): Uint8Array<ArrayBuffer> {}' },
{ code: 'function f(p: Uint8Array<ArrayBuffer>) {}' },
{ code: 'let v: Uint8Array<ArrayBuffer>;' },
{ code: 'let v = new Uint8Array();' },
{ code: 'let v = new Uint8Array<ArrayBuffer>();' },
{ code: 'let v = Uint8Array.of();' },
{ code: 'let v = Uint8Array.from();' },
{ code: 'let v: { p: Uint8Array<ArrayBuffer> };' },
{ code: 'type T = Buffer<ArrayBuffer>;' },
{ code: 'type T = Buffer<SharedArrayBuffer>;' },
{ code: 'type T = Buffer<ArrayBufferLike>;' },
{ code: 'type T = Buffer<U>;' },
{ code: 'let v = new Buffer();' },
{ code: 'let v = Buffer.from();' },
],
invalid: [
{
code: `type T = Uint8Array`,
output: `type T = Uint8Array<ArrayBuffer>`,
errors: [{ messageId: 'shouldUseArrayBuffer' }],
},
{
code: `function f(): Uint8Array {}`,
output: `function f(): Uint8Array<ArrayBuffer> {}`,
errors: [{ messageId: 'shouldUseArrayBuffer' }],
},
{
code: `function f(p: Uint8Array) {}`,
output: `function f(p: Uint8Array<ArrayBuffer>) {}`,
errors: [{ messageId: 'shouldUseArrayBuffer' }],
},
{
code: `let v: Uint8Array;`,
output: `let v: Uint8Array<ArrayBuffer>;`,
errors: [{ messageId: 'shouldUseArrayBuffer' }],
},
{
code: `let v: { p: Uint8Array };`,
output: `let v: { p: Uint8Array<ArrayBuffer> };`,
errors: [{ messageId: 'shouldUseArrayBuffer' }],
},
{
code: `type T = Buffer`,
output: `type T = Buffer<ArrayBuffer>`,
errors: [{ messageId: 'shouldUseArrayBuffer' }],
},
],
});

View File

@ -0,0 +1,654 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { getReferenceType } from './utils/getReferenceType.mjs';
import { isStringLiteral } from './utils/astUtils.mjs';
import { assert } from './utils/assert.mjs';
/**
* @typedef {import("@typescript-eslint/utils").TSESTree.Node} Node
* @typedef {import("@typescript-eslint/utils").TSESTree.ImportDeclaration} ImportDeclaration
* @typedef {import("@typescript-eslint/utils").TSESTree.ExportAllDeclaration} ExportAllDeclaration
* @typedef {import("@typescript-eslint/utils").TSESTree.ExportNamedDeclaration} ExportNamedDeclaration
* @typedef {import("@typescript-eslint/utils").TSESTree.ImportClause} ImportClause
* @typedef {import("@typescript-eslint/utils").TSESTree.ExportSpecifier} ExportSpecifier
*/
/**
* @typedef {'std' | 'node' | 'dom' | 'preload' | 'main'} Suffix
*/
const ELECTRON_MAIN_MODULES = new Set([
'app',
'autoUpdater',
'BaseWindow',
'BrowserView',
'BrowserWindow',
'contentTracing',
'desktopCapturer',
'dialog',
'globalShortcut',
'inAppPurchase',
'ipcMain',
'Menu',
'MenuItem',
'MessageChannelMain',
'MessagePortMain',
'nativeTheme',
'net',
'netLog',
'Notification',
'powerMonitor',
'powerSaveBlocker',
'process',
'protocol',
'pushNotifications',
'safeStorage',
'screen',
'session',
'ShareMenu',
'shell',
'systemPreferences',
'TouchBar',
'Tray',
'utilityProcess',
'webContents',
'WebContentsView',
'webFrameMain',
'View',
]);
const ELECTRON_RENDERER_MODULES = new Set([
'contextBridge',
'ipcRenderer',
'webFrame',
'webUtils',
]);
const ELECTRON_SHARED_MODULES = new Set([
'clipboard',
'crashReporter',
'nativeImage',
]);
// Packages that use Node.js APIs (file system, etc)
const NODE_PACKAGES = new Set([
'@electron/asar',
'@indutny/dicer',
'@indutny/mac-screen-share',
'@indutny/range-finder',
'@indutny/simple-windows-notifications',
'@signalapp/libsignal-client',
'@signalapp/mute-state-change',
'@signalapp/ringrtc',
'@signalapp/sqlcipher',
'@signalapp/windows-ucv',
'cirbuf',
'config',
'dashdash',
'encoding',
'fast-glob',
'fs-extra',
'fs-xattr',
'got',
'growing-file',
'http-proxy-agent',
'https-proxy-agent',
'node-fetch',
'read-last-lines',
'socks-proxy-agent',
'split2',
'write-file-atomic',
// Dev dependencies
'@electron/fuses',
'@electron/notarize',
'@electron/symbolicate-mac',
'@indutny/parallel-prettier',
'@indutny/rezip-electron',
'@napi-rs/canvas',
'@signalapp/mock-server',
'@tailwindcss/cli',
'@tailwindcss/postcss',
'better-blockmap',
'chokidar-cli',
'cross-env',
'electron-builder',
'electron-mocha',
'endanger',
'enhanced-resolve',
'enquirer',
'execa',
'http-server',
'json-to-ast',
'log-symbols',
'node-gyp',
'node-gyp-build',
'npm-run-all',
'p-limit',
'pe-library',
'pixelmatch',
'playwright',
'postcss-loader',
'prettier',
'prettier-plugin-tailwindcss',
'react-devtools',
'react-devtools-core',
'resolve-url-loader',
'rolldown',
'sass',
'sass-loader',
'style-loader',
'stylelint',
'stylelint-config-css-modules',
'stylelint-config-recommended-scss',
'stylelint-use-logical-spec',
'svgo',
'synckit',
'tailwindcss',
'tsx',
'typescript',
'wait-on',
'webpack',
'webpack-cli',
'webpack-dev-server',
]);
// Packages that use DOM APIs
const DOM_PACKAGES = new Set([
'@popperjs/core',
'@react-aria/focus',
'@react-aria/interactions',
'@react-aria/utils',
'@react-spring/web',
'@tanstack/react-virtual',
'blob-util',
'blueimp-load-image',
'dom-accessibility-api',
'fabric',
'radix-ui',
'react-aria',
'react-aria-components',
'react-blurhash',
'react-popper',
'react-virtualized',
// Note that: react-dom/server is categorized separately
'react-dom',
// Dev dependencies
'@storybook/addon-a11y',
'@storybook/addon-actions',
'@storybook/addon-controls',
'@storybook/addon-interactions',
'@storybook/addon-jest',
'@storybook/addon-measure',
'@storybook/addon-toolbars',
'@storybook/addon-viewport',
'@storybook/addon-webpack5-compiler-swc',
'@storybook/react',
'@storybook/react-webpack5',
'@storybook/test',
'@storybook/test-runner',
'@storybook/types',
'storybook',
]);
// Packages that can run in both browser/node
const STD_PACKAGES = new Set([
'@babel/core',
'@babel/plugin-transform-runtime',
'@babel/plugin-transform-typescript',
'@babel/preset-react',
'@babel/preset-typescript',
'@formatjs/fast-memoize',
'@formatjs/icu-messageformat-parser',
'@formatjs/intl',
'@formatjs/intl-localematcher',
'@indutny/sneequals',
'@internationalized/date',
'@react-types/shared',
'@signalapp/minimask',
'@signalapp/parchment-cjs',
'@signalapp/quill-cjs',
'@signalapp/lame',
'@typescript-eslint/eslint-plugin',
'@typescript-eslint/parser',
'axe-core',
'babel-core',
'babel-loader',
'babel-plugin-lodash',
'blurhash',
'buffer',
'card-validator',
'casual',
'chai',
'chai-as-promised',
'changedpi',
'classnames',
'country-codes-list',
'credit-card-type',
'css-loader',
'csv-parse',
'danger',
'debug',
'direction',
'emoji-regex-xs',
'eslint',
'eslint-plugin-better-tailwindcss',
'filesize',
'firstline',
'form-data',
'motion',
'motion/react',
'fuse.js',
'google-libphonenumber',
'heic-convert',
'humanize-duration',
'intl-tel-input',
'js-yaml',
'linkify-it',
'lodash',
'lru-cache',
'memoizee',
'mocha',
'moment',
'mp4box',
'nop',
'normalize-path',
'p-map',
'p-queue',
'p-timeout',
'parsecurrency',
'pino',
'pngjs',
'qrcode-generator',
'react',
'react-intl',
'react-redux',
'redux',
'redux-logger',
'redux-promise-middleware',
'redux-thunk',
'reselect',
'semver',
'sinon',
'tinykeys',
'type-fest',
'url',
'uuid',
'zod',
]);
export const enforceFileSuffix = ESLintUtils.RuleCreator.withoutDocs({
name: 'enforce-file-suffix',
meta: {
type: 'problem',
messages: {
missingFileSuffix: 'Missing file suffix in {{source}} import',
unrecognizedFileSuffix:
'Unrecognized file suffix in {{source}}, expected: node/preload/main/std, found: {{depSuffix}}',
commonJsImportOfElectronNoAllowed:
'CJS import of electron is not allowed',
uncategorizedElectronApi:
'Uncategorized electron API: "{{name}}". ' +
'Please update .oxlint/rules/file-suffix.js and add it to ' +
'ELECTRON_MAIN_MODULES/ELECTRON_RENDERER_MODULES/' +
'ELECTRON_SHARED_MODULES',
unsupportedNamespaceImportForElectron:
'Unsupported namespace import specifier for electron',
unsupportedImportSpecifierForElectron:
'Unsupported import specifier for electron',
uncategorizedDependency:
'Uncategorized dependency "{{moduleName}}". ' +
'Please update .oxlint/rules/file-suffix.js and add it to either ' +
'of NODE_PACKAGES/DOM_PACKAGES/STD_PACKAGES',
missingFileSuffixMustBeOneOf:
'Missing file suffix. Has to be one of: node/preload/main/std',
wrongFileSuffix:
'Invalid suffix {{fileSuffix}}, expected: {{expectedSuffix}}',
invalidImportForSuffix:
'Invalid import/reference for suffix: {{expectedSuffix}}',
invalidRequireCount: 'Invalid require() argument count',
},
schema: [],
defaultOptions: [],
},
create(context) {
const { filename, sourceCode } = context;
/** @type {string} */
let fileSuffix;
/** @type {Node[]} */
const nodeUses = [];
/** @type {Node[]} */
const domUses = [];
/** @type {Node[]} */
const preloadUses = [];
/** @type {Node[]} */
const mainUses = [];
/** @type Record<Suffix, Node[][]> */
const invalidUsesBySuffix = {
std: [nodeUses, domUses, preloadUses, mainUses],
node: [domUses, preloadUses, mainUses],
dom: [nodeUses, preloadUses, mainUses],
preload: [mainUses],
main: [domUses, preloadUses],
};
/**
* @param {Node} node
* @param {string} source
*/
function trackLocalDep(node, source) {
if (!/\.tsx?/.test(source)) {
return;
}
const match = source.match(/\.([^.\/]+)(?:\.stories)?\.tsx?$/);
if (match == null) {
context.report({
node,
messageId: 'missingFileSuffix',
data: { source },
});
return;
}
const [, depSuffix] = match;
if (depSuffix === 'node') {
nodeUses.push(node);
} else if (depSuffix === 'dom') {
domUses.push(node);
} else if (depSuffix === 'preload') {
preloadUses.push(node);
} else if (depSuffix === 'main') {
mainUses.push(node);
} else if (depSuffix === 'std') {
// Ignore
} else {
context.report({
node,
messageId: 'unrecognizedFileSuffix',
data: { source, depSuffix },
});
}
}
/**
* @param {Node} node
* @param {string} source
* @param {Array<ImportClause | ExportSpecifier> | null} specifiers
*/
function processUse(node, source, specifiers) {
if (source.startsWith('.')) {
trackLocalDep(node, source);
return;
}
// Node APIs
if (source.startsWith('node:')) {
nodeUses.push(node);
return;
}
// Electron
if (source === 'electron' && specifiers == null) {
context.report({
node,
messageId: 'commonJsImportOfElectronNoAllowed',
});
return;
} else if (source === 'electron') {
for (const s of specifiers ?? []) {
// We implicitly skip:
// they are used in scripts
if (s.type === 'ImportSpecifier') {
if (s.importKind === 'type') {
continue;
}
/** @type {string} */
let importName;
if (s.imported.type === 'Identifier') {
importName = s.imported.name;
} else {
importName = s.imported.value;
}
if (ELECTRON_MAIN_MODULES.has(importName)) {
mainUses.push(s);
} else if (ELECTRON_RENDERER_MODULES.has(importName)) {
preloadUses.push(s);
} else if (ELECTRON_SHARED_MODULES.has(importName)) {
// no-op
} else {
context.report({
node: s,
messageId: 'uncategorizedElectronApi',
data: { name: importName },
});
}
} else if (s.type === 'ImportNamespaceSpecifier') {
// import * as electron from 'electron';
context.report({
node: s,
messageId: 'unsupportedNamespaceImportForElectron',
});
nodeUses.push(s);
} else if (s.type === 'ImportDefaultSpecifier') {
// import ELECTRON_CLI from 'electron';
nodeUses.push(s);
} else {
context.report({
node: s,
messageId: 'unsupportedImportSpecifierForElectron',
});
}
}
return;
}
const match = source.match(/^([^@/]+|@[^/]+\/[^/]+)/);
if (match == null) {
return;
}
const [, moduleName] = match;
assert(moduleName, 'Missing moduleName');
if (NODE_PACKAGES.has(moduleName)) {
nodeUses.push(node);
} else if (source === 'react-dom/server') {
// no-op
} else if (
DOM_PACKAGES.has(moduleName) ||
source === 'react-dom/client'
) {
domUses.push(node);
} else if (!STD_PACKAGES.has(moduleName)) {
context.report({
node,
messageId: 'uncategorizedDependency',
data: { moduleName },
});
}
}
/**
* @param {ImportDeclaration | ExportAllDeclaration | ExportNamedDeclaration} node
*/
function processESMReference(node) {
/** @type {Array<ImportClause | ExportSpecifier> | null} */
let specifiers;
if (node.type === 'ImportDeclaration') {
if (node.importKind === 'type') {
return;
}
if (node.specifiers.length > 0) {
const allTypes = node.specifiers.every(specifier => {
return (
specifier.type === 'ImportSpecifier' &&
specifier.importKind === 'type'
);
});
if (allTypes) {
return;
}
}
specifiers = node.specifiers;
} else if (node.type === 'ExportNamedDeclaration') {
specifiers = node.specifiers;
} else {
specifiers = null;
}
if (!node.source) {
return;
}
if (node.source.type !== 'Literal') {
return;
}
const source = node.source.value;
processUse(node, source, specifiers);
}
return {
Program: node => {
if (/\.d\.m?ts$/.test(filename)) {
// Skip types
return;
}
const match = filename.match(
/\.([^.\/]+)(?:\.stories)?\.(?:ts|tsx|js|mjs)$/
);
if (match == null) {
context.report({
node,
messageId: 'missingFileSuffixMustBeOneOf',
});
return;
}
const matchedSuffix = match[1];
assert(matchedSuffix, 'Missing matchedSuffix');
fileSuffix = matchedSuffix;
},
'Program:exit': node => {
if (fileSuffix == null) {
return;
}
/** @type {Suffix} */
let expectedSuffix;
if (mainUses.length > 0) {
expectedSuffix = 'main';
} else if (preloadUses.length > 0) {
expectedSuffix = 'preload';
} else if (nodeUses.length > 0) {
if (domUses.length > 0) {
expectedSuffix = 'preload';
} else {
expectedSuffix = 'node';
}
} else if (domUses.length > 0) {
expectedSuffix = 'dom';
} else {
expectedSuffix = 'std';
}
// All .tsx files should normally be .dom.tsx, but could also be
// .std.tsx.
if (
expectedSuffix === 'std' &&
filename.endsWith('.tsx') &&
fileSuffix !== 'std'
) {
expectedSuffix = 'dom';
}
if (fileSuffix !== expectedSuffix) {
context.report({
node,
messageId: 'wrongFileSuffix',
data: { fileSuffix, expectedSuffix },
});
}
const invalid = invalidUsesBySuffix[expectedSuffix].flat();
for (const use of invalid) {
context.report({
node: use,
messageId: 'invalidImportForSuffix',
data: { expectedSuffix },
});
}
},
ImportDeclaration(node) {
processESMReference(node);
},
ExportAllDeclaration(node) {
processESMReference(node);
},
ExportNamedDeclaration(node) {
processESMReference(node);
},
CallExpression(node) {
if (
node.callee.type !== 'Identifier' ||
node.callee.name !== 'require'
) {
return;
}
const refType = getReferenceType(sourceCode, node.callee);
if (refType !== 'global') {
return;
}
const { arguments: args } = node;
if (args.length !== 1) {
context.report({
node,
messageId: 'invalidRequireCount',
});
return;
}
const [arg] = args;
assert(arg, 'Missing arg');
/** @type {string} */
let source;
if (isStringLiteral(arg)) {
source = arg.value;
} else if (
arg.type === 'TSAsExpression' &&
isStringLiteral(arg.expression)
) {
source = arg.expression.value;
} else {
// Ignore other expressions
return;
}
processUse(node, source, null);
},
Identifier(node) {
if (node.name !== 'window' && node.name !== 'document') {
return;
}
const refType = getReferenceType(sourceCode, node);
if (refType == null) {
// Not part of expression
return;
}
if (refType !== 'global') {
return;
}
domUses.push(node);
},
};
},
});

View File

@ -0,0 +1,139 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { enforceFileSuffix } from './enforceFileSuffix.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester();
const ALLOWED_REFERENCES = /* @type {const} */ [
{
fileSuffix: 'std',
requiredLine: '',
depSuffixes: ['std'],
},
{
fileSuffix: 'dom',
requiredLine: 'window.addEventListener();',
depSuffixes: ['std', 'dom'],
},
{
fileSuffix: 'node',
requiredLine: 'require("node:fs");',
depSuffixes: ['std', 'node'],
},
{
fileSuffix: 'preload',
requiredLine: 'import { ipcRenderer } from "electron";',
depSuffixes: ['std', 'node', 'preload'],
},
{
fileSuffix: 'main',
requiredLine: 'import { autoUpdater } from "electron";',
depSuffixes: ['std', 'node', 'main'],
},
];
const DISALLOWED_REFERENCES = /* @type {const} */ [
{ fileSuffix: 'std', depSuffixes: ['dom', 'node', 'preload', 'main'] },
{ fileSuffix: 'dom', depSuffixes: ['node', 'preload', 'main'] },
{ fileSuffix: 'node', depSuffixes: ['preload', 'main'] },
{ fileSuffix: 'preload', depSuffixes: ['main'] },
{ fileSuffix: 'main', depSuffixes: ['dom', 'preload'] },
];
ruleTester.run('file-suffix', enforceFileSuffix, {
valid: [
...ALLOWED_REFERENCES.map(({ fileSuffix, requiredLine, depSuffixes }) => {
return depSuffixes.map(depSuffix => {
/** @type {const} */
return {
name: `importing ${depSuffix} from ${fileSuffix}`,
filename: `a.${fileSuffix}.ts`,
code: `
import { x } from './b.${depSuffix}.ts';
${requiredLine}
`,
languageOptions: {
globals: {
window: 'writable',
require: 'readable',
},
},
};
});
}).flat(),
{
name: 'type import should have no effect',
filename: 'a.std.ts',
code: `import type { ReadonlyDeep } from './b.dom.ts'`,
},
],
invalid: [
...DISALLOWED_REFERENCES.map(({ fileSuffix, depSuffixes }) => {
return depSuffixes.map(depSuffix => {
/** @type {const} */
return {
name: `importing ${depSuffix} from ${fileSuffix}`,
filename: `a.${fileSuffix}.ts`,
code: `import { x } from './b.${depSuffix}.ts'`,
errors: [
{
messageId: 'wrongFileSuffix',
data: { fileSuffix, expectedSuffix: depSuffix },
},
],
};
});
}).flat(),
...['dom', 'node', 'preload', 'main'].map(fileSuffix => {
/** @type {const} */
return {
name: `no ${fileSuffix} imports`,
filename: `a.${fileSuffix}.ts`,
code: '',
errors: [
{
messageId: 'wrongFileSuffix',
data: { fileSuffix, expectedSuffix: 'std' },
},
],
};
}),
// Invalid imports
{
name: 'preload in main',
filename: 'a.main.ts',
code: `
import { autoUpdater } from 'electron';
import './b.preload.ts';
`,
errors: [
{
messageId: 'invalidImportForSuffix',
data: { expectedSuffix: 'main' },
},
],
},
{
name: 'main in preload',
filename: 'a.preload.ts',
code: `
import { ipcRenderer } from 'electron';
import './b.main.ts';
`,
errors: [
{
messageId: 'wrongFileSuffix',
data: { fileSuffix: 'preload', expectedSuffix: 'main' },
},
{
messageId: 'invalidImportForSuffix',
data: { expectedSuffix: 'main' },
},
],
},
],
});

View File

@ -0,0 +1,77 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
const COMMENT_LINE_1_EXACT = /^ Copyright \d{4} Signal Messenger, LLC$/;
const COMMENT_LINE_2_EXACT = /^ SPDX-License-Identifier: AGPL-3.0-only$/;
const COMMENT_LINE_1_LOOSE = /Copyright (\d{4}) Signal Messenger, LLC/;
const COMMENT_LINE_2_LOOSE = /SPDX-License-Identifier: AGPL-3.0-only/;
export const enforceLicenseComments = ESLintUtils.RuleCreator.withoutDocs({
meta: {
type: 'problem',
fixable: 'code',
messages: {
missingLicenseComment: 'Missing license comment',
},
schema: [],
defaultOptions: [],
},
create(context) {
return {
Program(node) {
const comment1 = node.comments?.at(0);
const comment2 = node.comments?.at(1);
if (
comment1?.type === 'Line' &&
comment2?.type === 'Line' &&
COMMENT_LINE_1_EXACT.test(comment1.value) &&
COMMENT_LINE_2_EXACT.test(comment2.value)
) {
return;
}
context.report({
node,
messageId: 'missingLicenseComment',
fix(fixer) {
let year = null;
const remove = [];
for (const comment of node.comments ?? []) {
const match1 = comment.value.match(COMMENT_LINE_1_LOOSE);
const match2 = comment.value.match(COMMENT_LINE_2_LOOSE);
if (match1 != null) {
year = match1[1];
}
if (match1 != null || match2 != null) {
remove.push(comment);
}
}
year ??= new Date().getFullYear().toString();
const insert =
`// Copyright ${year} Signal Messenger, LLC\n` +
'// SPDX-License-Identifier: AGPL-3.0-only\n';
return [
fixer.replaceTextRange([0, 0], insert),
...remove.map(comment => {
return fixer.replaceTextRange(
[comment.range[0], comment.range[1]],
''
);
}),
];
},
});
},
};
},
});

146
.oxlint/rules/enforceTw.mjs Normal file
View File

@ -0,0 +1,146 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { createSyncFn } from 'synckit';
/**
* @typedef {import("@typescript-eslint/utils").TSESTree.Node} Node
*/
const worker = createSyncFn(import.meta.resolve('./enforceTw.worker.mjs'));
export const enforceTw = ESLintUtils.RuleCreator.withoutDocs({
name: 'enforce-tw',
meta: {
type: 'problem',
messages: {
needsTw: 'Tailwind classes must be wrapped with tw()',
},
schema: [],
defaultOptions: [],
},
create(context) {
/**
* @param {string} input
* @param {Node} node
*/
function check(input, node) {
if (typeof input !== 'string') {
throw new Error(`Unexpected input ${input} for node type ${node.type}`);
}
const tailwindClasses = worker(input.split(/\s+/));
for (const tailwindClass of tailwindClasses) {
const index = input.indexOf(tailwindClass) + 1;
const length = tailwindClass.length;
context.report({
node,
loc: {
start: {
line: node.loc.start.line,
column: node.loc.start.column + index,
},
end: {
line: node.loc.end.line,
column: node.loc.start.column + index + length,
},
},
messageId: 'needsTw',
});
}
}
/**
* @param {Node} node
*/
function traverse(node) {
if (node.type === 'Literal') {
if (typeof node.value === 'string') {
check(node.value, node);
}
// ignore other literals
} else if (node.type === 'TemplateLiteral') {
for (const element of node.quasis) {
traverse(element);
}
for (const expression of node.expressions) {
traverse(expression);
}
} else if (node.type === 'TemplateElement') {
if (node.value.cooked != null) {
check(node.value.cooked, node);
}
} else if (node.type === 'JSXExpressionContainer') {
traverse(node.expression);
} else if (node.type === 'ConditionalExpression') {
// ignore node.test
traverse(node.consequent);
traverse(node.alternate);
} else if (node.type === 'LogicalExpression') {
if (node.operator === '||' || node.operator === '??') {
traverse(node.left);
}
traverse(node.right);
} else if (node.type === 'BinaryExpression') {
if (node.operator === '+') {
traverse(node.left);
traverse(node.right);
} else {
throw new Error(`Unexpected binary operator: ${node.operator}`);
}
} else if (node.type === 'ObjectExpression') {
for (const prop of node.properties) {
traverse(prop);
}
} else if (node.type === 'Property') {
if (node.key.type === 'Identifier') {
if (!node.computed) {
check(node.key.name, node.key);
}
// ignore computed
} else if (node.key.type === 'Literal') {
traverse(node.key);
} else if (node.key.type === 'TemplateLiteral') {
traverse(node.key);
} else if (node.key.type === 'CallExpression') {
// ignore
} else {
throw new Error(`Unexpected property key type: ${node.key.type}`);
}
} else if (node.type === 'ArrayExpression') {
for (const element of node.elements) {
if (element != null) {
traverse(element);
}
}
} else if (node.type === 'Identifier') {
// ignore
} else if (node.type === 'CallExpression') {
// ignore
} else if (node.type === 'MemberExpression') {
// ignore
} else {
throw new Error(`Unexpected traverse node type: ${node.type}`);
}
}
return {
CallExpression(node) {
if (node.callee.type !== 'Identifier') return;
if (node.callee.name !== 'classNames') return;
for (const arg of node.arguments) {
traverse(arg);
}
},
JSXAttribute(node) {
if (node.name.type !== 'JSXIdentifier') return;
if (node.name.name !== 'className') return;
if (node.value != null) {
traverse(node.value);
}
},
};
},
});

View File

@ -0,0 +1,69 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { enforceTw } from './enforceTw.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester({
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
});
ruleTester.run('enforce-tw', enforceTw, {
valid: [
{ code: `classNames("foo")` },
{ code: `<div className="foo"/>` },
{ code: `tw("flex")` },
],
invalid: [
{
code: `classNames("flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `<div className="flex"/>`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `<div className={"flex"}/>`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames("foo", "flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames(cond ? "foo" : "flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames(cond ? "flex" : "foo")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames(cond && "flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames(cond || "flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames(cond ?? "flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames("foo" + "flex")`,
errors: [{ messageId: 'needsTw' }],
},
{
code: `classNames("flex" + "foo")`,
errors: [{ messageId: 'needsTw' }],
},
],
});

View File

@ -0,0 +1,57 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { runAsWorker } from 'synckit';
import enhancedResolve from 'enhanced-resolve';
import * as tailwind from 'tailwindcss';
import path from 'node:path';
import fs from 'node:fs';
const rootDir = path.join(import.meta.dirname, '../..');
const tailwindCssPath = path.join(rootDir, 'stylesheets/tailwind-config.css');
async function loadDesignSystem() {
const tailwindCss = fs.readFileSync(tailwindCssPath, 'utf-8');
const resolver = enhancedResolve.create.sync({
conditionNames: ['style'],
extensions: ['.css'],
mainFields: ['style'],
});
const designSystem = await tailwind.__unstable__loadDesignSystem(
tailwindCss,
{
base: path.dirname(tailwindCssPath),
async loadStylesheet(id, base) {
const resolved = resolver(base, id);
if (!resolved) {
return { path: '', base: '', content: '' };
}
return {
path: resolved,
base: path.dirname(resolved),
content: fs.readFileSync(resolved, 'utf-8'),
};
},
}
);
return designSystem;
}
let cachedDesignSystem = null;
/**
* @param {Array<string>} classNames
*/
async function worker(classNames) {
cachedDesignSystem ??= await loadDesignSystem();
const designSystem = cachedDesignSystem;
const css = designSystem.candidatesToCss(classNames);
const tailwindClassNames = classNames.filter((_, index) => {
return css.at(index) != null;
});
return tailwindClassNames;
}
runAsWorker(worker);

View File

@ -0,0 +1,75 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { assert } from './utils/assert.mjs';
/**
* @typedef {import("@typescript-eslint/utils").TSESTree.Node} Node
* @typedef {import("@typescript-eslint/utils").TSESLint.Scope.Scope} Scope
*/
/**
* @param {Node} node
* @param {Scope} scope
*/
function isReadOnlyDeep(node, scope) {
if (node.type !== 'TSTypeReference') {
return false;
}
const reference = scope.references.find(ref => {
return ref.identifier === node.typeName;
});
const variable = reference?.resolved;
if (variable == null) {
return false;
}
const defs = variable.defs;
if (defs.length !== 1) {
return false;
}
const [def] = defs;
assert(def, 'Missing def');
return (
def.type === 'ImportBinding' &&
def.parent.type === 'ImportDeclaration' &&
def.parent.source.type === 'Literal' &&
def.parent.source.value === 'type-fest'
);
}
export const enforceTypeAliasReadonlyDeep = ESLintUtils.RuleCreator.withoutDocs(
{
name: 'enforce-type-alias-readonlydeep',
meta: {
type: 'problem',
messages: {
needsReadonlyDeep:
'Type aliases must be wrapped with ReadonlyDeep from type-fest',
},
schema: [],
defaultOptions: [],
},
create(context) {
return {
TSTypeAliasDeclaration(node) {
const scope = context.sourceCode.getScope(node);
if (isReadOnlyDeep(node.typeAnnotation, scope)) {
return;
}
context.report({
node: node.id,
messageId: 'needsReadonlyDeep',
});
},
};
},
}
);

View File

@ -0,0 +1,40 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { enforceTypeAliasReadonlyDeep } from './enforceTypeAliasReadonlyDeep.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester();
ruleTester.run('type-alias-readonlydeep', enforceTypeAliasReadonlyDeep, {
valid: [
{
code: `import type { ReadonlyDeep } from "type-fest"; type Foo = ReadonlyDeep<{}>`,
},
{
code: `import { ReadonlyDeep } from "type-fest"; type Foo = ReadonlyDeep<{}>`,
},
],
invalid: [
{
code: `type Foo = {}`,
errors: [{ messageId: 'needsReadonlyDeep' }],
},
{
code: `type Foo = Bar<{}>`,
errors: [{ messageId: 'needsReadonlyDeep' }],
},
{
code: `type Foo = ReadonlyDeep<{}>`,
errors: [{ messageId: 'needsReadonlyDeep' }],
},
{
code: `interface ReadonlyDeep<T> {}; type Foo = ReadonlyDeep<{}>`,
errors: [{ messageId: 'needsReadonlyDeep' }],
},
{
code: `import type { ReadonlyDeep } from "foo"; type Foo = ReadonlyDeep<{}>`,
errors: [{ messageId: 'needsReadonlyDeep' }],
},
],
});

View File

@ -0,0 +1,22 @@
{
"dependencies": {
"prod-dep": "0.0.0",
"@scoped/prod-dep": "0.0.0"
},
"devDependencies": {
"dev-dep": "0.0.0",
"@scoped/dev-dep": "0.0.0"
},
"peerDependencies": {
"peer-dep": "0.0.0",
"@scoped/peer-dep": "0.0.0"
},
"optionalDependencies": {
"optional-dep": "0.0.0",
"@scoped/optional-dep": "0.0.0"
},
"bundledDependencies": [
"bundled-dep",
"@scoped/bundled-dep"
]
}

View File

@ -0,0 +1,3 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
export {};

View File

@ -0,0 +1,3 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
export {};

View File

@ -0,0 +1,4 @@
{
"include": ["./client/**", "./server/**"],
"compilerOptions": {}
}

View File

@ -0,0 +1,64 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { getReferenceType } from './utils/getReferenceType.mjs';
import { isPropertyAccess } from './utils/astUtils.mjs';
export const noDisabledTests = ESLintUtils.RuleCreator.withoutDocs({
name: 'no-disabled-tests',
meta: {
type: 'problem',
hasSuggestions: true,
messages: {
unexpectedDisabledTest: 'Unexpected disabled test',
removeSkip: 'Remove .skip()',
},
schema: [],
defaultOptions: [],
},
create(context) {
const { sourceCode } = context;
return {
MemberExpression(node) {
if (node.object.type !== 'Identifier') {
return;
}
let replacement;
if (node.object.name === 'describe') {
replacement = 'describe';
} else if (node.object.name === 'it') {
replacement = 'it';
} else if (node.object.name === 'test') {
replacement = 'test';
} else {
return;
}
if (!isPropertyAccess(node, 'skip')) {
return;
}
const refType = getReferenceType(sourceCode, node.object);
if (refType != null && refType !== 'global') {
return;
}
context.report({
node,
messageId: 'unexpectedDisabledTest',
suggest: [
{
messageId: 'removeSkip',
fix(fixer) {
return [fixer.replaceTextRange(node.range, replacement)];
},
},
],
});
},
};
},
});

View File

@ -0,0 +1,56 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { noDisabledTests } from './noDisabledTests.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester();
ruleTester.run('no-disabled-tests', noDisabledTests, {
valid: [
{ code: 'describe(() => {});' },
{ code: 'it(() => {});' },
{ code: 'test(() => {});' },
{ code: 'describe.only(() => {});' },
{ code: 'it.only(() => {});' },
{ code: 'test.only(() => {});' },
{ code: 'let describe; describe.skip(() => {});' },
{ code: 'x.describe.skip(() => {});' },
],
invalid: [
{
code: `describe.skip(() => {});`,
suggestion: `describe(() => {});`,
},
{
code: `it.skip(() => {});`,
suggestion: `it(() => {});`,
},
{
code: `test.skip(() => {});`,
suggestion: `test(() => {});`,
},
{
code: `describe['skip'](() => {});`,
suggestion: `describe(() => {});`,
},
{
code: `it['skip'](() => {});`,
suggestion: `it(() => {});`,
},
{
code: `test['skip'](() => {});`,
suggestion: `test(() => {});`,
},
].map(opts => {
return {
code: opts.code,
errors: [
{
messageId: 'unexpectedDisabledTest',
suggestions: [{ messageId: 'removeSkip', output: opts.suggestion }],
},
],
};
}),
});

View File

@ -0,0 +1,202 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { readFileSync } from 'node:fs';
import { dirname } from 'node:path';
import { isBuiltin, findPackageJSON } from 'node:module';
import { createImportSourceVisitor } from './utils/createImportSourceVisitor.mjs';
/**
* @param value {unknown}
* @returns {value is Record<string, unknown>}
*/
function isObject(value) {
return typeof value === 'object' && value != null;
}
/**
* @param deps {unknown}
*/
function getDepsKeys(deps) {
return new Set(isObject(deps) ? Object.keys(deps) : null);
}
/**
* @param deps {unknown}
* @returns {Set<string>}
*/
function getBundledDepsKeys(deps) {
return Array.isArray(deps) ? new Set(deps) : getDepsKeys(deps);
}
/**
* @typedef {object} PkgDeps
* @property {Set<string>} dependencies
* @property {Set<string>} devDependencies
* @property {Set<string>} peerDependencies
* @property {Set<string>} optionalDependencies
* @property {Set<string>} bundledDependencies
*/
/** @type {Map<string, PkgDeps>} */
const PKG_DEPS_CACHE = new Map();
/** @param {string} currentFile */
function getPkgDeps(currentFile) {
const currentDir = dirname(currentFile);
const cached = PKG_DEPS_CACHE.get(currentDir);
if (cached != null) {
return cached;
}
const pkgPath = findPackageJSON('.', currentFile);
if (pkgPath == null) {
throw new Error(`Could not resolve package.json from ${currentFile}`);
}
const pkgText = readFileSync(pkgPath, 'utf8');
const pkgJson = JSON.parse(pkgText);
/** @type {PkgDeps} */
const pkgDeps = {
dependencies: getDepsKeys(pkgJson.dependencies),
devDependencies: getDepsKeys(pkgJson.devDependencies),
peerDependencies: getDepsKeys(pkgJson.peerDependencies),
optionalDependencies: getDepsKeys(pkgJson.optionalDependencies),
bundledDependencies: getBundledDepsKeys(pkgJson.bundledDependencies),
};
PKG_DEPS_CACHE.set(currentDir, pkgDeps);
return pkgDeps;
}
/** @param {string} source */
function getPackageNameFromSource(source) {
if (source.startsWith('@')) {
const [scope, name] = source.split('/', 2);
return `${scope}/${name}`;
}
const [name] = source.split('/', 1);
return name;
}
/**
* @typedef {object} Options
* @property {boolean=} devDependencies
* @property {boolean=} peerDependencies
* @property {boolean=} optionalDependencies
* @property {boolean=} bundledDependencies
*/
/** @type {[Options]} */
const defaultOptions = [
{
devDependencies: true,
peerDependencies: true,
optionalDependencies: true,
bundledDependencies: true,
},
];
export const noExtraneousDependencies = ESLintUtils.RuleCreator.withoutDocs({
name: 'no-extraneous-dependencies',
meta: {
type: 'problem',
messages: {
missingFromProjectDeps:
"'{{pkgName}}' should be listed in the project's dependencies",
wrongProjectDeps:
"'{{pkgName}}' should be listed in the project's dependencies, found in {{found}}",
},
schema: [
{
type: 'object',
properties: {
devDependencies: { type: 'boolean' },
peerDependencies: { type: 'boolean' },
optionalDependencies: { type: 'boolean' },
bundledDependencies: { type: 'boolean' },
},
additionalProperties: false,
},
],
defaultOptions,
},
create(context) {
const { sourceCode, options } = context;
const opts = {
devDependencies: options[0]?.devDependencies ?? true,
peerDependencies: options[0]?.peerDependencies ?? true,
optionalDependencies: options[0]?.optionalDependencies ?? true,
bundledDependencies: options[0]?.bundledDependencies ?? true,
};
const pkgDeps = getPkgDeps(context.physicalFilename);
return createImportSourceVisitor(sourceCode, node => {
const source = node.value;
if (
source.startsWith('.') ||
source.startsWith('/') ||
source.trim() === ''
) {
return;
}
if (isBuiltin(source)) {
return;
}
const pkgName = getPackageNameFromSource(source);
/** @type {Array<string>} */
const found = [];
if (pkgDeps.dependencies.has(pkgName)) {
return;
}
if (pkgDeps.devDependencies.has(pkgName)) {
found.push('devDependencies');
if (opts.devDependencies) {
return;
}
}
if (pkgDeps.peerDependencies.has(pkgName)) {
found.push('peerDependencies');
if (opts.peerDependencies) {
return;
}
}
if (pkgDeps.optionalDependencies.has(pkgName)) {
found.push('optionalDependencies');
if (opts.optionalDependencies) {
return;
}
}
if (pkgDeps.bundledDependencies.has(pkgName)) {
found.push('bundledDependencies');
if (opts.bundledDependencies) {
return;
}
}
if (found.length > 0) {
context.report({
node,
messageId: 'wrongProjectDeps',
data: { pkgName, found: found.join(', ') },
});
} else {
context.report({
node,
messageId: 'missingFromProjectDeps',
data: { pkgName },
});
}
});
},
});

View File

@ -0,0 +1,112 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import path from 'node:path';
import { noExtraneousDependencies } from './noExtraneousDependencies.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
/**
* @typedef {import("./noExtraneousDependencies.mjs").Options} Options
*/
const ruleTester = new RuleTester();
const filename = path.join(
import.meta.dirname,
'fixtures/noExtraneousDependencies/package/foo.js'
);
/** @type {Options} */
const NONE = {
devDependencies: false,
peerDependencies: false,
optionalDependencies: false,
bundledDependencies: false,
};
/**
* @satisfies {Record<string, [Options]>}
*/
const opts = {
none: [NONE],
dev: [{ ...NONE, devDependencies: true }],
peer: [{ ...NONE, peerDependencies: true }],
optional: [{ ...NONE, optionalDependencies: true }],
bundled: [{ ...NONE, bundledDependencies: true }],
};
ruleTester.run('no-extraneous-dependencies', noExtraneousDependencies, {
valid: [
{ filename, code: `import a from "./a";`, options: opts.none },
{ filename, code: `import a from "../a";`, options: opts.none },
{ filename, code: `import a from "path";`, options: opts.none },
{ filename, code: `import a from "node:path";`, options: opts.none },
{ filename, code: `import a from "";`, options: opts.none },
{ filename, code: `import a from "prod-dep";`, options: opts.none },
{ filename, code: `import a from "prod-dep/nested";`, options: opts.none },
{ filename, code: `import a from "@scoped/prod-dep";`, options: opts.none },
{
filename,
code: `import a from "@scoped/prod-dep/nested";`,
options: opts.none,
},
{ filename, code: `import a from "dev-dep";`, options: opts.dev },
{ filename, code: `import a from "peer-dep";`, options: opts.peer },
{
filename,
code: `import a from "optional-dep";`,
options: opts.optional,
},
{ filename, code: `import a from "bundled-dep";`, options: opts.bundled },
],
invalid: [
{
filename,
code: `import a from "dev-dep";`,
options: opts.none,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "peer-dep";`,
options: opts.none,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "optional-dep";`,
options: opts.none,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "bundled-dep";`,
options: opts.none,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "dev-dep";`,
options: opts.peer,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "dev-dep";`,
options: opts.optional,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "dev-dep";`,
options: opts.bundled,
errors: [{ messageId: 'wrongProjectDeps' }],
},
{
filename,
code: `import a from "does-not-exist";`,
options: opts.bundled,
errors: [{ messageId: 'missingFromProjectDeps' }],
},
],
});

View File

@ -0,0 +1,60 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { getReferenceType } from './utils/getReferenceType.mjs';
import { isPropertyAccess } from './utils/astUtils.mjs';
export const noFocusedTests = ESLintUtils.RuleCreator.withoutDocs({
name: 'no-focused-tests',
meta: {
type: 'problem',
hasSuggestions: true,
fixable: 'code',
messages: {
unexpectedFocusedTest: 'Unexpected focused test',
},
schema: [],
},
create(context) {
const { sourceCode } = context;
return {
MemberExpression(node) {
if (node.object.type !== 'Identifier') {
return;
}
let replacement;
if (node.object.name === 'describe') {
replacement = 'describe';
} else if (node.object.name === 'it') {
replacement = 'it';
} else if (node.object.name === 'test') {
replacement = 'test';
} else {
return;
}
if (!isPropertyAccess(node, 'only')) {
return;
}
const refType = getReferenceType(sourceCode, node.object);
if (refType != null && refType !== 'global') {
return;
}
context.report({
node,
messageId: 'unexpectedFocusedTest',
fix(fixer) {
if (node.range == null) {
return null;
}
return [fixer.replaceTextRange(node.range, replacement)];
},
});
},
};
},
});

View File

@ -0,0 +1,52 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { noFocusedTests } from './noFocusedTests.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester();
ruleTester.run('no-focused-tests', noFocusedTests, {
valid: [
{ code: 'describe(() => {});' },
{ code: 'it(() => {});' },
{ code: 'test(() => {});' },
{ code: 'describe.skip(() => {});' },
{ code: 'it.skip(() => {});' },
{ code: 'test.skip(() => {});' },
{ code: 'let describe; describe.only(() => {});' },
{ code: 'x.describe.only(() => {});' },
],
invalid: [
{
code: `describe.only(() => {});`,
output: `describe(() => {});`,
errors: [{ messageId: 'unexpectedFocusedTest' }],
},
{
code: `it.only(() => {});`,
output: `it(() => {});`,
errors: [{ messageId: 'unexpectedFocusedTest' }],
},
{
code: `test.only(() => {});`,
output: `test(() => {});`,
errors: [{ messageId: 'unexpectedFocusedTest' }],
},
{
code: `describe['only'](() => {});`,
output: `describe(() => {});`,
errors: [{ messageId: 'unexpectedFocusedTest' }],
},
{
code: `it['only'](() => {});`,
output: `it(() => {});`,
errors: [{ messageId: 'unexpectedFocusedTest' }],
},
{
code: `test['only'](() => {});`,
output: `test(() => {});`,
errors: [{ messageId: 'unexpectedFocusedTest' }],
},
],
});

25
.oxlint/rules/noForIn.mjs Normal file
View File

@ -0,0 +1,25 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
export const noForIn = ESLintUtils.RuleCreator.withoutDocs({
name: 'no-for-in',
meta: {
type: 'problem',
messages: {
preferForOf: 'Prefer for..of loops',
},
schema: [],
},
create(context) {
return {
ForInStatement(node) {
context.report({
node,
messageId: 'preferForOf',
});
},
};
},
});

View File

@ -0,0 +1,25 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { noForIn } from './noForIn.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
const ruleTester = new RuleTester();
ruleTester.run('no-for-in', noForIn, {
valid: [
{ code: 'for (let a of b) {}' },
{ code: 'for (;;) {}' },
{ code: 'if (a in b) {}' },
],
invalid: [
{
code: `for (let a in b) {}`,
errors: [{ messageId: 'preferForOf' }],
},
{
code: `for (a in b) {}`,
errors: [{ messageId: 'preferForOf' }],
},
],
});

View File

@ -0,0 +1,264 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { createImportSourceVisitor } from './utils/createImportSourceVisitor.mjs';
import micromatch from 'micromatch';
import isGlob from 'is-glob';
import * as path from 'node:path';
import { assert } from './utils/assert.mjs';
import enhancedResolve from 'enhanced-resolve';
const resolver = enhancedResolve.create.sync({
extensionAlias: {
'.js': ['.ts', '.tsx', '.js'],
},
});
/**
* @param {string} fromDir
* @param {string} moduleName
*/
function resolveFrom(fromDir, moduleName) {
try {
const result = resolver(fromDir, moduleName);
if (result === false) {
return null;
}
return result;
} catch (error) {
return null;
}
}
/**
* @param {string | string[]} input
* @returns {string[]}
*/
function toArray(input) {
return Array.isArray(input) ? input : [input];
}
/**
* @param {string} filePath
* @param {string} target
*/
function containsPath(filePath, target) {
const relative = path.relative(target, filePath);
return relative === '' || !relative.startsWith('..');
}
/**
* @param {string} fileName
* @param {RegExp | string} targetPath
*/
function isMatchingTargetPath(fileName, targetPath) {
return typeof targetPath === 'string'
? containsPath(fileName, targetPath)
: targetPath.test(fileName);
}
/** @type {Map<string, RegExp | string>} */
const REGEX_CACHE = new Map();
/**
* @typedef {object} Zone
* @property {string | string[]=} target
* @property {string | string[]=} from
* @property {string[]=} except
* @property {string=} message
*/
/**
* @typedef {object} Matcher
* @property {(RegExp | string)[]} targetPaths
* @property {(RegExp | string)[]} fromPaths
* @property {(RegExp | string)[] | null} exceptPaths
* @property {string | null} message
*/
/** @type {[Options]} */
const defaultOptions = [{}];
/**
* @typedef {object} Options
* @property {Zone[]=} zones
* @property {string=} basePath
*/
export const noRestrictedPaths = ESLintUtils.RuleCreator.withoutDocs({
name: 'no-restricted-paths',
meta: {
type: 'problem',
messages: {
pathRestrictedNoMessage:
'Unexpected path "{{moduleName}}" imported in restricted zone.',
pathRestrictedWithMessage:
'Unexpected path "{{moduleName}}" imported in restricted zone. {{message}}',
},
schema: [
{
type: 'object',
properties: {
zones: {
type: 'array',
minItems: 1,
items: {
type: 'object',
properties: {
target: {
anyOf: [
{ type: 'string' },
{
type: 'array',
items: { type: 'string' },
uniqueItems: true,
minItems: 1,
},
],
},
from: {
anyOf: [
{ type: 'string' },
{
type: 'array',
items: { type: 'string' },
uniqueItems: true,
minItems: 1,
},
],
},
except: {
type: 'array',
items: {
type: 'string',
},
uniqueItems: true,
},
message: { type: 'string' },
},
additionalProperties: false,
},
},
basePath: { type: 'string' },
},
additionalProperties: false,
},
],
defaultOptions,
},
create(context) {
const { filename, sourceCode } = context;
const zones = context.options[0]?.zones ?? [];
const basePath = context.options[0]?.basePath ?? context.cwd;
const matchers = zones.map(zone => {
assert(zone.target != null, 'Zone missing `target`');
assert(zone.from != null, 'Zone missing `from`');
const zoneTarget = toArray(zone.target);
const zoneFrom = toArray(zone.from);
assert(zoneTarget.length > 0, 'Zone needs at least one `target`');
assert(zoneFrom.length > 0, 'Zone needs at least one `from`');
let zoneExcept = zone.except != null ? toArray(zone.except) : null;
if (zoneExcept?.length === 0) {
zoneExcept = null;
}
let hasGlobPatterns = false;
let hasNonGlobPatterns = false;
/** @param {string} target */
function compilePattern(target) {
const targetPath = path.resolve(basePath, target);
const cached = REGEX_CACHE.get(targetPath);
if (cached != null) {
return cached;
}
/** @type {RegExp | string} */
let result;
if (isGlob(targetPath)) {
hasGlobPatterns = true;
result = micromatch.makeRe(targetPath);
} else {
hasNonGlobPatterns = true;
result = targetPath;
}
if (hasGlobPatterns && hasNonGlobPatterns) {
throw new Error(
'Cannot have both glob and non-glob patterns in the same zone'
);
}
REGEX_CACHE.set(targetPath, result);
return result;
}
/** @type {Matcher} */
const matcher = {
targetPaths: zoneTarget.map(target => compilePattern(target)),
fromPaths: zoneFrom.map(from => compilePattern(from)),
exceptPaths: zoneExcept?.map(except => compilePattern(except)) ?? null,
message: zone.message ?? null,
};
return matcher;
});
const targetMatchers = matchers.filter(matcher => {
return matcher.targetPaths.some(targetPath => {
return isMatchingTargetPath(filename, targetPath);
});
});
if (targetMatchers.length === 0) {
return {};
}
return createImportSourceVisitor(sourceCode, source => {
const dirname = path.dirname(filename);
const moduleName = source.value;
const resolvedPath = resolveFrom(dirname, moduleName);
if (resolvedPath == null) {
return;
}
for (const matcher of targetMatchers) {
const matchesFromPath = matcher.fromPaths.some(fromPath => {
return isMatchingTargetPath(resolvedPath, fromPath);
});
if (!matchesFromPath) {
continue;
}
const matchesExceptPath = matcher.exceptPaths?.some(exceptPath => {
return isMatchingTargetPath(resolvedPath, exceptPath);
});
if (matchesExceptPath) {
continue;
}
if (matcher.message != null) {
context.report({
node: source,
messageId: 'pathRestrictedWithMessage',
data: { moduleName, message: matcher.message },
});
} else {
context.report({
node: source,
messageId: 'pathRestrictedNoMessage',
data: { moduleName },
});
}
}
});
},
});

View File

@ -0,0 +1,54 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { noRestrictedPaths } from './noRestrictedPaths.mjs';
import { RuleTester } from '@typescript-eslint/rule-tester';
import * as path from 'node:path';
const basePath = path.join(import.meta.dirname, 'fixtures/noRestrictedPaths');
const filename = path.join(basePath, 'client/entry.ts');
/**
* @param {boolean=} withMessage
* @returns {[import("./noRestrictedPaths.mjs").Options]}
*/
function opts(withMessage) {
const message = withMessage ? 'just stop it' : undefined;
return [
{ basePath, zones: [{ target: './client', from: './server', message }] },
];
}
const ruleTester = new RuleTester();
ruleTester.run('no-restricted-paths', noRestrictedPaths, {
valid: [
{ filename, options: opts(), code: `import b from './client.ts';` },
{ filename, options: opts(), code: `import b from './client.js';` },
{ filename, options: opts(), code: `import b from '../client/client.ts';` },
{ filename, options: opts(), code: `import b from './nonexistant';` },
{ filename, options: opts(), code: `import b from 'node:path';` },
{ filename, options: opts(), code: `import b from 'react';` },
{ filename, options: opts(), code: `import b from 'fake-module';` },
],
invalid: [
{
filename,
options: opts(),
code: `import b from '../server/server.ts';`,
errors: [{ messageId: 'pathRestrictedNoMessage' }],
},
{
filename,
options: opts(),
code: `import b from '../server/server.js';`,
errors: [{ messageId: 'pathRestrictedNoMessage' }],
},
{
filename,
options: opts(true),
code: `import b from '../server/server.ts';`,
errors: [{ messageId: 'pathRestrictedWithMessage' }],
},
],
});

35
.oxlint/rules/noThen.mjs Normal file
View File

@ -0,0 +1,35 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { ESLintUtils } from '@typescript-eslint/utils';
import { isPropertyAccess } from './utils/astUtils.mjs';
export const noThen = ESLintUtils.RuleCreator.withoutDocs({
name: 'no-then',
meta: {
type: 'problem',
messages: {
preferAwait: 'Prefer await instead of .then()',
},
schema: [],
defaultOptions: [],
},
create(context) {
return {
MemberExpression(node) {
if (!isPropertyAccess(node, 'then')) {
return;
}
if (node.parent.type !== 'CallExpression') {
return;
}
context.report({
node: node.property,
messageId: 'preferAwait',
});
},
};
},
});

View File

@ -0,0 +1,14 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
/**
* @param condition {unknown}
* @param message {string}
* @returns {asserts condition}
*/
export function assert(condition, message) {
if (condition == null || condition === false) {
throw new TypeError(message);
}
}

View File

@ -0,0 +1,36 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
/**
* @typedef {import("@typescript-eslint/utils").TSESTree.Node} Node
* @typedef {import("@typescript-eslint/utils").TSESTree.Literal} Literal
* @typedef {import("@typescript-eslint/utils").TSESTree.StringLiteral} StringLiteral
* @typedef {import("@typescript-eslint/utils").TSESTree.Identifier} Identifier
* @typedef {import("@typescript-eslint/utils").TSESTree.MemberExpression} MemberExpression
*/
/**
* @param {Node=} node
* @returns {node is StringLiteral}
*/
export function isStringLiteral(node) {
return node?.type === 'Literal' && typeof node.value === 'string';
}
/**
* @param {Node | null | undefined} node
* @param {string} property
* @returns {node is MemberExpression}
*/
export function isPropertyAccess(node, property) {
if (node?.type !== 'MemberExpression') {
return false;
}
if (node.computed) {
return node.property.type === 'Literal' && node.property.value === property;
}
return node.property.type === 'Identifier' && node.property.name === property;
}

View File

@ -0,0 +1,123 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { getReferenceType } from './getReferenceType.mjs';
import { isStringLiteral } from './astUtils.mjs';
/**
* @typedef {import("@typescript-eslint/utils").TSESTree.StringLiteral} StringLiteral
* @typedef {import("@typescript-eslint/utils").TSESLint.SourceCode} SourceCode
* @typedef {import("@typescript-eslint/utils").TSESLint.RuleListener} RuleListener
*/
/**
* @param {SourceCode} sourceCode
* @param {(source: StringLiteral) => void} visitSource
* @returns {RuleListener}
*/
export function createImportSourceVisitor(sourceCode, visitSource) {
return {
// import ... from '<source>'
ImportDeclaration(node) {
visitSource(node.source);
},
// import('<source>')
ImportExpression(node) {
if (!isStringLiteral(node.source)) {
return;
}
visitSource(node.source);
},
CallExpression(node) {
// require('<source>')
if (node.callee.type === 'Identifier') {
if (node.callee.name !== 'require') {
return;
}
const refType = getReferenceType(sourceCode, node.callee);
if (refType != null && refType !== 'global') {
return;
}
const arg = node.arguments.at(0);
if (!isStringLiteral(arg)) {
return;
}
visitSource(arg);
return;
}
// require.resolve('<source>')
if (node.callee.type === 'MemberExpression') {
const { object, property } = node.callee;
if (object.type !== 'Identifier') {
return;
}
if (object.name !== 'require') {
return;
}
const refType = getReferenceType(sourceCode, object);
if (refType != null && refType !== 'global') {
return;
}
if (property.type !== 'Identifier') {
return;
}
if (property.name !== 'resolve') {
return;
}
const arg = node.arguments.at(0);
if (!isStringLiteral(arg)) {
return;
}
visitSource(arg);
}
},
// import.meta.resolve('<source>')
MetaProperty(node) {
if (node.meta.name !== 'import') {
return;
}
if (node.property.name !== 'meta') {
return;
}
const memberExpression = node.parent;
if (memberExpression.type !== 'MemberExpression') {
return;
}
if (memberExpression.property.type !== 'Identifier') {
return;
}
if (memberExpression.property.name !== 'resolve') {
return;
}
const callExpression = memberExpression.parent;
if (callExpression.type !== 'CallExpression') {
return;
}
const arg = callExpression.arguments.at(0);
if (!isStringLiteral(arg)) {
return;
}
visitSource(arg);
},
// export {...} from '<source>'
ExportNamedDeclaration(node) {
if (node.source == null) {
return;
}
visitSource(node.source);
},
// export * ... from '<source>'
ExportAllDeclaration(node) {
visitSource(node.source);
},
};
}

View File

@ -0,0 +1,18 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
/**
* @typedef {import("@typescript-eslint/utils").TSESTree.Identifier} Identifier
* @typedef {import("@typescript-eslint/utils").TSESLint.SourceCode} SourceCode
*/
/**
* @param {SourceCode} sourceCode
* @param {Identifier} node
*/
export function getReferenceType(sourceCode, node) {
const scope = sourceCode.getScope(node);
const ref = scope.references.find(r => r.identifier === node);
return ref?.resolved?.scope.type ?? null;
}

7
.oxlint/test-setup.mjs Normal file
View File

@ -0,0 +1,7 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import * as mocha from 'mocha'
import { RuleTester } from '@typescript-eslint/rule-tester';
RuleTester.afterAll = mocha.after;

1902
.oxlintrc.json Normal file

File diff suppressed because it is too large Load Diff

269
.pnpmfile.mjs Normal file
View File

@ -0,0 +1,269 @@
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
//
// WARNING: Do not import (or even `import()`) any packages, they won't always be installed.
//
import { execSync } from 'node:child_process';
import { styleText } from 'node:util';
import { test } from 'node:test';
import assert from 'node:assert/strict';
/**
* From @pnpm/pnpmfile/lib/Hooks.d.ts
*
* @typedef {{
* deprecated?: boolean;
* }} PackageSnapshot
*
* @typedef {Record<string, PackageSnapshot>} PackageSnapshots
*
* @typedef {{
* packages?: PackageSnapshots
* }} LockfileObject
*
* @typedef {{
* log: (message: string) => void;
* }} HookContext
*
* @typedef {{
* verifyDepsBeforeRun?: unknown,
* }} Config
*
* @typedef {{
* afterAllResolved?: (
* lockfile: LockfileObject,
* context: HookContext,
* ) => LockfileObject | Promise<LockfileObject>;
* updateConfig?: (config: Config) => Config | Promise<Config>
* }} Hooks
*/
/**
* @param {boolean} condition
* @param {string} message
* @returns {asserts condition}
*/
// function assert(condition, message) {
// if (!condition) {
// throw new TypeError(message);
// }
// }
/**
* @param {string} message
*/
function formatError(message) {
return `${styleText(['bgRed', 'whiteBright'], '[ERROR]')} ${styleText('red', message)}`;
}
/** @type {any} */
let CACHED_WORKSPACE_CONFIG;
async function getWorkspaceConfig() {
if (CACHED_WORKSPACE_CONFIG == null) {
const stdout = execSync('pnpm config list --json', {
encoding: 'utf-8',
env: { PATH: process.env.PATH },
});
const config = JSON.parse(stdout);
CACHED_WORKSPACE_CONFIG = config;
}
return CACHED_WORKSPACE_CONFIG;
}
/**
* Samples:
* - "jest-process-manager@0.4.0"
* - "@jest/process-manager@0.4.0"
* - "jest-process-manager@0.4.0(debug@4.4.3)"
*
* @param {string} packagePath
*/
function parsePackagePath(packagePath) {
const truncateAt = packagePath.indexOf('(');
const packageSpec =
truncateAt === -1 ? packagePath : packagePath.slice(0, truncateAt);
const splitAt = packageSpec.lastIndexOf('@');
const name = packageSpec.slice(0, splitAt);
const version = packageSpec.slice(splitAt + 1);
return { name, version };
}
/**
* @typedef {{
* path: string,
* name: string,
* version: string,
* snapshot: PackageSnapshot,
* }} PackageSnapshotEntry
*/
/**
* @param {LockfileObject} lockfile
* @returns {ReadonlyArray<PackageSnapshotEntry>}
*/
function getPackages(lockfile) {
const { packages = {} } = lockfile;
return Object.keys(packages).map(path => {
const snapshot = packages[path];
const { name, version } = parsePackagePath(path);
return { path, name, version, snapshot };
});
}
/**
* Minimal semver support, only supports exact versions and `||`
* @param {string} version
* @param {string} range
*/
function satisfies(version, range) {
return range.split('||').some(choice => {
return choice.trim() === version;
});
}
/**
* @typedef {(lockfile: LockfileObject, context: HookContext) => Promise<boolean>} CustomCheck
*/
/** @type {CustomCheck} */
async function noDeprecatedPackages(lockfile, context) {
const config = await getWorkspaceConfig();
const packages = getPackages(lockfile);
const deprecated = packages.filter(pkg => {
if (!pkg.snapshot.deprecated) {
return false;
}
const allowed = config.allowedDeprecatedVersions?.[pkg.name];
if (allowed != null && satisfies(pkg.version, allowed)) {
return false;
}
return true;
});
const success = deprecated.length === 0;
if (!success) {
context.log('');
context.log(
formatError(
'Found deprecated packages, to ignore them add this to the pnpm-workspace.yaml file:'
)
);
context.log('');
context.log('allowedDeprecatedVersions:');
for (const pkg of deprecated) {
context.log(` '${pkg.name}': '${pkg.version}'`);
}
context.log('');
}
return success;
}
/** @type {ReadonlyArray<RegExp>} */
const RESTRICTED_DUPLICATE_DEPENDENCIES = [
// /^@signalapp\//,
// /^@indutny\//,
];
/**
* @param {string} name
* @returns {boolean}
*/
function isRestrictedDuplicateDependency(name) {
return RESTRICTED_DUPLICATE_DEPENDENCIES.some(regex => {
return regex.test(name);
});
}
/** @type {CustomCheck} */
async function restrictDuplicateDependencies(lockfile, context) {
const packages = getPackages(lockfile);
/** @type {Map<string, Set<string>>} */
const seen = new Map();
/** @type {Set<string>} */
const duplicates = new Set();
for (const pkg of packages) {
if (!isRestrictedDuplicateDependency(pkg.name)) {
continue;
}
let versions = seen.get(pkg.name);
if (versions != null) {
duplicates.add(pkg.name);
} else {
versions = new Set();
seen.set(pkg.name, versions);
}
versions.add(pkg.version);
}
const success = duplicates.size === 0;
if (!success) {
context.log('');
context.log(formatError('Found duplicate restricted packages:'));
context.log('');
for (const duplicate of duplicates) {
const versions = seen.get(duplicate);
assert(versions != null, `Missing package versions for ${duplicate}`);
context.log(` ${duplicate}: ${Array.from(versions).join(', ')}`);
}
context.log('');
}
return success;
}
/** @type {Hooks} */
export const hooks = {
async afterAllResolved(lockfile, context) {
const results = await Promise.all([
noDeprecatedPackages(lockfile, context),
restrictDuplicateDependencies(lockfile, context),
]);
const hasAnyFailures = results.includes(false);
if (hasAnyFailures) {
context.log(
formatError(
'pnpm install failed because of a custom check in .pnpmfile.mjs'
)
);
context.log('');
process.exit(1);
}
return lockfile;
},
updateConfig(config) {
return {
...config,
verifyDepsBeforeRun:
process.env.CI || process.env.SKIP_VERIFY_DEPS_BEFORE_RUN
? false
: config.verifyDepsBeforeRun,
};
},
};
if (process.env.NODE_TEST_CONTEXT) {
await test('noDeprecatedPackages', async () => {
const pkg = '@scope/pkg-name@1.0.0(@other-scope/other-pkg@2.0.0)';
const success = await noDeprecatedPackages(
{ packages: { [pkg]: { deprecated: true } } },
{ log: () => undefined }
);
assert(!success);
});
}

View File

@ -2,21 +2,19 @@
# supports `.gitignore`: https://github.com/prettier/prettier/issues/2294
# Generated files
build/**/*.js
build/**/*.json
app/**/*.js
config/local-*.json
config/local.json
dist/**
js/components.js
js/util_worker.js
libtextsecure/components.js
libtextsecure/test/test.js
stylesheets/*.css
test/test.js
ts/**/*.js
!ts/**/.eslintrc.js
ts/protobuf/*.d.ts
ts/protobuf/*.js
stylesheets/manifest.css
stylesheets/tailwind.css
ts/util/lint/exceptions.json
storybook-static
build/locale-display-names.json
@ -27,13 +25,14 @@ pnpm-lock.yaml
# Third-party files
node_modules/**
packages/*/node_modules/**
packages/lame/wrapper.mjs
packages/lame/lame-*/
packages/windows-ucv/dist/**
danger/node_modules/**
sticker-creator/node_modules/**
components/**
js/curve/**
js/Mp3LameEncoder.min.js
js/WebAudioRecorderMp3.js
js/calling-tools/**
scripts/emoji-datasource/emoji-datasource.json
# Assets
/images/

View File

@ -1,8 +0,0 @@
// Copyright 2018 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
module.exports = {
singleQuote: true,
arrowParens: 'avoid',
trailingComma: 'es5',
};

16
.prettierrc.mjs Normal file
View File

@ -0,0 +1,16 @@
// Copyright 2018 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
/** @type {import("prettier").Config} */
const config = {
plugins: ['prettier-plugin-tailwindcss'],
singleQuote: true,
arrowParens: 'avoid',
trailingComma: 'es5',
tailwindStylesheet: './stylesheets/tailwind-config.css',
tailwindFunctions: ['tw'],
tailwindAttributes: [],
};
export default config

View File

@ -1,7 +0,0 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { Context } from 'react';
import type { ThemeType } from '../ts/types/Util';
export const StorybookThemeContext: Context<ThemeType>;

View File

@ -1,7 +0,0 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { createContext } from 'react';
import { ThemeType } from '../ts/types/Util';
export const StorybookThemeContext = createContext(ThemeType.light);

View File

@ -0,0 +1,7 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { createContext } from 'react';
import { ThemeType } from '../ts/types/Util.std.ts';
export const StorybookThemeContext = createContext(ThemeType.light);

View File

@ -47,7 +47,7 @@
summary.textContent = `${key}: "${message}"`;
details.appendChild(summary);
for (const storyId of stories) {
for (const [storyId, image] of stories) {
const story = document.createElement('details');
details.appendChild(story);
@ -56,8 +56,7 @@
story.appendChild(title);
const img = document.createElement('img');
img.src = `data/${encodeURIComponent(storyId)}/` +
`${encodeURIComponent(key.replace(/^icu:/, ''))}.jpg`;
img.src = `images/${image}`;
img.loading = 'lazy';
story.appendChild(img);
}

View File

@ -3,13 +3,20 @@
import type { StorybookConfig } from '@storybook/react-webpack5';
import { ProvidePlugin } from 'webpack';
import { builtinModules } from 'node:module';
const config: StorybookConfig = {
const EXTERNALS = new Set(builtinModules);
// We have polyfills for these
EXTERNALS.delete('buffer');
EXTERNALS.delete('url');
const storybookConfig: StorybookConfig = {
typescript: {
reactDocgen: false,
},
stories: ['../ts/components/**/*.stories.tsx'],
stories: ['../ts/axo/**/*.stories.tsx', '../ts/components/**/*.stories.tsx'],
addons: [
'@storybook/addon-a11y',
@ -36,80 +43,101 @@ const config: StorybookConfig = {
{ from: '../fonts', to: 'fonts' },
{ from: '../images', to: 'images' },
{ from: '../fixtures', to: 'fixtures' },
{
from: '../node_modules/emoji-datasource-apple/img',
to: 'node_modules/emoji-datasource-apple/img',
},
{
from: '../node_modules/intl-tel-input/build/img',
to: 'node_modules/intl-tel-input/build/img',
},
],
webpackFinal(config) {
config.cache = {
swc() {
return {
jsc: {
transform: {
react: { runtime: 'automatic' },
},
},
};
},
webpackFinal(webpackConfig) {
// oxlint-disable-next-line no-param-reassign
webpackConfig.cache = {
type: 'filesystem',
};
config.resolve!.extensions = ['.tsx', '.ts', '...'];
// oxlint-disable-next-line no-param-reassign, typescript/no-non-null-assertion
webpackConfig.resolve!.extensionAlias = {
'.js': ['.tsx', '.ts', '.js'],
};
config.module!.rules!.unshift({
// oxlint-disable-next-line typescript/no-non-null-assertion
webpackConfig.module!.rules!.unshift({
test: /\.scss$/,
use: [
{ loader: 'style-loader' },
{ loader: 'css-loader', options: { modules: false, url: false } },
{ loader: 'sass-loader' },
{ loader: require.resolve('style-loader') },
{
loader: require.resolve('css-loader'),
options: { modules: false, url: false },
},
{
loader: require.resolve('sass-loader'),
options: {
additionalData: '$is-storybook: true;',
},
},
],
});
config.module!.rules!.unshift({
// oxlint-disable-next-line typescript/no-non-null-assertion
webpackConfig.module!.rules!.unshift({
test: /\.css$/,
use: [
// prevent storybook defaults from being applied
],
});
config.node = { global: true };
// oxlint-disable-next-line typescript/no-non-null-assertion
webpackConfig.module!.rules!.push({
test: /tailwind-config\.css$/,
use: [
{
loader: require.resolve('postcss-loader'),
options: {
postcssOptions: {
config: false,
plugins: [require.resolve('@tailwindcss/postcss')],
},
},
},
],
});
config.externals = {
net: 'commonjs net',
vm: 'commonjs vm',
fs: 'commonjs fs',
async_hooks: 'commonjs async_hooks',
module: 'commonjs module',
stream: 'commonjs stream',
tls: 'commonjs tls',
dns: 'commonjs dns',
http: 'commonjs http',
https: 'commonjs https',
os: 'commonjs os',
constants: 'commonjs constants',
zlib: 'commonjs zlib',
'@signalapp/libsignal-client': 'commonjs @signalapp/libsignal-client',
'@signalapp/libsignal-client/zkgroup':
'commonjs @signalapp/libsignal-client/zkgroup',
'@signalapp/ringrtc': 'commonjs @signalapp/ringrtc',
'@signalapp/better-sqlite3': 'commonjs @signalapp/better-sqlite3',
electron: 'commonjs electron',
'fs-xattr': 'commonjs fs-xattr',
fsevents: 'commonjs fsevents',
'mac-screen-capture-permissions':
'commonjs mac-screen-capture-permissions',
sass: 'commonjs sass',
bufferutil: 'commonjs bufferutil',
'utf-8-validate': 'commonjs utf-8-validate',
// oxlint-disable-next-line no-param-reassign
webpackConfig.node = { global: true };
// oxlint-disable-next-line no-param-reassign
webpackConfig.externals = ({ request }, callback) => {
if (
(request.startsWith('node:') && request !== 'node:buffer') ||
EXTERNALS.has(request)
) {
// Keep Node.js imports unchanged
return callback(null, 'commonjs ' + request);
}
callback();
};
config.plugins!.push(
// oxlint-disable-next-line typescript/no-non-null-assertion
webpackConfig.plugins!.push(
new ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
})
);
return config;
return webpackConfig;
},
docs: {},
};
export default config;
export default storybookConfig;

View File

@ -3,26 +3,38 @@
import '../ts/window.d.ts';
import React from 'react';
import 'sanitize.css';
import '@signalapp/quill-cjs/dist/quill.core.css';
import '../stylesheets/manifest.scss';
import '../stylesheets/tailwind-config.css';
import * as styles from './styles.scss';
import messages from '../_locales/en/messages.json';
import { StorybookThemeContext } from './StorybookThemeContext';
import { ThemeType } from '../ts/types/Util';
import { setupI18n } from '../ts/util/setupI18n';
import { HourCyclePreference } from '../ts/types/I18N';
import { Provider } from 'react-redux';
import { Store, combineReducers, createStore } from 'redux';
import type { Store } from 'redux';
import { combineReducers, createStore } from 'redux';
import { Globals } from '@react-spring/web';
import { StateType } from '../ts/state/reducer';
import { StorybookThemeContext } from './StorybookThemeContext.std.ts';
import { SystemThemeType, ThemeType } from '../ts/types/Util.std.ts';
import { setupI18n } from '../ts/util/setupI18n.dom.tsx';
import { HourCyclePreference } from '../ts/types/I18N.std.ts';
import { AppProvider } from '../ts/windows/AppProvider.dom.tsx';
import type { StateType } from '../ts/state/reducer.preload.ts';
import {
ScrollerLockContext,
createScrollerLock,
} from '../ts/hooks/useScrollLock';
import { Environment, setEnvironment } from '../ts/environment.ts';
} from '../ts/hooks/useScrollLock.dom.tsx';
import { Environment, setEnvironment } from '../ts/environment.std.ts';
import { parseUnknown } from '../ts/util/schemas.std.ts';
import { LocaleEmojiListSchema } from '../ts/types/emoji.std.ts';
import { FunProvider } from '../ts/components/fun/FunProvider.dom.tsx';
import { MOCK_GIFS_PAGINATED_ONE_PAGE } from '../ts/test-helpers/funPickerMocks.dom.tsx';
import { NavTab } from '../ts/types/Nav.std.ts';
import type { FunEmojiSelection } from '../ts/components/fun/panels/FunPanelEmojis.dom.tsx';
import type { FunGifSelection } from '../ts/components/fun/panels/FunPanelGifs.dom.tsx';
import type { FunStickerSelection } from '../ts/components/fun/panels/FunPanelStickers.dom.tsx';
import { Emoji } from '../ts/axo/emoji.std.ts';
setEnvironment(Environment.Development, true);
@ -67,6 +79,16 @@ export const globalTypes = {
const mockStore: Store<StateType> = createStore(
combineReducers({
calling: (state = {}) => state,
nav: (
state = {
selectedLocation: {
tab: NavTab.Chats,
details: {
conversationId: undefined,
},
},
}
) => state,
conversations: (
state = {
conversationLookup: {},
@ -78,10 +100,10 @@ const mockStore: Store<StateType> = createStore(
})
);
// eslint-disable-next-line
// oxlint-disable-next-line
const noop = () => {};
window.Whisper = window.Whisper || {};
window.Whisper ??= {};
window.Whisper.events = {
on: noop,
off: noop,
@ -99,10 +121,10 @@ window.SignalContext = {
},
nativeThemeListener: {
getSystemTheme: () => 'light',
getSystemTheme: () => SystemThemeType.light,
subscribe: noop,
unsubscribe: noop,
update: () => 'light',
update: () => SystemThemeType.light,
},
Settings: {
themeSetting: {
@ -116,6 +138,7 @@ window.SignalContext = {
platform: '',
release: '',
},
// oxlint-disable-next-line typescript/no-explicit-any
config: {} as any,
getHourCyclePreference: () => HourCyclePreference.UnknownPreference,
@ -132,6 +155,8 @@ window.SignalContext = {
return result;
},
getVersion: () => '7.61.0',
// For test-runner
_skipAnimation: () => {
Globals.assign({
@ -142,11 +167,21 @@ window.SignalContext = {
_stopTrackingICUStrings: () => i18n.stopTrackingUsage(),
};
window.i18n = i18n;
window.ConversationController = window.ConversationController || {};
window.ConversationController ??= {};
window.ConversationController.isSignalConversationId = () => false;
window.ConversationController.onConvoMessageMount = noop;
window.reduxStore = mockStore;
window.Signal = {
Services: {
beforeNavigate: {
registerCallback: () => undefined,
unregisterCallback: () => undefined,
shouldCancelNavigation: () => {
throw new Error('Not implemented');
},
},
},
};
const withGlobalTypesProvider = (Story, context) => {
const theme =
@ -199,17 +234,61 @@ function withMockStoreProvider(Story, context) {
function withScrollLockProvider(Story, context) {
return (
<ScrollerLockContext.Provider
value={createScrollerLock('MockStories', () => {})}
value={createScrollerLock('MockStories', () => null)}
>
<Story {...context} />
</ScrollerLockContext.Provider>
);
}
function withFunProvider(Story, context) {
return (
<FunProvider
i18n={window.SignalContext.i18n}
recentEmojis={[]}
recentStickers={[]}
recentGifs={[]}
emojiSkinToneDefault={Emoji.SkinTone.None}
onEmojiSkinToneDefaultChange={noop}
installedStickerPacks={[]}
showStickerPickerHint={false}
onClearStickerPickerHint={noop}
onOpenCustomizePreferredReactionsModal={noop}
fetchGifsSearch={() => Promise.resolve(MOCK_GIFS_PAGINATED_ONE_PAGE)}
fetchGifsFeatured={() => Promise.resolve(MOCK_GIFS_PAGINATED_ONE_PAGE)}
fetchGif={() => Promise.resolve(new Blob([new Uint8Array(1)]))}
onSelectEmoji={function (emojiSelection: FunEmojiSelection): void {
// oxlint-disable-next-line no-console
console.log('onSelectEmoji', emojiSelection);
}}
onSelectSticker={function (stickerSelection: FunStickerSelection): void {
// oxlint-disable-next-line no-console
console.log('onSelectSticker', stickerSelection);
}}
onSelectGif={function (gifSelection: FunGifSelection): void {
// oxlint-disable-next-line no-console
console.log('onSelectGif', gifSelection);
}}
>
<Story {...context} />
</FunProvider>
);
}
function withAppProvider(Story, context) {
return (
<AppProvider>
<Story {...context} />
</AppProvider>
);
}
export const decorators = [
withAppProvider,
withGlobalTypesProvider,
withMockStoreProvider,
withScrollLockProvider,
withFunProvider,
];
export const parameters = {

View File

@ -3,6 +3,13 @@
@use '../stylesheets/variables';
#storybook-root {
height: 100%;
}
#storybook-root > div {
height: 100%;
}
.container {
align-content: stretch;
align-items: stretch;

View File

@ -1,8 +1,9 @@
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { mkdir, writeFile } from 'node:fs/promises';
import { mkdir, writeFile, symlink } from 'node:fs/promises';
import { join } from 'node:path';
import { createHash } from 'node:crypto';
import {
type TestRunnerConfig,
waitForPageReady,
@ -40,25 +41,33 @@ const config: TestRunnerConfig = {
return;
}
const dir = join(ARTIFACTS_DIR, context.id);
await mkdir(dir, { recursive: true });
const storeDir = join(ARTIFACTS_DIR, 'images');
await mkdir(storeDir, { recursive: true });
const componentDir = join(ARTIFACTS_DIR, 'components', context.id);
await mkdir(componentDir, { recursive: true });
const saves = new Array<Promise<void>>();
for (const [key, value] of result) {
const locator = page
.getByText(value)
.or(page.getByTitle(value))
.or(page.getByLabel(value));
// oxlint-disable-next-line no-await-in-loop
if (await locator.count()) {
const first = locator.first();
try {
// oxlint-disable-next-line no-await-in-loop
await first.focus({ timeout: SECOND });
} catch {
// Opportunistic
}
try {
// oxlint-disable-next-line no-await-in-loop
if (await first.isVisible()) {
// oxlint-disable-next-line no-await-in-loop
await first.scrollIntoViewIfNeeded({ timeout: SECOND });
}
} catch {
@ -66,6 +75,7 @@ const config: TestRunnerConfig = {
}
}
// oxlint-disable-next-line no-await-in-loop
const image = await page.screenshot({
animations: 'disabled',
fullPage: true,
@ -76,8 +86,28 @@ const config: TestRunnerConfig = {
quality: 95,
});
await writeFile(join(dir, `${key.replace(/^icu:/, '')}.jpg`), image);
const digest = createHash('sha256').update(image).digest('hex');
const storeFile = join(storeDir, `${digest}.jpg`);
const targetFile = join(componentDir, `${key.replace(/^icu:/, '')}.jpg`);
saves.push(
(async () => {
try {
await writeFile(storeFile, image, {
// Fail if exists
flags: 'wx',
});
} catch (error) {
if (error.code !== 'EEXIST') {
throw error;
}
}
await symlink(storeFile, targetFile);
})()
);
}
await Promise.all(saves);
},
};
export default config;

View File

@ -1,47 +0,0 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
module.exports = {
extends: [
'stylelint-config-recommended-scss',
'stylelint-config-css-modules',
],
plugins: ['stylelint-use-logical-spec'],
rules: {
// Disabled from recommended set to get stylelint working initially
'block-no-empty': null,
'declaration-block-no-duplicate-properties': null,
'declaration-block-no-shorthand-property-overrides': null,
'font-family-no-missing-generic-family-keyword': null,
'no-duplicate-selectors': null,
'no-descending-specificity': null,
'selector-pseudo-element-no-unknown': null,
'scss/at-import-partial-extension': null,
'scss/comment-no-empty': null,
'scss/no-global-function-names': null,
'scss/operator-no-newline-after': null,
'scss/operator-no-unspaced': null,
'scss/function-no-unknown': null,
'scss/load-partial-extension': null,
'unit-no-unknown': null,
'selector-pseudo-class-no-unknown': [
true,
{
ignorePseudoClasses: ['placeholder'],
},
],
// RTL
'liberty/use-logical-spec': [
'always',
{
except: [/\btop\b/, /\bbottom\b/, /\bwidth\b/, /\bheight\b/],
},
],
'declaration-property-value-disallowed-list': {
// Use dir="ltr/rtl" instead
direction: ['ltr', 'rtl', 'auto'],
transform: [/translate3d\(/, /translateX\(/, /translate\(/],
translate: [/./],
},
},
};

54
.stylelintrc.mjs Normal file
View File

@ -0,0 +1,54 @@
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
// @ts-expect-error
import githubActionsFormatter from '@csstools/stylelint-formatter-github';
/** @type {import('stylelint').Config} */
const config = {
formatter: process.env.CI ? githubActionsFormatter : undefined,
extends: [
'stylelint-config-recommended-scss',
'stylelint-config-css-modules',
],
plugins: ['stylelint-use-logical-spec'],
rules: {
// Disabled from recommended set to get stylelint working initially
'at-rule-empty-line-before': null,
'block-no-empty': null,
'declaration-block-no-duplicate-properties': null,
'declaration-block-no-shorthand-property-overrides': null,
'font-family-no-missing-generic-family-keyword': null,
'no-duplicate-selectors': null,
'no-descending-specificity': null,
'selector-pseudo-element-no-unknown': null,
'scss/comment-no-empty': null,
'scss/no-global-function-names': null,
'scss/operator-no-newline-after': null,
'scss/operator-no-unspaced': null,
'scss/function-no-unknown': null,
'scss/load-partial-extension': null,
'unit-no-unknown': null,
'selector-pseudo-class-no-unknown': [
true,
{
ignorePseudoClasses: ['placeholder'],
},
],
// RTL
'liberty/use-logical-spec': [
'always',
{
except: [/\btop\b/, /\bbottom\b/, /\bwidth\b/, /\bheight\b/],
},
],
'declaration-property-value-disallowed-list': {
// Use dir="ltr/rtl" instead
direction: ['ltr', 'rtl', 'auto'],
transform: [/translate3d\(/, /translateX\(/, /translate\(/],
translate: [/./],
},
},
};
export default config;

File diff suppressed because it is too large Load Diff

View File

@ -5,17 +5,49 @@
## Advice for new contributors
Start small. The PRs most likely to be merged are the ones that make small,
easily reviewed changes with clear and specific intentions. See below for more
[guidelines on pull requests](#pull-requests).
First, there are ways to contribute that don't involve the code at all. It helps to
_start small_. Here's a list of things to consider:
It's a good idea to gauge interest in your intended work by finding the current issue
for it or creating a new one yourself. You can use also that issue as a place to signal
your intentions and get feedback from the users most likely to appreciate your changes.
1. Talk about Signal with your friends and family - get them to join you in using it!
1. Join the Beta and test out recently-released features before the general public gets access
1. Find and comment on duplicate GitHub issues, so we can close them
1. Determine and provide workarounds on existing GitHub issues
1. Test Signal Desktop and find reliable, well-defined reproduction steps for existing GitHub issues
1. For a given GitHub issue, test Signal iOS and/or Signal Android to see if their behavior matches Signal Desktop, and provide the details of your analysis.
Once you've spent a little bit of time planning your solution, you can go
back to the issue and talk about your approach. We'd be happy to provide feedback. [An
ounce of prevention, as they say!](https://www.goodreads.com/quotes/247269-an-ounce-of-prevention-is-worth-a-pound-of-cure)
If you're ready to spend some time on a GitHub issue, please consider commenting to ask us
if there's interest. That will help ensure we minimize wasted time.
### Getting into the code
Have you spent some good time with Signal Desktop and GitHub issues? You can go deeper
and get into the code itself.
Again, it helps to start small. You don't need to create a PR to contribute!
1. Find the root cause of a GitHub issue, and provide your explanation in the issue, with links to specific places in the code
1. For a particularly difficult investigation, provide your process. Talk about the changes you made, and what happened - this might be useful to others working to fix the issue.
1. Test or review the code for others' pull requests
1. When reporting any issue, also include the specific place in the code where it happens.
### Considering a Pull Request?
If you're getting more comfortable with the code, you can consider assembling a PR. We
have very high standards for the code we put into Signal Desktop, so take special care
in changing the code, adding tests, and crafting the PR summary.
Because this can take a lot of time, it's a good idea to gauge interest in your intended
changes first. Find the current GitHub issue for it or create a new one yourself, then
post about your plans. That way you'll get feedback from the users most likely to
appreciate your changes. And we may tell you not to move forward with changes, because we
have other plans for the issue itself or that area of the code.
Than, once you've spent some time planning your solution, please consider going back
to the issue and talking about your approach. We'd be happy to provide feedback.
The PRs most likely to be merged are the ones that fix issues with real user impact,
make small easily reviewed changes, and have clear and specific intentions. See below for
more [guidelines on pull requests](#pull-requests).
## Developer Setup
@ -73,7 +105,7 @@ instance while you make changes - they'll run until you stop them:
```
pnpm run dev:transpile # recompiles when you change .ts files
pnpm run dev:sass # recompiles when you change .scss files
pnpm run dev:styles # recompiles when you change .scss files
```
#### Known issues
@ -217,9 +249,19 @@ command line. You can run the client-side tests in an interactive session with
## Pull requests
So you wanna make a pull request? Please observe the following guidelines.
So you wanna make a pull request?
- First, make sure that your `pnpm run ready` run passes - it's very similar to what our
First, know that it's highly unlikely we'll accept visual changes, new strings, or really
anything that changes the user experience. Please talk to us first if you're planning
something like this! It's possible that we'll give you the okay, but very likely not.
The best changes fix bugs in our implementation of the existing user experience. For
example, it's almost certain that we'll reject anything that adds a new option.
More guidelines:
- Don't forget to sign the [CLA](https://signal.org/cla/).
- Be very sure that your `pnpm run ready` run passes - it's very similar to what our
Continuous Integration servers do to test the app.
- Please do not submit pull requests for translation fixes.
- Never use plain strings right in the source code - pull them from `messages.json`!
@ -230,7 +272,7 @@ So you wanna make a pull request? Please observe the following guidelines.
changes on the latest `main` branch, resolving any conflicts.
This ensures that your changes will merge cleanly when you open your PR.
- Be sure to add and run tests!
- Make sure the diff between the development branch and your branch contains only the
- Make sure the diff between the main branch and your branch contains only the
minimal set of changes needed to implement your feature or bugfix. This will
make it easier for the person reviewing your code to approve the changes.
Please do not submit a PR with commented out code or unfinished features.
@ -244,7 +286,6 @@ So you wanna make a pull request? Please observe the following guidelines.
link](http://chris.beams.io/posts/git-commit/)
for some tips on formatting. As far as content, try to include the following in your
summary:
1. What you changed
2. Why this change was made. If there is a relevant [GitHub Issue](https://github.com/signalapp/Signal-Desktop/issues), please include the Issue number.
3. Any relevant technical details or motivations for your implementation
@ -309,16 +350,15 @@ Then, run the tests using `pnpm run test-release`.
macOS requires apps to be code signed with an Apple certificate. To test development builds
you can ad-hoc sign the packaged app which will let you run it locally.
1. In `package.json` remove the macOS signing script: `"sign": "./ts/scripts/sign-macos.js",`
2. Build the app and ad-hoc sign the app bundle:
1. Build the app while skipping the custom macOS signing script:
```
pnpm run generate
pnpm run build
SKIP_SIGNING_SCRIPT=1 pnpm run build
cd release
# Pick the desired app bundle: mac, mac-arm64, or mac-universal
cd mac-arm64
codesign --force --deep --sign - Signal.app
```
3. Now you can run the app locally.
2. Now you can run the app locally.

3068
DATABASE_SCHEMA.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -20,14 +20,13 @@ Please search for any [existing issues](https://github.com/signalapp/Signal-Desk
Please use our community forum: https://community.signalusers.org/
## Contributing Code
## Contributing to the project
Please see [CONTRIBUTING.md](https://github.com/signalapp/Signal-Desktop/blob/main/CONTRIBUTING.md)
for setup instructions and guidelines for new contributors. Don't forget to sign the [CLA](https://signal.org/cla/).
Please see [CONTRIBUTING.md](https://github.com/signalapp/Signal-Desktop/blob/main/CONTRIBUTING.md). There are lots of ways to contribute - many that don't involve code!
## Contributing Funds
## Donate to Signal
You can donate to Signal development through the [Signal Technology Foundation](https://signal.org/donate), an independent 501c3 nonprofit.
You can donate to Signal from inside Signal apps (Desktop, Android, or iOS), or via the web here: [Signal Technology Foundation](https://signal.org/donate). Signal is an independent 501c3 nonprofit.
## Cryptography Notice

View File

@ -0,0 +1,21 @@
Signal is 'n boodskaptoepassing wat privaatheid as kernwaarde het. Dis gratis en maklik om te gebruik, met kragtige end-tot-end-enkriptering wat jou kletse en oproepe heeltemal privaat hou. Signal kan nie jou boodskappe lees of na jou oproepe luister nie, en niemand anders kan ook nie.
• Signal in MacOS is gekoppel aan Signal op jou foon.
• Stuur end-tot-end-geënkripteerde teksboodskappe, stemboodskappe, fotos, videos, GIFs en lêers gratis.
• Bly in verbinding met groepkletse vir tot 1000 deelnemers. Beheer wie boodskappe mag plaas en bestuur groeplede met administrateurtoestemming-instellings.
• Bel jou vriende met klokhelder end-tot-end-geënkripteerde stem- en video-oproepe. Groepoproepe ondersteun tot 75 deelnemers.
• Signal is gebou vir jou privaatheid. Ons weet glad nie wie jy is of met wie jy praat nie. Ons oopbron Signal-protokol beteken dat ons nie jou boodskappe kan lees of na jou oproepe kan luister nie. En niemand anders kan ook nie. Geen agterdeure nie, geen data-insameling nie, geen kompromisse nie.
• Deel foto-, teks- en video-Stories wat ná 24 uur verdwyn. Privaatheidinstellings hou jou in beheer van presies wie elke Storie kan sien.
• Signal is onafhanklik en niewinsgewend; dit is 'n ander soort tegnologie van 'n ander soort organisasie. As 'n 501c3-niewinsgewende organisasie word ons ondersteun deur jou skenkings, nie deur adverteerders of beleggers nie.
• Vir steundiens, vrae of meer inligting, besoek asb. https://support.signal.org/
Om na ons bronkode te kyk, besoek https://github.com/signalapp
Volg ons op X @signalapp en Instagram @signal_app

View File

@ -0,0 +1 @@
signal,boodskap(per),oproep,stem,geënkripteer,privaat,veilig,privaatheid,groep,video,klets,stories

View File

@ -0,0 +1 @@
Sê “hallo” vir privaatheid.

View File

@ -0,0 +1 @@
Signal Private Messenger

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
سيجنال هو تطبيق للمراسلة قائم على مراعاة الخصوصية. هو تطبيق مجاني وسهل الاستخدام، ويُوفِّر تشفيرًا قويًا من طرف لِطرف للحفاظ على السرية التامة لمراسلاتك. لا يمكن لسيجنال قراءة رسائلك أو التنصت على مكالماتك، ولا يُمكن لأي أحد آخر القيام بذلك أيضًا.
• يتصل سيجنال على نظام macOS بسيجنال المُثبَّت على هاتفك.
• أرسِل رسائل نصيّة ورسائل صوتية وصور وفيديوهات وصورة متحركة وملفات مُشفَّرة من طرف لطرف بالمجان.
• ابقَ على اتصال مع دردشات جماعية تجمع أكثر من 1000 شخص. تحكَّم في من يُمكنه النشر والقيام بإدارة أعضاء المجموعة باستخدام إعدادات أذونات المُشرِف.
• أجرِ مُكالمات صوتية ومكالمات فيديو مُشفَّرة بجودة عالية مع أصدقائك. تدعم المكالمات الجماعية ما يصل إلى 75 شخصًا.
صُمِّمَ سيجنال للحفاظ على خصوصيتك. لا نعرف شيئًا عنك أو مع من تتحدث. بروتوكول سيجنال الخاص بنا ذو المصدر المفتوح يعني أنه لا يُمكننا قراءة رسائلك أو الاستماع إلى مكالماتك. ولا يُمكن لأي شخص آخر القيام بذلك. لا أبواب خلفية ولا عملية جمع بيانات ولا مساومات.
• شارِك الصور والرسائل وقِصص الفيديو التي تختفي بعد 24 ساعة. تُتيح لك إعدادات الخصوصية فرصة البقاء مسؤولًا عن من يُمكنه رؤية كل قصة.
• تطبيق سيجنال مُستقل ولا يهدف إلى الربح؛ نوع مختلف من التكنولوجيا من نوع مختلف من المنظمات. وبصفتنا مؤسسة غير ربحية، فإننا نستمد دعمنا من التبرُّعات وليس من الإعلانات ولا المُستثمرين.
• للدعم أو لطرح الأسئلة أو للمزيد من المعلومات، يُرجى زيارة https://support.signal.org/
لإلقاء نظرة على كود المصدر الخاص بنا، قُم بزيارة https://github.com/signalapp
تابعنا على X على العنوان @signalapp وعلى انستغرام على العنوان @signal_app

View File

@ -0,0 +1 @@
سيجنال،رسالة،تطبيق،دردشة،مكالمة،صوت،مشفر،خاص،آمن،خصوصية،مجموعة،فيديو،دردشة،قصص

View File

@ -0,0 +1 @@
مرحبًا بكم في عالم الخصوصية.

View File

@ -0,0 +1 @@
سيجنال - تطبيق مراسلة يحترم الخصوصية

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
Signal məxfiliyə əsaslanan bir mesajlaşma tətbiqidir. Çatlar və zənglərinizin məxfiliyini tamamilə qoruyan güclü tam şifrələmə xüsusiyyəti ilə ondan istifadə pulsuz və asandır. Signal mesajlarınızı oxuya və ya zənglərinizi dinləyə bilmir, digərlərinə də bunu etməyə icazə vermir.
• MacOS ilə işləyən Signal telefonunuzdakı Signal tətbiqi ilə əlaqələndirilir.
• Tam şifrələnmiş mətnləri, səsli mesajları, fotoları, videoları, GIF və faylları pulsuz göndərin.
• 1000 nəfərə qədər iştirakçını dəstəkləyən qrup çatlarına qoşulun. Admin icazəsi parametrləri ilə kimin qrup üzvləri ilə yazı paylaşacağına və onları idarə edəcəyinə nəzarət edin.
• Dostlarınıza tam şifrələnmiş yüksək səs keyfiyyətinə malik audio və video zənglər edin. Qrup zəngləri 75 nəfərə qədər insanın qoşulmasını dəstəkləyir.
• Signal məxfiliyinizi qorumaq üçün yaradılıb. Siz və ya söhbət etdiyiniz şəxslər haqqında heç nə bilmirik. Açıq mənbəli Signal Protokolumuz mesajlarınızı oxuya və zənglərinizi dinləyə bilməyəcəyimizi nəzərdə tutur. Bunu nə biz, nə də başqası edə bilməz. Arxa qapılar, verilənlərin toplanması və kompromislər yoxdur.
• 24 saat sonra yox olacaq foto, mətn və video Hekayələri paylaşın. Məxfilik parametrləri sayəsində hər bir Hekayəni kimin görə biləcəyini dəqiqliklə seçirsiniz.
• Signal müstəqildir və mənfəət məqsədi güdmür, o, fərqli bir təşkilatın fərq yaradan bir texnologiyasıdır. Bir 501c3 qeyri-kommersiya təşkilatı kimi biz, reklamçı və investorların deyil, sizin ianələrinizlə dəstəklənirik.
• Dəstək, sual və əlavə məlumat üçün https://support.signal.org/ keçidinə daxil olun
Mənbə kodumuzu yoxlamaq üçün https://github.com/signalapp keçidinə daxil olun
Bizi X-də @signalapp, Instagram-da isə @signal_app istifadəçi profilləri ilə izləyin

View File

@ -0,0 +1 @@
signal,mesaj,messenger,zəng,səsli,şifrələnmiş,şəxsi,təhlükəsiz,məxfilik,qrup,video,çat,hekayələr

View File

@ -0,0 +1 @@
Məxfiliyə "Salam" verin.

View File

@ -0,0 +1 @@
Signal Gizli Mesajlaşma

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
Signal е приложение за съобщения, изградено около поверителността. То е безплатно и лесно за използване, със силно криптиране от край до край, което поддържа вашите чатове и обаждания напълно поверителни. Signal не може да чете вашите съобщения или да слуша вашите обаждания, а и никой друг не може.
• Signal на MacOS се свързва със Signal на телефона ви.
• Изпращайте криптирани от край до край текстови и гласови съобщения, снимки, видеоклипове, GIF-ове и файлове безплатно.
• Поддържайте връзка с групови чатове до 1000 души. Контролирайте кой може да публикува и управлява членовете на групата с настройките за администраторски разрешения.
• Обаждайте се на приятелите си с кристално чисти криптирани от край до край гласови и видео обаждания. Поддържат се групови разговори до 75 души.
• Signal е създаден за вашата поверителност. Не знаем нищо за вас или хората, с които говорите. Нашият Signal протокол с отворен код означава, че не можем да четем вашите съобщения или да слушаме вашите обаждания. И никой друг не може. Без задни вратички, без събиране на данни, без компромиси.
• Споделяйте снимки, текст и видео истории, които изчезват след 24 часа. Настройките за поверителност ви позволяват да контролирате точно кой може да вижда всяка история.
• Signal е независим и не е с цел печалба; различен вид технология от различен вид организация. Като организация с нестопанска цел, ние се издържаме от вашите дарения, а не от рекламодатели или инвеститори.
За поддръжка, въпроси или повече информация, моля посетете https://support.signal.org/
За да разгледате нашия изходен код, посетете https://github.com/signalapp
Последвайте ни в X @signalapp и Instagram @signal_app

View File

@ -0,0 +1 @@
signal,съобщения,обаждане,глас,криптиран,поверителен,сигурно,поверителност,група,видео,чат,истории

View File

@ -0,0 +1 @@
Поверителността преди всичко.

View File

@ -0,0 +1 @@
Signal - Private Messenger

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
Signal একটি মেসেজিং অ্যাপ যার মূল ভিত্তি হলো গোপনীয়তা। এটি ফ্রি-তে ব্যবহার করা যায় এবং ব্যবহার করা সহজ, এতে রয়েছে শক্তিশালী এন্ড-টু-এন্ড এনক্রিপশন ব্যবস্থা যা আপনার চ্যাট ও কল সম্পূর্ণ গোপন রাখে। Signal আপনার মেসেজ পড়তে বা আপনার কল শুনতে পারে না, এবং অন্য কেউই তা পারে না।
• MacOS-এর Signal আপনার ফোনের Signal-এর সাথে সংযুক্ত হয়।
• ফ্রি-তে এন্ড-টু-এন্ড এনক্রিপ্ট করা টেক্সট, ভয়েস মেসেজ, ছবি, ভিডিও, GIF ও ফাইল পাঠান।
• 1,000 জন পর্যন্ত ব্যক্তি নিয়ে সংগঠিত গ্রুপ চ্যাটের মাধ্যমে সংযুক্ত থাকুন সবার সাথে। অ্যাডমিন অনুমতির সেটিংস সহ গ্রুপ সদস্যদের মধ্যে কে কে পোস্ট করতে পারবেন এবং কে কে নিয়ন্ত্রণ করতে পারবেন তা নিয়ন্ত্রণ করুন।
• আপনার বন্ধুদের সাথে এন্ড-টু-এন্ড এনক্রিপ্ট করা ভয়েস ও ভিডিও কলের মাধ্যমে কল করুন। গ্ৰুপ কলে একসাথে সর্বোচ্চ 75 জন যোগ দিতে পারে।
• Signal আপনার গোপনীয়তা রক্ষা করার জন্য তৈরি করা হয়েছে। আমরা আপনার সম্পর্কে এবং আপনি কার সাথে কথা বলছেন তার সম্পর্কে কিছুই জানি না। আমাদের ওপেন সোর্স Signal Protocol-এর অর্থ হলো আমরা আপনার ম্যাসেজ পড়তে বা আপনার কল থেকে কথা শুনতে পারি না। এটি অন্য আর কেউও পারে না। নেই কোনো অসৎ উদ্দেশ্য, নেই কোনো তথ্য সংগ্রহের চর্চা, নেই কোনো আপোষ।
• ছবি, টেক্সট ও ভিডিও স্টোরি শেয়ার করা যায়, যা 24 ঘন্টা পরে অদৃশ্য হয়ে যায়। গোপনীয়তা সেটিংস আপনাকে প্রত্যেকটি স্টোরি কে দেখতে পাবেন তা নিয়ন্ত্রণ করার সুযোগ দেয়।
• Signal একটি স্বাধীন এবং অলাভজনক উদ্যোগ; একটি ভিন্নধর্মী প্রতিষ্ঠানের প্রচেষ্টায় তৈরি একটি ভিন্নধর্মী প্রযুক্তি। একটি 501c3 অলাভজনক প্রতিষ্ঠান হিসাবে আমরা আপনার দেওয়া ডোনেশনের সমর্থনে পরিচালিত, কোনো বিজ্ঞাপনদাতা বা বিনিয়োগকারীর দ্বারা সমর্থিত নয়।
• এ সংক্রান্ত সহায়তা, প্রশ্ন বা আরো তথ্যের জন্য অনুগ্রহ করে ভিজিট করুন: https://support.signal.org/
আমাদের সোর্স কোড চেক করতে, ভিজিট করুন: https://github.com/signalapp
X-এ @signalapp পেজে এবং Instagram-এ @signal_app পেজে আমাদের ফলো করুন

View File

@ -0,0 +1 @@
signal,মেসেজ,মেসেঞ্জার,কল,ভয়েস,এনক্রিপ্ট করা,ব্যক্তিগত,সুরক্ষিত,গোপনীয়তা,গ্ৰুপ,ভিডিও,চ্যাট,স্টোরি

View File

@ -0,0 +1 @@
গোপনীয়তাকে “হ্যালো” বলুন।

View File

@ -0,0 +1 @@
Signal - প্রাইভেট মেসেঞ্জার

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
Signal je aplikacija za razmjenu poruka čiji je ključ privatnost. Besplatna je i jednostavna za korištenje, sa snažnim sveobuhvatnim šifriranjem koje čuva vaše razgovore i pozive potpuno privatnima. Ne možemo čitati vaše poruke niti slušati vaše pozive, a ne može ni niko drugi.
• Signal na MacOS-u se povezuje sa Signalom na vašem telefonu.
• Besplatno šaljite tekstualne poruke, glasovne poruke, fotografije, videozapise, GIF-ove i datoteke, sve sveobuhvatno šifrirano.
• Ostanite povezani uz grupne razgovore i do 1000 ljudi. Kontrolirajte ko može objavljivati i upravljati članovima grupe pomoću postavki administratorskih dozvola.
• Pozovite svoje prijatelje kristalno čistim glasovnim i video pozivima, sve sveobhvatno šifrirano. Grupni pozivi podržavaju do 75 osoba.
• Signal je kreiran za vašu privatnost. Ne znamo ništa o vama niti s kim razgovarate. Naš Signal protokol otvorenog koda podrazumijeva da ne možemo čitati vaše poruke niti slušati vaše pozive. A to ne može ni niko drugi. Nema skrivenih motiva, prikupljanja podataka niti kompromisa.
• Dijelite fotografije, tekstualne i video priče koje nestaju nakon 24 sata. S postavkama privatnosti kontrolirate ko tačno može vidjeti svaku vašu priču.
• Signal je nezavisan i neprofitan; drugačija vrsta tehnologije od drugačije vrste organizacije. Kao neprofitna organizacija, podržavaju nas vaše donacije, a ne oglašivači ili investitori.
• Za podršku, pitanja ili više informacija posjetite https://support.signal.org/
Da provjerite naš izvorni kȏd, posjetite https://github.com/signalapp
Pratite nas na X @signalapp i Instagramu @signal_app

Some files were not shown because too many files have changed in this diff Show More