BT
← All projectsBTCPay Server

BTCPay Server

Free, open-source, self-hosted Bitcoin payment processor supporting on-chain and Lightning payments.

BitcoinLightning NetworkPayment infrastructureNormal
Repository coverage

661 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.

85security candidates223second-pass queue308AI analyses
94commits · 30 days
118commits · 60 days
315commits · 180 days
634commits · 365 days
Backfill bands
Aug 8 → Feb 9247 seen22 candidatesComplete
Feb 9 → Jun 9197 seen39 candidatesComplete
Jun 9 → Jul 954 seen0 candidatesComplete
Jul 9 → Aug 865 seen16 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.

53/100 average clarity
80Strong · 80–100
148Adequate · 60–79
277Thin · 40–59
156Opaque · 0–39
8security 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.
Nicolas Dorier43748226346
Cerberus622290
ndeet111133
rockstardev33612049
Abhijay Jain26610087
Chukwuleta Tobechi25610068
thgO.O32512066
dstrukt625062
Tim522074
Atharva Borade711067
Pavlenex412065
psam21312068
Analysis record

Published AI watches

Last scanned 31 minutes ago

Informational 15 AI analysisMessage 58 · Thin
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Containerize the server settings views into sections (#7501)

This commit is a user-interface redesign, not a security fix. It wraps existing server settings pages into consistent visual sections and adds short explanatory subtitles. No code handling payments, authentication, permissions, or data val…

97357e8cby dstrukt+255−11230 files
No security note in commit
Informational 15 AI analysisMessage 53 · Thin
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Rename global search keywords to aliases (#7586)

This commit simply renames the search feature's 'Keywords' field to 'Aliases' across the BTCPay Server codebase. It is a non-functional refactoring that does not change any security behavior, access controls, or data handling. Backward com…

3af94084by Nicolas Dorier+96−7720 files
No security note in commit
Moderate 58 AI analysisMessage 36 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

fix confirm (#7570)

This commit adds a missing safety check in the API key authorization flow. Previously, if a user clicked a 'confirm' action for an API key that no longer existed, the code would try to use a null (non-existent) key object, which could caus…

Null dereference / NullReferenceException preventedMissing validation of repository return valueUser-facing authorization flow hardening
bd7f91e2by monasco+9−01 file
No security note in commit
Informational 3 AI analysisMessage 0 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Bump libs

This commit simply updates four external software library (NuGet package) versions to newer patch releases. There are no code changes shown, and the commit message gives no indication that any security issue is being fixed. It looks like a…

48c57151by Nicolas Dorier+5−54 files
No security note in commit
Low 35 AI analysisMessage 36 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

fix notfound (#7572)

This commit changes how BTCPay Server handles a missing user when an administrator tries to resend a verification email. Previously, the code threw a generic internal error (ApplicationException), which could expose internal details or pro…

Replaces thrown ApplicationException with NotFound() for missing userReduces information leakage via exception message containing userIdImproves HTTP semantics (404 instead of 500-class error)
491cf201by monasco+1−31 file
No security note in commit
Informational 15 AI analysisMessage 28 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Add PushNuget.sh

This commit adds a simple build-and-publish helper script for the project's NuGet package. It packages the BTCPayServer.Client library, pushes it to the public NuGet registry using an API key from an environment variable, and creates a mat…

24f5054eby Nicolas Dorier+16−01 file
No security note in commit
Low 36 AI analysisMessage 58 · Thin
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Encode payjoin errors in wallet status messages (#7567)

This commit fixes a potential cross-site scripting (XSS) issue in BTCPay Server's wallet status messages. When a payjoin transaction fails, the server shows a warning message that includes an error string. Previously, that error string was…

HTML content constructed from an external error string without encodingAddition of HtmlEncoder.Default.Encode around user-influenced or third-party error textStatus message rendered as raw Html in the UI
a60f8bf2by Nicolas Dorier+2−11 file
No security note in commit
Low 46 AI analysisMessage 36 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

fix lnurl (#7563)

This commit fixes a bug in BTCPay Server's LNURL feature for pull payments. Previously, if someone requested a LNURL for a pull payment that didn't exist, the code would try to use a null (empty) pull payment object, which could cause the …

Null dereference / missing null check on database/service lookup resultPotential server-side exception (DoS/crash) on crafted LNURL requestInformation disclosure risk if exception details leak stack traces
227912f2by monasco+1−11 file
No security note in commit
Informational 15 AI analysisMessage 63 · Adequate
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Update POS callback authentication guidance (#7566)

This commit only updates user-facing help text in the Point of Sale plugin. It replaces outdated guidance about legacy API keys and Basic authentication with newer guidance about API tokens and the correct REST API endpoint. No code logic,…

045f70a2by Nicolas Dorier+2−22 files
No security note in commit
Informational 15 AI analysisMessage 0 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Fix test

This is a one-line change to a test file. It adjusts an assertion so that the test now expects a database-migrated API key to have a null CreatedAt value instead of a non-null value. There is no production code change and no security relev…

ecfb7990by Nicolas Dorier+1−11 file
No security note in commit
Moderate 56 AI analysisMessage 45 · Thin
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Merge branch 'refact-api-keys'

This commit refactors how BTCPay Server stores and handles API keys. Previously, the secret API key itself was used as the database primary key, meaning the full secret was stored in plaintext and appeared in URLs/revocation endpoints. Now…

API key secrets no longer used as database primary key or in revocation URLsDatabase now stores SHA256 hash of secret rather than plaintext secret for authentication lookupNew ephemeral Key column cleared after 5 minutes by scheduled cleanup
7ec0260bby Nicolas Dorier+368−39129 files
Vendor flagged security relevance
Moderate 60 AI analysisMessage 28 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Harden API key storage

This commit changes how BTCPay Server stores and handles API keys. Previously, the secret API key itself was used as the database primary key and was stored in plaintext. After this change, the database stores a one-way hash of the secret,…

Database now stores SHA-256 hash of API key secret instead of the secret itselfAPI key secret is cleared from database after creation via scheduled cleanup jobPublic management ID (akid_*) is separated from the secret
b1294924by Nicolas Dorier+368−39129 files
Vendor flagged security relevance
Low 32 AI analysisMessage 18 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

bump HtmlSanitizer

This commit updates the HtmlSanitizer library to a newer patch version and reorganizes some account email-change tests. The library bump could fix a security bug in how user-supplied HTML is cleaned, but the commit itself does not say it f…

Dependency version bump of an HTML-sanitization library (HtmlSanitizer)Test-only reorganization around account email change flowsNo explicit security advisory, CVE, or vulnerability description in commit message
f8946b83by Nicolas Dorier+17−332 files
No security note in commit
Moderate 58 AI analysisMessage 50 · Thin
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Require current password for account email changes

This commit adds a security check so that when a user tries to change their email address on their account profile, they must enter their current password. Before this change, an attacker who had already hijacked a logged-in session could …

Account-takeover mitigation: email change now requires password re-authenticationNew model property CurrentPassword with DataType.PasswordController now calls CheckPasswordAsync before applying email change
f681ec7eby Nicolas Dorier+74−137 files
Vendor flagged security relevance
Informational 15 AI analysisMessage 28 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Make a signed commit

This commit changes a single word in a build script's status message, from 'if it is possible' to 'whether it is possible'. There is no functional, security, or behavioral change to the software.

e342c62aby Nicolas Dorier+1−11 file
No security note in commit
Low 35 AI analysisMessage 70 · Adequate
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

fix(plugin-manager): use update lookup for installed plugins (#7536)

This commit changes how BTCPay Server's plugin manager asks the plugin directory for update information. Previously, the server fetched the full catalog of plugins and then filtered locally. Now it sends a list of the plugins actually inst…

Reduces information disclosure to external plugin directory by sending only installed/pending plugin list instead of querying full catalogAdds input validation on plugin update response (null entries, missing identifier/version)Improves handling of disabled and pending plugins in update checks
c617a24fby thgO.O+248−685 files
No security note in commit
Informational 15 AI analysisMessage 38 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Fix flaky test

This commit adds one extra wait/check to an automated test that verifies email rules appear in a web page. It is purely a test-stability fix and does not change any production code, user-facing behavior, or security boundary.

34ce3589by Nicolas Dorier+1−01 file
No security note in commit
Informational 15 AI analysisMessage 38 · Opaque
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Fix github reports in CI

This commit changes a CI test script so that GitHub Actions can write step summary reports to the correct file path inside a Docker container. It is a build/test infrastructure fix with no apparent security relevance.

4208bf71by Nicolas Dorier+15−11 file
No security note in commit
Moderate 66 AI analysisMessage 85 · Strong
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Validate support URL scheme to prevent stored script injection (#7537)

This commit fixes a stored cross-site scripting (XSS) risk in BTCPay Server's store settings. Merchants can set a 'Support URL' that is shown to customers during checkout. Before this fix, an attacker with access to store settings could en…

Stored XSS via javascript: URI in SupportUrlMissing scheme validation on user-supplied URLGreenfield API and UI controller both patched
a6b81460by Chukwuleta Tobechi+19−33 files
Vendor flagged security relevance
Moderate 61 AI analysisMessage 58 · Thin
BT BTCPay ServerBTCPay Server BitcoinLightning NetworkPayment infrastructure

Prevent monetization from overriding administrator account lockout (#7523)

This change fixes a bug where BTCPay Server's paid-subscription ('monetization') system could automatically re-enable an administrator account that had been manually disabled. Previously, when a subscription renewed or was bypassed, the mo…

Privilege/authorization bypass: automated subsystem overriding an administrative account-disable actionMissing provenance/audit trail in security-sensitive state change (account disabled flag)Business-logic flaw in subscription lifecycle interacting with identity lockout
0e4fc389by Chukwuleta Tobechi+28−64 files
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.

Security candidatefix: Broken Access Control: Private form access and invoice creation on other stores via unscoped authorization check (#7236)by Cerberus · e7cd630b · Mar 13, 2026 · 1 fileMessage 90 · StrongHigh 74Details
Commit message · Cerberus

fix: Broken Access Control: Private form access and invoice creation on other stores via unscoped authorization check (#7236)

Co-authored-by: Cerberus Merlin <merlin@cerberus.security>

90/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
access control
AI analysis · High 74/100

This commit fixes a broken access control bug in BTCPay Server's form feature. Previously, when checking whether a user could view a private form, the system asked 'Is this user allowed to view store settings anywhere?' without specifying which store. That meant any user with store-settings permission for any store could see private forms belonging to other stores, and could potentially create invoices against those stores. The patch changes the authorization check to include the specific store ID of the form, so users must have permission for that exact store.

Lower-priorityfix: Cross-tenant payment request creation/update via forged StoreId in UIPaymentRequestController (#7233)by Cerberus · 1fe2ca31 · Mar 13, 2026 · 1 fileMessage 90 · StrongTriage 0Details
Commit message · Cerberus

fix: Cross-tenant payment request creation/update via forged StoreId in UIPaymentRequestController (#7233)

Co-authored-by: Cerberus Merlin <merlin@cerberus.security>

90/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Lower-priorityTests: Make sure the dll of the loaded plugin is properly foundby Nicolas Dorier · e5d53402 · Mar 12, 2026 · 1 fileMessage 60 · AdequateTriage 0Details
Commit message · Nicolas Dorier

Tests: Make sure the dll of the loaded plugin is properly found

60/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
Lower-priorityTests: Fix path searching for test filesby Nicolas Dorier · 9c8dbeb7 · Mar 12, 2026 · 1 fileMessage 55 · ThinTriage 0Details
Commit message · Nicolas Dorier

Tests: Fix path searching for test files

55/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification! No meaningful explanatory body
AI review queuedRe-introduce GetAppDataby Nicolas Dorier · 62f33da3 · Mar 12, 2026 · 1 fileMessage 28 · OpaqueInformational 15Details
Commit message · Nicolas Dorier

Re-introduce GetAppData

28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit simply re-adds a helper method called GetAppData that retrieves application data from a web request. It throws an error if the data is missing. There is no indication of a security fix or vulnerability in this change.

Lower-priorityMove some test code inside the test project (#7230)by Nicolas Dorier · 9c718c94 · Mar 12, 2026 · 4 filesMessage 68 · AdequateTriage 0Details
Commit message · Nicolas Dorier

Move some test code inside the test project (#7230)

68/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
AI review queuedFix possible crash when installing pluginby Nicolas Dorier · d027a6d6 · Mar 11, 2026 · 1 fileMessage 45 · ThinInformational 16Details
Commit message · Nicolas Dorier

Fix possible crash when installing plugin

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
second-pass: broader security terminology
AI analysis · Informational 16/100

This is a one-line bug fix that prevents a file-move operation from failing when a destination file already exists during plugin installation. The change makes the system overwrite the existing manifest file instead of throwing an error. It appears to be a stability fix for a rare edge case rather than a security vulnerability.

AI review queuedImprove plugin crash detectionby Nicolas Dorier · e88b9ee4 · Mar 11, 2026 · 1 fileMessage 35 · OpaqueInformational 21Details
Commit message · Nicolas Dorier

Improve plugin crash detection

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: broader security terminologysecond-pass: opaque commit message
AI analysis · Informational 21/100

This commit improves how BTCPay Server figures out whether a crash was caused by a third-party plugin. It adds a new check that inspects the crash's stack trace to see if any loaded plugin's code appears in it. This is a defensive reliability improvement, not a fix for an active security vulnerability. It helps the server better identify misbehaving plugins so they can be disabled or reported, reducing the chance that a bad plugin causes repeated outages or unexpected behavior.

AI review queuedBump libs (#7229)by Nicolas Dorier · 35dea6af · Mar 11, 2026 · 8 filesMessage 36 · OpaqueLow 34Details
Commit message · Nicolas Dorier

Bump libs (#7229)

36/100 · OpaqueMessage clarity
✓ Subject identifies a change✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Low 34/100

This commit updates several third-party software libraries and the underlying .NET runtime image used by BTCPay Server. Library and runtime updates often include routine bug fixes and security patches, but the commit message does not say any specific vulnerability was being fixed. Without a vendor security advisory or changelog reference, we cannot confirm this is a security patch, though it is a common way projects keep dependencies secure.

Lower-priorityFix mention of .NET 10 (#7228)by Nicolas Dorier · e9f52ab4 · Mar 11, 2026 · 2 filesMessage 53 · ThinTriage 0Details
Commit message · Nicolas Dorier

Fix mention of .NET 10 (#7228)

53/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
AI review queuedUpdate default translationsby Nicolas Dorier · 4b24455d · Mar 10, 2026 · 1 fileMessage 35 · OpaqueInformational 15Details
Commit message · Nicolas Dorier

Update default translations

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
translation-only discountsecond-pass: opaque commit message
AI analysis · Informational 15/100

This commit only updates the default translation file for the BTCPay Server application. It adds, removes, and modifies user-facing text strings (for example, labels like 'API Key Analysis', 'Never Used', and 'Used Permissions'). There are no code logic changes, no security fixes, and no changes to how the application behaves or protects data.

AI review queuedRefactor: Cleanup useless code (#7224)by Nicolas Dorier · bab9a8a2 · Mar 10, 2026 · 25 filesMessage 65 · AdequateLow 29Details
Commit message · Nicolas Dorier

Refactor: Cleanup useless code (#7224)

65/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Why it was queued
second-pass: unusually broad change
AI analysis · Low 29/100

This commit is a large cleanup/refactoring change that removes unused code, simplifies controllers, and updates tests. It also removes the temporary file URL feature entirely. There are a few small security-relevant changes, such as switching pull-payment lookups to use context data set by an authorization filter and removing explicit store-id checks in some actions, but these appear to be moving checks into a shared filter rather than removing them. The commit title and message do not describe this as a security fix.

AI review queuedFix: Dashboard UI issue on mobile (#7223)by Nicolas Dorier · 134417a7 · Mar 10, 2026 · 3 filesMessage 65 · AdequateInformational 15Details
Commit message · Nicolas Dorier

Fix: Dashboard UI issue on mobile (#7223)

65/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit is a user-interface fix for the BTCPay Server dashboard on mobile devices. It simplifies how the wallet balance widget is rendered, removes a multi-column dashboard layout, and makes the default cryptocurrency optional. There is no security-relevant change.

Security candidateInclude API key - permission analysis for improved security (#6771)by Chukwuleta Tobechi · b253df29 · Mar 10, 2026 · 11 filesMessage 96 · StrongInformational 21Details
Commit message · Chukwuleta Tobechi

Include API key - permission analysis for improved security (#6771)

* Include API key - permission analysis for improved security

resolve codderbyte

Remove designer class

fix review feedback

include text translate

avoid string parsion and use Permission directly

use permission against string

include translation and update selecte stores

Include tests for api key permission edit and usage

.Update api key analysis page

include test

delete key usage when deleting api key

* update layout and delete query

96/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference✓ Names security-relevant behavior explicitly
Why it was queued
credential or privilege state
AI analysis · Informational 21/100

This commit adds a new feature that tracks which permissions each API key actually uses and shows the owner a dashboard of used, unused, and stale permissions. It is a security-hardening and visibility improvement, not a fix for an active vulnerability. The change also deletes usage records when an API key is removed.

Lower-priorityRefactor: Move test PaymentControllerTestsby Nicolas Dorier · 604c44a5 · Mar 8, 2026 · 2 filesMessage 57 · ThinTriage 0Details
Commit message · Nicolas Dorier

Refactor: Move test PaymentControllerTests

57/100 · ThinMessage clarity
✓ Descriptive subject✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
AI review queuedUnify GetStoreDataOrNull/GetInvoiceDataOrNullby Nicolas Dorier · 08b3055e · Mar 8, 2026 · 53 filesMessage 35 · OpaqueModerate 64Details
Commit message · Nicolas Dorier

Unify GetStoreDataOrNull/GetInvoiceDataOrNull

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: opaque commit messagesecond-pass: unusually broad changesecond-pass: security-sensitive path
AI analysis · Moderate 64/100

This commit is a large internal cleanup that renames and unifies how BTCPay Server looks up store, invoice, app, and payment-request data from the HTTP request context. The main visible change is that many controllers stop manually checking the database for a store/invoice and instead rely on data that an authorization filter already placed in the request context. The commit also adds route-to-store mappings for paymentRequestId and pullPaymentId, and adds a new test that verifies a user with view-only invoice permission cannot read an invoice belonging to a different store. While the change is mostly defensive, it is also risky: if the authorization filter ever misses a route or a controller action is reachable without the filter, the controller may assume it has a valid store/invoice when it does not, which could lead to null-reference crashes or, in the worst case, cross-store data access.

Security candidateCleanup unused namespacesby Nicolas Dorier · 1633275d · Mar 8, 2026 · 372 filesMessage 35 · OpaqueInformational 15Details
Commit message · Nicolas Dorier

Cleanup unused namespaces

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
seed or entropy pathsigning or wallet pathboot or update pathauthentication pathparser or protocol path
AI analysis · Informational 15/100

This commit removes unused C# 'using' statements (imported namespaces) and one unused Razor view import across 372 files. It is a code-cleanup change with no functional modifications. The only non-cleanup hunk is a tiny refactor in GreenfieldInvoiceController.UpdateInvoice that reorders an existing null check and variable assignment without changing behavior.

AI review queuedHttpContext.GetStoreData method should be nullableby Nicolas Dorier · b7e69f53 · Mar 8, 2026 · 21 filesMessage 50 · ThinModerate 50Details
Commit message · Nicolas Dorier

HttpContext.GetStoreData method should be nullable

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: unusually broad changesecond-pass: security-sensitive path
AI analysis · Moderate 50/100

This commit is a code-quality and null-safety refactor. It makes the helper that retrieves the current store from an HTTP request return null when no store is set, adds a separate throw-on-null variant, and updates many controllers to use the appropriate variant. It also switches invoice lookups to use a context item set by an authorization filter. The changes reduce the chance of accidental null-reference crashes and make authorization checks more centralized, but the commit itself does not describe a specific security bug being fixed.

Security candidateRefactor: User User.GetId instead of using the UserManagerby Nicolas Dorier · be7f3f04 · Mar 8, 2026 · 44 filesMessage 62 · AdequateLow 34Details
Commit message · Nicolas Dorier

Refactor: User User.GetId instead of using the UserManager

62/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope! No meaningful explanatory body
Why it was queued
signing or wallet pathauthentication path
AI analysis · Low 34/100

This is a large internal code cleanup that replaces calls to ASP.NET Core's UserManager for getting the current user's ID with a new direct helper that reads the value from the user's identity claims. Most changes are mechanical refactors across many controllers and views. There are a few small behavior changes worth watching: the new helper returns an empty string instead of "???" for missing users, some places now treat a missing user ID as a validation failure rather than passing it through, and a couple of user-not-found cases now return NotFound instead of throwing an exception. The commit does not describe itself as a security fix and no external advisory is provided.

Security candidateFix PermissionTagHelper to behave in the right scope when in nav barby Nicolas Dorier · d6bec86c · Mar 7, 2026 · 14 filesMessage 50 · ThinLow 49Details
Commit message · Nicolas Dorier

Fix PermissionTagHelper to behave in the right scope when in nav bar

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
credential or privilege stateauthentication path
AI analysis · Low 49/100

This commit fixes how BTCPay Server's navigation bar decides which store's permissions to use when showing or hiding menu items. Previously, the permission checks inside the navigation bar could accidentally use the store from the main page (for example, the server settings page) instead of the store selected in the navigation bar. This could cause menu items to be shown or hidden incorrectly. The change makes the navigation bar temporarily switch to the correct store context while it renders, and removes a caching shortcut that could reuse the wrong permission result. There is no direct evidence in the commit message or diff that this was exploited or reported as a security vulnerability.

Security candidateDo not add claims twice for cookie authby Nicolas Dorier · e34d8d7d · Mar 6, 2026 · 1 fileMessage 50 · ThinLow 26Details
Commit message · Nicolas Dorier

Do not add claims twice for cookie auth

50/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Names security-relevant behavior explicitly! No meaningful explanatory body
Why it was queued
authentication path
AI analysis · Low 26/100

This commit fixes a small bug where a special permission claim was being added to a user's identity every time it was transformed, instead of only once. Repeated claims are harmless in most cases, but could in theory cause the identity to grow unexpectedly or lead to subtle authorization behavior. The fix checks whether the permission claim already exists before adding it again.

Security candidatePluginize permissionsby Nicolas Dorier · 14837e6c · Mar 6, 2026 · 70 filesMessage 18 · OpaqueModerate 51Details
Commit message · Nicolas Dorier

Pluginize permissions

18/100 · OpaqueMessage clarity
✓ Subject identifies a change! Too few words to establish purpose! No meaningful explanatory body! Opaque security-relevant change
Why it was queued
credential or privilege stateauthentication path
AI analysis · Moderate 51/100

This is a large refactoring commit that reworks how permissions are defined and enforced in BTCPay Server so that plugins can register their own permissions. It moves the permission hierarchy out of a hard-coded static class into a runtime service, changes how store context is tracked during requests, and updates authorization handlers. The change is architectural rather than a targeted security fix, but any mistake in the new permission logic could allow users to access stores or functions they should not.

Lower-priorityFix: Not able to create subscriber portal session via API (#7200)by Nicolas Dorier · 47949d0e · Mar 3, 2026 · 6 filesMessage 70 · AdequateTriage 0Details
Commit message · Nicolas Dorier

Fix: Not able to create subscriber portal session via API (#7200)

Fix #7198

70/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Links an issue, advisory, or supporting reference! No meaningful explanatory body
Lower-priorityInclude payment method to get invoices api (#6757)by Chukwuleta Tobechi · 2ba0a884 · Mar 3, 2026 · 6 filesMessage 91 · StrongTriage 0Details
Commit message · Chukwuleta Tobechi

Include payment method to get invoices api (#6757)

Resolve coderbyte comment

blacklist https://zaphq.io, Returns forbidden over test. redirects to strike on web

correction fixes

payment method description

Remove InvoiceDataWithPaymentMethods and include new properties to InvoiceData

spelling check

update PR

Include payment method to get invoices api

blacklist https://zaphq.io, Returns forbidden over test. redirects to strike on web

correction fixes

Remove InvoiceDataWithPaymentMethods and include new properties to InvoiceData

spelling check

91/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
AI review queuedRun CanUsePairing in CIby Nicolas Dorier · 0783c20f · Mar 2, 2026 · 1 fileMessage 28 · OpaqueInformational 15Details
Commit message · Nicolas Dorier

Run CanUsePairing in CI

28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit only changes test code. It fixes a minor indentation issue and adds a test category label so that an existing test called CanUsePairing is run as part of automated browser-based (Playwright) testing. There is no change to production code, no bug fix, and no security relevance.