Release: 2.1.1.102 (Canary) 2025-09-23

2.1.1.102_canary_2025-09-23

This release is a canary release intended to be used for testing.

Changes in this versions

This version contains a number of fixes for issues discovered through testing, including fixes for the restore process and the index file recreate.

This version adds support for Service Account JSON when using Google Clouds Services for storage.

To improve security, this version adds masking of passwords so it is harder to leak sensitive values.

Database update to v9

This version updates the server settings database to v9 to add a new column to the Backup table.
The database tool can downgrade without data loss (assuming that external configs were not loaded).

Detailed list of changes:

  • Fixed an issue with the restore flow where it would fail if a local file existed but was locked
  • Removed display of custom values in NGAX dropdowns
  • Fixed an issue with locale settings affecting SQL statements
  • Mask passwords when sending them through the API to avoid leaking secrets
  • Added retry option for backend tester
  • Downgrade Minio library to 6.0.0 due to faulty error handling in later versions
  • Validate that the S3 hostname does not contain a path, thanks @smyja
  • Updated logic for showing HyperV and MSSQL in source browser
  • Fixed an issue where the MSGraph backend would attempt to re-read the response body for error messages
  • Added support for remotely managed backup configurations
  • Removed leading and trailing null characters from paths to work around an issue with .NET Core and some virtual filesystems
  • Improved debug logging of SQL statements to use invariant locale
  • Added support for Service Account JSON authentication with GCS
  • Updated CoCoL to fix a flood of unhandled exception messages
  • Fixed a case where a recreated index volume would sometimes not contain all data
  • Added support for sending webmodule data without needing a callback

ngclient changes:

  • Fixed images not showing for the destination list
  • Fixed some UI rendering issues caused by missing values in data
  • Added destination icons to backup list view
  • Fixed destinations page not scrolling correctly
  • Updated ShipUI library
  • Fixed an issue with text-editing of advanced options that could loose values
  • Improved support for smaller screens
  • Fixed some button displays and added dark theme for loading screen
  • Simplified source and destination trees
  • Source tree now supports HyperV and MSSQL sources, if present
  • Updated to Angular v20.2
  • Added support for showing externally managed reporting url and backups
  • Fixed wording on channels to reflect Beta status
  • Fixed some typo’s and casing issues
  • Correct handling of advanced options with leading slashes
  • Prevent adding a leading slash for Windows UNC style paths
  • Fixed file backend ignoring advanced options
  • Added multiple search terms to destination list, and fixed priority sorting
  • Added machine name to the left-hand menu for easier identification
  • Improved logic for import to better reflect the current state when editing
  • Fixed support for choosing filter groups when adding source filters
  • Added support for GCS Service Account JSON
  • Fixed wording on restore to not mention the option to restore a config from storage

Upgraded my Windows 10 system, b2 backend. First attempted backup ran into:


Sep 23, 2025 12:06 PM: Failed while executing Backup "delli2-os" (id: 3)
System.FormatException: Input string was not in a correct format. Failure to parse near offset 31. Format item ends prematurely.

   at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)

   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)

   at Duplicati.Library.Main.Database.ExtensionMethods.GetPrintableCommandText(IDbCommand self)

   at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64Async(SqliteCommand self, Boolean writeLog, String cmd, Dictionary`2 values, Int64 defaultvalue, CancellationToken cancellationToken)

   at Duplicati.Library.Main.Database.LocalDatabase.GetOrCreatePathPrefix(String prefix, CancellationToken token)

   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddFile(String filename, DateTime lastmodified, Int64 blocksetID, Int64 metadataID, CancellationToken token)

   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddDirectoryEntry(String path, Int64 metadataID, DateTime lastmodified, CancellationToken token)

   at Duplicati.Library.Main.Operation.Backup.BackupDatabase.<>c__DisplayClass8_0.<<AddDirectoryEntryAsync>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at Duplicati.Library.Main.Operation.Common.SingleRunner.<>c__DisplayClass5_0.<<RunOnMain>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at Duplicati.Library.Main.Operation.Common.SingleRunner.DoRunOnMain[T](Func`1 method)

   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.AddFolderToOutputAsync(String filename, DateTime lastModified, IMetahash meta, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)

   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.ProcessMetadata(ISourceProviderEntry entry, FileAttributes attributes, DateTime lastwrite, Options options, IMetahash emptymetadata, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)

   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.<>c__DisplayClass2_0.<<Run>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at CoCoL.AutomationExtensions.RunTask[T](T channels, Func`2 method, Boolean catchRetiredExceptions)

   at Duplicati.Library.Main.Operation.BackupHandler.RunMainOperation(Channels channels, ISourceProvider source, UsnJournalService journalService, BackupDatabase database, IBackendManager backendManager, BackupStatsCollector stats, Options options, IFilter filter, BackupResults result, ITaskReader taskreader, Int64 filesetid, Int64 lastfilesetid)

   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)

   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)

   at Duplicati.Library.Main.Controller.<>c__DisplayClass22_0.<<Backup>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at Duplicati.Library.Utility.Utility.Await(Task task)

   at Duplicati.Library.Main.Controller.RunAction[T](T result, String[]& paths, IFilter& filter, Func`3 method)

   at Duplicati.Library.Main.Controller.Backup(String[] inputsources, IFilter filter)

   at Duplicati.Server.Runner.RunInternal(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IRunnerData data, Boolean fromQueue)
