Early preview of .Net8 based packages, codename `debug-2.0.8.100`

As announced in the latest canary, the plan is to move to .Net8 builds going forward.
For those that want to help out or try the very latest, I have prepared a set of builds that use the .Net8 build & package process.

For all the packages, I have made the absolute minimum testing, and the packages are intended to be used for testing the build/package process for each platform, NOT for running backups.

A new update is that the packages use Avalonia for the UI part. For Windows, MacOS, and Ubuntu, this should work without any extra steps. For other Linux installs, the following packages are needed: libice6 libsm6 libfontconfig1.

As a new thing, there are also builds with no UI components, and these require no additional packages (all is bundled).

For Windows users, the new versions of SQLite no longer support the deprecated RC4 encryption. Current builds (.Net4 based) can decrypt the Duplicati-server.sqlite file used by the UI, but the new builds cannot. I have prepared a decrypt tool from the .Net4 line:

The filenames are named after operating system, chip architecture and intended use, e.g. linux-x64-gui.
The -gui builds also include the cli executable.

The suffix denotes the installer type:

  • .zip: Generally just the files, zipped.
  • .deb: Debian package
  • .rpm: RPM package
  • .pkg, .dmg: MacOS packages
  • .msi: Windows Installer

The packages are:

For Docker users, the images are pushed with the Debug and 2.0.8.100 tags:

If you are adventurous enough to try any of the packages, please report any findings here or as an issue on Github. I will spend the next few days testing all the packages on various platforms.

The links don’t point to what they claim to point to. Workaround is a do-it-yourself link edit from text.

Thanks for pointing it out, I have fixed the links!

The package architecture of at least 2.0.8.100_debug_2024-04-04-linux-x64-gui.deb is rejected by Linux Mint (a Ubuntu derivative). I tried a GUI install from the file manager. I think this from gdebi:

image

$ dpkg-deb --info 2.0.8.100_debug_2024-04-04-linux-x64-gui.deb
 new Debian package, version 2.0.
 size 53901410 bytes: control archive=844 bytes.
     179 bytes,     6 lines      changelog            
    1016 bytes,    23 lines      control              
 Source: duplicati
 Section: utils
 Priority: extra
 Maintainer: Kenneth Skovhede <kenneth@duplicati.com>
 Build-Depends: debhelper (>= 9.0.0)
 Standards-Version: 3.9.4
 Homepage: http://duplicati.com
 Vcs-Git: https://github.com/duplicati/duplicati.git
 Package: duplicati
 Architecture: x64
...
$ dpkg --print-architecture
amd64

EDIT:

Chapter 2. Debian package management gives examples, and links to a list of architectures.
I think Duplicati used to claim Architecture: all, sort of justifiably thanks to mono helping.

Yes, exactly. I have updated with 2.0.8.101.deb packages that have the right Debian-style architecture names.

45 minutes later, new files seem to not be there, or maybe are empty files.
Server seems configured to not 404 on totally bad URLs, for some reason.

It was a cache thing. They are there now.
The 404 is returned, but there is no placeholder page.

Interestingly, Edge makes a display – " This updates.duplicati.com page can’t be found" etc…
Firefox shows an unhelpful empty page. Oh well. Anyway, install let me view files beforehand.
Seeing some more things in /usr/bin was a little exciting – until I saw where they’re pointed at.

$ ls -lcrt /usr/bin/duplicati*
lrwxrwxrwx 1 root root 123 Apr  4 14:12 /usr/bin/duplicati-server -> /Users/kenneth/Developer/duplicati/ReleaseBuilder/build-temp/deb/duplicati-2.0.8.101_x64/usr/lib/duplicati/Duplicati.Server
lrwxrwxrwx 1 root root 141 Apr  4 14:12 /usr/bin/duplicati-recovery-tool -> /Users/kenneth/Developer/duplicati/ReleaseBuilder/build-temp/deb/duplicati-2.0.8.101_x64/usr/lib/duplicati/Duplicati.CommandLine.RecoveryTool
lrwxrwxrwx 1 root root 128 Apr  4 14:12 /usr/bin/duplicati-cli -> /Users/kenneth/Developer/duplicati/ReleaseBuilder/build-temp/deb/duplicati-2.0.8.101_x64/usr/lib/duplicati/Duplicati.CommandLine
lrwxrwxrwx 1 root root 140 Apr  4 14:12 /usr/bin/duplicati-backend-tool -> /Users/kenneth/Developer/duplicati/ReleaseBuilder/build-temp/deb/duplicati-2.0.8.101_x64/usr/lib/duplicati/Duplicati.CommandLine.BackendTool
lrwxrwxrwx 1 root root 142 Apr  4 14:12 /usr/bin/duplicati-backend-tester -> /Users/kenneth/Developer/duplicati/ReleaseBuilder/build-temp/deb/duplicati-2.0.8.101_x64/usr/lib/duplicati/Duplicati.CommandLine.BackendTester
lrwxrwxrwx 1 root root 129 Apr  4 14:12 /usr/bin/duplicati -> /Users/kenneth/Developer/duplicati/ReleaseBuilder/build-temp/deb/duplicati-2.0.8.101_x64/usr/lib/duplicati/Duplicati.GUI.TrayIcon

