EL
← All projectsElectrum

Electrum

Long-running lightweight Bitcoin wallet for desktop and mobile platforms.

BitcoinSoftware walletsNormal
Repository coverage

927 commits in the local evidence base

Every captured commit receives deterministic security triage and a separate communication-quality score. Security candidates and broader second-pass signals receive full-patch Ollama analysis.

65security candidates205second-pass queue302AI analyses
57commits · 30 days
111commits · 60 days
457commits · 180 days
926commits · 365 days
Backfill bands
Aug 5 → Feb 6470 seen11 candidatesComplete
Feb 6 → Jun 6346 seen10 candidatesComplete
Jun 6 → Jul 653 seen2 candidatesComplete
Jul 6 → Aug 554 seen3 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

65/100 average clarity
192Strong · 80–100
410Adequate · 60–79
286Thin · 40–59
39Opaque · 0–39
2security candidates with opaque commit messaging
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
ThomasV72219156
SomberNight35126124063
f321x37121114070
Sander van Grieken981030057
user322062
Roman Zeyde512053
Sasha Zykov413076
Aaron Fiore411068
Ferdinando Ametrano111096
Felix201075
Oren201043
Ilya Artemov200050
Analysis record

Published AI watches

Last scanned 43 minutes ago

Informational 18 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

Merge pull request #10791 from SomberNight/202608_wallet_sign_message2

This change moves the trimming of leading/trailing spaces in message-signing fields from the user-interface code into the shared wallet code. For the graphical interfaces (Qt and QML), spaces are still stripped automatically for convenienc…

Behavior change in message signing/verification input handlingCLI now preserves whitespace, which could affect signature validity for messages that intentionally contain leading or trailing whitespaceNo memory-safety, cryptographic, or authentication flaw visible in the diff
b1aa52d7by ghost43+27−185 files
No security note in commit
Informational 19 AI analysisMessage 96 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: strip whitespaces in GUIs, do not strip in CLI

This commit tidies up how Electrum handles extra spaces around Bitcoin addresses, messages, and signatures when signing or verifying messages. Previously, different parts of the program (desktop GUI, mobile-style GUI, command line) behaved…

Behavior normalization across GUI and CLI interfacesNo cryptographic primitive changedNo privilege boundary crossed
4c3064f5by SomberNight+27−185 files
No security note in commit
Informational 22 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: decrypt_message: nicer error msg if pubkey is unrelated

This commit improves the error handling in Electrum's message decryption feature. Previously, if a user tried to decrypt a message using a public key that did not belong to their wallet, the code could proceed and likely fail with a confus…

Input validation added for public key before cryptographic operationUser-facing exception replaces potential internal failureDefensive check prevents use of unrelated key material
92e938f4by SomberNight+5−01 file
No security note in commit
Informational 16 AI analysisMessage 83 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

qt: main_window: use TaskThread for each of sign/verify/encrypt/decrypt

This commit moves four message-crypto operations (sign, verify, encrypt, decrypt) in Electrum's Qt wallet window onto a background worker thread so they all behave the same way. It also lets the background thread surface user-facing errors…

Moved blocking wallet crypto calls off the GUI thread, reducing UI freeze / DoS surfaceRemoved local exception swallowing for encrypt_message; errors now propagate through the window's on_error handlerAdded defensive RuntimeError guard for deleted Qt widget in async callback
4a9a199fby SomberNight+28−151 file
No security note in commit
Low 29 AI analysisMessage 35 · Opaque
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: force kwargs

This commit changes how Electrum's message-signing function is called so that callers must explicitly name each argument (address, message, password) rather than passing them by position. The main practical effect is to prevent accidental …

API hardening: keyword-only arguments prevent positional argument swapNo explicit security bug fix or vulnerability disclosure in commit message or diffNo changes to cryptographic logic, password handling, or message parsing
e1eb2a34by SomberNight+9−44 files
No security note in commit
Low 39 AI analysisMessage 45 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: sign_message: consolidate checks from UIs

