{
  # Snowfall Lib provides a customized `lib` instance with access to your flake's library
  # as well as the libraries available from your flake's inputs.
  lib,
  # An instance of `pkgs` with your overlays and packages applied is also available.
  pkgs,
  # You also have access to your flake's inputs.
  inputs,

  # Additional metadata is provided by Snowfall Lib.
  system, # The system architecture for this host (eg. `x86_64-linux`).
  target, # The Snowfall Lib target for this system (eg. `x86_64-iso`).
  format, # A normalized name for the system target (eg. `iso`).
  virtual, # A boolean to determine whether this system is a virtual target using nixos-generators.
  systems, # An attribute map of your defined hosts.

  # All other arguments come from the module system.
  config,
  ...
}:

with lib;

let
  cfg = config.modules.emacs;
  doomRepoUrl = "https://github.com/doomemacs/doomemacs";
  configRepoUrl = "https://gitlab.julian-mutter.de/julian/emacs-config";
in
{
  options.modules.emacs = {
    enable = mkOption { default = false; };
  };

  config = mkIf cfg.enable {
    home.sessionPath = [ "/home/julian/.config/emacs/bin" ];

    home.packages = with pkgs; [
      emacs
      binutils # native-comp needs 'as', provided by this

      ## Doom dependencies
      git
      (ripgrep.override { withPCRE2 = true; })

      ## Optional dependencies
      fd # faster projectile indexing
      imagemagick # for image-dired
      zstd # for undo-fu-session/undo-tree compression

      ## Module dependencies
      (aspellWithDicts (
        ds: with ds; [
          en
          en-computers
          en-science
          de
        ]
      ))
      sqlite

      # Code formatters for use with doom emacs
      nixfmt-rfc-style # nix
      dockfmt # docker
      google-java-format # java
      black # python
      unstable.rustfmt # rust
      shfmt
      pyright

      graphviz
      # Lsps for use with doom emacs
      # neocmakelsp # cmake

      emacs-all-the-icons-fonts
    ];

    home.activation.installDoomEmacs = lib.home-manager.hm.dag.entryAfter [ "writeBoundary" ] ''
      if [ ! -d "/home/julian/.config/emacs" ]; then
         $DRY_RUN_CMD ${pkgs.git}/bin/git clone --depth=1 --single-branch "${doomRepoUrl}" "/home/julian/.config/emacs"
      fi
      if [ ! -d "/home/julian/.config/doom" ]; then
         $DRY_RUN_CMD ${pkgs.git}/bin/git clone "${configRepoUrl}" "/home/julian/.config/doom"
      fi
    '';
  };
}