{
  description = "Put a short description here";

  inputs = {
    nixpkgs = {
      type = "indirect";
      id = "nixpkgs";
    };
  };

  outputs = {self, nixpkgs} :
  let
    # name to be used as identifier for editor environments and such
    name = "Name";
    #Generate a user-friendly version number.
    version = builtins.substring 0 8 self.lastModifiedDate;

    # System types to support.
    supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];

    # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'.
    forAllSystems = nixpkgs.lib.genAttrs supportedSystems;

    # Nixpkgs instantiated for supported system types.
    nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });


  in {
    packages = forAllSystems (system:
      let
        pkgs = nixpkgsFor.${system};
        # LaTex package dependencies
        latexdeps = {inherit (pkgs.texlive) scheme-full;};
        latex = pkgs.texlive.combine latexdeps;
        latexrun = pkgs.latexrun;
      in {
        default = pkgs.stdenvNoCC.mkDerivation {
          name = "output.pdf";
          buildInputs = [latex latexrun pkgs.biber pkgs.inkscape pkgs.stix-two];
          src = self;
          buildPhase = ''
            HOME=.
            cd src
            latexrun --latex-cmd lualatex --bibtex-cmd biber --latex-args '\-shell-escape' -o output.pdf Main.tex
          '';
          installPhase = ''
            mkdir -p $out
            env > $out/env
            cp output.pdf $out/output.pdf
          '';
        };
      }
    );
    devShells = forAllSystems  (system:
      let
        pkgs = nixpkgsFor.${system};
      in ( rec {
        # This sets the default devShell
        default = kakoune;
        kakoune =
          let
            texlab = pkgs.texlab;
            latexTmpDir = "latex.out/";
            myKakoune =
               let
                 # this could also be done by generating toml with the
                 # nixpkgs lib, but I'm lazy
                 kak-lsp-config = pkgs.writeTextFile {
                   name = "kak-lsp-config.toml";
                   text = ''
                     [language.latex]
                     filetypes = ["latex"]
                     roots = [".git", "Main.tex"]
                     command = "texlab"
                     # args = ["-vvvv", "--log-file", "/tmp/texlabLog"]
                     settings_section = "texlab"
                     [language.latex.settings.texlab.build]
                     onSave = true
                     auxDirectory = "${latexTmpDir}"
                     executable = "latexrun"
                     args = ["--latex-cmd", "lualatex", "--bibtex-cmd", "biber", "--latex-args", "'-shell-escape -synctex=1'","%f"]
                     # args = ["--latex-cmd", "lualatex", "--bibtex-cmd", "biber", "%f"]
                     forwardSearchAfter = true
                     [language.latex.settings.texlab.forwardSearch]
                     executable = "zathura"
                     args = ["--synctex-forward", "%l:1:%f", "%p"]
                   '';
                 };
                 config = pkgs.writeTextFile (rec {
                   name = "kakrc.kak";
                   destination = "/share/kak/autoload/${name}";
                   text = ''
                     colorscheme solarized-dark
                     set global tabstop 2
                     set global indentwidth 0
                     # eval %sh{kak-lsp  --kakoune --session $kak_session -c ${kak-lsp-config} --log /tmp/kak-lspLog -vvvv}
                     eval %sh{kak-lsp  --kakoune --session $kak_session -c ${kak-lsp-config}}
                     hook global WinSetOption filetype=(latex) %{
                       lsp-auto-hover-enable
                       lsp-enable-window
                     }
                     add-highlighter global/ number-lines
                     map global normal <c-p> ': fzf-mode<ret>'
                   '';
                 });
               in
                 pkgs.kakoune.override {
                   plugins = with pkgs.kakounePlugins; [fzf-kak kak-lsp config];
                 };
          in
            pkgs.mkShellNoCC {
              inputsFrom = [self.outputs.packages.${system}.default];
              packages = [myKakoune texlab pkgs.git pkgs.zathura pkgs.fzf];
              # TODO only try to start the kakoune session if no session with that
              # name exists
              shellHook = ''
                HOME=.
                # unset LANG # This is a very stupid idea but lualatex GRMBLFX!!! # argh this brakes kakoune unicode!!!
                alias ..="cd .."
                cd src
                mkdir -p ${latexTmpDir}
                export KAKOUNE_CONFIG_DIR="/dev/null/"
                kak -d -s ${name} &
                alias vim="kak -c ${name}"
              '';
        };
        texstudio =
          pkgs.mkShellNoCC {
            inputsFrom = [self.outputs.packages.${system}.default];
            packages = [pkgs.texstudio pkgs.git];
            shellHook = ''
              texstudio
            '';
        };

        texmaker =
          pkgs.mkShellNoCC {
            inputsFrom = [self.outputs.packages.${system}.default];
            packages = [pkgs.texmaker pkgs.git];
            shellHook = ''
              texmaker
            '';
        };
      })
    );
  };
}

      