This commit moves input-validation checks for signing, verifying, encrypting, and decrypting messages out of the user-interface code and into the shared wallet logic. It also adds type checks so that non-text inputs are rejected earlier. T…

Input validation moved from UI controllers into core wallet logicType checks added at the CLI command entry points for message-crypto operationsUserFacingException used consistently for address, wallet, script-type, and key-format errors
48893760by SomberNight+89−396 files
No security note in commit
Low 27 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: decrypt_message: consolidate checks from UIs

This commit moves input-validation and wallet-type checks for message decryption out of the user-interface and command-line layers and into the core wallet code. It also removes a faster, separate decryption path for imported wallets so al…

Input validation consolidated into a single core methodWatching-only wallet check moved from UI to wallet layerMultisig wallet unsupported-operation check moved from UI to wallet layer
9a0cc0d6by SomberNight+25−173 files
No security note in commit
Informational 15 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: refactor: add encrypt_message method, consolidated from UIs

This commit is a simple code cleanup: it moves the message-encryption logic from two separate places (the command-line tool and the Qt graphical interface) into a single shared method on the wallet class. The actual encryption behavior is …

No change to cryptographic primitives or parametersNo change to trust boundaries or input sourcesPure refactor consolidating duplicate code
5e9c8df0by SomberNight+26−183 files
No security note in commit
Informational 13 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

wallet: refactor: add verify_message method, consolidated from UIs

This commit is a routine code cleanup: it moves message-signature verification out of three user-interface files into a single shared helper method in the wallet module. There is no security-relevant behavior change visible in the diff. Th…

No security-relevant functional changeRefactoring only: code deduplicationException handling broadened safely (ValueError covers binascii.Error and unicode errors)
ff5bbb04by SomberNight+26−304 files
No security note in commit
Informational 15 AI analysisMessage 60 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

qt: main_window: add type hints to sign/verify, encrypt/decrypt

This commit only adds Python type hints and renames some function parameters for clarity in the Electrum desktop wallet's sign/verify and encrypt/decrypt message dialogs. It does not change what the code actually does, how it processes use…

0906fc20by SomberNight+45−181 file
No security note in commit
Informational 18 AI analysisMessage 50 · Thin
EL ElectrumElectrum BitcoinSoftware wallets

coldcard: fix get_soft_device_id() discarding its return value

This is a tiny one-line bug fix in Electrum's Coldcard hardware wallet plugin. A helper method that is supposed to fetch a software-based device identifier was calling the parent implementation but accidentally throwing away the result ins…

Missing return value causes method to always return NoneAffects hardware wallet device identification onlyNo change to signing, encryption, or authentication code
d7500508by Felipe Micaroni Lalli+1−11 file
No security note in commit
Informational 19 AI analysisMessage 96 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

qml: strip whitespace from message before signing, as in qt gui

This commit fixes a minor consistency bug in Electrum's newer QML (mobile-style) user interface. When signing a message, the app now removes accidental spaces at the start or end of the message and address, just like the older desktop Qt i…

Behavioral inconsistency between GUI implementations could cause user confusion or failed verificationNo cryptographic weakness introduced; change is input normalizationNo memory-unsafe code, no privilege changes, no network changes
72507328by Ferdinando Ametrano+3−01 file
No security note in commit
Low 48 AI analysisMessage 85 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

config: don't save "hidden wallet" paths in CURRENT_WALLET cv

This commit fixes a privacy leak in the Electrum wallet app. Previously, if a user opened a 'hidden wallet' (one whose filename starts with a dot, like a secret file), Electrum would remember it as the last-used wallet and could reopen it …

Privacy leak: hidden wallet filename persisted in config and could be auto-reopenedInformation disclosure: hidden wallet path exposed in recently-opened listBehavioral fix: setter silently drops sensitive value rather than persisting it
c43cf8e4by SomberNight+14−23 files
No security note in commit
Low 28 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

lnrouter: liquidity hints: add extra penalty if amt near cannot_send

