diff --git a/nixos/modules/config/xdg/portals/wlr.nix b/nixos/modules/config/xdg/portals/wlr.nix
new file mode 100644
index 000000000000..55baab0026b2
--- /dev/null
+++ b/nixos/modules/config/xdg/portals/wlr.nix
@@ -0,0 +1,67 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+ cfg = config.xdg.portal.wlr;
+ package = pkgs.xdg-desktop-portal-wlr;
+ settingsFormat = pkgs.formats.ini { };
+ configFile = settingsFormat.generate "xdg-desktop-portal-wlr.ini" cfg.settings;
+in
+{
+ meta = {
+ maintainers = with maintainers; [ minijackson ];
+ };
+
+ options.xdg.portal.wlr = {
+ enable = mkEnableOption ''
+ desktop portal for wlroots-based desktops
+
+ This will add the xdg-desktop-portal-wlr package into
+ the option, and provide the
+ configuration file
+ '';
+
+ settings = mkOption {
+ description = ''
+ Configuration for xdg-desktop-portal-wlr.
+
+ See xdg-desktop-portal-wlr(5) for supported
+ values.
+ '';
+
+ type = types.submodule {
+ freeformType = settingsFormat.type;
+ };
+
+ default = { };
+
+ # Example taken from the manpage
+ example = literalExample ''
+ {
+ screencast = {
+ output_name = "HDMI-A-1";
+ max_fps = 30;
+ exec_before = "disable_notifications.sh";
+ exec_after = "enable_notifications.sh";
+ chooser_type = "simple";
+ chooser_cmd = "''${pkgs.slurp}/bin/slurp -f %o -or";
+ };
+ }
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ xdg.portal = {
+ enable = true;
+ extraPortals = [ package ];
+ };
+
+ systemd.user.services.xdg-desktop-portal-wlr.serviceConfig.ExecStart = [
+ # Empty ExecStart value to override the field
+ ""
+ "${package}/libexec/xdg-desktop-portal-wlr --config=${configFile}"
+ ];
+ };
+}
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 1a4c2fb719dc..8a96b42c556b 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -9,6 +9,7 @@
./config/xdg/menus.nix
./config/xdg/mime.nix
./config/xdg/portal.nix
+ ./config/xdg/portals/wlr.nix
./config/appstream.nix
./config/console.nix
./config/xdg/sounds.nix