I’m also not seeing the systemd unit file or a new /etc/default/duplicati (if the latter is still used).

$ /usr/lib/duplicati/Duplicati.CommandLine.RecoveryTool
Program crashed: 
System.ArgumentNullException: Value cannot be null. (Parameter 'stream')
   at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean leaveOpen)
   at Duplicati.CommandLine.RecoveryTool.Help.Run(List`1 args, Dictionary`2 options, IFilter filter)
   at Duplicati.CommandLine.RecoveryTool.Program.Main(String[] _args)

Server comes up and process stays up, but GUI comes partly up, disconnects and Server spews errors onto my terminal because I started it that way. I can post a few if that becomes necessary.

EDIT:

It seems to connect, fail instantly, cycle. Although the start was different, the repeating pattern is:

Newtonsoft.Json.JsonSerializationException: Error getting value from 'UpdateDownloadLink' on 'Duplicati.Server.Serializable.ServerStatus'.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetGenericUpdatePageUrl(String packageTypeId)
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetUpdateUrls(String packageTypeId)
   at Duplicati.Server.Serializable.ServerStatus.get_UpdateDownloadLink()
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   --- End of inner exception stack trace ---
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Duplicati.Server.Serialization.Serializer.SerializeJsonAsync(TextWriter tw, Object o, Boolean preventDispose)
   at Duplicati.Server.WebServer.BodyWriter.<>c__DisplayClass8_0.<<WriteJsonObject>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Server.WebServer.BodyWriter.WriteJsonObject(Object o)
   at Duplicati.Server.WebServer.BodyWriter.OutputOK(Object result)
   at Duplicati.Server.WebServer.RESTMethods.RequestInfo.OutputOK(Object item)
   at Duplicati.Server.WebServer.RESTMethods.ServerState.GET(String key, RequestInfo info)
   at Duplicati.Server.WebServer.RESTHandler.DoProcess(RequestInfo info, String method, String module, String key)

Tray icon crashes. This run was after closing the GUI tab to eliminate any interference from it:

$ ./Duplicati.GUI.TrayIcon
info: Duplicati.WebserverCore.ApplicationPartsLogger[0]
      Found the following application parts: 'Duplicati.GUI.TrayIcon, Duplicati.WebserverCore' with the following controllers: 'RESTHandlerCoreController'
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:3001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /usr/lib/duplicati
Newtonsoft.Json.JsonSerializationException: Error getting value from 'UpdateDownloadLink' on 'Duplicati.Server.Serializable.ServerStatus'.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetGenericUpdatePageUrl(String packageTypeId)
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetUpdateUrls(String packageTypeId)
   at Duplicati.Server.Serializable.ServerStatus.get_UpdateDownloadLink()
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   --- End of inner exception stack trace ---
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at Duplicati.Server.Serialization.Serializer.SerializeJsonAsync(TextWriter tw, Object o, Boolean preventDispose)
   at Duplicati.Server.WebServer.BodyWriter.<>c__DisplayClass8_0.<<WriteJsonObject>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Server.WebServer.BodyWriter.WriteJsonObject(Object o)
   at Duplicati.Server.WebServer.BodyWriter.OutputOK(Object result)
   at Duplicati.Server.WebServer.RESTMethods.RequestInfo.OutputOK(Object item)
   at Duplicati.Server.WebServer.RESTMethods.ServerState.GET(String key, RequestInfo info)
   at Duplicati.Server.WebServer.RESTHandler.DoProcess(RequestInfo info, String method, String module, String key)
Request error: System.Net.WebException: The remote server returned an error: (500) Error.
   at Duplicati.Library.Utility.AsyncHttpRequest.AsyncWrapper.GetResponseOrStream()
   at Duplicati.Library.Utility.AsyncHttpRequest.GetResponse()
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequestInternal[T](String method, String endpoint, Dictionary`2 queryparams)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequest[T](String method, String urlfragment, Dictionary`2 queryparams)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.UpdateStatus()
   at Duplicati.GUI.TrayIcon.HttpServerConnection..ctor(Uri server, String password, Boolean saltedpassword, PasswordSource passwordSource, Boolean disableTrayIconLogin, Dictionary`2 options)
   at Duplicati.GUI.TrayIcon.Program.StartTray(String[] _args, Dictionary`2 options, HostedInstanceKeeper hosted, String password, Boolean saltedpassword)