This commit tweaks how Electrum's Lightning Network payment routing avoids channels where a previous payment attempt already failed. Previously, the router would treat a channel almost at its known failure limit almost the same as a channe…

Routing/liquidity-hint logic changed to penalize amounts close to a known cannot_send thresholdAdds defensive assertions on num_inflight_htlcs type and rangeSelf-described by author as a 'completely naive bandaid' / heuristic improvement
ee75ea31by SomberNight+12−21 file
No security note in commit
Moderate 52 AI analysisMessage 93 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

lnwallet: don't blacklist htlc failures without channel update

This change fixes how Electrum's Lightning wallet reacts when a payment route fails but the failing node no longer provides a channel update message, as now allowed by the Lightning protocol spec. Previously, Electrum would permanently bla…

Denial-of-service via over-blacklisting: prior behavior could cause legitimate channels to be blacklisted, degrading payment success and potentially isolating the wallet from usable routes.Spec compliance fix: aligns Electrum with updated Lightning BOLT protocol behavior.No cryptographic bypass or funds theft signal: the change is about routing policy, not key leakage or transaction authorization.
a865e336by f321x+48−142 files
No security note in commit
Informational 15 AI analysisMessage 35 · Opaque
EL ElectrumElectrum BitcoinSoftware wallets

hww/qt: followup 898a4c270

This commit simply renames an internal variable from `dialog_label` to `_dialog_label` to mark it as private. It is a minor code cleanup with no visible behavior change and no security relevance.

f3af41deby f321x+4−41 file
No security note in commit
Low 25 AI analysisMessage 68 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

trezor: drop session after closing it

This commit fixes a bug in Electrum's support for Trezor hardware wallets. After a Trezor session times out or is closed, Electrum now forgets the old session ID. Previously it kept the stale session ID, so the next attempt to sign a trans…

Fixes a stale-session reference that caused InvalidSessionError on re-authenticationEnsures PIN re-prompt after session timeout/closureFailure mode was denial-of-service (transaction signing crash), not unauthorized signing
071b1e24by f321x+8−51 file
No security note in commit
Informational 12 AI analysisMessage 83 · Strong
EL ElectrumElectrum BitcoinSoftware wallets

test_lnwallet: add unittest for unchanged channel update from failed htlc

This commit only adds a new unit test to Electrum's Lightning wallet test suite. It checks that when a payment fails due to a temporary lack of liquidity (TEMPORARY_CHANNEL_FAILURE) and the accompanying channel policy update is identical t…

Lightning payment routing failure handling behavior is being testedTEMPORARY_CHANNEL_FAILURE no longer (or is confirmed not to) blacklist channels when the channel update is unchangedLiquidity hints are used as an alternative to blacklisting for retry amounts
1f5b9adbby f321x+61−21 file
No security note in commit
Informational 15 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

lnwallet: rename flag in handle_error_code_from_failed_htlc

This commit only renames a local variable from 'update' to 'handled' in a Lightning Network payment-failure handler. It does not change any program logic, behavior, or security properties. The change is purely cosmetic/clarifying.

8e3aed1fby f321x+8−81 file
No security note in commit
Low 45 AI analysisMessage 73 · Adequate
EL ElectrumElectrum BitcoinSoftware wallets

lnwallet: don't blacklist chan on unchanged channel update

This commit fixes a bug in Electrum's Lightning payment routing. Previously, if a payment failed because a channel didn't have enough money (a temporary liquidity issue), Electrum would incorrectly 'blacklist' that channel for an hour, eve…

Denial-of-service-like self-harm: unnecessary channel blacklisting degrades user's own payment routing capabilityLightning Network routing logic changeBehavioral fix for TEMPORARY_CHANNEL_FAILURE handling
6a97e74cby f321x+6−11 file
No security note in commit
Repository ledger

Explore captured commits

Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.

Lower-prioritylocale: rm llm_proofreader directory during buildby f321x · 0e7f7b30 · Feb 20, 2026 · 1 fileMessage 60 · AdequateTriage 0Details
Commit message · f321x

