Android - Mobile Transfer Issues - HTTP 403

Checklist
I have read intro post: https://community.passbolt.com/t/about-the-installation-issues-category/12
I have read the tutorials, help and searched for similar issues
I provide relevant information about my server (component names and versions, etc.)
I provide a copy of my logs and healthcheck
I describe the steps I have taken to trouble shoot the problem
I describe the steps on how to reproduce the issue

Provide your system information

System Information

– Server operating system name and version
LXC Container on Proxmox running an Ubuntu 24.04 template.

– Web server name and version
LXC - nginx version: nginx/1.24.0 (Ubuntu)
Reverse Proxy - NPMPlus - 2.12.3+0a85402
Cloudflare

Cloudflare → NPMP → LXC

– Database server name and version
mysql 8.0.42-0ubuntu0.24.04.2

– Php version
PHP 8.3.6 (cli) (built: Jul 14 2025 18:30:55) (NTS)

– Passbolt version
Can’t find version, assuming github… Somebody to love ([5.3.2] - 2025-07-16)

Healthcheck
root@passbolt:/opt# sudo su -s /bin/bash -c "/usr/share/php/passbolt/bin/cake passbolt healthcheck" www-data

     ____                  __          ____  
    / __ \____  _____ ____/ /_  ____  / / /_ 
   / /_/ / __ `/ ___/ ___/ __ \/ __ \/ / __/ 
  / ____/ /_/ (__  |__  ) /_/ / /_/ / / /    
 /_/    \__,_/____/____/_.___/\____/_/\__/   

 Open source password manager for teams
-------------------------------------------------------------------------------
 Healthcheck shell
 If you want to have more information about the different checks, please take a look at the documentation: https://www.passbolt.com/docs/admin/server-maintenance/passbolt-api-status/                                                                
-------------------------------------------------------------------------------

 Environment

 [INFO] Linux passbolt 6.8.12-4-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-4 (2024-11-06T15:04Z) x86_64 x86_64 x86_64 GNU/Linux
 [PASS] PHP version 8.3.6.
 [PASS] PHP version is 8.2 or above.
 [PASS] 64-bit architecture system detected.
 [INFO] gpg (GnuPG) 2.4.4 / libgcrypt 1.10.3
 [PASS] PCRE compiled with unicode support.
 [PASS] Mbstring extension is installed.
 [PASS] Intl extension is installed.
 [PASS] GD or Imagick extension is installed.
 [PASS] The temporary directory and its content are writable and not executable.
 [PASS] The logs directory /var/log/passbolt/ and its content are writable.
 [PASS] System clock is synchronized and NTP service is active.

 Config files

 [PASS] The application config file is present
 [PASS] The passbolt config file is present

 Core config

 [PASS] Cache is working.
 [PASS] Debug mode is off.
 [PASS] Unique value set for security.salt
 [PASS] Full base url is set to https://pass.stefanocoding.me
 [PASS] App.fullBaseUrl validation OK.
 [PASS] /healthcheck/status is reachable.

 SSL Certificate

 [PASS] SSL peer certificate validates.
 [PASS] Hostname is matching in SSL certificate.
 [PASS] Not using a self-signed certificate.

 SMTP settings

 [PASS] The SMTP Settings plugin is enabled.
 [PASS] SMTP Settings coherent. You may send a test email to validate them.
 [PASS] The SMTP Settings source is: database.
 [WARN] The SMTP Settings plugin endpoints are enabled.
 [HELP] It is recommended to disable the plugin endpoints.
 [HELP] Set the PASSBOLT_SECURITY_SMTP_SETTINGS_ENDPOINTS_DISABLED environment variable to true.
 [HELP] Or set passbolt.security.smtpSettings.endpointsDisabled to true in /etc/passbolt/passbolt.php.
 [PASS] No custom SSL configuration for SMTP server.

 JWT Authentication

 [PASS] The JWT Authentication plugin is enabled.
 [PASS] The /etc/passbolt/jwt/ directory is not writable.
 [PASS] A valid JWT key pair was found.

 GPG Configuration

 [PASS] PHP GPG Module is installed and loaded.
 [PASS] The environment variable GNUPGHOME is set to /var/lib/passbolt/.gnupg.
 [PASS] The directory /var/lib/passbolt/.gnupg containing the keyring is writable by the webserver user.
 [PASS] The server OpenPGP key is not the default one.
 [PASS] The public key file is defined in /etc/passbolt/passbolt.php and readable.
 [PASS] The private key file is defined in /etc/passbolt/passbolt.php and readable.
 [PASS] The server key fingerprint matches the one defined in /etc/passbolt/passbolt.php.
 [PASS] The server public key defined in the /etc/passbolt/passbolt.php (or environment variables) is in the keyring.
 [PASS] There is a valid email id defined for the server key.
 [PASS] The public key can be used to encrypt a message.
 [PASS] The private key can be used to sign a message.
 [PASS] The public and private keys can be used to encrypt and sign a message.
 [PASS] The private key can be used to decrypt a message.
 [PASS] The private key can be used to decrypt and verify a message.
 [PASS] The public key can be used to verify a signature.
 [PASS] The server public key format is Gopengpg compatible.
 [PASS] The server private key format is Gopengpg compatible.

 Application configuration

 [PASS] Using latest passbolt version (5.3.2).
 [PASS] Passbolt is configured to force SSL use.
 [PASS] App.fullBaseUrl is set to HTTPS.
 [PASS] Selenium API endpoints are disabled.
 [PASS] Search engine robots are told not to index content.
 [INFO] The Self Registration plugin is enabled.
 [INFO] Registration is closed, only administrators can add users.
 [PASS] The deprecated self registration public setting was not found in /etc/passbolt/passbolt.php.
 [WARN] Host availability checking is disabled.
 [HELP] Make sure this instance is not publicly available on the internet.
 [HELP] Or set the PASSBOLT_EMAIL_VALIDATE_MX environment variable to true.
 [HELP] Or set passbolt.email.validate.mx to true in /etc/passbolt/passbolt.php.
 [PASS] Serving the compiled version of the javascript app.
 [WARN] Some email notifications are disabled by the administrator.
 [PASS] The database schema is up to date.

 Database

 [PASS] The application is able to connect to the database
 [PASS] 34 tables found.
 [PASS] Some default content is present.

 Metadata

 [PASS] The server is able to decrypt the metadata private key.

 [PASS] No error found. Nice one, sparky!

Describe the problem thoroughly with as much details as possible so that people can reproduce the issues

Problem and details

– What steps did you take?
Passbolt is fully installed and working on both Windows, Web and extention. Encrypts and decrypts with the full vault.

– What happened?
Android is unable to sync, when checking the latest code, I am unable to setup due to a 403 error.

Logs
Device: Google Pixel 8
Android 16 (36)
Passbolt 2.1.1-38

17:09:56 --> PUT https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json h2 (41-byte body)
17:09:56 <-- 200 https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json (242ms, unknown-length body)
17:09:56 --> PUT https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json h2 (41-byte body)
17:09:56 <-- 200 https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json (230ms, unknown-length body)
17:09:57 --> PUT https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json h2 (41-byte body)
17:09:57 <-- 200 https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json (149ms, unknown-length body)
17:09:57 --> PUT https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json h2 (41-byte body)
17:09:58 <-- 200 https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json (114ms, unknown-length body)
17:09:58 Saving private key.
17:09:58 --> PUT https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json?contain%5Buser.profile%5D=1 h2 (38-byte body)
17:09:58 <-- 403 https://pass.stefanocoding.me/mobile/transfers/239e9d4f-3ead-48ae-907d-4b4463c06c71/33e57a85-18fa-4fea-ad65-7b62cec7546a.json?contain%5Buser.profile%5D=1 (40ms, unknown-length body)
17:09:58 retrofit2.HttpException: HTTP 403 
	at retrofit2.KotlinExtensions$await$2$2.onResponse(SourceFile:53)
	at retrofit2.OkHttpCall$1.onResponse(SourceFile:164)
	at okhttp3.internal.connection.RealCall$AsyncCall.run(SourceFile:519)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
	at java.lang.Thread.run(Thread.java:1119)

retrofit2.HttpException: HTTP 403 
	at retrofit2.KotlinExtensions$await$2$2.onResponse(SourceFile:53)
	at retrofit2.OkHttpCall$1.onResponse(SourceFile:164)
	at okhttp3.internal.connection.RealCall$AsyncCall.run(SourceFile:519)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
	at java.lang.Thread.run(Thread.java:1119)
17:09:58 Encountered a non-standard backend error response
17:09:58 There was an error during checking if MFA is required
java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.Map<kotlin.String, kotlin.collections.List<kotlin.String>>
	at com.passbolt.mobile.android.core.networking.ErrorHeaderMapper.checkMfaRequired(SourceFile:71)
	at com.passbolt.mobile.android.core.networking.ResponseHandler.checkIfMfaRequired(SourceFile:76)
	at com.passbolt.mobile.android.core.networking.ResponseHandler.handleException(SourceFile:50)
	at com.passbolt.mobile.android.passboltapi.registration.MobileTransferRepository.turnPage(SourceFile:97)
	at com.passbolt.mobile.android.passboltapi.registration.MobileTransferRepository$turnPage$1.invokeSuspend(Unknown Source:16)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:33)
	at kotlinx.coroutines.DispatchedTask.run(SourceFile:102)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(SourceFile:111)
	at kotlinx.coroutines.scheduling.TaskImpl.run(SourceFile:99)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(SourceFile:585)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(SourceFile:802)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(SourceFile:706)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(SourceFile:693)

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.Map<kotlin.String, kotlin.collections.List<kotlin.String>>
	at com.passbolt.mobile.android.core.networking.ErrorHeaderMapper.checkMfaRequired(SourceFile:71)
	at com.passbolt.mobile.android.core.networking.ResponseHandler.checkIfMfaRequired(SourceFile:76)
	at com.passbolt.mobile.android.core.networking.ResponseHandler.handleException(SourceFile:50)
	at com.passbolt.mobile.android.passboltapi.registration.MobileTransferRepository.turnPage(SourceFile:97)
	at com.passbolt.mobile.android.passboltapi.registration.MobileTransferRepository$turnPage$1.invokeSuspend(Unknown Source:16)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:33)
	at kotlinx.coroutines.DispatchedTask.run(SourceFile:102)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(SourceFile:111)
	at kotlinx.coroutines.scheduling.TaskImpl.run(SourceFile:99)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(SourceFile:585)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(SourceFile:802)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(SourceFile:706)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(SourceFile:693)
17:09:58 There was an error during transfer update
retrofit2.HttpException: HTTP 403 
	at retrofit2.KotlinExtensions$await$2$2.onResponse(SourceFile:53)
	at retrofit2.OkHttpCall$1.onResponse(SourceFile:164)
	at okhttp3.internal.connection.RealCall$AsyncCall.run(SourceFile:519)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
	at java.lang.Thread.run(Thread.java:1119)

retrofit2.HttpException: HTTP 403 
	at retrofit2.KotlinExtensions$await$2$2.onResponse(SourceFile:53)
	at retrofit2.OkHttpCall$1.onResponse(SourceFile:164)
	at okhttp3.internal.connection.RealCall$AsyncCall.run(SourceFile:519)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
	at java.lang.Thread.run(Thread.java:1119)
17:10:01 Checking biometry state
17:10:02 Received fill request
17:10:02 Visiting view node with id: -1 scheme + domain: null://null package: null content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131361871 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131361892 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131362208 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131362208 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131362731 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: -1 scheme + domain: null://null package: null content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362417 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362135 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362112 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362488 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131362728 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362708 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362275 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints passwordAuto hint: null html autocomplete attr: null important for autofill: 1 input type: 129 
17:10:02 Visiting view node with id: -1 scheme + domain: null://null package: null content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: -1 scheme + domain: null://null package: null content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 0 input type: 0 
17:10:02 Visiting view node with id: 2131362722 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131361968 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131361966 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Visiting view node with id: 2131362207 scheme + domain: null://null package: com.passbolt.mobile.android content description: null autofill hints null hint: null html autocomplete attr: null important for autofill: 1 input type: 0 
17:10:02 Parsed domain: 
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: mail,username,mobile,number,name,mail,username,mobile,number,name,username
Structure hint: passwordAuto
17:10:02 Marking input as fillable. 
Hint values: password,secret,passphrase,password,secret,passphrase,password
Structure hint: passwordAuto
17:10:02 Showing authentication prompt
17:10:07 Passphrase cache cleared
17:10:07 Passphrase cached
17:10:07 Getting server pgp and rsa keys
17:10:07 --> GET https://pass.stefanocoding.me/auth/verify.json h2
17:10:07 <-- 200 https://pass.stefanocoding.me/auth/verify.json (192ms, unknown-length body)
17:10:07 --> GET https://pass.stefanocoding.me/auth/jwt/rsa.json h2
17:10:08 <-- 200 https://pass.stefanocoding.me/auth/jwt/rsa.json (117ms, unknown-length body)
17:10:08 Getting server pgp and rsa keys succeeded
17:10:08 Checking if time adjustment is needed
17:10:08 Local time sync needed. Adjusted: -1
17:10:08 Verifying server fingerprint
17:10:08 Server key fingerprint is valid
17:10:08 Preparing sign in challenge
17:10:08 Prepared sign in challenge
17:10:08 Signing in
17:10:08 --> POST https://pass.stefanocoding.me/auth/jwt/login.json h2 (1699-byte body)
17:10:08 <-- 403 https://pass.stefanocoding.me/auth/jwt/login.json (25ms, unknown-length body)
17:10:08 Encountered a non-standard backend error response
17:10:08 There was an error during checking if MFA is required
java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.Map<kotlin.String, kotlin.collections.List<kotlin.String>>
	at com.passbolt.mobile.android.core.networking.ErrorHeaderMapper.checkMfaRequired(SourceFile:71)
	at com.passbolt.mobile.android.core.networking.ResponseHandler.checkIfMfaRequired(SourceFile:76)
	at com.passbolt.mobile.android.passboltapi.auth.AuthRepository.signIn(SourceFile:114)
	at com.passbolt.mobile.android.passboltapi.auth.AuthRepository$signIn$1.invokeSuspend(Unknown Source:12)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:33)
	at kotlinx.coroutines.DispatchedTask.run(SourceFile:104)
	at android.os.Handler.handleCallback(Handler.java:995)
	at android.os.Handler.dispatchMessage(Handler.java:103)
	at android.os.Looper.loopOnce(Looper.java:248)
	at android.os.Looper.loop(Looper.java:338)
	at android.app.ActivityThread.main(ActivityThread.java:9067)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.Map<kotlin.String, kotlin.collections.List<kotlin.String>>
	at com.passbolt.mobile.android.core.networking.ErrorHeaderMapper.checkMfaRequired(SourceFile:71)
	at com.passbolt.mobile.android.core.networking.ResponseHandler.checkIfMfaRequired(SourceFile:76)
	at com.passbolt.mobile.android.passboltapi.auth.AuthRepository.signIn(SourceFile:114)
	at com.passbolt.mobile.android.passboltapi.auth.AuthRepository$signIn$1.invokeSuspend(Unknown Source:12)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:33)
	at kotlinx.coroutines.DispatchedTask.run(SourceFile:104)
	at android.os.Handler.handleCallback(Handler.java:995)
	at android.os.Handler.dispatchMessage(Handler.java:103)
	at android.os.Looper.loopOnce(Looper.java:248)
	at android.os.Looper.loop(Looper.java:338)
	at android.app.ActivityThread.main(ActivityThread.java:9067)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)
17:10:08 Failure during sign in: Something went wrong!

– What did you expect instead?
Being able to login to passbolt on my phone.

Other issues with similair logs
https://community.passbolt.com/t/cannot-scan-qr-code-on-android/8754
https://community.passbolt.com/t/android-qr-code-error-during-transport-update/8446

I moved from NPMPlus to NPM (so sort of a downgrade of sorts?) and now it works.