anchor.diff:  
       configFile = mkOption {
         type = types.nullOr types.lines;
  -      default = null;
  +      default = configFile;
         description = ''
  -        Contents of Shout's <filename>config.js</filename> file. If left empty,
  -        Shout will generate from its defaults at first startup.
  +        Contents of Shout's <filename>config.js</filename> file.
  +
  +        Used for backward compatibility, recommended way is now to use
  +        the <literal>config</literal> option.
  +
  +        Documentation: http://shout-irc.com/docs/server/configuration.html
  +      '';
  +    };
  +
  +    config = mkOption {
  +      default = {};
  +      type = types.attrs;
  +      example = {
  +        displayNetwork = false;
  +        defaults = {
  +          name = "Your Network";
  +          host = "localhost";
  +          port = 6697;
  +        };
  +      };
  +      description = ''
  +        Shout <filename>config.js</filename> 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.
   
           Documentation: http://shout-irc.com/docs/server/configuration.html
         '';
  
positive.code:       wantedBy = [ "multi-user.target" ];
        wants = [ "network-online.target" ];
        after = [ "network-online.target" ];
        preStart = if isNull cfg.configFile then ""
                   else ''
                     ln -sf ${pkgs.writeText "config.js" cfg.configFile} \
                            ${shoutHome}/config.js
                   '';
        script = concatStringsSep " " [
          "${pkgs.shout}/bin/shout"
          (if cfg.private then "--private" else "--public")
  
negative.code: let
    cfg = config.services.shout;
    shoutHome = "/var/lib/shout";
  
    defaultConfig = pkgs.runCommand "config.js" {} ''
      EDITOR=true ${pkgs.shout}/bin/shout config --home $PWD
      mv config.js $out
    '';
  
    configFile = if (cfg.configFile != null) then cfg.configFile else ''
      var _ = require('${pkgs.shout}/lib/node_modules/shout/node_modules/lodash')
  
      module.exports = _.merge(
        {},
        require('${defaultConfig}'),
        ${builtins.toJSON cfg.config}
      )
    '';
  
  in {
    options.services.shout = {
  