{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };
  outputs = {
    self,
    nixpkgs,
    flake-utils,
    fenix,
  }:
    flake-utils.lib.eachDefaultSystem
    (
      system: let
        overlays = [fenix.overlays.default];
        pkgs = import nixpkgs {
          inherit system overlays;
        };
        libPath = with pkgs;
          lib.makeLibraryPath [
            libGL
            libxkbcommon
            wayland
          ];
      in
        with pkgs; {
          formatter = alejandra;
          defaultPackage = pkgs.callPackage ./. {};
        }
    )
    // flake-utils.lib.eachDefaultSystemPassThrough (system: {
      nixosModules.default = {
        config,
        lib,
        pkgs,
        ...
      }: {
        options.services.wanireminder = {
          enable = lib.mkEnableOption "wanikani reminder bot";
          webhook = lib.mkOption {
            type = lib.types.string;
            description = "The webhook to post the messages to";
          };
          users =
            lib.mkOption {
              type = lib.types.listOf lib.types.attrs;
            }
            // {
              name = lib.mkOption {
                type = lib.types.string;
              };
              wktoken = lib.mkOption {
                type = lib.types.string;
              };
              discord = lib.mkOption {
                type = lib.types.string;
              };
            };
        };
        config = lib.mkIf config.services.wanireminder.enable {
          systemd.timers.wanireminder = {
            wantedBy = [ "timers.target" ];
            after = ["network.target"];
            timerConfig = {
              OnCalendar = "hourly";
              Persistent = true;
              Unit = ["wanireminder.service"];
            };
          };
          systemd.services.wanireminder = {
            description = "Run wanireminders";
            script = let
              configJson = builtins.toFile "config.json" (builtins.toJSON config.services.wanireminder);
            in ''${self.defaultPackage.${system}}/bin/wanireminder ${configJson}'';
            serviceConfig = {
              Type = "oneshot";
            };
          };
        };
      };
    });
}