Sep 23, 2025 12:06 PM: Error in worker
System.FormatException: Input string was not in a correct format. Failure to parse near offset 31. Format item ends prematurely.

   at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)

   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)

   at Duplicati.Library.Main.Database.ExtensionMethods.GetPrintableCommandText(IDbCommand self)

   at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64Async(SqliteCommand self, Boolean writeLog, String cmd, Dictionary`2 values, Int64 defaultvalue, CancellationToken cancellationToken)

   at Duplicati.Library.Main.Database.LocalDatabase.GetOrCreatePathPrefix(String prefix, CancellationToken token)

   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddFile(String filename, DateTime lastmodified, Int64 blocksetID, Int64 metadataID, CancellationToken token)

   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddDirectoryEntry(String path, Int64 metadataID, DateTime lastmodified, CancellationToken token)

   at Duplicati.Library.Main.Operation.Backup.BackupDatabase.<>c__DisplayClass8_0.<<AddDirectoryEntryAsync>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at Duplicati.Library.Main.Operation.Common.SingleRunner.<>c__DisplayClass5_0.<<RunOnMain>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at Duplicati.Library.Main.Operation.Common.SingleRunner.DoRunOnMain[T](Func`1 method)

   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.AddFolderToOutputAsync(String filename, DateTime lastModified, IMetahash meta, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)

   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.ProcessMetadata(ISourceProviderEntry entry, FileAttributes attributes, DateTime lastwrite, Options options, IMetahash emptymetadata, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)

   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.<>c__DisplayClass2_0.<<Run>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at CoCoL.AutomationExtensions.RunTask[T](T channels, Func`2 method, Boolean catchRetiredExceptions)

   at Duplicati.Library.Main.Operation.BackupHandler.RunMainOperation(Channels channels, ISourceProvider source, UsnJournalService journalService, BackupDatabase database, IBackendManager backendManager, BackupStatsCollector stats, Options options, IFilter filter, BackupResults result, ITaskReader taskreader, Int64 filesetid, Int64 lastfilesetid)

   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)

   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)

   at Duplicati.Library.Main.Controller.<>c__DisplayClass22_0.<<Backup>b__0>d.MoveNext()

--- End of stack trace from previous location ---

   at Duplicati.Library.Utility.Utility.Await(Task task)

   at Duplicati.Library.Main.Controller.RunAction[T](T result, String[]& paths, IFilter& filter, Func`3 method)

   at Duplicati.Library.Main.Controller.Backup(String[] inputsources, IFilter filter)

   at Duplicati.Server.Runner.RunInternal(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IRunnerData data, Boolean fromQueue)

   at Duplicati.Server.Runner.Run(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IQueuedTask data, Boolean fromQueue)

   at Duplicati.WebserverCore.Services.QueueRunnerService.RunTask(IQueuedTask task)

Things didn’t go well first backup on my test Windows 2025 server:

