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 develop -c 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)
  • Run cabal upload [--publish] <path/to/sdist> to upload the sdist. Ignore --publish if you want to preview it first.
  • Publish Haddocks manually (optional, if Hackage doesn’t do it automatically)
    • 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