Posted onIntoolsWord count in article: 543Reading time ≈2 mins.
If you found yourself ever missed some hidden items or equipment/inventory, you probably do not want to start a new game. Moreover, one missable is only available during H'aanit chapter 1. It’s the very start of the game, and it’s in my case unfortunately. But I was able to fix the saves to complete both Eagle-Eyed and Collector achievements.
1. Fixing Missable Hidden Items
The save files are located in %USERPROFILE%\Documents\My Games\Octopath_Traveler\<user-id>\SaveGames\, they are in UE4 GVAS format. I have no idea what exactly the format is structured, but it seems to be a plain, binary, casscading container format. The data is not compressed, which means I can use a binary editor like imhex to modify it directly.
Now open the save you want to modify using imhex, search by string with BitFlag. Scroll down to find a binary sequence starting with DE. It is a 32-byte sequence, several hundreds of bytes before you can see EventCheckFlag section. It’s not a fixed offset, but around offset 00205B80 in most cases.
First, the Inspiriting Plum (M) only available during H'aanit chapter 1, in S'warkii of Woodlands. Modify the 29th byte to value|0x20. For me, I modified it from 0x5F to 0x7F.
Second, the Heavy Coin Pouch only available after Olberic chapter 3 but before chapter4, in Wellspring of Sunlands. Modify the 19th byte to value|0x04. For me, I modified it from 0xF8 to 0xFC.
Third, the Inspiriting Plum (M) only available during quest Arianna Again (I) & Arianna Again (II) in Trail to the Whitewood of Frostlands. Modify the 4th byte to value|0x80. For me, I modified it from 0x03 to 0x83.
Now, open the modified save, travel to these maps. Hidden items are revealed directly, no more information gleaning.
I did collect Sleepweed and Olive Bloom in Clearbrook of Riverlands. If you have missed them, continue reading the 3rd part of the article.
2. Fixing Missable Equipment/Inventory
Open the save you want to modify using imhex, search by string with ItemFlag. Scroll down to find last 2 byte sequences before you can see FreeFlag section. It’s not a fixed offset, but around offset 002082B0 in most cases.
First, Obsidian Garb only can be stolen in boss fight of Primrose chaper 3. Modify the 4th byte in the 2nd last byte sequence to value|0x04. For me, I modified it from 0xFB to 0xFF.
Second, Physical Belt and Mental Belt can be stolen in boss fight of Primrose chaper 4. Though they can also be collected via challenge and provoke. Modify the 2nd byte in the last byte sequence to value|0xC0(0x40 for Physical Belt and 0x80 for Mental Belt). For me, I modified it from 0xBF to 0xFF. See the screenshot for reference(red marked).
The byte changes only affect achievement. You do not actually own them in your inventory. You can add them to your inventory by using OctopathTraveler-SaveDataEditor.
3. How to Find Those Bytes
Well, that’s simple. Load the save which is the last chance to collect an item, collect it, and save to another one. Now compare these 2 saves and find the diff bytes in the BitFlag and ItemFlag sections.
Posted onIntoolsWord count in article: 441Reading time ≈2 mins.
0. Environment
Hardware
System: 2023 version of Lenovo XiaoXin(IdeaPad) Pro 14
CPU: AMD 7840HS (Zen4)
GPU: AMD 780M iGPU (RDNA3) with 8G vRAM setup in UEFI
Memory: 24G (32G total, 8G is assigned to iGPU in UEFI)
Windows 11 25H2
AMD graphic driver 2025.9.1
Room Temperature
~25°C
1. ITS Settings
Do install Lenovo Vantage app or some equivalents to adjust ITS(Intelligent Thermal System) settings. It is the most important. It has higher priority than Windows settings. I’m using ck3 and victoria3 for benchmarking.
Game
CPU Voltage (v)
CPU Power (w)
CPU Max Frequency (MHz)
CPU Temperature (°C)
ck3 (original)
1.1-1.2
35-40
~4.6
80-90
victoria3 (original)
1.1-1.2
35-40
~4.6
80-90
ck3 (after)
0.6-0.8
15-20
~4.6
55-65
victoria3 (after)
0.6-0.8
15-20
~4.6
55-65
The CPU power and voltage are dramatically reduced. Thus, the temperature is much lower. The max frequency appears only when launching these two games. You see, even with strategy games from Paradox, they are not CPU bound.
Alternatively, you can use my homemade app ideapad-keyboard-backlight to adjust ITS settings. It’s much more lightweight than the official one.
2. Windows Power Mode
Go to Settings app –> System –> Power & Battery, set Power Mode to Best Power Efficiency. This helps a bit, but not much.
Game
CPU Voltage (v)
CPU Power (w)
CPU Max Frequency (MHz)
CPU Temperature (°C)
ck3 (after)
0.6-0.8
~15
~4.6
55-60
victoria3 (after)
0.6-0.8
~15
~4.6
55-60
3. Windows Power Plan
It’s really annoying there are separate settings, and what is the fxxking difference between power mode and power plan?
The default version is 1. This enables the Processor performance boost mode option.
Now go to Control Panel –> Hardware and Sound –> Power Options –> Edit Plan Settings, click Change advanced power settings –> Processor power management –> Processor performance boost mode, set to Disabled(or maybe Efficient Enabled).
Now, CPU boost is completely disabled.
Game
CPU Voltage (v)
CPU Power (w)
CPU Max Frequency (MHz)
CPU Temperature (°C)
ck3 (after)
0.6-0.8
~15
~3.7
55-60
victoria3 (after)
0.6-0.8
~15
~3.7
55-60
Your laptop is cool. Your fan makes much less noise. The setting also prevents system services or 3rd-party applications from making a sudden and unintended CPU boost.
Modern CPUs are just capable to run games at their base frequency, with almost no performance loss. All is done.
Posted onIntoolsWord count in article: 125Reading time ≈1 mins.
Cheat Engine 7.7 was just release several days ago. The new version gains additional support for both Linux and MacOS.
The 7.7 installer on the website is just a downloader of the actual installer. It is a InnoSetup one. After some process monitoring work, the actual installer is downloaded into %LocalAppData%\Temp\is-XXXXX.tmp directory. The directory name is randrom. So I copied the actual installer as an offline installer. But it only installs 32-bit files.
With the help of InnoUnpacker-Windows-GUI and some reverse-engineering work. I found that the key is to add two command line options. This can be cross-verified here on Reddit.
1
$ CheatEngine77.exe /VERYSILENT /ZBDIST
You can also change the default installation directory with /DIR="some_custom_directory" option.
Posted onInlinuxWord count in article: 665Reading time ≈2 mins.
0. Install Ghostty
ghostty is a fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration. kitty is not chosen, since it is not as easy as ghostty by default. ghostty provides out-of-box support for features that require configuration in kitty. wezterm can be an alternative, but the project is less active these days, since the author is busy moving countries, see #7451. ghostty also provides better native experience on Linux and MacOS.
For Ubuntu, install it using a community binary here.
mise is chosen as an alternative to homebrew, since homebrew has bugs running patchelf, see #163826 and #258146. But there is a workaround. nix is also not chosen, since it is complex and I do not want to learn its config DSL.
mise also helps to manage different versions of node, python etc..
mise use installs a tool and adds the version to mise.toml. -g means it will use the global config file ~/.config/mise/config.toml. The additional --include-bash-completion-lib parameter ensures that it works in bash-completion versions earlier than 2.12.
1.3 Install Tools
1 2 3 4
$ mise use -g ripgrep[exe=rg] fd fzf jq resvg zoxide yazi $ mise use -g [email protected] $ mise use -g oh-my-posh@28 $ echo'eval "$(oh-my-posh init bash)"' >> ~/.bashrc
Some useful command lines:
1 2 3 4 5 6
$ mise ls $ mise ls-remote neovim $ mise latest neovim $ mise upgrade $ mise upgrade neovim $ mise registry
All supported command line tools can be found in their registry.
For yazi to be full functional, install imagemagick and ffmpeg:
AlmaLinux 9 selects Source Code Pro Regular 10 as its default monospace font, while LinuxMint selects DejaVu Sans Mono. Change it to just monospace in gnome-tweaks or cinnamon-settings. We will use fontconfig to config system fonts.
Posted onInlinuxWord count in article: 610Reading time ≈2 mins.
0. Install Ghostty
ghostty is a fast, feature-rich, and cross-platform terminal emulator that uses platform-native UI and GPU acceleration. kitty is not chosen, since it is not as easy as ghostty by default. ghostty provides out-of-box support for features that require configuration in kitty. wezterm can be an alternative, but the project is less active these days, since the author is busy moving countries, see #7451. ghostty also provides better native experience on Linux and MacOS.
For Ubuntu, install it using a community binary here.
AlmaLinux 9 selects Source Code Pro Regular 10 as its default monospace font, while LinuxMint selects DejaVu Sans Mono. Change it to just monospace in gnome-tweaks or cinnamon-settings. We will use fontconfig to config system fonts.
1.4 Workaround Bugs in patchelf
homebrew has bugs running patchelf, see #163826 and #258146. For gtk+3 and libadwaita, we can simply fix them by not running patchelf at all. Find bottles in the cache and extract them directly into the homebrew installation directory:
1 2 3 4 5
$ ls ~/.cache/Homebrew/downloads/*bottle*.tar.gz | grep -iE 'gtk|adwaita' /home/gonwan/.cache/Homebrew/downloads/0a00657a6b24c00ca122404a34a7ed7af7b88ba48cea9e192d6f7ec101675f51--gtk+3--3.24.51.x86_64_linux.bottle.tar.gz /home/gonwan/.cache/Homebrew/downloads/0d02f139507799d4915c97def5e0a717b25ee3e56704b318da8d8aa0e76fa45b--libadwaita--1.8.4.x86_64_linux.bottle.tar.gz $ tar xzvf /home/gonwan/.cache/Homebrew/downloads/0a00657a6b24c00ca122404a34a7ed7af7b88ba48cea9e192d6f7ec101675f51--gtk+3--3.24.51.x86_64_linux.bottle.tar.gz -C /home/linuxbrew/.linuxbrew/Cellar/ gtk+3/3.24.51/lib/ $ tar xzvf /home/gonwan/.cache/Homebrew/downloads/0d02f139507799d4915c97def5e0a717b25ee3e56704b318da8d8aa0e76fa45b--libadwaita--1.8.4.x86_64_linux.bottle.tar.gz -C /home/linuxbrew/.linuxbrew/Cellar/ libadwaita/1.8.4/lib/
Only *.so files are restored. patchelf can be mandatory for binary files in bin directories, they have a @@HOMEBREW_PREFIX@@ placeholder hardcoded in the ldd dependency list, which to be replaced by patchelf. The workaround does work, because we are using the default installation prefix /home/linuxbrew/.linuxbrew.
Otherwise, you may want to build gtk+3 and libadwaita from source, which leads to tons of dependencies to be installed as well as much time to build them.
1
$ brew reinstall -s gtk+3 libadwaita
Now, gtk3/gtk+4/libadwaita apps work. Verified with evince and gnome-papers:
You can find 6 fonts from Jetbrains, with and without ligatures.
JetBrainsMono Nerd Font, JetBrainsMono Nerd Font Mono, JetBrainsMono Nerd Font Propo.
JetBrainsMonoNL Nerd Font, JetBrainsMonoNL Nerd Font Mono, JetBrainsMonoNL Nerd Font Propo.
Fonts without Mono suffix have bigger icons (usually around 1.5 normal letters wide). It works better with oh-my-posh. Just choose JetBrainsMonoNL Nerd Font in the settings of Windows Terminal.
Now your terminal looks more productive. It also shows git and language info in its prompt.
See Techempower. This repository contains homemade benchmarks for Http servers. Only a single text response is considered, since some servers do not have their builtin Json implementation. Basically, I am benchmarking event loops, with Http implementation.
All server applications are running in a 4C docker environment. After packaging, a server can be launched using docker compose:
1
$ docker compose -f docker-compose.yml up actix
wrk is used as the client. Http keep-alive is enabled in the benchmark.
It is amazing that actix in rust wins the first price. It runs even faster than any C/C++ servers. It does gain a bit more QPS when enabling LTO optimization. But I choose to not have it. Since all C/C++ servers do not have it, and the optimization can introduce bugs in a production environment. nginx is here for reference.
Then, drogon is the second. It is also an application level framework. libevhtp is not actively maintained and somehow hard to use. beast from boost is just another choice in C++. In my previous benchmark, I can remember it did not scale well and got a much lower throughput. It got almost same throughput running in a 4C and 24C Linux machine. Not knowing why, maybe It was running on an outdated CPU and OS(CentOS 7).
In the Go world, all 3 frameworks give competitive throughput. Setting GOMAXPROCS makes large difference in performance. Starting 1.25, Go automatically detects and respects docker CPU limits to set GOMAXPROCS.
Java servers all have bad performance. spring-webmvc gives the worst performance by default. It does get better when switching to use undertow or the virtual thread feature introduced in Java 21, but no so much. There is almost no difference when running under Java 21 and Java 25 in this case, regarding JEP 491(Synchronize Virtual Threads without Pinning). spring-webflux gives the best performance. The drawback is that, it is hard to write and debug reactive code. The Java world seems to have chosen virtual thread, say stackful coroutine, as their future of non-blocking programming. Even Spring has deprecated their reactor-kafka component. By the way, Java detects the docker environment with limited CPU resource. It not necessary to set IO or worker count manually for these servers.
Regarding ASP .NET Core, it beats only Java servers.
Regarding Javascript, both vanilla node and bun servers run smooth. They both have higher throughput than Java and .NET servers.
The benchmark only evolves event loop with Http implementation, without any business logics. The QPS can decrease dramatically if cross-service calls or database operations are added in a real-world application. But the benchmark does expose difference among languages and their potentials.
Maybe it time to say goodbye to Java and .NET in 2026. I almost have no knowledge about rust, so I think Go frameworks can be the first choice for application-level servers, as they are easier to get started.
Redroid(Remote-Android) is a docker-based solution for Android emulation, GPU enabled, super fast. It is also easy to deploy and use.
What is the difference between Waydroid? Redroid runs in docker, it won’t pollute your host environment with Waydroid packages. Redroid also supports remote access, while Waydroid does not. You can even build a cloud environment above it. Though, Waydroid should provide better performance, since no video encoding/decoding and redirection exist.
I’m using LinuxMint 22 / Ubuntu 24.04. Should also work under other Linux OS. Android 12 and 14 are verified to work.
1. Pull Redroid Docker Images
1
$ docker pull redroid/redroid:14.0.0-latest
If you are in Mainland China, edit /usr/lib/systemd/system/docker.service to add a proxy for docker repository:
libhoudini provides a translation layer from Arm to x86, while Magisk provides root access.
1 2 3
$ git clone https://github.com/ayasa520/redroid-script $ cd redroid-script $ ./redroid.py -a 14.0.0 -i -m
A new docker image is built with libhoudini and Magisk added.
1 2 3 4
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE redroid/redroid 14.0.0_houdini_magisk e250d0ca87c5 About an hour ago 2.34GB redroid/redroid 14.0.0-latest 639792975c26 21 months ago 2.09GB
The readme file says libhoudini does not work. But it actually works, after this PR fixing the linker namespace issue. More details can be found here, in Chinese.
Note: I set androidboot.redroid_gpu_mode=host to pass through the host GPU, which dramatically improves the graphic performance. Surprisingly, it also has add Vulkan support. Otherwise, SwiftShader or LLVM-based software render is used.
If you have an Nvidia GPU, hardware acceleration is likely to fail. See here for details. The virtio-gpu approach are recommended by the author.
The issue previously mentioned is also resolved. When playing 阴阳师(Chinese version of Onmyoji), all maps do not load. I was finally able to collect the detailed logs:
02-21 18:22:02.276 4522 4649 I [18:22:02.276] M: [UIManager] openUI MapGuild 02-21 18:22:02.289 4522 4649 I [18:22:02.289] M: [MapManager] createMapView size (1920.0, 1080.0), init_lat 31.32253721571831, init_lng 121.45974425804117, init_altitude 17 02-21 18:22:02.300 4522 4649 W System.err: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/~~Q9WxXLThl_RFQ0m11zDw4w==/com.netease.onmyoji.wyzymnqsd_cps-1NPxTDts0hEOW_vq1dzUIQ==/lib/x86_64/libGNaviUtils.so" is for EM_AARCH64 (183) instead of EM_X86_64 (62) 02-21 18:22:02.300 4522 4649 W System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1077) 02-21 18:22:02.300 4522 4649 W System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:998) 02-21 18:22:02.300 4522 4649 W System.err: at java.lang.System.loadLibrary(System.java:1656) 02-21 18:22:02.300 4522 4649 W System.err: at com.autonavi.amap.mapcore.AEUtil.<clinit>(Unknown Source:2) 02-21 18:22:02.300 4522 4649 W System.err: at com.autonavi.amap.mapcore.AEUtil.init(Unknown Source:0) 02-21 18:22:02.300 4522 4649 W System.err: at com.amap.api.mapcore.util.a.<init>(Unknown Source:286) 02-21 18:22:02.300 4522 4649 W System.err: at com.amap.api.mapcore.util.b.<init>(Unknown Source:11) 02-21 18:22:02.300 4522 4649 W System.err: at com.amap.api.mapcore.util.b.<init>(Unknown Source:1) 02-21 18:22:02.300 4522 4649 W System.err: at com.amap.api.mapcore.util.o.getMap(Unknown Source:132) 02-21 18:22:02.300 4522 4649 W System.err: at com.amap.api.maps.UnityGLRenderer.getMap(Unknown Source:4) 02-21 18:22:02.300 4522 4649 W System.err: at com.amap.api.maps.UnityGLRenderer.setContext(Unknown Source:20) 02-21 18:22:02.300 4522 4649 W System.err: at com.netease.neox.NXMapViewContainer.<init>(Unknown Source:65) 02-21 18:22:02.300 4522 4649 W System.err: at com.netease.neox.PluginMapView.create(Unknown Source:12) 02-21 18:22:02.300 4522 4649 E NeoX : 02-21 18:22:02.300 4522 4649 E NeoX : ERROR ***************************************************************************** 02-21 18:22:02.300 4522 4649 E [18:22:02.300] M [ANDROID]: JNIManager Failed to call method create with signiture (I)Lcom/netease/neox/NXMapViewContainer;! 02-21 18:22:02.300 4522 4649 E NeoX : 02-21 18:22:02.300 4522 4649 E NeoX : 02-21 18:22:02.300 4522 4649 E NeoX : ERROR ***************************************************************************** 02-21 18:22:02.301 4522 4649 E [18:22:02.301] M: create mapview error 02-21 18:22:02.301 4522 4649 E NeoX : 02-21 18:22:02.301 4522 4649 I NeoX : 02-21 18:22:02.301 4522 4649 I NeoX : SCRIPT ERROR **********************************************************************
They are packaging *.so with mismatching architectures, WTF. Seems AutoNavi does not provide a x86_64 SDK for Android. Not knowing how MumuPlayer workaround this.
After installing the normal version(arm64 ABI), all maps can be loaded. The game just looks like a native Linux application. Redroid is now the best Android emulator for Linux.
These applications look like bellow. There is no difference between a plain gtk3 and gtk4 application. But gtk4 with libadwaita really looks different. The title bar of the window seems to be hidden by default. I am using the famous arc theme. It does have a gtk4 adoption. You can find a gtk-4.0 folder in it. So, it is clear that a libadwaita application just ignores themes.
This can be further verified with gtk3-widget-factory and gtk4-widget-factory. They just look the same. Transmission is the only application I can find, which uses gtk4 without libadwaita. It just renders the same when building with gtk3 and gtk4 options.
2. Theming in Gtk4
2.1 gtk4 - gtk/gtksettings.c
In settings_init_style(), gtk4 tries to load ~/.config/gtk-4.0/gtk.css for theming at first. Then it adds 3 css providers to the application. css_provider uses GTK_STYLE_PROVIDER_PRIORITY_USER(800), which is the highest priority. settings and settings->theme_provider use GTK_STYLE_PROVIDER_PRIORITY_SETTINGS(400). Lastly, it calls settings_update_theme().
In gtk_settings_notify(), settings_update_theme() is also called here. This is a callback function, which is invoked when system-wide settings(including themes) are changed. Thus, a gtk4 application can apply the theme change on-the-fly.
The Gtk property name is gtk-theme-name, it is mapped from GSettings value gtk-theme. Found in gdk/wayland/gdkdisplay-wayland.c:
In gtk_css_provider_load_named(), gtk4 calls _gtk_css_find_theme() to find theme by name and variant, and fallback to default gtk4 or libadwaita themes. It also tries to load gtk.gresource.
path = _gtk_css_find_theme (name, variant); if (path) { /*...*/ resource_file = g_build_filename (dir, "gtk.gresource", NULL); resource = g_resource_load (resource_file, NULL); /*...*/ gtk_css_provider_load_from_path (provider, path); /*...*/ } else { /* Things failed! Fall back! Fall back! * * We accept the names HighContrast, HighContrastInverse, * Adwaita and Adwaita-dark as aliases for the variants * of the Default theme. */ /*...*/ }
It hardcodes gtk-theme-name to Adwaita-empty. This prevent the theme name change callback from working, since g_object_set() has higher priority than a GSettings binding in the gtk4 library. The application will still read the hardcoded value. Also see comments in gtk/gtksettings.c:
1 2 3 4 5 6
/* * Applications can override system-wide settings by setting the property * of the `GtkSettings` object with g_object_set(). This should be restricted * to special cases though; `GtkSettings` are not meant as an application * configuration facility. */
There is another series of setting objects. Say, libadwaita has its own GtkSettings(AdwSettings) and corresponding css providers. libadwaita does not change these settings in gtk4, it works more like an overlay, to encapsulate Gnome HIG(Human Interface Guidelines).
libadwaita uses GTK_STYLE_PROVIDER_PRIORITY_THEME(200) for these css providers. It actually has lower priority than GTK_STYLE_PROVIDER_PRIORITY_SETTINGS(400) used in gtk4. Since it forces to use the Adwaita-empty theme, css providers in gtk4 do not take effect.
At last, if GTK_THEME is set, libadwaita is forced to use the given gtk4 theme.
4. gtk.css and gtk-dark.css
In 2.1 section, we can see gtk4 tries to load ~/.config/gtk-4.0/gtk.css for theming. The file has the highest priority. That’s why most libadwaita-supporting themes like Colloid suggest using these files to force enable theming in libadwaita applications.
In both gtk3 and gtk4, auto loading of gtk.gresource does not always take effect. When in ~/.config/gtk-3.0,gtk-4.0/ directory, gtk loads css using gtk_css_provider_load_from_path(), gtk.gresource is not loaded. When in common theme directories, gtk loads css using gtk_css_provider_load_named(), gtk.gresource is loaded. Thus, @import directive in a css file does not work if the url starts with resource:// and the actual resource file is not already loaded by the gtk library. For the same reason, 3rd part libadwaita-supporting themes does not use gtk.gresource at all.
A gtk.gresource file can be extracted using following script:
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/bash
f="gtk.gresource"
for r in $(gresource list "$f"); do r_path=`dirname"$r"` mkdir -p ".$r_path" echo"Extracting file $r" gresource extract "$f""$r" > ".$r" done
To force libadwaita applications to use arc theme, run following commands:
* Merge with Debian. Remaining changes: - Add patch to support Yaru accent colors using Adwaita theming - Drop all revert patches - Set minimum GTK4 to 4.13.4
-- Jeremy BÃcha <[email protected]> Wed, 20 Mar 2024 15:37:01 -0400
LinuxMint ignores the patch above, it uses its own libadwaita fork instead. In both Ubuntu and LinuxMint, theme changing is notified from GSettings and XDG Desktop Portal. For a libadwaita application, only accent color, color-scheme and high_contrast are affected, the libadwaita widget style stays unchanged. The fork is more like a backport of accent color support in libadwaita 1.6.
5.3 ArchLinux
There is a AUR package libadwaita-without-adwaita, which is a patched version of libadwaita to respect gtk4 themes. It is different from patches from Ubuntu and LinuxMint, where the entire gtk4 theme is applied for libadwaita applications.
5.4 Fedora
Seems Fedora uses vanilla Gnome, there is no such patch for libadwaita.
6. Flatpak
Flatpak does not respect system themes by default, themes in /usr are not accessible by it. The recommend solution is to use packaged themes.
NOTE: After you install a theme, only theme files are installed there. You still need to switch to use it. Flatpak does detect gtk-theme value in GSettings on the host. But the theme should also be available in the Flatpak sandbox. So, I’m using Arc theme, I should install org.gtk.Gtk3theme.Arc package. If I switches to use Mint-Y, I should also install org.gtk.Gtk3theme.Mint-Y package.
Alternatively, you can put themes and icons into ~/.themes and ~/.icons, then make them accessible to Flatpak by running:
Given there are so many gtk3/gtk4 themes, arc theme is still the best one. I want a compact theme with mixed light and dark blocks. I don’t like full-light or full-dark themes. I like light blocks with dark background to help me focus on the content.
Unfortunately, no one works better than the great arc theme. Some themes have too much contrast. Some themes just have visual bugs.
8. Conclusion
The Gnome guys are right to an extent. libadwaita forces users not to theme the original apps. Thus, all libadwaita apps can have a unified look, in several years maybe. libadwaita with Gnome HIG actually does a good job, in my opinion. I suggest to only theme gtk2, gtk3 and gtk4 apps without libadwaita, but not libadwaita apps. Leave them as-is. See articles from Gnome developers: