Flatpak: Difference between revisions
→Declaratively: feat behavior precision |
|||
| (21 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]. | ||
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. | |||
== | == Declarative installation == | ||
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 | |||
=== | === [https://github.com/gmodena/nix-flatpak nix-flatpak] === | ||
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. | |||
{{file|3= | ==== Installation ==== | ||
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"; | ||
}; | |||
=== | outputs = { self, nixpkgs, nix-flatpak, ... } @ inputs: | ||
After adding | { | ||
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}} | |||
==== Managing remotes ==== | |||
{{file|3= | 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}} | |||
=== | ==== Managing permissions ==== | ||
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}} | |||
=== | === [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. | |||
It supports non-flake, flakes, and [[Home Manager|home-manager]] | |||
== Imperative installation == | |||
===== | === Global === | ||
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 | |||
==== | {{file|3=users.users."user" = { | ||
packages = with pkgs; [ | |||
flatpak | |||
]; | |||
};|name=/etc/nixos/configuration.nix|lang=nix}} | |||
==== | ==== Terminal User Interface ==== | ||
To | 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 54: | 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 81: | 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 | It is possible to install and run Flatpaks which were compiled for a different platform. | ||
$ flatpak install | |||
$ flatpak run | 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 91: | 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
{
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;
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.
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:
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:
{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.
services.flatpak.overrides.settings = {
global = {
Environment.GTK_THEME = "Adwaita:dark";
};
"com.orcaslicer.OrcaSlicer " = {
Context.devices = ["dri"];
};
};
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.
services.flatpak.enable = true;
Per-User
If you'd rather make Flatpak available to a specific user, add flatpak to that user's packages
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
Otherwise, the following section could conflict with them
If you are, prefer using nix-flatpak'sservices.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:
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
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.:
export XDG_DATA_DIRS=$XDG_DATA_DIRS:/usr/share:/var/lib/flatpak/exports/share:$HOME/.local/share/flatpak/exports/shareThis is also required when installing flatpak on a per-user basis.
Uninstalling an application and wiping its data
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.