{ pkgs, config, lib, ... }: {
  services.matrix-synapse = {
    enable = true;
    allow_guest_access = true;
    listeners = [{
      bind_address = "0.0.0.0";
      port = 13748;
      resources = [
        {
          compress = true;
          names = [ "client" ];
        }
        {
          compress = false;
          names = [ "federation" ];
        }
      ];
      tls = true;
      type = "http";
      x_forwarded = false;
    }];
    registration_shared_secret = config.secrets.matrix.shared_secret;
    public_baseurl = "https://balsoft.ru:13748/";
    server_name = "balsoft.ru";
    tls_certificate_path = toString (pkgs.writeTextFile {
      name = "matrix.crt";
      text = config.secrets.ssl.cert;
    });
    tls_private_key_path = toString (pkgs.writeTextFile {
      name = "matrix_rsa";
      text = config.secrets.ssl.priv;
    });
    app_service_config_files = [
      (builtins.toFile "registration_tg.yaml"
        (builtins.toJSON config.secrets.matrix.mautrix-telegram.registration))
      (builtins.toFile "registration_wa.yaml"
        (builtins.toJSON config.secrets.matrix.mautrix-whatsapp.registration))
    ];
  };
  home-manager.users.balsoft.xsession.windowManager.i3.config.startup = [{
    command = "anbox launch --package=com.whatsapp --component=.HomeActivity";
  }];
  systemd.services.mautrix-whatsapp = {
    description = "A bridge between whatsapp and matrix";
    path = with pkgs; [ coreutils mautrix-whatsapp ];
    wantedBy = [ "multi-user.target" ];
    requires = [
      "matrix-synapse.service"
      "anbox-container-manager.service"
      "network-online.target"
    ];
    serviceConfig = {
      Restart = "always";
      RestartSec = 1;
    };
    script = ''
      mkdir -p /var/lib/mautrix-whatsapp
      cd /var/lib/mautrix-whatsapp
      sleep 5
      timeout 900 mautrix-whatsapp -c ${
        builtins.toFile "config_wa.yaml"
        (builtins.toJSON config.secrets.matrix.mautrix-whatsapp.config)
      }
    '';
  };
  systemd.services.mautrix-telegram = {
    description = "A bridge between telegram and matrix";
    requires = [ "matrix-synapse.service" "openvpn-client.service" ];
    path = with pkgs; [ coreutils mautrix-telegram ];
    serviceConfig = {
      Restart = "always";
      RestartSec = 1;
    };
    wantedBy = [ "network-online.target" ];
    script = ''
      mkdir -p /var/lib/mautrix-telegram
      cp -r ${pkgs.mautrix-telegram}/* /var/lib/mautrix-telegram
      cd /var/lib/mautrix-telegram
      alembic upgrade head || echo "update failed"
      sleep 5
      cp ${
        builtins.toFile "config.yaml"
        (builtins.toJSON config.secrets.matrix.mautrix-telegram.config)
      } ./config.yaml
      timeout 900 mautrix-telegram 
    '';
  };
  users.users.matrix-synapse.name = lib.mkForce "matrix-synapse";
}
