Contributing to Awsum

May 27, 2026 · View on GitHub

Thanks for your interest in contributing.

Development setup

Build the compiler from source:

# Install Stack (Haskell build tool)
ghcup install stack

# Build and install the compiler
stack build
stack install

# Make sure ~/.local/bin is on PATH

Target runtimes (LLVM / JVM / CLR / WASM / JS) are needed to run the test suite end-to-end. Install only the ones you plan to exercise — per-OS instructions at awsum-lang.org/install.

Project layout: see CLAUDE.md. Common commands:

just build      # Build with pedantic warnings
just test       # Run all tests
just fix        # Format, lint, build, test (run before pushing)

Developer Certificate of Origin

By contributing to Awsum you certify the Developer Certificate of Origin (DCO) for your contribution — a short statement that you wrote the patch yourself, or otherwise have the right to submit it under the project's Apache-2.0 license. The full text is at the link above.

After cloning, run once:

just setup-dev

This installs the prepare-commit-msg hook from scripts/git-hooks/ (via per-clone core.hooksPath), which adds a Signed-off-by trailer to every commit you make in this clone:

Signed-off-by: Your Name <you@example.com>

The trailer uses the name and email from your [user] section in ~/.gitconfig (the same one used for signed commits below). No manual flags, no global gitconfig changes. The setup is per-clone — repeat in each clone of the repo.

Signed commits

Separately from the DCO trailer above, the main branch requires signed commits — every commit you push to a PR needs a verified signature (GPG or SSH), otherwise the merge button stays grey.

Minimal ~/.gitconfig for SSH signing:

[user]
	email = ...
	name = ...
	signingkey = ~/.ssh/id_ed25519.pub
[commit]
	gpgsign = true
[gpg]
	format = ssh

For GPG signing instead, set gpg.format = openpgp (or omit — that's the default) and point signingkey at your GPG key ID. The option name gpgsign is git's historical name for "sign this thing" and applies regardless of format.

The same key file must be added to GitHub Settings → SSH and GPG keys as a Signing Key (a separate category from Authentication Key, even if you reuse the same file). Verify locally:

git commit -S -m "test" --allow-empty
git log --show-signature -1

If you already made unsigned commits on a feature branch, retroactively sign with:

git rebase --exec 'git commit --amend --no-edit -S' <range>

then force-push your branch.

Pull requests

  • Open against main. CI (check-and-build.yml) must be green before merge.
  • Any new functionality lands together with the tests that exercise it — see docs/testing.md for the workflow.
  • For user-visible changes, add a bullet under ## [Unreleased] in CHANGELOG.md, grouped by Keep-a-Changelog section (Added / Changed / Fixed / Removed). Infrastructure-only changes (CI, dev tooling, internal refactors) still get an entry so the next release notes are complete.
  • Run just fix before pushing — it runs the same checks CI does (format, lint, build, test), faster locally.