{
  inputs = {
    nixpkgs.url = "github:NixOs/nixpkgs/nixos-unstable";
    utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, utils }:
    utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
      in {
        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [
            php
            phpPackages.composer
            phpPackages.php-codesniffer
            vscode-langservers-extracted
            nodejs
            nixfmt-rfc-style
            nixfmt-tree
            cypress
            yaml-language-server
            typescript
            postgresql
            process-compose
          ];

          shellHook = ''
            REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
            export PGDATA="$REPO_ROOT/.postgres"
            export PGHOST="$PGDATA"
            export PGUSER="postgres"
            export PGDATABASE="rabbigerzi"

            if [ ! -d "$PGDATA" ]; then
              echo "[pg] initializing cluster at $PGDATA"
              initdb --auth=trust --username=postgres --no-locale --encoding=UTF8 >/dev/null
              {
                echo "listen_addresses = '127.0.0.1'"
                echo "unix_socket_directories = '$PGDATA'"
              } >> "$PGDATA/postgresql.conf"
            fi

            echo "[dev] run 'process-compose up' to start postgres + backend + vite"
          '';
        };
      }
    );
}
