{
  description = "Chrysoblog";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
    flake-parts.url = "github:hercules-ci/flake-parts";
    dream2nix.url = "github:nix-community/dream2nix";
  };

  outputs = inputs @ {
    self,
    nixpkgs,
    flake-parts,
    dream2nix,
    ...
  } : flake-parts.lib.mkFlake { inherit inputs; } {
    flake = {
    };
    systems = [
      "x86_64-linux"
      "x86_64-darwin"
    ];
    perSystem = { system, pkgs, ... }: let
      nodejs = pkgs.nodejs_22;
      module = {
        lib,
          config,
          dream2nix,
          ...
      }: {
        imports = [
          dream2nix.modules.dream2nix.nodejs-package-lock-v3
          dream2nix.modules.dream2nix.nodejs-granular-v3
        ];

        mkDerivation = {
          src = ./.;
        };

        deps = { pkgs, ...}: {
        };

        nodejs-package-lock-v3 = {
          packageLockFile = "${config.mkDerivation.src}/package-lock.json";
        };

        # This must match project name in `package.json`, and it cannot have spaces.
        name = "chrysoblog";
        version = "0.1.0";
      };
    in rec {
      packages = {
        default = dream2nix.lib.evalModules {
          packageSets.nixpkgs = pkgs;
          modules = [
            module
            {
              paths.projectRoot = ./.;
              paths.package = ./.;
            }
          ];
        };
      };
      devShells.default = pkgs.mkShell {
        packages = [
          pkgs.playwright-driver.browsers
        ];
        PLAYWRIGHT_NODEJS_PATH = "${nodejs}/bin/node";
        PLAYWRIGHT_BROWSERS_PATH = "${pkgs.playwright-driver.browsers}";
        PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = 1;
        PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS = 1;
        buildInputs = [
          nodejs
        ];
      };
    };
  };
}