{
  description = "tlater.net web server";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
    dream2nix.url = "github:nix-community/dream2nix";

    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = {
    self,
    nixpkgs,
    dream2nix,
    fenix,
  }: let
    # At the moment, we only deploy to x86_64-linux. Update when we
    # care about another platform.
    system = "x86_64-linux";
    pkgs = nixpkgs.legacyPackages.${system};
    fenixPkgs = fenix.packages.${system};
    ownPkgs = self.packages.${system};
  in {
    packages.${system} = dream2nix.lib.importPackages {
      projectRoot = ./.;
      projectRootFile = "flake.nix";
      packagesDir = ./packages;
      packageSets = {
        nixpkgs = pkgs;
        fenix = fenixPkgs;
      };
    };

    apps.${system} = {
      default = let
        inherit (ownPkgs) server templates;
        inherit (pkgs) writeShellScript;
      in {
        type = "app";
        program = builtins.toString (writeShellScript "tlaternet-webserver" ''
          ${server}/bin/tlaternet-webserver --template-directory ${templates}
        '');
      };

      update = let
        update-script = pkgs.callPackage ./nix/update.nix {inherit self;};
      in {
        type = "app";
        program = "${update-script}/bin/update";
      };
    };

    nixosModules.default = import ./nix/module.nix {inherit self system;};

    devShells.${system} = {
      server = pkgs.mkShell {
        packages = [
          (fenixPkgs.stable.withComponents [
            "rustc"
            "cargo"
            "rustfmt"
            "rust-std"
            "rust-docs"
            "clippy"
            "rust-src"
            "rust-analysis"
          ])
          fenixPkgs.rust-analyzer
        ];
      };
    };

    checks.${system} = import ./nix/checks {
      inherit self pkgs;
    };
  };
}