Jump to content

Flatpak: Difference between revisions

From Official NixOS Wiki
Malix (talk | contribs)
Cktiel (talk | contribs)
 
(19 intermediate revisions by 5 users not shown)
Line 3: Line 3:
This article extends the documentation in the [https://nixos.org/manual/nixos/stable/#module-services-flatpak NixOS manual].
This article extends the documentation in the [https://nixos.org/manual/nixos/stable/#module-services-flatpak NixOS manual].


== Usage ==
Flatpak on NixOS can be used either in a declarative or imperative way. The imperative way is better suited for beginners, If you're just starting out with NixOS, and/or don't want to deal with advanced configuration, refer to the [[Flatpak#Imperative installation|Imperative installation]] section.


=== Global Installation ===
== Declarative installation ==
Using this configuration, <code>flatpak</code> will be installed and ready to use globally for all users:
To manage Flatpak declaratively, you can either use [https://github.com/gmodena/nix-flatpak nix-flatpak] or [https://github.com/in-a-dil-emma/declarative-flatpak declarative-flatpak]. In the event of a Nix rollback, both modules will reinstall the previously declared Flatpak packages
{{file|3=services.flatpak.enable = true;|name=/etc/nixos/configuration.nix|lang=nix}}To automatically configure a flatpak repository for all users using the global configuration file, add this to your <code>configuration.nix</code> file:{{file|3=systemd.services.flatpak-repo = {
    wantedBy = [ "multi-user.target" ];
    path = [ pkgs.flatpak ];
    script = ''
      flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
    '';
  };|name=/etc/nixos/configuration.nix|lang=nix}}
 
=== Per-User Installation ===
If you'd rather make Flatpak available to a specific user, add <code>flatpak</code> to that user's packages. To be able to install Flatpaks graphically, add the <code>gnome-software</code> package. The result will look something like this:


{{file|3=users.users."user" = {
=== [https://github.com/gmodena/nix-flatpak nix-flatpak] ===
    packages = with pkgs; [
A convergent approach to Flatpak management where refs are managed in place. It supports flakes or [[Home Manager|home-manager]], but doesn't support installation without flakes. Flatpak packages are not cached in the Nix store.
      flatpak
      gnome-software
    ];
  };|name=/etc/nixos/configuration.nix|lang=nix}}


=== Window Managers / Compositors Patches ===
==== Installation ====
After adding the desired solution to your configuration file, Flatpak will be installed, but it is not always added to your path directly, e.g. when you are using Sway.
Add nix-flatpak to your flake inputs and import the module. Below is an example flake.nix
{{file|3={
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
  };


To manually add it to the path while using the [[Greetd]] login manager and [[Sway]], create a <code>.profile</code> file with an override for your <code>XDG_DATA_DIRS</code> path, e.g.:
  outputs = { self, nixpkgs, nix-flatpak, ... } @ inputs:  
{{file|3=export XDG_DATA_DIRS=$XDG_DATA_DIRS:/usr/share:/var/lib/flatpak/exports/share:$HOME/.local/share/flatpak/exports/share|name=.profile|lang=}}
  {
This is also required when installing <code>flatpak</code> on a per-user basis.
nixosConfigurations.YOURHOSTNAME = nixpkgs.lib.nixosSystem {
  specialArgs = { inherit inputs; };
  modules = [
            nix-flatpak.nixosModules.nix-flatpak
  ];
};
  };
}|name=flake.nix|lang=nix}}After adding nix-flatpak to your flake inputs and importing the module, packages can be installed declaratively;{{file|3=services.flatpak.enable = true;
services.flatpak.packages = [
  { appId = "com.brave.Browser"; origin = "flathub";  }
  "com.obsproject.Studio"
];|name=configuration.nix|lang=nix}}


=== Flatpak Package Installation ===
==== Managing remotes ====
nix-flatpak will add the flathub remote by default. You may also declare your own additional remotes. Doing so will override the default configuration, so you will need to also declare flathub as a remote if you wish to use it.{{file|3=services.flatpak.remotes = [
  {
    name = "flathub-beta";
    location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo";
  }
  {
    name = "flathub";
    location = "https://dl.flathub.org/repo/flathub.flatpakrepo";
  } 
];|name=configuration.nix|lang=nix}}
===== Installing a .flatpak file declaratively =====
Add the file you want to install as a flake input. Orca slicer nightly will be used as an example:{{file|3=inputs = {
  nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
  orca-slicer = {
    url = "https://github.com/OrcaSlicer/OrcaSlicer/releases/download/nightly-builds/OrcaSlicer-Linux-flatpak_nightly_x86_64.flatpak";
    flake = false;
  };
};|name=flake.nix|lang=nix}}In your configuration.nix, add the .flatpak file from your inputs to your packages:{{file|3={config, pkgs, lib, inputs, ... }:
{
  services.flatpak.packages = [
    {
      appId = "com.orcaslicer.OrcaSlicer";
      bundle = inputs.orca-slicer.outPath;
      sha256 = inputs.orca-slicer.narHash;
    }
  ];
}|name=/etc/nixos/configuration.nix|lang=nix}}


==== Declaratively ====
==== Managing permissions ====
To install flatpak packages declaratively, you can either use [https://github.com/gmodena/nix-flatpak nix-flatpak] or [https://github.com/in-a-dil-emma/declarative-flatpak declarative-flatpak]
Instead of using software like [https://flathub.org/en/apps/com.github.tchx84.Flatseal Flatseal] or using <code>flatpak override</code> one can also manage flatpak permissions in a declarative manner. Below is an example forcing the Adwaita dark theme globally and enabling GPU acceleration for orca slicer.{{file|3=services.flatpak.overrides.settings = {
  global = {
    Environment.GTK_THEME = "Adwaita:dark";
  };
  "com.orcaslicer.OrcaSlicer " = {
      Context.devices = ["dri"];
  };
};|name=/etc/nixos/configuration.nix|lang=nix}}


In the event of a Nix rollback, both modules will reinstall the previously declared Flatpak packages
=== [https://github.com/in-a-dil-emma/declarative-flatpak declarative-flatpak] ===
{{Expand|reason=Examples are missing|scope=section}}A congruent approach to Flatpak management where changes are designed to be atomic, ensuring that either they succeed or nothing happens. This module uses a temporary installation and then overwrites the current one.


===== [https://github.com/gmodena/nix-flatpak nix-flatpak] =====
It supports non-flake, flakes, and [[Home Manager|home-manager]]
A '''convergent approach''' where Flatpak packages manage their own lifecycle independently of Nix generations. It manages refs in place. Since Flatpak packages are '''not cached in the Nix store''', this approach uses '''more network bandwidth''' but is more '''efficient with disk storage'''. Note that it '''requires flakes''' to function
== Imperative installation ==


===== [https://github.com/in-a-dil-emma/declarative-flatpak declarative-flatpak] =====
=== Global ===
A congruent approach to Flatpak management where changes are designed to be atomic, ensuring that either they succeed or nothing happens. This module uses a temporary installation and then overwrites the current one. Note that it supports non-flake installs
Using this configuration, <code>flatpak</code> will be installed and ready to use globally for all users.
{{file|3=services.flatpak.enable = true;|name=/etc/nixos/configuration.nix|lang=nix}}
=== Per-User ===
If you'd rather make Flatpak available to a specific user, add <code>flatpak</code> to that user's packages


<small>For more details, see [https://github.com/in-a-dil-emma/declarative-flatpak/issues/44 declarative-flatpak/issues/44]</small>
{{file|3=users.users."user" = {
    packages = with pkgs; [
      flatpak
    ];
  };|name=/etc/nixos/configuration.nix|lang=nix}}


==== Imperatively ====
==== Terminal User Interface ====
To install flatpak packages imperatively and use them, you can use [https://docs.flatpak.org/en/latest/using-flatpak.html the <code>flatpak</code> CLI] ([https://docs.flatpak.org/en/latest/flatpak-command-reference.html <code>flatpak</code> CLI Reference Documentation])
To manage Flatpak imperatively, you can use [https://docs.flatpak.org/en/latest/using-flatpak.html the <code>flatpak</code> command] ([https://docs.flatpak.org/en/latest/flatpak-command-reference.html <code>flatpak</code> Command Reference Documentation])


===== Example =====
===== Example =====
Line 56: Line 101:
$ flatpak install flathub com.github.tchx84.Flatseal
$ flatpak install flathub com.github.tchx84.Flatseal
$ flatpak run com.github.tchx84.Flatseal</syntaxhighlight>
$ flatpak run com.github.tchx84.Flatseal</syntaxhighlight>
==== Graphical User Interface ====
To install Flatpaks graphically, you can use [https://apps.gnome.org/en-GB/Software/ the GNOME Software Application] ([https://search.nixos.org/packages?show=gnome-software <code>gnome-software</code> in nixpkgs])
==== Configure Repositories Globally ====
{{Warning|This assumes you are not installing Flatpak packages [https://wiki.nixos.org/wiki/Flatpak#Declarative declaratively] (using [https://wiki.nixos.org/wiki/Flatpak#nix-flatpak nix-flatpak] or [https://wiki.nixos.org/wiki/Flatpak#declarative-flatpak declarative-flatpak])
Otherwise, the following section could conflict with them
If you are, prefer using [https://wiki.nixos.org/wiki/Flatpak#nix-flatpak nix-flatpak]'s <code>services.flatpak.remotes</code> or [https://wiki.nixos.org/wiki/Flatpak#declarative-flatpak declarative-flatpak]'s <code>services.flatpak.remotes</code> instead}}
To automatically configure Flatpak repositories for all users, one can add this snippet to <code>configuration.nix</code>:{{file|3=systemd.services.flatpak-repo = {
    wantedBy = [ "multi-user.target" ];
    path = [ pkgs.flatpak ];
    script = ''
      flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
    '';
  };|name=/etc/nixos/configuration.nix|lang=nix}}


== Development ==
== Development ==
Line 83: Line 145:


=== Emulate Flatpaks of different architecture ===
=== Emulate Flatpaks of different architecture ===
It is possible to install and run Flatpaks which were compiled for a different platform. In this example we start the application ''Metronome'' as aarch64 Flatpak on a x86_64 host:<syntaxhighlight lang="console">
It is possible to install and run Flatpaks which were compiled for a different platform.
$ flatpak install --user --arch=aarch64 flathub com.adrienplazas.Metronome
 
$ flatpak run --user com.adrienplazas.Metronome
In this example we imperatively install the application "Metronome" <code>aarch64</code> Flatpak package and run it (regardless of the architecture of the host, but in that case, it was <code>x86_64</code>):<syntaxhighlight lang="console">$ flatpak install flathub com.adrienplazas.Metronome --arch=aarch64
</syntaxhighlight>To support emulation with Qemu, [[QEMU#Run binaries of different architecture|following Binfmt configuration]] is required.
$ flatpak run com.adrienplazas.Metronome</syntaxhighlight>To support emulation with Qemu, [[QEMU#Run binaries of different architecture|following Binfmt configuration]] is required.
 
=== Using Flatpak with Impermanence ===
If you're using [[Impermanence]], you'll need to make sure you persist the directories that flatpak will be using
 
* <code>/var/lib/flatpak</code> (for system configuration, repositories, etc.)
* <code>~/.var/app</code> (for app data)
* <code>~/.local/share/flatpak</code> (for user-specific configuration)
 
The directories in your home (starting with <code>~</code>) will need to be persisted for every user who will use flatpak


== Troubleshooting ==
== Troubleshooting ==
Line 93: Line 164:


If you have issues with cursors or themes in general, take a look at [[Fonts#Flatpak_applications_can't_find_system_fonts]]
If you have issues with cursors or themes in general, take a look at [[Fonts#Flatpak_applications_can't_find_system_fonts]]
=== Window Managers / Compositors Patches ===
After adding the desired solution to your configuration file, Flatpak will be installed, but it is not always added to your path directly, e.g. when you are using Sway.
To manually add it to the path while using the [[Greetd]] login manager and [[Sway]], create a <code>.profile</code> file with an override for your <code>XDG_DATA_DIRS</code> path, e.g.:
{{file|3=export XDG_DATA_DIRS=$XDG_DATA_DIRS:/usr/share:/var/lib/flatpak/exports/share:$HOME/.local/share/flatpak/exports/share|name=.profile|lang=}}
This is also required when installing <code>flatpak</code> on a per-user basis.
=== Uninstalling an application and wiping its data ===
{{Warning|This involves deleting application data of flatpak applications, make sure to keep backed up any flatpak application data you want before proceeding.}}
Sometimes, flatpak applications may glitch (like fonts in Flatseal<ref>https://github.com/tchx84/Flatseal/issues/501</ref>) and wiping their data may solve the issue. To do so, you have two options.
==== Option 1: Delete application and its data in a single command ====
This is useful if you have installed the flatpak application '''imperatively'''. Use the <code>--delete-data</code> flag when uninstalling the offending application, (like <code>flatpak uninstall <application> --delete-data</code> ). Then re-install the offending application (like <code>flatpak install <application></code> ).
==== Option 2: Delete application and then delete its data ====
This is useful if you have set up flatpak '''declaratively'''<ref>[[Flatpak#Declarative]]</ref>. First remove the application from your configuration and rebuild. Then run <code>flatpak uninstall --unused --delete-data</code> to both delete '''all''' leftover applications and wipe the data of anything previously deleted. This will ask you to delete the data of each application individually, delete only the data of the offending application. Then re-add the offending application in your configuration and rebuild.


[[Category:Software]]
[[Category:Software]]
[[Category:NixOS Manual]]
[[Category:NixOS Manual]]

Latest revision as of 18:09, 5 November 2026

Flatpak is a Linux application sandboxing and distribution framework.

This article extends the documentation in the NixOS manual.

Flatpak on NixOS can be used either in a declarative or imperative way. The imperative way is better suited for beginners, If you're just starting out with NixOS, and/or don't want to deal with advanced configuration, refer to the Imperative installation section.

Declarative installation

To manage Flatpak declaratively, you can either use nix-flatpak or declarative-flatpak. In the event of a Nix rollback, both modules will reinstall the previously declared Flatpak packages

A convergent approach to Flatpak management where refs are managed in place. It supports flakes or home-manager, but doesn't support installation without flakes. Flatpak packages are not cached in the Nix store.

Installation

Add nix-flatpak to your flake inputs and import the module. Below is an example flake.nix

❄︎ flake.nix
{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
  };

  outputs = { self, nixpkgs, nix-flatpak, ... } @ inputs: 
  {
	nixosConfigurations.YOURHOSTNAME = nixpkgs.lib.nixosSystem {
	  specialArgs = { inherit inputs; };
	  modules = [
            nix-flatpak.nixosModules.nix-flatpak
	  ];
	};
  };
}

After adding nix-flatpak to your flake inputs and importing the module, packages can be installed declaratively;

❄︎ configuration.nix
services.flatpak.enable = true;
services.flatpak.packages = [
  { appId = "com.brave.Browser"; origin = "flathub";  }
  "com.obsproject.Studio"
];

Managing remotes

nix-flatpak will add the flathub remote by default. You may also declare your own additional remotes. Doing so will override the default configuration, so you will need to also declare flathub as a remote if you wish to use it.

❄︎ configuration.nix
services.flatpak.remotes = [
  {
    name = "flathub-beta";
    location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo";
  }
  {
    name = "flathub";
    location = "https://dl.flathub.org/repo/flathub.flatpakrepo";
  }   
];
Installing a .flatpak file declaratively

Add the file you want to install as a flake input. Orca slicer nightly will be used as an example:

❄︎ flake.nix
inputs = {
  nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
  orca-slicer = {
    url = "https://github.com/OrcaSlicer/OrcaSlicer/releases/download/nightly-builds/OrcaSlicer-Linux-flatpak_nightly_x86_64.flatpak";
    flake = false; 
  };
};

In your configuration.nix, add the .flatpak file from your inputs to your packages:

❄︎ /etc/nixos/configuration.nix
{config, pkgs, lib, inputs, ... }:
{
  services.flatpak.packages = [
    { 
      appId = "com.orcaslicer.OrcaSlicer";
      bundle = inputs.orca-slicer.outPath;
      sha256 = inputs.orca-slicer.narHash; 
    }
  ];
}

Managing permissions

Instead of using software like Flatseal or using flatpak override one can also manage flatpak permissions in a declarative manner. Below is an example forcing the Adwaita dark theme globally and enabling GPU acceleration for orca slicer.

❄︎ /etc/nixos/configuration.nix
services.flatpak.overrides.settings = {
  global = {
    Environment.GTK_THEME = "Adwaita:dark";
  };
  "com.orcaslicer.OrcaSlicer " = {
      Context.devices = ["dri"];
  };
};
☶︎
This section needs to be expanded. Examples are missing Further information may be found in the related discussion page. Please consult the pedia article metapage for guidelines on contributing.

A congruent approach to Flatpak management where changes are designed to be atomic, ensuring that either they succeed or nothing happens. This module uses a temporary installation and then overwrites the current one.

It supports non-flake, flakes, and home-manager

Imperative installation

Global

Using this configuration, flatpak will be installed and ready to use globally for all users.

❄︎ /etc/nixos/configuration.nix
services.flatpak.enable = true;

Per-User

If you'd rather make Flatpak available to a specific user, add flatpak to that user's packages

❄︎ /etc/nixos/configuration.nix
users.users."user" = {
    packages = with pkgs; [
      flatpak
    ];
  };

Terminal User Interface

To manage Flatpak imperatively, you can use the flatpak command (flatpak Command Reference Documentation)

Example
$ flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
$ flatpak update
$ flatpak search Flatseal
$ flatpak install flathub com.github.tchx84.Flatseal
$ flatpak run com.github.tchx84.Flatseal

Graphical User Interface

To install Flatpaks graphically, you can use the GNOME Software Application (gnome-software in nixpkgs)

Configure Repositories Globally

⚠︎
Warning: This assumes you are not installing Flatpak packages declaratively (using nix-flatpak or declarative-flatpak)

Otherwise, the following section could conflict with them

If you are, prefer using nix-flatpak's services.flatpak.remotes or declarative-flatpak's services.flatpak.remotes instead

To automatically configure Flatpak repositories for all users, one can add this snippet to configuration.nix:

❄︎ /etc/nixos/configuration.nix
systemd.services.flatpak-repo = {
    wantedBy = [ "multi-user.target" ];
    path = [ pkgs.flatpak ];
    script = ''
      flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
    '';
  };

Development

Build a Flatpak project

The following example builds a demo app of the libadwaita repository using flatpak-builder, installs it locally in the user space and runs it. First install flatpak and flatpak-builder on your system

❄︎ /etc/nixos/configuration.nix
services.flatpak.enable = true;
environment.systemPackages = [
  pkgs.flatpak-builder
];

Clone, build and run the example project.

$ flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
$ flatpak install gnome-nightly org.gnome.Sdk org.gnome.Platform
$ git clone https://gitlab.gnome.org/GNOME/libadwaita.git
$ cd libadwaita
$ nix shell nixpkgs#appstream
$ flatpak-builder --disable-tests --user --install build demo/org.gnome.Adwaita1.Demo.json
$ flatpak run org.gnome.Adwaita1.Demo.json

Note that the gnome-nightly repository and the appstream dependency are especially required for this specific project and might be different for other Flatpak projects.

Tips and tricks

Emulate Flatpaks of different architecture

It is possible to install and run Flatpaks which were compiled for a different platform.

In this example we imperatively install the application "Metronome" aarch64 Flatpak package and run it (regardless of the architecture of the host, but in that case, it was x86_64):

$ flatpak install flathub com.adrienplazas.Metronome --arch=aarch64
$ flatpak run com.adrienplazas.Metronome

To support emulation with Qemu, following Binfmt configuration is required.

Using Flatpak with Impermanence

If you're using Impermanence, you'll need to make sure you persist the directories that flatpak will be using

  • /var/lib/flatpak (for system configuration, repositories, etc.)
  • ~/.var/app (for app data)
  • ~/.local/share/flatpak (for user-specific configuration)

The directories in your home (starting with ~) will need to be persisted for every user who will use flatpak

Troubleshooting

Missing themes and cursors

If you have issues with cursors or themes in general, take a look at Fonts#Flatpak_applications_can't_find_system_fonts

Window Managers / Compositors Patches

After adding the desired solution to your configuration file, Flatpak will be installed, but it is not always added to your path directly, e.g. when you are using Sway.

To manually add it to the path while using the Greetd login manager and Sway, create a .profile file with an override for your XDG_DATA_DIRS path, e.g.:

≡︎ .profile
export XDG_DATA_DIRS=$XDG_DATA_DIRS:/usr/share:/var/lib/flatpak/exports/share:$HOME/.local/share/flatpak/exports/share

This is also required when installing flatpak on a per-user basis.

Uninstalling an application and wiping its data

⚠︎
Warning: This involves deleting application data of flatpak applications, make sure to keep backed up any flatpak application data you want before proceeding.

Sometimes, flatpak applications may glitch (like fonts in Flatseal[1]) and wiping their data may solve the issue. To do so, you have two options.

Option 1: Delete application and its data in a single command

This is useful if you have installed the flatpak application imperatively. Use the --delete-data flag when uninstalling the offending application, (like flatpak uninstall <application> --delete-data ). Then re-install the offending application (like flatpak install <application> ).

Option 2: Delete application and then delete its data

This is useful if you have set up flatpak declaratively[2]. First remove the application from your configuration and rebuild. Then run flatpak uninstall --unused --delete-data to both delete all leftover applications and wipe the data of anything previously deleted. This will ask you to delete the data of each application individually, delete only the data of the offending application. Then re-add the offending application in your configuration and rebuild.