Welcome, and thanks for your interest in contributing. This document is your starting point — it covers the contribution workflow, coding standards, and PR guidelines. Deeper references are linked throughout.
Start here instead (recommended):
- Environment setup (tools, clone, verify):
docs/ENVIRONMENT_SETUP.md - Development workflow (fork, branch, PR):
CONTRIBUTOR_DEVELOPMENT_WORKFLOW_GUIDE.md
| Document | Purpose |
|---|---|
| This file | Workflow, standards, PR guidelines |
CONTRIBUTOR_SETUP.md |
Full local environment setup from scratch |
CONTRIBUTOR_DEVELOPMENT_WORKFLOW_GUIDE.md |
End-to-end workflow reference |
CONTRIBUTOR_ARCHITECTURE_DEEP_DIVE.md |
System architecture and component internals |
ARCHITECTURE_OVERVIEW.md |
High-level architecture walkthrough |
Companion guides:
docs/GIT_WORKFLOW.md— the full branching strategy, commit conventions, and PR process, with a command cheat sheetdocs/CONTRIBUTOR_TROUBLESHOOTING.md— solutions for common build, test, database, and Git problemsdocs/API_ERROR_REFERENCE.md— every error response the listener API returnsdocs/adr/README.md— Architecture Decision Records
Use these names consistently in docs and PRs:
| Concept | Standard form |
|---|---|
| Product name (prose/titles) | NotifyChain |
| GitHub repository / clone directory | Notify-Chain (Core-Foundry/Notify-Chain) |
| Off-chain service | Listener (listener/) |
| React + Vite UI | Dashboard (dashboard/) |
| Legacy analytics app | Frontend (frontend/) |
| On-chain code | Smart contracts (contract/, Documents/Task Bounty/) |
Canonical setup path: workflow guide → LOCAL_DEVELOPMENT.md (quick) → CONTRIBUTOR_SETUP.md (detailed).
- Be respectful and inclusive
- Provide constructive feedback
- Focus on what is best for the community
- Show empathy towards other contributors
To contribute to NotifyChain, install the tools listed in
docs/ENVIRONMENT_SETUP.md (Rust, WebAssembly
target, Stellar CLI, Node.js 22, Git). The guide includes verification steps
to confirm your machine is ready.
You should also have a basic understanding of Soroban smart contracts, Git, and GitHub.
To set up a local development environment, follow this fork-and-clone workflow:
- Fork the Repository: Visit Notify-Chain and click the Fork button to create a copy of the repository under your GitHub account.
- Clone your Fork:
git clone https://github.com/your-username/Notify-Chain.git cd Notify-Chain - Configure Upstream Remote: Keep your fork updated by pointing to the upstream repository:
git remote add upstream https://github.com/Core-Foundry/Notify-Chain.git
- Verify Remotes: Run
git remote -vto ensure your configuration is correct:origin https://github.com/your-username/Notify-Chain.git (fetch) origin https://github.com/your-username/Notify-Chain.git (push) upstream https://github.com/Core-Foundry/Notify-Chain.git (fetch) upstream https://github.com/Core-Foundry/Notify-Chain.git (push)
Before starting any new work or creating a branch, always pull the latest changes from the upstream main branch to prevent merge conflicts:
- Give constructive, specific feedback
- Show empathy — everyone is learning
Before you start, make sure you have:
- Rust (stable) + WebAssembly target:
rustup target add wasm32-unknown-unknown - Stellar CLI:
cargo install --locked stellar-cli --features opt - Node.js 22 (used by both listener and dashboard in CI)
- Git
For a detailed walkthrough including platform-specific notes, see CONTRIBUTOR_SETUP.md.
Requires Docker Desktop (or Docker Engine + Compose on Linux). No Node.js install needed.
Verify Stellar CLI:
git clone https://github.com/YOUR-USERNAME/Notify-Chain.git
cd Notify-Chain
git remote add upstream https://github.com/Core-Foundry/Notify-Chain.git
cp .env.example .env
# Edit .env — set CONTRACT_ADDRESSES to your deployed contract ID
docker compose up --buildDashboard → http://localhost:5173 · Listener API → http://localhost:8787
git clone https://github.com/YOUR-USERNAME/Notify-Chain.git
cd Notify-Chain
git remote add upstream https://github.com/Core-Foundry/Notify-Chain.git
cd listener && npm install && cp .env.example .env && npm run migrate
cd ../dashboard && npm install && cp .env.example .envMinimum listener/.env:
STELLAR_RPC_URL=https://soroban-testnet.stellar.org:443
CONTRACT_ADDRESSES=[{"address":"YOUR_CONTRACT_ID","events":["*"]}]Full setup details: CONTRIBUTOR_SETUP.md
- Browse open issues. New? Look for
good first issue. - Comment:
I would like to work on this issue. - Wait to be assigned — don't open a PR for unassigned work.
- Once assigned, submit a draft PR or progress update within 5 days. Post an update if you need more time.
git remote add upstream https://github.com/Core-Foundry/Notify-Chain.git
git remote -v # verify: origin = your fork, upstream = main repoAlways start from an up-to-date main:
git checkout main
git fetch upstream
git merge upstream/main
git push origin main
git checkout -b <branch-name>Branch naming:
| Prefix | Use |
|---|---|
feature/ |
New features |
fix/ |
Bug fixes |
docs/ |
Documentation |
refactor/ |
Refactoring |
test/ |
Tests only |
chore/ |
Maintenance |
For the complete branching strategy — including naming rules, what to avoid, and how to recover from common mistakes — see
docs/GIT_WORKFLOW.md.
cd dashboard
npm ci- Follow the existing code style in each component directory.
- Add comments for non-obvious logic.
- Update docs when behavior changes.
- Write tests for all new logic and bug fixes.
Making a significant architectural change? Read the Architecture Decision Records first — they document why the current design is what it is. If your change alters one of those decisions, add a new ADR using
docs/adr/0000-template.mdand reference it in your PR.
Hit a problem? Check docs/CONTRIBUTOR_TROUBLESHOOTING.md before opening an issue.
Contracts (Rust)
cd contract
cargo fmt --all # format
cargo fmt --all -- --check # verify clean
cd contracts/hello-world && cargo test # unit testsListener (TypeScript)
cd listener
npm run lint
npm run typecheck
npm testDashboard (TypeScript)
cd dashboard
npm run lint
npm run build # includes TypeScript check
npm testFollow Conventional Commits:
feat: new feature
fix: bug fix
docs: documentation only
test: tests only
refactor: no behavior change
chore: maintenance
Examples:
git commit -m "feat: add retry queue for failed notifications"
git commit -m "fix: resolve event parsing issue in listener"
git commit -m "test: add payload validation edge cases"git push -u origin <branch-name>Then open a PR on GitHub against main. GitHub will pre-fill the PR template — fill it out completely.
- Format with
cargo fmt --allbefore every commit - Add
///doc comments on all public functions and structs - Use
#[contracterror]for custom errors - Every public function needs a test
npm run lintmust pass with zero warnings- Use TypeScript — no
anyunless genuinely unavoidable - Unit test all new service logic
- Follow existing file and naming conventions in the directory you're editing
- Push your branch and open a Pull Request on GitHub:
git push -u origin <branch-name>
Match commit convention: feat: add slack notification channel
The PR template will prompt you for:
- Overview of what changed and why
- Linked issue number
- Key files modified
- Verification commands you ran
- Manual test instructions
- Branch is up to date with
main - All tests pass locally
- Lint/format checks pass
- Docs updated if behavior changed
- PR scope is focused on a single issue
- CI runs automatically — wait for green before requesting review.
- Address feedback promptly and push to the same branch (the PR updates automatically).
- Keep the scope tight — don't mix unrelated changes in one PR.
- Reviewers will test locally for significant changes.
Maintainers preparing a tagged release should follow the steps in
docs/RELEASE_CHECKLIST.md, including CI-parity
testing, documentation review, and release validation.
Review expectations and a per-area checklist live in
docs/CODE_REVIEW_GUIDELINES.md.
- Ensure all tests pass locally
- Address reviewer feedback promptly
- Keep PR scope focused on a single issue or feature
- Be open to suggestions
Dependabot opens PRs weekly (Mondays) for outdated dependencies across all four ecosystems. Config is in
.github/dependabot.yml.
When reviewing Dependabot PRs: check the changelog for breaking changes, wait for CI to pass, and review the migration guide for major version bumps.
NotifyChain uses fully automated releases powered by semantic-release. You never need to bump version numbers or write changelog entries manually — the tooling derives everything from commit messages.
- Every commit merged to
mainis analysed by the release workflow (.github/workflows/release.yml). - If any releasable commits exist (see table below),
semantic-release:- Determines the next semver version.
- Updates
CHANGELOG.mdwith structured release notes. - Bumps
versionindashboard/package.json,listener/package.json, andcontract/contracts/hello-world/Cargo.tomlviascripts/bump-versions.js. - Creates a Git tag
vX.Y.Zand pushes it. - Publishes a GitHub Release with auto-generated release notes.
- Posts a comment on any PR/issue included in the release.
| Commit prefix | Example | Release bump |
|---|---|---|
feat: |
feat: add webhook delivery channel |
minor (1.x.0) |
fix: |
fix: retry logic on timeout |
patch (1.0.x) |
perf: |
perf: reduce event polling interval |
patch (1.0.x) |
refactor: |
refactor: extract notification builder |
patch (1.0.x) |
BREAKING CHANGE: footer or feat!:/fix!: |
feat!: rename schedule_notification params |
major (x.0.0) |
docs:, test:, chore:, ci:, style: |
any | no release |
This is why following Conventional Commits matters — your commit message directly controls whether a release happens and what kind it is.
You can trigger the workflow manually from the Actions tab:
- Select Release workflow → Run workflow.
- Set
dry_runtotrueto preview what would be released without creating a tag or GitHub Release. - Leave
dry_runasfalse(default) to cut a real release on demand (e.g. for hotfixes that need to ship before the next batch ofmainmerges).
The workflow uses the default GITHUB_TOKEN — no extra secrets are required
for tagging and publishing GitHub Releases.
- GitHub Releases:
https://github.com/Core-Foundry/Notify-Chain/releases - CHANGELOG:
CHANGELOG.mdin the repo root.
- Search existing issues first.
- Open a new issue for bugs or feature requests.
- Join discussions on GitHub.
By contributing, you agree your work will be licensed under the MIT License.