Acceptance of contributions is not guaranteed. All pull requests are evaluated based on quality, relevance, and alignment with the project’s goals. The maintainers reserve the right to accept, deny, or modify any pull request at their sole discretion.
Before you start
Open an issue first. Before writing any code, open an issue to discuss your proposed change. This avoids duplicate work and ensures your contribution fits the project’s direction. When opening an issue:- Use a clear, descriptive title
- Describe the problem you are solving or the feature you want to add
- If it is a bug, include steps to reproduce it and details about your environment
- Redact any personal or sensitive information in logs and configs
Contribution workflow
Fork the repository
Click Fork at the top right of the GitHub repository to create a copy under your account.Then clone your fork and add the upstream remote:
Sync with upstream
Before starting any new work, sync your fork with the latest upstream changes. Rebase is preferred over merge to keep a clean, linear history:
Create a feature branch
Create a new branch with a descriptive name that reflects the purpose of your changes:
Make your changes
Implement your changes. Follow the existing code style and conventions. Test your changes locally against a running N.O.M.A.D. instance before submitting.
Add release notes
If your changes include anything user-facing, add a summary to the
## Unreleased section at the top of admin/docs/release-notes.md. See Release Notes format below.Commit your changes
Commit using the Conventional Commits format. See the format description below.
Submit a pull request
Push your branch to your fork and open a pull request against the In the PR description:
main branch:- Summarize what your changes do and why
- Reference the related issue (e.g.,
Closes #123) - Note any relevant testing steps or environment details
Conventional commits
This project uses Conventional Commits. All commit messages must follow this format:| Type | When to use |
|---|---|
feat | A new user-facing feature |
fix | A bug fix |
docs | Documentation changes only |
refactor | Code change that is not a fix or feature |
chore | Build process, dependency updates, tooling |
test | Adding or updating tests |
scope is optional but encouraged — use it to indicate the area of the codebase affected (e.g., api, ui, maps).
Examples:
Release notes format
Human-readable release notes live inadmin/docs/release-notes.md and are displayed in the Command Center UI.
When your changes include anything user-facing, add an entry to the ## Unreleased section at the top of that file:
- **Area**: Description to stay consistent with existing entries.
Headings to use:
- Features — new user-facing capabilities
- Bug Fixes — corrections to existing behavior
- Improvements — enhancements, refactors, docs, or dependency updates
When a release is triggered, CI automatically stamps the version and date, commits the update, and publishes the content to the GitHub release. You do not need to do this manually.
Versioning
This project uses Semantic Versioning. Versions are managed in the rootpackage.json and updated automatically by semantic-release. The project-nomad Docker image uses this version. The admin/package.json version stays at 0.0.0 and should not be changed manually.