Is it really any linux?

Here is GIMP running in Ubuntu 10.04 image
Here is Cromite running in NixOS without any FHS-wrapper image
Here is Cromite running in Ubuntu 14.04 image
Here is WINE running foobar2000 in Ubuntu 14.04 image
Here is QEMU running in Ubuntu 12.04 image
Here is FeatherPad running in Ubuntu 6.10 👀 image
Here is aarch64 Trelby running on 32-bit ARM debian 👀 This is possible because this system had a 64bit kernel and CPU. We barely depend on the host userland besides some POSIX utils like sh. image
Here is Eden running in FreeBSD using Vulkan with NVIDIA via Linuxulator 👀 image

What’s the minimum supported kernel version?

glibc on archlinux is compiled with --enable-kernel=4.4, that does not mean it is unable to run on kernels older than that, it will work as long as it doesn’t attempt to use a syscall not present in such kernels. For example GIMP3 runs perfectly in Ubuntu 10.04 (kernel 2.6.32) as shown above.

However one problematic syscall is statx, which is kernel 4.11 which Qt depends on and apps will crash when missing.

To fix this and a several other potential issues, our fork of sharun now has a compatiblity layer for older kernels, for more details see the Anylinux-sharun README.

image

Supporting old kernels has run into some interesting issues, for example:

How come this only became possible in 2024?

I didn’t understand any of this

So what’s the problem with dynamic binaries?

This problem is what sharun fixes, by using userland-execve and bypassing the kernel execve, since it is the kernel what sets /proc/self/exe, if we use userland-execve we can control where /proc/self/exe actually points to instead and fix this.

Why bundle glibc instead of musl?

image


We only use musl where it is very useful, that is when making static binaries.

Why not statically link everything?

Why not use solo or detour?

These solutions allow statically linked programs to dlopen host libraries, amazing no? Well that runs into several problems:

Using the host Mesa you are also going to run into bugs that had already been fixed in Mesa, we used to allow our AppImage to use the host vulkan drivers along with the bundled drivers, that ended up being a bad idea.

Also you are not forced to use our bundled drivers always, you can always set USE_HOST_MESA_DRIVERS=1, this will help if you plan to use the same AppImage several years into the future, but it is not guaranteed to work forever due to glibc symbol nonsense.

We don’t run into these problems with Nvidia, because Nvidia releases its proprietary driver linking to super old versions of glibc so you can be certain it will always work.


UPDATE: We now have a similar feature via cross-libc-dlopen, enabled via USE_HOST_DRIVERS_EXPERIMENTAL=1 in quick-sharun.

This feature is only going to be used if the applications meets the following conditions:


Why DwarFS instead of SquashFS?

DwarFS is a lot faster than SquashFS while being smaller at the same time.

Screenshot_2026-04-27_02-09-36


DwarFS also offers PGO like optimizations, which allows us to make small appimages that start instantly.

AppImage has no thumbnail?

Because we use DwarFS instead of SquashFS, you need an AppImage thumbnailer that supports DwarFS:

I get ERROR: Can't find a valid SQUASHFS superblock in NixOS

Once again this is because we use DwarFS instead of SquashFS, NixOS has something called appimage-run which lets you run old type appimages that need an FHS env and some host libraries, appimage-run manually mounts the appimage instead of letting it execute itself which results in that error since it expects it to be SquashFS.

None of this is needed for our appimages, they run directly in NixOS, so all you have to do is disable appimage-run.

Why is there no usr directory in the AppImages?

Because it causes more issues than it solves.