Failed: Input string was not in a correct format. Failure to parse near offset 81. Format item ends prematurely.
Details: System.FormatException: Input string was not in a correct format. Failure to parse near offset 81. Format item ends prematurely.
   at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at Duplicati.Library.Main.Database.ExtensionMethods.GetPrintableCommandText(IDbCommand self)
   at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64Async(SqliteCommand self, Boolean writeLog, String cmd, Dictionary`2 values, Int64 defaultvalue, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Database.LocalDatabase.GetOrCreatePathPrefix(String prefix, CancellationToken token)
   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddFile(String filename, DateTime lastmodified, Int64 blocksetID, Int64 metadataID, CancellationToken token)
   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddDirectoryEntry(String path, Int64 metadataID, DateTime lastmodified, CancellationToken token)
   at Duplicati.Library.Main.Operation.Backup.BackupDatabase.<>c__DisplayClass8_0.<<AddDirectoryEntryAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Main.Operation.Common.SingleRunner.<>c__DisplayClass5_0.<<RunOnMain>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Main.Operation.Common.SingleRunner.DoRunOnMain[T](Func`1 method)
   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.AddFolderToOutputAsync(String filename, DateTime lastModified, IMetahash meta, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.ProcessMetadata(ISourceProviderEntry entry, FileAttributes attributes, DateTime lastwrite, Options options, IMetahash emptymetadata, BackupDatabase database, IWriteChannel`1 streamblockchannel, 

Rest of the report is here: Duplicati Errors - Pastebin.com

Windows 10, b2 backend. 2 of 3 backups fail as reported earlier. 1 backup runs without error.

2 Linux systems, b2 backend. No issues so far.

Installed it, imported B2 job from 2.1.1.101. The old and new GUI Destination tests give:

Failed to connect: error-id:TestPreparationError, user-information:Error listing content: Backblaze ErrorResponse: 401 - bad_auth_token

Checked an Export As Command-line and saw plausible credentials. Can’t easily get the internal credentials the connection test uses, but the Destination URL displays all end in:

&auth-password=*************** (and those asterisks aren’t me redacting password)

Verify button works, so there are good credentials in there. Backup starts, then fails later without a job log, and with a pretty odd looking server log. I’m not sure what this is about:

System.FormatException: Input string was not in a correct format. Failure to parse near offset 2. Expected an ASCII digit.
   at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at Duplicati.Library.Main.Database.ExtensionMethods.GetPrintableCommandText(IDbCommand self)
   at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64Async(SqliteCommand self, Boolean writeLog, String cmd, Dictionary`2 values, Int64 defaultvalue, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddFile(Int64 pathprefixid, String filename, DateTime lastmodified, Int64 blocksetID, Int64 metadataID, CancellationToken token)
   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddFile(String filename, DateTime lastmodified, Int64 blocksetID, Int64 metadataID, CancellationToken token)
   at Duplicati.Library.Main.Database.LocalBackupDatabase.AddDirectoryEntry(String path, Int64 metadataID, DateTime lastmodified, CancellationToken token)
   at Duplicati.Library.Main.Operation.Backup.BackupDatabase.<>c__DisplayClass8_0.<<AddDirectoryEntryAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Main.Operation.Common.SingleRunner.<>c__DisplayClass5_0.<<RunOnMain>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Main.Operation.Common.SingleRunner.DoRunOnMain[T](Func`1 method)
   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.AddFolderToOutputAsync(String filename, DateTime lastModified, IMetahash meta, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.ProcessMetadata(ISourceProviderEntry entry, FileAttributes attributes, DateTime lastwrite, Options options, IMetahash emptymetadata, BackupDatabase database, IWriteChannel`1 streamblockchannel, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.<>c__DisplayClass2_0.<<Run>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at CoCoL.AutomationExtensions.RunTask[T](T channels, Func`2 method, Boolean catchRetiredExceptions)
   at Duplicati.Library.Main.Operation.BackupHandler.RunMainOperation(Channels channels, ISourceProvider source, UsnJournalService journalService, BackupDatabase database, IBackendManager backendManager, BackupStatsCollector stats, Options options, IFilter filter, BackupResults result, ITaskReader taskreader, Int64 filesetid, Int64 lastfilesetid)
   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)
   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)
   at Duplicati.Library.Main.Controller.<>c__DisplayClass22_0.<<Backup>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Utility.Utility.Await(Task task)
   at Duplicati.Library.Main.Controller.RunAction[T](T result, String[]& paths, IFilter& filter, Func`3 method)
   at Duplicati.Library.Main.Controller.Backup(String[] inputsources, IFilter filter)
   at Duplicati.Server.Runner.RunInternal(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IRunnerData data, Boolean fromQueue)

My run-script-after failed to recreate the database from (unchanged?) rclone sync.

The operation Repair has failed => Detected non-empty blocksets with no associated blocks!

Running from CLI, this repair gives floods of complaints some like the above one, e.g.:

Input string was not in a correct format. Failure to parse near offset 2. Expected an ASCII digit.

2.1.1.101 on an identical command line finished the repair (DB recreate) quietly and well.

EDIT 1:

There seems to be a new intolerance to curly braces. If I make a short text file at path

C:\backup source\{curly braces}\short.txt

2025-09-23 20:06:02 -04 - [Warning-Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.FileEntry-ProcessingMetadataFailed]: Failed to process path: C:\backup source\{curly braces}\short.txt FormatException: Input string was not in a correct format. Failure to parse near offset 19. Expected an ASCII digit.

If I Export As Command-line and run it in 2.1.1.101, backup works. 2.1.1.102 Recreate:

Detected non-empty blocksets with no associated blocks!

Profiling log:

2025-09-23 20:09:52 -04 - [Warning-Duplicati.Library.Main.Operation.RecreateDatabaseHandler-FileEntryProcessingFailed]: Failed to process file-entry: C:\backup source\{curly braces}\
System.FormatException: Input string was not in a correct format. Failure to parse near offset 2. Expected an ASCII digit.
   at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at Duplicati.Library.Main.Database.ExtensionMethods.GetPrintableCommandText(IDbCommand self)
   at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64Async(SqliteCommand self, Boolean writeLog, String cmd, Dictionary`2 values, Int64 defaultvalue, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Database.LocalRecreateDatabase.AddEntry(Int64 filesetid, Int64 pathprefixid, String path, DateTime time, Int64 blocksetid, Int64 metadataid, CancellationToken token)
   at Duplicati.Library.Main.Database.LocalRecreateDatabase.AddDirectoryEntry(Int64 filesetid, Int64 pathprefixid, String path, DateTime time, Int64 metadataid, CancellationToken token)
   at Duplicati.Library.Main.Operation.RecreateDatabaseHandler.RecreateFilesetFromRemoteList(LocalRecreateDatabase restoredb, ICompression compressor, Int64 filesetid, Options options, IFilter filter, CancellationToken cancellationToken)
2025-09-23 20:09:52 -04 - [Warning-Duplicati.Library.Main.Operation.RecreateDatabaseHandler-FileEntryProcessingFailed]: Failed to process file-entry: C:\backup source\{curly braces}\short.txt
System.FormatException: Input string was not in a correct format. Failure to parse near offset 19. Expected an ASCII digit.
   at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at System.String.FormatHelper(IFormatProvider provider, String format, ReadOnlySpan`1 args)
   at Duplicati.Library.Main.Database.ExtensionMethods.GetPrintableCommandText(IDbCommand self)
   at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64Async(SqliteCommand self, Boolean writeLog, String cmd, Dictionary`2 values, Int64 defaultvalue, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Database.LocalDatabase.GetOrCreatePathPrefix(String prefix, CancellationToken token)
   at Duplicati.Library.Main.Operation.RecreateDatabaseHandler.RecreateFilesetFromRemoteList(LocalRecreateDatabase restoredb, ICompression compressor, Int64 filesetid, Options options, IFilter filter, CancellationToken cancellationToken)

EDIT 2:

Easier than looking for password inside C# code is to run browser development tools.
The test request passed to the server sent in a URL with asterisks for its password.

I did the test with the new version, first anomaly:

The message window exits the screen. The browser window is “full screen”. Below is the cut message.

2025-09-23 19:45:58 +02 - [Warning-Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.FileEntry-ProcessingMetadataFailed]: Failed to process path: C:\Portable App\PortableApps\FirefoxPortable\Data\profile\features\{25885681-f776-4335-877b-e8b0cd3e7f5e}\webcompat@mozilla.org.xpi FormatException: Input string was not in a correct format. Failure to parse near offset 76. Format item ends prematurely.


Failed to parse response Method: DELETE, RequestUri: 'https://my.microsoftpersonalcontent.com/personal/2113006cdd4f5280/_api/v2.0/drive/items/01KUQJT6BDHDNCWJALLFAINVAGR2WVI3N2/uploadSession?guid='aa443218-ce53-47ec-9b75-e3caf2cac1f1'&overwrite=True&rename=False&dc=0&tempauth=v1e.eyJzaXRlaWQiOiJjZDgxMDc1ZS02ZDAwLTRhMmQtYTQzNy1hNjY4ZDFiZWI2YTciLCJhcHBfZGlzcGxheW5hbWUiOiJEdXBsaWNhdGkiLCJhcHBpZCI6IjE1MzQ5ODM3LTFjOTktNDZjMy05YzIxLWY1OGMzN2E3NDk4NSIsImF1ZCI6IjAwMDAwMDAzLTAwMDAtMGZmMS1jZTAwLTAwMDAwMDAwMDAwMC9teS5taWNyb3NvZnRwZXJzb25hbGNvbnRlbnQuY29tQDkxODgwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsImV4cCI6IjE3NTg3MzYzNTQifQ.6nlt_VgMZ1o0PA6L3C8TZPHF6c_vRXLzIZPQQjHJoh86EMs75iC-02Vky5crq_hclMSDfyfsWiOLx_fa66LZW_dsNXsIidnlROoNsaGTgJDYzVDByfyErEc9NmA2usiL47iSGp-dtc_sJ7Z62k4w9cFB2t1Ch03Sh9vJ80PzGLpEAzUk_V8QX3Jag-fPvZXvurWWwKhfZnFesLAJVMUEjbL0d5v3I0PZC_oCLWfrWy7Yl2CjiD3J4gzlGcWEe8sO4KcrFfoSm5L_seEdCYtQMqU7UbphDfe4bLoLKOjOt43UctstxHa-C13smTqwvdeA_f0Q4CMsLMaW1YRN4hL0vtty0v2JSvt6SXMzrRu8ygRO1Sj1P7QEg-OteKgtspH02nGdGwZ0k-WQ__RT9k_8tes8gI-_P5kbNGglOAK9ter7vl7qc41S1HTu8JMWmicEwhjRHZ6BWfA1FBEj2tlpuw.OlXbMXlypgtAR2CSOEjwo12GLl5Awom3uG8mXEQaxv8', Version: 1.1, Content: <null>, Headers: { User-Agent: Duplicati/2.1.1.102 traceparent: 00-2b9ba0007e4d5646af1fa30172b53439-3c789efe92059d06-00 } StatusCode: 204, ReasonPhrase: 'No Content', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers: { Cache-Control: no-cache, no-store Pragma: no-cache P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI" IsOCDI: 0 X-NetworkStatistics: 1,4194720,9,122,4645725,4204800,4204800,8498 X-SharePointHealthScore: 2 X-SP-SERVERSTATE: ReadOnly=0 ODATA-VERSION: 4.0 SPClientServiceRequestDuration: 124 X-AspNet-Version: 4.0.30319 X-DataBoundary: EU X-1DSCollectorUrl: https://eu-mobile.events.data.microsoft.com/OneCollector/1.0/ X-AriaCollectorURL: https://eu-mobile.events.data.microsoft.com/Collector/3.0/ SPRequestGuid: 1f9ec8a1-c0f9-e000-275a-2af83011db0c request-id: 1f9ec8a1-c0f9-e000-275a-2af83011db0c MS-CV: ocieH/nAAOAnWir4MBHbDA.0 SPLogId: 1f9ec8a1-c0f9-e000-275a-2af83011db0c SPRequestDuration: 156 Strict-Transport-Security: max-age=31536000 X-Frame-Options: SAMEORIGIN Content-Security-Policy: frame-ancestors 'self' teams.microsoft.com *.teams.microsoft.com *.skype.com *.teams.microsoft.us local.teams.office.com teams.cloud.microsoft teams.live.com *.teams.live.com *.office365.com goals.cloud.microsoft *.powerapps.com *.powerbi.com *.yammer.com engage.cloud.microsoft word.cloud.microsoft excel.cloud.microsoft powerpoint.cloud.microsoft *.officeapps.live.com *.office.com *.microsoft365.com m365.cloud.microsoft *.cloud.microsoft *.stream.azure-test.net *.dynamics.com *.microsoft.com onedrive.live.com *.onedrive.live.com securebroker.sharepointonline.com; X-Powered-By: ASP.NET MicrosoftSharePointTeamServices: 16.0.0.26510 X-Content-Type-Options: nosniff X-MS-InvokeApp: 1; RequireReadOnly X-Cache: CONFIG_NOCACHE X-MSEdge-Ref: Ref A: 7D690B257A8D4732A82F16940D4F22D8 Ref B: LON21EDGE2808 Ref C: 2025-09-23T17:53:04Z Date: Tue, 23 Sep 2025 17:53:04 GMT Expires: -1 } <error reading body>: The stream was already consumed. It cannot be read again.

Below is the log for the problem with OneDrive, let’s see if we now understand who is causing it:

Duplicati.Library.Backend.MicrosoftGraph.MicrosoftGraphException: Failed to parse response
Method: DELETE, RequestUri: 'https://my.microsoftpersonalcontent.com/personal/2113006cdd4f5280/_api/v2.0/drive/items/01KUQJT6BDHDNCWJALLFAINVAGR2WVI3N2/uploadSession?guid='aa443218-ce53-47ec-9b75-e3caf2cac1f1'&overwrite=True&rename=False&dc=0&tempauth=v1e.eyJzaXRlaWQiOiJjZDgxMDc1ZS02ZDAwLTRhMmQtYTQzNy1hNjY4ZDFiZWI2YTciLCJhcHBfZGlzcGxheW5hbWUiOiJEdXBsaWNhdGkiLCJhcHBpZCI6IjE1MzQ5ODM3LTFjOTktNDZjMy05YzIxLWY1OGMzN2E3NDk4NSIsImF1ZCI6IjAwMDAwMDAzLTAwMDAtMGZmMS1jZTAwLTAwMDAwMDAwMDAwMC9teS5taWNyb3NvZnRwZXJzb25hbGNvbnRlbnQuY29tQDkxODgwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsImV4cCI6IjE3NTg3MzYzNTQifQ.6nlt_VgMZ1o0PA6L3C8TZPHF6c_vRXLzIZPQQjHJoh86EMs75iC-02Vky5crq_hclMSDfyfsWiOLx_fa66LZW_dsNXsIidnlROoNsaGTgJDYzVDByfyErEc9NmA2usiL47iSGp-dtc_sJ7Z62k4w9cFB2t1Ch03Sh9vJ80PzGLpEAzUk_V8QX3Jag-fPvZXvurWWwKhfZnFesLAJVMUEjbL0d5v3I0PZC_oCLWfrWy7Yl2CjiD3J4gzlGcWEe8sO4KcrFfoSm5L_seEdCYtQMqU7UbphDfe4bLoLKOjOt43UctstxHa-C13smTqwvdeA_f0Q4CMsLMaW1YRN4hL0vtty0v2JSvt6SXMzrRu8ygRO1Sj1P7QEg-OteKgtspH02nGdGwZ0k-WQ__RT9k_8tes8gI-_P5kbNGglOAK9ter7vl7qc41S1HTu8JMWmicEwhjRHZ6BWfA1FBEj2tlpuw.OlXbMXlypgtAR2CSOEjwo12GLl5Awom3uG8mXEQaxv8', Version: 1.1, Content: <null>, Headers:
{
  User-Agent: Duplicati/2.1.1.102
  traceparent: 00-2b9ba0007e4d5646af1fa30172b53439-3c789efe92059d06-00
}
StatusCode: 204, ReasonPhrase: 'No Content', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
  Cache-Control: no-cache, no-store
  Pragma: no-cache
  P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
  IsOCDI: 0
  X-NetworkStatistics: 1,4194720,9,122,4645725,4204800,4204800,8498
  X-SharePointHealthScore: 2
  X-SP-SERVERSTATE: ReadOnly=0
  ODATA-VERSION: 4.0
  SPClientServiceRequestDuration: 124
  X-AspNet-Version: 4.0.30319
  X-DataBoundary: EU
  X-1DSCollectorUrl: https://eu-mobile.events.data.microsoft.com/OneCollector/1.0/
  X-AriaCollectorURL: https://eu-mobile.events.data.microsoft.com/Collector/3.0/
  SPRequestGuid: 1f9ec8a1-c0f9-e000-275a-2af83011db0c
  request-id: 1f9ec8a1-c0f9-e000-275a-2af83011db0c
  MS-CV: ocieH/nAAOAnWir4MBHbDA.0
  SPLogId: 1f9ec8a1-c0f9-e000-275a-2af83011db0c
  SPRequestDuration: 156
  Strict-Transport-Security: max-age=31536000
  X-Frame-Options: SAMEORIGIN
  Content-Security-Policy: frame-ancestors 'self' teams.microsoft.com *.teams.microsoft.com *.skype.com *.teams.microsoft.us local.teams.office.com teams.cloud.microsoft teams.live.com *.teams.live.com *.office365.com goals.cloud.microsoft *.powerapps.com *.powerbi.com *.yammer.com engage.cloud.microsoft word.cloud.microsoft excel.cloud.microsoft powerpoint.cloud.microsoft *.officeapps.live.com *.office.com *.microsoft365.com m365.cloud.microsoft *.cloud.microsoft *.stream.azure-test.net *.dynamics.com *.microsoft.com onedrive.live.com *.onedrive.live.com securebroker.sharepointonline.com;
  X-Powered-By: ASP.NET
  MicrosoftSharePointTeamServices: 16.0.0.26510
  X-Content-Type-Options: nosniff
  X-MS-InvokeApp: 1; RequireReadOnly
  X-Cache: CONFIG_NOCACHE
  X-MSEdge-Ref: Ref A: 7D690B257A8D4732A82F16940D4F22D8 Ref B: LON21EDGE2808 Ref C: 2025-09-23T17:53:04Z
  Date: Tue, 23 Sep 2025 17:53:04 GMT
  Expires: -1
}
<error reading body>: The stream was already consumed. It cannot be read again.
   at Duplicati.Library.Backend.MicrosoftGraphBackend.ParseResponseAsync[T](HttpResponseMessage response, CancellationToken cancelToken)
   at Duplicati.Library.Backend.MicrosoftGraphBackend.ThrowUploadSessionException(UploadSession uploadSession, HttpResponseMessage createSessionResponse, Int32 fragment, Int32 fragmentCount, Exception ex, CancellationToken cancelToken)
   at Duplicati.Library.Backend.MicrosoftGraphBackend.PutAsync(String remotename, Stream stream, CancellationToken cancelToken)
   at Duplicati.Library.Main.Backend.BackendManager.PutOperation.PerformUpload(IBackend backend, String hash, Int64 size, CancellationToken cancelToken)
   at Duplicati.Library.Main.Backend.BackendManager.PutOperation.ExecuteAsync(IBackend backend, CancellationToken cancelToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.Execute[TResult](PendingOperation`1 op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.Execute(PendingOperationBase op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.ExecuteWithRetry(PendingOperationBase op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.ExecuteWithRetry(PendingOperationBase op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.ReclaimCompletedTasks(List`1 tasks)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.EnsureAtMostNActiveTasks(Int32 n, List`1 tasks)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.EnsureAtMostNActiveTasks(Int32 uploads, Int32 downloads)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.Run(IReadChannel`1 requestChannel)
   at Duplicati.Library.Main.Backend.BackendManager.PutAsync(VolumeWriterBase volume, IndexVolumeWriter indexVolume, Func`1 indexVolumeFinished, Boolean waitForComplete, Func`1 onDbUpdate, CancellationToken cancelToken)
   at Duplicati.Library.Main.Operation.Backup.DataBlockProcessor.<>c__DisplayClass0_0.<<Run>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Main.Operation.Backup.DataBlockProcessor.<>c__DisplayClass0_0.<<Run>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at CoCoL.AutomationExtensions.RunTask[T](T channels, Func`2 method, Boolean catchRetiredExceptions)
   at Duplicati.Library.Main.Operation.BackupHandler.RunMainOperation(Channels channels, ISourceProvider source, UsnJournalService journalService, BackupDatabase database, IBackendManager backendManager, BackupStatsCollector stats, Options options, IFilter filter, BackupResults result, ITaskReader taskreader, Int64 filesetid, Int64 lastfilesetid)
   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)
   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)
   at Duplicati.Library.Main.Controller.<>c__DisplayClass22_0.<<Backup>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Utility.Utility.Await(Task task)
   at Duplicati.Library.Main.Controller.RunAction[T](T result, String[]& paths, IFilter& filter, Func`3 method)
   at Duplicati.Library.Main.Controller.Backup(String[] inputsources, IFilter filter)
   at Duplicati.Server.Runner.RunInternal(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IRunnerData data, Boolean fromQueue)
Duplicati.Library.Backend.MicrosoftGraph.MicrosoftGraphException: Failed to parse response
Method: DELETE, RequestUri: 'https://my.microsoftpersonalcontent.com/personal/2113006cdd4f5280/_api/v2.0/drive/items/01KUQJT6BDHDNCWJALLFAINVAGR2WVI3N2/uploadSession?guid='aa443218-ce53-47ec-9b75-e3caf2cac1f1'&overwrite=True&rename=False&dc=0&tempauth=v1e.eyJzaXRlaWQiOiJjZDgxMDc1ZS02ZDAwLTRhMmQtYTQzNy1hNjY4ZDFiZWI2YTciLCJhcHBfZGlzcGxheW5hbWUiOiJEdXBsaWNhdGkiLCJhcHBpZCI6IjE1MzQ5ODM3LTFjOTktNDZjMy05YzIxLWY1OGMzN2E3NDk4NSIsImF1ZCI6IjAwMDAwMDAzLTAwMDAtMGZmMS1jZTAwLTAwMDAwMDAwMDAwMC9teS5taWNyb3NvZnRwZXJzb25hbGNvbnRlbnQuY29tQDkxODgwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsImV4cCI6IjE3NTg3MzYzNTQifQ.6nlt_VgMZ1o0PA6L3C8TZPHF6c_vRXLzIZPQQjHJoh86EMs75iC-02Vky5crq_hclMSDfyfsWiOLx_fa66LZW_dsNXsIidnlROoNsaGTgJDYzVDByfyErEc9NmA2usiL47iSGp-dtc_sJ7Z62k4w9cFB2t1Ch03Sh9vJ80PzGLpEAzUk_V8QX3Jag-fPvZXvurWWwKhfZnFesLAJVMUEjbL0d5v3I0PZC_oCLWfrWy7Yl2CjiD3J4gzlGcWEe8sO4KcrFfoSm5L_seEdCYtQMqU7UbphDfe4bLoLKOjOt43UctstxHa-C13smTqwvdeA_f0Q4CMsLMaW1YRN4hL0vtty0v2JSvt6SXMzrRu8ygRO1Sj1P7QEg-OteKgtspH02nGdGwZ0k-WQ__RT9k_8tes8gI-_P5kbNGglOAK9ter7vl7qc41S1HTu8JMWmicEwhjRHZ6BWfA1FBEj2tlpuw.OlXbMXlypgtAR2CSOEjwo12GLl5Awom3uG8mXEQaxv8', Version: 1.1, Content: <null>, Headers:
{
  User-Agent: Duplicati/2.1.1.102
  traceparent: 00-2b9ba0007e4d5646af1fa30172b53439-3c789efe92059d06-00
}
StatusCode: 204, ReasonPhrase: 'No Content', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
  Cache-Control: no-cache, no-store
  Pragma: no-cache
  P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
  IsOCDI: 0
  X-NetworkStatistics: 1,4194720,9,122,4645725,4204800,4204800,8498
  X-SharePointHealthScore: 2
  X-SP-SERVERSTATE: ReadOnly=0
  ODATA-VERSION: 4.0
  SPClientServiceRequestDuration: 124
  X-AspNet-Version: 4.0.30319
  X-DataBoundary: EU
  X-1DSCollectorUrl: https://eu-mobile.events.data.microsoft.com/OneCollector/1.0/
  X-AriaCollectorURL: https://eu-mobile.events.data.microsoft.com/Collector/3.0/
  SPRequestGuid: 1f9ec8a1-c0f9-e000-275a-2af83011db0c
  request-id: 1f9ec8a1-c0f9-e000-275a-2af83011db0c
  MS-CV: ocieH/nAAOAnWir4MBHbDA.0
  SPLogId: 1f9ec8a1-c0f9-e000-275a-2af83011db0c
  SPRequestDuration: 156
  Strict-Transport-Security: max-age=31536000
  X-Frame-Options: SAMEORIGIN
  Content-Security-Policy: frame-ancestors 'self' teams.microsoft.com *.teams.microsoft.com *.skype.com *.teams.microsoft.us local.teams.office.com teams.cloud.microsoft teams.live.com *.teams.live.com *.office365.com goals.cloud.microsoft *.powerapps.com *.powerbi.com *.yammer.com engage.cloud.microsoft word.cloud.microsoft excel.cloud.microsoft powerpoint.cloud.microsoft *.officeapps.live.com *.office.com *.microsoft365.com m365.cloud.microsoft *.cloud.microsoft *.stream.azure-test.net *.dynamics.com *.microsoft.com onedrive.live.com *.onedrive.live.com securebroker.sharepointonline.com;
  X-Powered-By: ASP.NET
  MicrosoftSharePointTeamServices: 16.0.0.26510
  X-Content-Type-Options: nosniff
  X-MS-InvokeApp: 1; RequireReadOnly
  X-Cache: CONFIG_NOCACHE
  X-MSEdge-Ref: Ref A: 7D690B257A8D4732A82F16940D4F22D8 Ref B: LON21EDGE2808 Ref C: 2025-09-23T17:53:04Z
  Date: Tue, 23 Sep 2025 17:53:04 GMT
  Expires: -1
}
<error reading body>: The stream was already consumed. It cannot be read again.
   at Duplicati.Library.Backend.MicrosoftGraphBackend.ParseResponseAsync[T](HttpResponseMessage response, CancellationToken cancelToken)
   at Duplicati.Library.Backend.MicrosoftGraphBackend.ThrowUploadSessionException(UploadSession uploadSession, HttpResponseMessage createSessionResponse, Int32 fragment, Int32 fragmentCount, Exception ex, CancellationToken cancelToken)
   at Duplicati.Library.Backend.MicrosoftGraphBackend.PutAsync(String remotename, Stream stream, CancellationToken cancelToken)
   at Duplicati.Library.Main.Backend.BackendManager.PutOperation.PerformUpload(IBackend backend, String hash, Int64 size, CancellationToken cancelToken)
   at Duplicati.Library.Main.Backend.BackendManager.PutOperation.ExecuteAsync(IBackend backend, CancellationToken cancelToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.Execute[TResult](PendingOperation`1 op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.Execute(PendingOperationBase op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.ExecuteWithRetry(PendingOperationBase op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.ExecuteWithRetry(PendingOperationBase op, CancellationToken cancellationToken)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.ReclaimCompletedTasks(List`1 tasks)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.EnsureAtMostNActiveTasks(Int32 n, List`1 tasks)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.EnsureAtMostNActiveTasks(Int32 uploads, Int32 downloads)
   at Duplicati.Library.Main.Backend.BackendManager.Handler.Run(IReadChannel`1 requestChannel)
   at Duplicati.Library.Main.Backend.BackendManager.PutAsync(VolumeWriterBase volume, IndexVolumeWriter indexVolume, Func`1 indexVolumeFinished, Boolean waitForComplete, Func`1 onDbUpdate, CancellationToken cancelToken)
   at Duplicati.Library.Main.Operation.Backup.DataBlockProcessor.<>c__DisplayClass0_0.<<Run>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Main.Operation.Backup.DataBlockProcessor.<>c__DisplayClass0_0.<<Run>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at CoCoL.AutomationExtensions.RunTask[T](T channels, Func`2 method, Boolean catchRetiredExceptions)
   at Duplicati.Library.Main.Operation.BackupHandler.RunMainOperation(Channels channels, ISourceProvider source, UsnJournalService journalService, BackupDatabase database, IBackendManager backendManager, BackupStatsCollector stats, Options options, IFilter filter, BackupResults result, ITaskReader taskreader, Int64 filesetid, Int64 lastfilesetid)
   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)
   at Duplicati.Library.Main.Operation.BackupHandler.RunAsync(String[] sources, IBackendManager backendManager, IFilter filter)
   at Duplicati.Library.Main.Controller.<>c__DisplayClass22_0.<<Backup>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Library.Utility.Utility.Await(Task task)
   at Duplicati.Library.Main.Controller.RunAction[T](T result, String[]& paths, IFilter& filter, Func`3 method)
   at Duplicati.Library.Main.Controller.Backup(String[] inputsources, IFilter filter)
   at Duplicati.Server.Runner.RunInternal(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IRunnerData data, Boolean fromQueue)
   at Duplicati.Server.Runner.Run(Connection databaseConnection, EventPollNotify eventPollNotify, INotificationUpdateService notificationUpdateService, IProgressStateProviderService progressStateProviderService, IApplicationSettings applicationSettings, IQueuedTask data, Boolean fromQueue)
   at Duplicati.WebserverCore.Services.QueueRunnerService.RunTask(IQueuedTask task)

Why don’t failed backups appear under the job that failed? The notification takes you there, yet I had to go into About to find the log for the job I reported before:

If this means something like the below, I have 76 of them in my log:

2025-09-23 18:56:08 -04 - [Error-Duplicati.Server.Program-UnobservedTaskException]: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (The CancellationTokenSource has been disposed.)
System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (The CancellationTokenSource has been disposed.)
 ---> System.ObjectDisposedException: The CancellationTokenSource has been disposed.
   at Duplicati.Server.Runner.<>c__DisplayClass16_2.<<RunInternal>b__3>d.MoveNext()
   --- End of inner exception stack trace ---

I got clues for Test connection, DB recreate, and backup errors. Please see edits above.

Fedora 42, b2 backend:

2025-09-24 02:10:12 -04 - [Warning-Duplicati.Library.Main.Operation.Backup.MetadataPreProcess.FileEntry-ProcessingMetadataFailed]: Failed to process path: /home/xxxx/.mozilla/firefox/Profiles/xxxxxx.default/features/{beabd8f7-85b5-4b69-a991-ce375688a70f}/data-leak-blocker@mozilla.com.xpi
FormatException: Input string was not in a correct format. Failure to parse near offset 67. Expected an ASCII digit.

As it is just a warning the backup is successful.

My updated Windows 10 system still errors out on 2 of 3 backups as previously posted.

@jberry02, @Taomyn, @Folgore101, and @ts678: Thanks for reporting the error:

That method is called on every one of the tests.

But never with a path that has curly braces…

Essentially, this is the logging update that is calling the wrong formatting method. I have a fix ready.

I think this is related to the formatting error.

That is because the test command is using the masked input directly. I will fix it.

Yes, the idea is to prevent leaking passwords by masking the contents sent to the UI. But it is a little annoying from a debugging perspective.