{
  description = "HEX local-first voice dictation";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    { self, nixpkgs, ... }:
    let
      systems = [
        "x86_64-linux"
        "aarch64-linux"
      ];
      forSystems = f: nixpkgs.lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
      package = pkgs: self.packages.${pkgs.stdenv.hostPlatform.system}.hex;
    in
    {
      packages = forSystems (
        pkgs:
        let
          hex = pkgs.callPackage ./nix/package.nix { };
        in
        {
          inherit hex;
          default = hex;
        }
      );

      overlays.default = final: _prev: {
        hex = final.callPackage ./nix/package.nix { };
      };

      nixosModules.hex =
        { pkgs, ... }:
        {
          imports = [ ./nix/module.nix ];
          programs.hex.package = nixpkgs.lib.mkDefault (package pkgs);
        };
      nixosModules.default = self.nixosModules.hex;

      homeManagerModules.hex =
        { pkgs, ... }:
        {
          imports = [ ./nix/hm-module.nix ];
          programs.hex.package = nixpkgs.lib.mkDefault (package pkgs);
        };
      homeManagerModules.default = self.homeManagerModules.hex;

      devShells = forSystems (pkgs: {
        default = (package pkgs).devShell;
      });
      checks = forSystems (pkgs: import ./nix/checks.nix { inherit self pkgs; });
      formatter = forSystems (pkgs: pkgs.nixfmt);
    };
}