locale: rm llm_proofreader directory during build

Deletes the llm_proofreader directory during the build so
these scripts aren't bundled into the binaries.

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Why it was queued
translation-only discount
Lower-prioritygit: ignore changes to locale submoduleby f321x · 53166cc0 · Feb 20, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · f321x

git: ignore changes to locale submodule

add ignore = dirty to electrum locale submodule so changes to the
locale submodule files don't show up in the main git status.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI review queuedwallet_db: assert WalletDBUpgrader.storage is dictby f321x · a1f1b393 · Feb 20, 2026 · 1 fileMessage 73 · AdequateModerate 53Details
Commit message · f321x

wallet_db: assert WalletDBUpgrader.storage is dict

Assert `WalletDBUpgrader.data` is a regular in-memory dict and not
some StoredDict, so if an exception would happen during a wallet
db upgrade the partial changes don't get commited to disk.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Moderate 53/100

This commit adds a safety check to Electrum's wallet database upgrade code. It ensures that when the wallet file format is being upgraded, the data being modified is a plain in-memory copy, not a live disk-backed structure. The goal is to prevent a failed or partial upgrade from accidentally being written to disk, which could corrupt the wallet file.

AI review queuedwallet_db: handle non-existing parent_set_key in v65by f321x · 73a03249 · Feb 20, 2026 · 1 fileMessage 73 · AdequateLow 30Details
Commit message · f321x

wallet_db: handle non-existing parent_set_key in v65

Handles non-existing parent_set_key in _convert_version_65.

Fixes #10487

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Links an issue, advisory, or supporting reference
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Low 30/100

This commit fixes a bug in Electrum's wallet database upgrade code. When opening an older wallet file, the upgrade routine could crash because it expected a database field (parent_set_key) that wasn't always present. The fix makes the upgrade tolerate missing data. This is a reliability fix for wallet migration, not a remote attack vector.

Lower-prioritycontrib/locale/push_locale: do not sort source-stringsby SomberNight · 6c1e0859 · Feb 19, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · SomberNight

contrib/locale/push_locale: do not sort source-strings

xgettext and related tools have a -s/--sort-output option, which results in the output being lexicographically sorted. The gettext maintainers recommend against using this option and even started deprecating it in some of their tools (xgettext included):
- with -s, source strings are lexicographically sorted in the .pot/.po files
- without -s, source string are output in the same order they are found in the code
- this way, translators have to do much fewer context switches when contributing translations

note that the qml part we have already *not* been sorting

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
translation-only discount
Security candidatelocale: don't translate string "Electrum", "BIP39"by SomberNight · cf259909 · Feb 19, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · SomberNight

locale: don't translate string "Electrum", "BIP39"

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
secret or key materialseed or entropy path
AI analysis · Informational 15/100

This commit removes translation markers from two proper names ('Electrum' and 'BIP39') in a wallet setup wizard dropdown. It is a localization/UI consistency fix with no security relevance.

Lower-priorityqml: ReceiveDetailsDialog use proper ButtonContainerby Sander van Grieken · b10b14c2 · Feb 19, 2026 · 1 fileMessage 50 · ThinTriage 0Details
Commit message · Sander van Grieken

qml: ReceiveDetailsDialog use proper ButtonContainer

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Lower-priorityfix: bip21.py: add missing importby SomberNight · c6dfc8e6 · Feb 17, 2026 · 1 fileMessage 92 · StrongTriage 0Details
Commit message · SomberNight

fix: bip21.py: add missing import

urllib.parse needs to be explicitly imported for e.g. urllib.parse.urlparse to work.
I think this was not erroring only because urllib.parse is imported in other modules.

92/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Security candidatelocale: don't translate string "Electrum"by SomberNight · e2c41aab · Feb 17, 2026 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · SomberNight

locale: don't translate string "Electrum"

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
seed or entropy path
AI analysis · Informational 15/100