Newtonsoft.Json.JsonSerializationException: Error getting value from 'UpdateDownloadLink' on 'Duplicati.Server.Serializable.ServerStatus'.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetGenericUpdatePageUrl(String packageTypeId)
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetUpdateUrls(String packageTypeId)
   at Duplicati.Server.Serializable.ServerStatus.get_UpdateDownloadLink()
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   --- End of inner exception stack trace ---
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at Duplicati.Server.Serialization.Serializer.SerializeJsonAsync(TextWriter tw, Object o, Boolean preventDispose)
   at Duplicati.Server.WebServer.BodyWriter.<>c__DisplayClass8_0.<<WriteJsonObject>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Server.WebServer.BodyWriter.WriteJsonObject(Object o)
   at Duplicati.Server.WebServer.BodyWriter.OutputOK(Object result)
   at Duplicati.Server.WebServer.RESTMethods.RequestInfo.OutputOK(Object item)
   at Duplicati.Server.WebServer.RESTMethods.ServerState.GET(String key, RequestInfo info)
   at Duplicati.Server.WebServer.RESTHandler.DoProcess(RequestInfo info, String method, String module, String key)
Request error: System.Net.WebException: The remote server returned an error: (500) Error.
   at Duplicati.Library.Utility.AsyncHttpRequest.AsyncWrapper.GetResponseOrStream()
   at Duplicati.Library.Utility.AsyncHttpRequest.GetResponse()
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequestInternal[T](String method, String endpoint, Dictionary`2 queryparams)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequest[T](String method, String urlfragment, Dictionary`2 queryparams)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.UpdateStatus()
   at Duplicati.GUI.TrayIcon.HttpServerConnection..ctor(Uri server, String password, Boolean saltedpassword, PasswordSource passwordSource, Boolean disableTrayIconLogin, Dictionary`2 options)
   at Duplicati.GUI.TrayIcon.Program.StartTray(String[] _args, Dictionary`2 options, HostedInstanceKeeper hosted, String password, Boolean saltedpassword)
Newtonsoft.Json.JsonSerializationException: Error getting value from 'UpdateDownloadLink' on 'Duplicati.Server.Serializable.ServerStatus'.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetGenericUpdatePageUrl(String packageTypeId)
   at Duplicati.Library.AutoUpdater.UpdateInfo.GetUpdateUrls(String packageTypeId)
   at Duplicati.Server.Serializable.ServerStatus.get_UpdateDownloadLink()
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   --- End of inner exception stack trace ---
   at Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(Object target)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at Duplicati.Server.Serialization.Serializer.SerializeJsonAsync(TextWriter tw, Object o, Boolean preventDispose)
   at Duplicati.Server.WebServer.BodyWriter.<>c__DisplayClass8_0.<<WriteJsonObject>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Duplicati.Server.WebServer.BodyWriter.WriteJsonObject(Object o)
   at Duplicati.Server.WebServer.BodyWriter.OutputOK(Object result)
   at Duplicati.Server.WebServer.RESTMethods.RequestInfo.OutputOK(Object item)
   at Duplicati.Server.WebServer.RESTMethods.ServerState.GET(String key, RequestInfo info)
   at Duplicati.Server.WebServer.RESTHandler.DoProcess(RequestInfo info, String method, String module, String key)
Request error: System.Net.WebException: The remote server returned an error: (500) Error.
   at Duplicati.Library.Utility.AsyncHttpRequest.AsyncWrapper.GetResponseOrStream()
   at Duplicati.Library.Utility.AsyncHttpRequest.GetResponse()
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequestInternal[T](String method, String endpoint, Dictionary`2 queryparams)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.PerformRequest[T](String method, String urlfragment, Dictionary`2 queryparams)
   at Duplicati.GUI.TrayIcon.HttpServerConnection.UpdateStatus()
   at Duplicati.GUI.TrayIcon.HttpServerConnection..ctor(Uri server, String password, Boolean saltedpassword, PasswordSource passwordSource, Boolean disableTrayIconLogin, Dictionary`2 options)
   at Duplicati.GUI.TrayIcon.Program.StartTray(String[] _args, Dictionary`2 options, HostedInstanceKeeper hosted, String password, Boolean saltedpassword)
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...

That last line is what Server said to my first Control-C, then it didn’t shut down. A second did it.

Some executables lack executable permission. I don’t know if that’s deliberate though.

Duplicati.CommandLine.ConfigurationImporter
Duplicati.CommandLine.AutoUpdater

