Jump to content

Appimage: Difference between revisions

From Official NixOS Wiki
Jopejoe1 (talk | contribs)
appimage also needs to be enabled for binfmt to work
Added a section for fixing appimage applications not being able to find Nix-managed fonts, icons and themes
 
(23 intermediate revisions by 10 users not shown)
Line 1: Line 1:
[https://appimage.org/ AppImage] is a monolithic packaging format for linux applications. It contains all dependencies in one file that is composed of an executable with a tacked on filesystem.
<languages/>
<translate>
<!--T:1-->
[<tvar name=1>https://appimage.org/</tvar> AppImage] is a monolithic packaging format for linux applications. It contains all dependencies in one file that is composed of an executable with a tacked on filesystem.


On most distros, all one has to do is download the <code>.AppImage</code> file, make it executable <code>chmod +x $AppImage</code>, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain libraries commonly found on other Linux distributions to exist on certain paths; such as <code>/lib64/ld-linux-x86-64.so.2</code>.
== Usage == <!--T:10-->


== Running an AppImage file on NixOS ==
=== Run === <!--T:2-->
 
<!--T:3-->
On most distros, all one has to do is download the <code>.AppImage</code> file, make it executable <code>chmod +x $AppImage</code>, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain system libraries in hardcoded paths.
</translate>


<syntaxhighlight lang="shell">
<syntaxhighlight lang="shell">
$ nix-shell -p appimage-run
$ nix-shell -p appimage-run
$ appimage-run $AppImageFile
$ appimage-run path/to/application.AppImage
</syntaxhighlight>
 
<translate>
===== Appimage apps cannot access host fonts, icons and themes =====
See: [[Fixes for non-Nix applications#Flatpak, Distrobox, Appimage and other non-Nix applications can't find system fonts/icons/themes]]
 
===== Additional Packages ===== <!--T:17-->
 
<!--T:18-->
Some appimages still have issues, so you can override for additional pkgs such as
</translate>
 
<syntaxhighlight lang="nix">programs.appimage.enable = true;
programs.appimage.binfmt = true;
programs.appimage.package = pkgs.appimage-run.override
{
  extraPkgs = pkgs:
  [
    pkgs.icu
    pkgs.libxcrypt-legacy
    pkgs.python312
    pkgs.python312Packages.torch
  ];
};
</syntaxhighlight>
</syntaxhighlight>


== Register AppImage files as a binary type to binfmt_misc ==
<translate>
=== Packaging === <!--T:8-->


You can tell the Linux kernel to use an interpreter (e.g. <code>appimage-run</code>) when executing certain binary files through the use of [https://en.wikipedia.org/wiki/Binfmt_misc#External_links binfmt_misc], either by filename extension or magic number matching. Below NixOS configuration registers AppImage files (ELF files with magic number "AI" + 0x02) to be run with <code>appimage-run</code> as interpreter.
<!--T:9-->
See the [<tvar name=1>https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-appimageTools</tvar> nixpkgs manual on wrapping AppImage packages]. In short, the AppImage is extracted and any dependencies are added as Nix build dependencies.
Following example is a derivation for the program Quba, which is also distributed as AppImage.
</translate>


Since [https://nixos.org/manual/nixos/stable/release-notes#sec-release-24.05-new-services NixOS 24.05], there is a binfmt option:
<syntaxhighlight lang="nix">
{
  lib,
  appimageTools,
  fetchurl,
}:
 
let
  version = "1.4.0";
  pname = "quba";
 
  src = fetchurl {
    url = "https://github.com/ZUGFeRD/quba-viewer/releases/download/v${version}/Quba-${version}.AppImage";
    hash = "sha256-EsTF7W1np5qbQQh3pdqsFe32olvGK3AowGWjqHPEfoM=";
  };
 
  appimageContents = appimageTools.extractType1 { inherit name src; };
in
appimageTools.wrapType2 rec {
  inherit pname version src;
 
  extraInstallCommands = ''
    substituteInPlace $out/share/applications/${pname}.desktop \
      --replace-fail 'Exec=AppRun' 'Exec=${meta.mainProgram}'
  '';
 
  meta = {
    description = "Viewer for electronic invoices";
    homepage = "https://github.com/ZUGFeRD/quba-viewer";
    downloadPage = "https://github.com/ZUGFeRD/quba-viewer/releases";
    license = lib.licenses.asl20;
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    maintainers = with lib.maintainers; [ onny ];
    platforms = [ "x86_64-linux" ];
  };
}
</syntaxhighlight>
 
<translate>
 
== Configuration == <!--T:16-->
 
=== Register AppImage files as a binary type to binfmt_misc === <!--T:4-->
 
<!--T:5-->
You can tell the [[Linux kernel]] to use an interpreter (e.g. <code>appimage-run</code>) when executing certain binary files through the use of [<tvar name=1>https://en.wikipedia.org/wiki/Binfmt_misc#External_links</tvar> binfmt_misc], either by filename extension or magic number matching. Below NixOS configuration registers AppImage files (ELF files with magic number "AI" + 0x02) to be run with <code>appimage-run</code> as interpreter:
</translate>


<syntaxhighlight lang="nixos">
<syntaxhighlight lang="nixos">
Line 23: Line 104:
</syntaxhighlight>
</syntaxhighlight>


This way AppImage files can be invoked directly as if they were normal programs
<translate>
 
<!--T:7-->
== How AppImage files are packaged by NixOS ==
This way AppImage files can be invoked directly as if they were normal programs.
 
</translate>
See the [https://nixos.org/manual/nixpkgs/stable/#sec-pkgs-appimageTools nixpkgs manual on wrapping AppImage packages]. In short, the AppImage is extracted and any dependencies are added as nix build dependencies.


[[Category:Software]]
[[Category:Software]]

Latest revision as of 10:35, 4 August 2026

AppImage is a monolithic packaging format for linux applications. It contains all dependencies in one file that is composed of an executable with a tacked on filesystem.

Usage

Run

On most distros, all one has to do is download the .AppImage file, make it executable chmod +x $AppImage, and execute it. This doesn't work in NixOS out of the box though, as AppImage files usually (if not always) depend on certain system libraries in hardcoded paths.

$ nix-shell -p appimage-run
$ appimage-run path/to/application.AppImage
Appimage apps cannot access host fonts, icons and themes

See: Fixes for non-Nix applications#Flatpak, Distrobox, Appimage and other non-Nix applications can't find system fonts/icons/themes

Additional Packages

Some appimages still have issues, so you can override for additional pkgs such as

programs.appimage.enable = true;
programs.appimage.binfmt = true;
programs.appimage.package = pkgs.appimage-run.override 
{
  extraPkgs = pkgs: 
  [
    pkgs.icu
    pkgs.libxcrypt-legacy
    pkgs.python312
    pkgs.python312Packages.torch
  ]; 
};

Packaging

See the nixpkgs manual on wrapping AppImage packages. In short, the AppImage is extracted and any dependencies are added as Nix build dependencies. Following example is a derivation for the program Quba, which is also distributed as AppImage.

{
  lib,
  appimageTools,
  fetchurl,
}:

let
  version = "1.4.0";
  pname = "quba";

  src = fetchurl {
    url = "https://github.com/ZUGFeRD/quba-viewer/releases/download/v${version}/Quba-${version}.AppImage";
    hash = "sha256-EsTF7W1np5qbQQh3pdqsFe32olvGK3AowGWjqHPEfoM=";
  };

  appimageContents = appimageTools.extractType1 { inherit name src; };
in
appimageTools.wrapType2 rec {
  inherit pname version src;

  extraInstallCommands = ''
    substituteInPlace $out/share/applications/${pname}.desktop \
      --replace-fail 'Exec=AppRun' 'Exec=${meta.mainProgram}'
  '';

  meta = {
    description = "Viewer for electronic invoices";
    homepage = "https://github.com/ZUGFeRD/quba-viewer";
    downloadPage = "https://github.com/ZUGFeRD/quba-viewer/releases";
    license = lib.licenses.asl20;
    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
    maintainers = with lib.maintainers; [ onny ];
    platforms = [ "x86_64-linux" ];
  };
}


Configuration

Register AppImage files as a binary type to binfmt_misc

You can tell the Linux kernel to use an interpreter (e.g. appimage-run) when executing certain binary files through the use of binfmt_misc, either by filename extension or magic number matching. Below NixOS configuration registers AppImage files (ELF files with magic number "AI" + 0x02) to be run with appimage-run as interpreter:

programs.appimage = {
  enable = true;
  binfmt = true;
};

This way AppImage files can be invoked directly as if they were normal programs.