This is a tiny localization cleanup: the word 'Electrum' (the software's own brand name) is no longer marked for translation in one dropdown menu. It is not a security fix and does not change program behavior in any meaningful way.

Lower-prioritycontrib/locale/push_locale: add comments re proofreader-approvalby SomberNight · 6eb6f313 · Feb 17, 2026 · 1 fileMessage 73 · AdequateTriage 0Details
Commit message · SomberNight

contrib/locale/push_locale: add comments re proofreader-approval

see https://github.com/spesmilo/electrum-locale/commit/6b07fc29ceee1489d825334e0682983dc450f228

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Links an issue, advisory, or supporting reference
Why it was queued
translation-only discount
Security candidateandroid: biometry: catch java import errorsby f321x · f573ab2d · Feb 17, 2026 · 1 fileMessage 76 · AdequateInformational 23Details
Commit message · f321x

android: biometry: catch java import errors

Catch JavaError when trying to load the java classes of the biometry
module on startup. This can raise if the device is on an old API version
and the loaded java class depends on apis unknown to the os.

Fixes #10470

```
02-17 10:07:25.714 5254 5270 I python : 0.47 | E | __main__ | daemon.run_gui errored
02-17 10:07:25.714 5254 5270 I python : Traceback (most recent call last):
02-17 10:07:25.714 5254 5270 I python : File "app/main.py", line 514, in handle_cmd
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/daemon.py", line 653, in run_gui
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/__init__.py", line 38, in <module>
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qeapp.py", line 49, in <module>
02-17 10:07:25.714 5254 5270 I python : File "app/electrum/gui/qml/qebiometrics.py", line 33, in <module>
02-17 10:07:25.714 5254 5270 I python : File "jnius/reflect.py", line 243, in autoclass
02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_export_class.pxi", line 877, in jnius.jnius.JavaMethod.__call__
02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_export_class.pxi", line 964, in jnius.jnius.JavaMethod.call_method
02-17 10:07:25.714 5254 5270 I python : File "jnius/jnius_utils.pxi", line 79, in jnius.jnius.check_exception
02-17 10:07:25.714 5254 5270 I python : jnius.jnius.JavaException: JVM exception occurred: Failed resolution of: Landroid/hardware/biometrics/BiometricPrompt$AuthenticationResult; java.lang.NoClassDefFoundError
```

76/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
access control
AI analysis · Informational 23/100

This commit fixes a crash in the Electrum Android app when it starts on older Android devices. The app was trying to load modern fingerprint/face-unlock Java classes that don't exist on old Android versions, causing an uncaught exception and preventing the app from opening. The fix catches that loading error and gracefully disables biometric features instead of crashing.

Lower-priorityservers.json: add additional default serverby f321x · 52b554a5 · Feb 17, 2026 · 1 fileMessage 60 · AdequateTriage 0Details
Commit message · f321x

servers.json: add additional default server

Add new additional default server on protocol version 1.6.0 operated
by a known contributor.

60/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
Security candidateannouncement_signatures: add more early returnsby ThomasV · 95273759 · Feb 17, 2026 · 1 fileMessage 45 · ThinLow 46Details
Commit message · ThomasV

announcement_signatures: add more early returns

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing boundary
AI analysis · Low 46/100

This small change tightens validation in Electrum's Lightning Network code. It makes the program return early and skip processing when it receives or is about to send 'announcement signatures' for a channel that isn't public or doesn't yet have a short channel ID. This likely prevents crashes or incorrect behavior caused by processing incomplete/unready channel data, but the diff alone does not show an obvious exploitable vulnerability.

Lower-priorityUpdate servers.jsonby Sanksari12 · 67f3fcfb · Feb 16, 2026 · 1 fileMessage 43 · ThinTriage 0Details
Commit message · Sanksari12

Update servers.json

Remove lavahost.org from servers.json as the host does not host a public electrum instance.

43/100 · ThinMessage clarity
✓ Subject identifies a change✓ Provides an explanatory body
Lower-prioritycontrib/locale/push_locale: trivial follow-up: write vs writelinesby SomberNight · cf072f6e · Feb 16, 2026 · 1 fileMessage 81 · StrongTriage 0Details
Commit message · SomberNight

contrib/locale/push_locale: trivial follow-up: write vs writelines

kinda wild that writelines worked there too, that's what we get for dynamic typing... :)

follow-up https://github.com/spesmilo/electrum/commit/d20c9364efb01a513e14b5eb9195f51b9919c695

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
translation-only discount
Lower-priorityplugin: nwc: qt: fix thread safety bugby f321x · 4556d59f · Feb 16, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · f321x

plugin: nwc: qt: fix thread safety bug

Call `NWCServer.event_handler_task.cancel()` on asyncio thread.

```
 File "/home/user/Documents/electrum/electrum/plugins/nwc/nwcserver.py", line 281, in restart_event_handler
   self.event_handler_task.cancel()
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
 File "/usr/lib64/python3.14/asyncio/base_events.py", line 829, in call_soon
   self._check_thread()
   ~~~~~~~~~~~~~~~~~~^^
 File "/usr/lib64/python3.14/asyncio/base_events.py", line 866, in _check_thread
   raise RuntimeError(
       "Non-thread-safe operation invoked on an event loop other "
       "than the current one")
RuntimeError: Non-thread-safe operation invoked on an event loop other than the current one
```

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI review queuedqt: fix toolbar action exc in offline modeby f321x · 907fff46 · Feb 16, 2026 · 1 fileMessage 68 · AdequateInformational 20Details
Commit message · f321x

qt: fix toolbar action exc in offline mode

Fix exception when clicking on "Donate to server" in offline mode by not
showing the "Donate to server" menu action when no network is set.

Raise CancelledError in `fetch_bitcoin_paper` as
`_fetch_tx_from_network` already shows an according error message so the
second, subsequent error message shown by `on_error` is not useful if
`_fetch_tx_from_network` already failed.

```
63.53 | E | gui.qt.exception_window.Exception_Hook | exception caught by crash reporter
Traceback (most recent call last):
 File "/home/user/Documents/electrum/electrum/gui/qt/main_window.py", line 864, in donate_to_server
   d = self.network.get_donation_address()
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get_donation_address'
```

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
AI analysis · Informational 20/100

This commit fixes a harmless user-interface bug in Electrum's Qt desktop wallet. When running in offline mode, clicking 'Donate to server' in the Help menu caused a crash because the program tried to use a network connection that didn't exist. The fix simply hides that menu item when there is no network. A second small change prevents an extra, unhelpful error message when fetching the built-in Bitcoin whitepaper fails offline.

Lower-priorityfollow-up prev: satisfy ban_unicode.pyby SomberNight · 4c597ffb · Feb 14, 2026 · 1 fileMessage 45 · ThinTriage 0Details
Commit message · SomberNight

follow-up prev: satisfy ban_unicode.py

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
translation-only discount
Lower-prioritylocale: don't translate names of languagesby SomberNight · 1fc88047 · Feb 14, 2026 · 1 fileMessage 76 · AdequateTriage 0Details
Commit message · SomberNight

locale: don't translate names of languages

note this is just a conceptual change, in practice it is a no-op:
i18n.py global scope is executed much earlier than the language gets set.
see https://github.com/spesmilo/electrum/blob/61a6ab1d95e6faccce45ed008426283430fa99d4/run_electrum#L422

76/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Why it was queued
translation-only discount
Security candidatelocale: don't translate URL, like wtfby SomberNight · 61a6ab1d · Feb 14, 2026 · 1 fileMessage 73 · AdequateInformational 18Details
Commit message · SomberNight

locale: don't translate URL, like wtf

please, use common sense :(
I guess it was a copy-paste error, but still, treat all _() and qsTr() calls as "scary" and as potential attack vectors. Don't blindly call _(): every call needs to be weighed separately.

73/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
explicit security language
AI analysis · Informational 18/100

This commit removes translation markup from a hardcoded web link in Electrum's 'About' screen. The developer's message warns that translation functions can be risky because malicious or compromised translators could alter URLs or inject harmful content. The actual change is very small and only affects a single, trusted URL label, so the direct security risk is low, but the commit reflects a broader defensive-coding concern.

Lower-prioritycontrib/locale/push_locale: more deterministic messages.pot (fs order)by SomberNight · d20c9364 · Feb 14, 2026 · 2 filesMessage 73 · AdequateTriage 0Details
Commit message · SomberNight

contrib/locale/push_locale: more deterministic messages.pot (fs order)

Tries to remove differences caused by filesystem-order in the generated .pot file.

The crowdin activity stream is full of events:
```
SomberNight_CI_BOT changed the context of 126 strings
02:42
String Previous context New context File Time
{} blocks #: electrum/gui/qt/channel_details.py:256 #: electrum/gui/qt/channel_details.py:257 electrum/gui/qt/network_dialog.py:514 #: electrum/gui/qt/network_dialog.py:514 electrum/gui/qt/channel_details.py:256 #: electrum/gui/qt/channel_details.py:257 messages.pot 02:42
[...]
```
^ i.e. on every CI push, the comments containing the file paths and line-numbers were getting mixed up randomly
This is undesirable noise.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Security candidateCI: changed API key for crowdin translations, update notesby SomberNight · cd802c6e · Feb 13, 2026 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · SomberNight

CI: changed API key for crowdin translations, update notes

api key was previously for "SomberNight" crowdin acc, now it's for a fresh acc "SomberNight_CI_BOT".

- "SomberNight_CI_BOT" acc has fewer permissions overall
- the new api key is minimally scoped
- I can't remember what the old api key was scoped to, and crowdin does not show the settings of existing api key, one can only revoke them
- the crowdin audit log can now distinguish actions of the bot vs actions I do manually

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
credential or privilege state
AI analysis · Informational 15/100

This commit is a routine CI maintenance change. The developer rotated a Crowdin translation API key to a new dedicated bot account with fewer permissions and added a comment explaining it. No code behavior changed, and nothing in the commit suggests a security vulnerability.

Lower-priorityplugins: hardware: HardwareHandlerBase.show_error() takes str, not excby SomberNight · 0c33994d · Feb 12, 2026 · 4 filesMessage 81 · StrongTriage 0Details
Commit message · SomberNight

plugins: hardware: HardwareHandlerBase.show_error() takes str, not exc

This is just a minor conceptual clean-up,
runtime behaviour is not being changed, as ultimately, much later in the exec flow,
the msg object being passed around is cast to str already.
(e.g. see str(text) at https://github.com/spesmilo/electrum/blob/4f7b6e897710338e8a4cfb8fa97c305218bdff88/electrum/gui/qt/util.py#L375-L379)

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
Security candidatecontrib: android: Dockerfile: fix ownership of COPYby Aaron Fiore · 202ea287 · Feb 11, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Aaron Fiore

contrib: android: Dockerfile: fix ownership of COPY

Resolves:

ERROR: Could not open requirements file: [Errno 13] Permission
denied: '/opt/deterministic-build/requirements-build-base.txt'

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
credential or privilege state
AI analysis · Informational 15/100

This commit fixes a file-permission problem inside the Android build container. Two requirement files were being copied as the root user, so the non-root build user could not read them. The fix makes the files owned by the build user. There is no security vulnerability here—just a broken build step.

Lower-prioritycontrib: android: Dockerfile: fix build user envby Aaron Fiore · 99b0df0f · Feb 11, 2026 · 1 fileMessage 68 · AdequateTriage 0Details
Commit message · Aaron Fiore

contrib: android: Dockerfile: fix build user env

The previous layers were somewhat senseless; as the buildozer user's
UID and environment must remain static across the entire build.

Resolves: "Usage of undefined variable '$HOME_DIR'"

Refactoring command args also keeps things sane.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context