They at least start up, if I chmod 755 them, but this may or may not be the expected result now:

$ ./Duplicati.CommandLine.AutoUpdater check
Error detected: System.Net.WebException: The remote server returned an error: (404) Not Found.
   at System.Net.HttpWebRequest.GetResponse()
   at System.Net.WebClient.GetWebResponse(WebRequest request)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream)
   at System.Net.WebClient.DownloadFile(Uri address, String fileName)
   at Duplicati.Library.AutoUpdater.UpdaterManager.CheckForUpdate(ReleaseType channel)
Error detected: System.Net.WebException: The remote server returned an error: (404) Not Found.
   at System.Net.HttpWebRequest.GetResponse()
   at System.Net.WebClient.GetWebResponse(WebRequest request)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream)
   at System.Net.WebClient.DownloadFile(Uri address, String fileName)
   at Duplicati.Library.AutoUpdater.UpdaterManager.CheckForUpdate(ReleaseType channel)
No updates found

Did we mean to ship our own SQLite? If so, is it available in all the binary flavors we’re shipping?

Yes, that is an old case where IE (and Edge) shows a “helpful” message if the 404 is small.
I think I will add a 404 content page to the server.

Arh, the OS was “fixing” my symlinks I see. I will fix it, thanks for reporting.

I assume this is the .deb package that is missing those?

Ok, it looks like I messed something up with the update checker, so it breaks in release builds.

It only assigns execute permissions to the ones in the Executables folder, so that is “on purpose” but not sure if it is correct.

That is the expected response, because the debug builds do not have an update manifest. But perhaps we should make it human readable :slight_smile: .

Right now all the packages are using the SQLite NuGet packages which includes arch-specific binaries, and it appears to be available in all the flavors (have not tested if it works with Arm7).

All reported tests so far are on the .deb because it was where I started (had a VM handy).

As an update, I dipped a toe into a Windows .zip install, clicked TrayIcon. It fails there too.
Because I didn’t do a Command Prompt startup, all I could see was errors in event viewer.

How else is one supposed to run them? I wasn’t sure if AutoUpdater died with autoupdates, however after I ran it, it looks like the outdated options were gone but relevant ones remain.

If it sticks, that may solve the issue (there’s one open) of unknown SQLite level and features, limiting our code to what was available a decade ago. Canonical just added 12 year support.

On random other comments, Windows Defender goes crazy on scanning when seeing these. Maybe signed executables would do better, but I think we’ve seen it’s not a complete answer.

Was storj-uplink.dll supposed to go away?

There’s also some JetBrains stuff and extra language files, but maybe those were intentional.

And it turned out there was some support missing for Linux-arm64 and Linux-armv7. I have made support packages for this now.

That was a mistake on my end it turns out. The binaries are now linked in.

This is now fixed with 2.0.8.103.

This is now fixed with 2.0.8.103.

That crash is now fixed, thanks for reporting.

An alternative is to use the Microsoft.Data.SQLite.Core.

This does not currently work because it does not support position argument.
We need to rewrite select * from table where id = ? into something like select * from table where id = @paramname. Given the number of convoluted queries in the codebase, this is a pretty big task with a high risk of breaking things.

That has been a problem so far; unsigned binaries are flagged as malware. That is probably a smart move :).

I don’t think so. It is used for the Storj backend and Tardigrade. But the included binary should now match the operating system, instead of spraying different versions.

I removed the Spatial library from the Azure backend, and that removed the language folders.
What JetBrains files did you find?

/usr/lib/duplicati/JetBrains.Annotations.dll

This wasn’t very clear. If storj-uplink.dll is supposed to be there somewhere, it isn’t:

$ find /usr/lib/duplicati -iname '*storj*'
/usr/lib/duplicati/webroot/ngax/templates/backends/storj.html
/usr/lib/duplicati/Duplicati.Library.Backend.Storj.dll

Arh, good catch. I think we simply need to add some more packages:

<PackageReference Include="uplink.NET.Win" Version="2.12.3328" />
<PackageReference Include="uplink.NET.Linux" Version="2.12.3328" />
<PackageReference Include="uplink.NET.Mac" Version="2.12.3328" />		

Assuming those are NuGet package references, Linux and macOS only have x64.
Windows also has x86 and arm64. I’m clicking on NuGet Package Explorer at site.
I’m not sure how much worse this all is than previously though. Still an open issue:

and an unrelated question after posting that is why mentions don’t change issues?
This used to work, but seems to have stopped working. Not sure if it was intended.

If you expand the runtimes in the package explorer you can see they have more than x64. Not sure if the Arm64 for MacOS works, but maybe @TopperDEL can fix it if not.

Time for screenshots then. Why do I not see those?

Mac:

image

Linux:

image