My release process for Haskell libraries

Just a note to myself as to the steps I normally follow when releasing a Haskell library to Hackage.

Release steps

  • Create a release-x.y branch
  • Finalize
  • Run nix-shell --run 'cabal haddock' and sanity check the haddocks
  • Commit all changes, and push a release PR.
  • Generated sdist using cabal sdist (if using flakes, run nix run nixpkgs#cabal-install -- sdist)
  • Upload a package candidate
  • Sanity check the upload, and then “publish” it publicly.
  • Run cabal haddock --haddock-for-hackage to generated haddocks for hackage.
  • Run cabal upload -d --publish $PATH_TO_TARBALL to update haddocks on the release.
  • Squash merge the PR.
  • Draft a new release on Github. Copy paste the change log. This will automatically create and push the new git tag.


  • Increment cabal version in .cabal file
  • Plan, as first task, updating of nixpkgs and package dependencies.

Open questions

  • Research a tool that automates much of the release process