{
  config,
  common,
  pkgs,
  lib,
  ...
}:
with common.nginx;
let
  tryFiles = "$uri $uri.html $uri/ =404";
  csp = rec {
    default-src = [
      "'self'"
      "'unsafe-inline'"
    ];
    frame-ancestors = [
      "'self'"
    ];
    script-src = default-src ++ [
      "storage.ko-fi.com"
    ];
    style-src = default-src ++ [
      "fonts.googleapis.com"
    ];
    img-src = [
      "'self'"
      "storage.ko-fi.com"
    ];
    font-src = [
      "'self'"
      "fonts.gstatic.com"
    ];
    frame-src = [
      "'self'"
      "github.com"
    ];
  };
  cspString = lib.concatStringsSep " " (
    lib.mapAttrsToList (kind: locations: "${kind} ${lib.concatStringsSep " " locations};") csp
  );

  websiteConfig = ''
    error_page 403 /403.html;
    error_page 404 /404.html;

    location ^~ /.well-known { allow all; }

    location = /template.html { deny all; }
    location ~* "\.(nix|lock)" { deny all; }
    location ~ "/\..+" { deny all; }

    add_header Content-Security-Policy "${cspString}";
    add_header X-Content-Type-Options "nosniff";
  '';

  mkRedirect = to: ssl-optional // { globalRedirect = to; };
  mkTmpRedirect = to: ssl-optional // { locations."/".return = "302 ${to}"; };
in
{
  services.nginx.commonHttpConfig = ''
    map $request_uri $jump_link {
      default "https://inx.moe";
      volatile;
      include /srv/web/jump.map;
    }
  '';

  services.nginx.virtualHosts = {
    "inx.moe" = ssl-inx // {
      locations."/" = {
        root = "/srv/web/inx.moe/out"; # TODO: Make this less volatile
        inherit tryFiles;
        extraConfig =
          websiteConfig
          + ''
            add_header Strict-Transport-Security "max-age=15768000;";
          '';
      };
    };
    "nitter.inx.moe" = mkRedirect "twitter.com";
    "sweedish.fish" = mkRedirect "swedish.fish";
    "blahaj.inx.moe" = mkRedirect "swedish.fish";
    "foxy.software" = mkTmpRedirect "https://inx.moe";
    "j.inx.moe" = ssl-inx-optional // {
      locations."/".return = "302 $jump_link";
    };
    "swedish.fish" = ssl-optional // {
      locations."/" = {
        tryFiles = "/Blahaj.png =404";
        root = ./static;
      };
      locations."/buy".return = "301 https://www.ikea.com/us/en/p/blahaj-soft-toy-shark-90373590/";
    };
    "files.inx.moe" = ssl-inx // {
      locations."/" = {
        root = "/srv/web/files.inx.moe";
        extraConfig = "autoindex on;";
      };
      locations."/p/" = {
        root = "/srv/web/files.inx.moe";
      };
    };
    "archive.inx.moe" = ssl-inx // {
      locations."/" = {
        root = "/srv/web/archive.inx.moe";
        extraConfig = "expires max;";
      };
    };
    "random.inx.moe" = ssl-inx // {
      locations."/" = {
        root = "/srv/web/files.inx.moe/subject";
        extraConfig = ''
          random_index on;
          etag off;
          add_header Cache-Control 'no-cache, no-store, max-age=0';
        '';
      };
    };
    "old.inx.moe" = ssl-inx-optional // {
      locations."/" = {
        root = "/srv/web/inx.moe/out";
        inherit tryFiles;
        extraConfig = websiteConfig;
      };
    };
    "tools.inx.moe" = ssl-inx // {
      locations."/" = {
        root = "${pkgs.it-tools}/share";
        tryFiles = "$uri $uri/ $uri.html /index.html";
      };
    };
  };

  services.uwsgi = {
    enable = true;
    plugins = [ "python3" ];
    instance.type = "emperor";
  };

  storage.directories = [ "/srv/web/archive.inx.moe" ];
}
