{

    pkgs ? import (fetchTarball {
        name = "nixpkgs-21-05";
        url = "https://github.com/NixOS/nixpkgs/archive/7e9b0dff974c89e070da1ad85713ff3c20b0ca97.tar.gz";
        sha256 = "1ckzhh24mgz6jd1xhfgx0i9mijk6xjqxwsshnvq789xsavrmsc36";
    }) {},

    config ? import ./config.nix,

}: rec {

    inherit pkgs;

    init = pkgs.writeText "mediocre-blog-init" ''

      export MEDIOCRE_BLOG_DATA_DIR="${config.dataDir}"

      # mailing list
      export MEDIOCRE_BLOG_ML_SMTP_ADDR="${config.mlSMTPAddr}"
      export MEDIOCRE_BLOG_ML_SMTP_AUTH="${config.mlSMTPAuth}"
      export MEDIOCRE_BLOG_ML_PUBLIC_URL="${config.publicURL}"

      # pow
      export MEDIOCRE_BLOG_POW_SECRET="${config.powSecret}"

      # http
      export MEDIOCRE_BLOG_HTTP_PUBLIC_URL="${config.publicURL}"
      export MEDIOCRE_BLOG_HTTP_LISTEN_PROTO="${config.httpListenProto}"
      export MEDIOCRE_BLOG_HTTP_LISTEN_ADDR="${config.httpListenAddr}"
      export MEDIOCRE_BLOG_HTTP_AUTH_USERS='${builtins.toJSON config.httpAuthUsers}'
      export MEDIOCRE_BLOG_HTTP_AUTH_RATELIMIT='${config.httpAuthRatelimit}'
    '';

    bin = pkgs.buildGoModule {
        pname = "mediocre-blog";
        version = "dev";
        src = ./src;
        vendorSha256 = "sha256:1vazrrg8rs9n8x40c9r53h9qnyxw59xkp0aq7jl15fliigk6q0cr";

        subPackages = [ "cmd/mediocre-blog" ];

        # disable tests
        checkPhase = '''';
    };

    entrypoint = pkgs.writeScript "mediocre-blog-entrypoint" ''
        #!${pkgs.bash}/bin/bash

        set -e
        source ${init}

        mkdir -p ${config.runDir}
        mkdir -p ${config.dataDir}

        exec ${bin}/bin/mediocre-blog "$@"
    '';

    shell = pkgs.stdenv.mkDerivation {
        name = "mediocre-blog-shell";
        buildInputs = [ pkgs.go pkgs.sqlite ];
        shellHook = ''
          source ${init}
        '';
    };

    service = pkgs.writeText "mediocre-blog" ''
        [Unit]
        Description=mediocregopher mediocre blog
        Requires=network.target
        After=network.target

        [Service]
        Restart=always
        RestartSec=1s
        User=mediocregopher
        Group=mediocregopher
        RuntimeDirectory=mediocre-blog
        ExecStart=${entrypoint}

        [Install]
        WantedBy=multi-user.target
    '';

    install = pkgs.writeScript "mediocre-blog" ''
        set -e -x

        sudo cp ${service} /etc/systemd/system/mediocregopher-mediocre-blog.service
        sudo systemctl daemon-reload
        sudo systemctl enable mediocregopher-mediocre-blog.service
        sudo systemctl restart mediocregopher-mediocre-blog.service
    '';
}
