{
  inputs = {
    nixpkgs.url = "nixpkgs/nixos-24.11";
    flake-utils.url = "github:numtide/flake-utils";
    home-manager = {
      url = "github:nix-community/home-manager/release-24.11";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = {
    self,
    flake-utils,
    nixpkgs,
    home-manager,
  }:
    flake-utils.lib.eachDefaultSystem (
      system: let
        pkgs = (import nixpkgs) {
          inherit system;
        };
      in rec {
        packages.resize-tty = pkgs.writeShellScriptBin "resize-tty" ''
          echo -ne '\e[s\e[5000;5000H'
          IFS='[;' read -p $'\e[6n' -d R -a pos -rs
          echo -ne '\e[u'

          ${pkgs.coreutils-full}/bin/stty cols "''${pos[2]}" rows "''${pos[1]}"

          export TERM=xterm-256color
        '';

        packages.nixosConfigurations.vm = nixpkgs.lib.nixosSystem {
          inherit system;
          modules = [
            home-manager.nixosModules.home-manager
            ({pkgs, ...}: {
              system.stateVersion = "23.11";

              services.getty.autologinUser = "neovim";

              virtualisation.vmVariant = {
                virtualisation = {
                  graphics = false;
                };
              };

              users.groups.neovim = {};
              users.users.neovim = {
                initialPassword = "example";
                isNormalUser = true;
                group = "neovim";
                extraGroups = ["wheel"];
              };

              environment.systemPackages = [
                pkgs.git
              ];

              home-manager = {
                useGlobalPkgs = true;
                useUserPackages = true;

                users.neovim = {...}: {
                  imports = [self.nixosModules.home-manager.neovim-config];

                  config = {
                    home = {
                      homeDirectory = "/home/neovim";
                      stateVersion = "23.11";
                    };

                    programs.bash = {
                      enable = true;
                      bashrcExtra = ''
                        ${self.packages.${system}.resize-tty}/bin/resize-tty
                      '';
                    };
                  };
                };
              };
            })
          ];
        };

        devShell = pkgs.mkShell {
          nativeBuildInputs = with pkgs; [
            nixos-rebuild
            sumneko-lua-language-server
          ];
        };

        formatter = nixpkgs.legacyPackages.${system}.alejandra;
      }
    )
    // {
      nixosModules.home-manager.neovim-config = import ./home-manager;
    };
}