{
  inputs = {
    nixpkgs.url = "nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs }: let
    inherit (nixpkgs) lib;
    systems = [
      "x86_64-linux"
      "aarch64-linux"
      "x86_64-darwin"
      "aarch64-darwin"
      "armv7l-linux"
    ];

    forAllSystems = f: lib.genAttrs systems (system: f system nixpkgs.legacyPackages.${system});
  in {
    apps = forAllSystems (system: pkgs: let
      wrapUpdateScript = name: path: {
        type = "app";
        meta.description = "A script to update the ${name} data";
        program = let
          drv = pkgs.writeShellApplication {
            name = "update-${name}";
            text = lib.readFile path;
            runtimeInputs = lib.pipe path [
              lib.readFile
              (lib.splitString "\n")
              (x: lib.elemAt x 1)
              (lib.splitString " ")
              (lib.drop 4) # "#!nix-shell -i bash -p"
              (map (dep: pkgs.${dep}))
            ];
          };
        in lib.getExe drv;
      };
    in {
      update-jmdict = wrapUpdateScript "jmdict" ./scripts/update-jmdict.sh;
      update-kanjidic2 = wrapUpdateScript "kanjidic2" ./scripts/update-kanjidic2.sh;
      update-radkfile = wrapUpdateScript "radkfile" ./scripts/update-radkfile.sh;
    });

    packages = let
      edrdgMetadata = {
        license = [{
          shortName = "EDRDG";
          fullName = "Electronic Dictionary Research and Development Group General Dictionary Licence";
          url = "http://www.csse.monash.edu.au/~jwb/edrdg/licence.html";
        }];
        maintainers = [ lib.maintainers.h7x4 ];
        platforms = lib.platforms.all;
      };
    in forAllSystems (system: pkgs: {
      jmdict = pkgs.stdenvNoCC.mkDerivation {
        pname = "jmdict";
        version = lib.fileContents ./jmdict/version.txt;

        dontUnpack = true;
        dontBuild = true;
        installPhase = ''
          runHook preInstall

          install -Dm644 '${./jmdict/jmdict.xml}' "$out/JMdict.xml"

          runHook postInstall
        '';

        meta = edrdgMetadata // {
          description = "A Japanese-Multilingual Dictionary providing lexical data for japanese words";
          homepage = "https://www.edrdg.org/jmdict/j_jmdict.html";
        };
      };

      kanjidic2 = pkgs.stdenvNoCC.mkDerivation {
        pname = "kanjidic2";
        version = lib.fileContents ./kanjidic2/version.txt;

        dontUnpack = true;
        dontBuild = true;
        installPhase = ''
          runHook preInstall

          install -Dm644 '${./kanjidic2/kanjidic2.xml}' "$out/kanjidic2.xml"

          runHook postInstall
        '';

        meta = edrdgMetadata // {
          description = "A consolidated XML-format kanji database";
          homepage = "https://www.edrdg.org/kanjidic/kanjd2index_legacy.html";
        };
      };

      radkfile = pkgs.stdenvNoCC.mkDerivation {
        pname = "radkfile";
        version = lib.fileContents ./radkfile/version.txt;

        dontUnpack = true;
        dontBuild = true;
        installPhase = ''
          runHook preInstall

          install -Dm644 ${./radkfile/radkfile} "$out/RADKFILE"

          runHook postInstall
        '';

        meta = edrdgMetadata // {
          description = "A file providing searchable decompositions of kanji characters";
          homepage = "https://www.edrdg.org/krad/kradinf.html";
        };
      };

      tanos-jlpt = pkgs.stdenvNoCC.mkDerivation {
        pname = "tanos-jlpt";
        version = "2011";

        dontUnpack = true;
        dontBuild = true;
        installPhase = ''
          runHook preInstall

          for f in ${./tanos-jlpt}/*.csv; do
            install -Dm644 -t "$out" "$f"
          done

          runHook postInstall
        '';

        meta = {
          description = "A CSV file containing JLPT-rated Japanese vocabulary";
          homepage = "https://www.tanos.co.uk/jlpt/";
          license = lib.licenses.cc-by-40;
          maintainers = [ lib.maintainers.h7x4 ];
          platforms = lib.platforms.all;
        };
      };
    });
  };
}
