diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 0b8ed530889..5041e49db1d 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -692,6 +692,7 @@
./services/networking/tcpcrypt.nix
./services/networking/teamspeak3.nix
./services/networking/tedicross.nix
+ ./services/networking/thelounge.nix
./services/networking/tinc.nix
./services/networking/tinydns.nix
./services/networking/tftpd.nix
diff --git a/nixos/modules/services/networking/thelounge.nix b/nixos/modules/services/networking/thelounge.nix
new file mode 100644
index 00000000000..b1d23372955
--- /dev/null
+++ b/nixos/modules/services/networking/thelounge.nix
@@ -0,0 +1,75 @@
+{ pkgs, lib, config, ... }:
+
+with lib;
+
+let
+ cfg = config.services.thelounge;
+ dataDir = "/var/lib/thelounge";
+ configJsData = "module.exports = " + builtins.toJSON (
+ { private = cfg.private; port = cfg.port; } // cfg.extraConfig
+ );
+in {
+ options.services.thelounge = {
+ enable = mkEnableOption "The Lounge web IRC client";
+
+ private = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Make your The Lounge instance private. You will need to configure user
+ accounts by using the (thelounge) command or by adding
+ entries in ${dataDir}/users. You might need to restart
+ The Lounge after making changes to the state directory.
+ '';
+ };
+
+ port = mkOption {
+ type = types.port;
+ default = 9000;
+ description = "TCP port to listen on for http connections.";
+ };
+
+ extraConfig = mkOption {
+ default = {};
+ type = types.attrs;
+ example = literalExample ''{
+ reverseProxy = true;
+ defaults = {
+ name = "Your Network";
+ host = "localhost";
+ port = 6697;
+ };
+ }'';
+ description = ''
+ The Lounge's config.js contents as attribute set (will be
+ converted to JSON to generate the configuration file).
+
+ The options defined here will be merged to the default configuration file.
+ Note: In case of duplicate configuration, options from have priority.
+
+ Documentation:
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ users.users.thelounge = {
+ description = "thelounge service user";
+ group = "thelounge";
+ };
+ users.groups.thelounge = {};
+ systemd.services.thelounge = {
+ description = "The Lounge web IRC client";
+ wantedBy = [ "multi-user.target" ];
+ environment = { THELOUNGE_HOME = dataDir; };
+ preStart = "ln -sf ${pkgs.writeText "config.js" configJsData} ${dataDir}/config.js";
+ serviceConfig = {
+ User = "thelounge";
+ StateDirectory = baseNameOf dataDir;
+ ExecStart = "${pkgs.thelounge}/bin/thelounge start";
+ };
+ };
+
+ environment.systemPackages = [ pkgs.thelounge ];
+ };
+}