Thank you for your interest in contributing. This guide covers everything you need to go from zero to an open pull request.
- Prerequisites
- Setting up the repo
- Project structure
- Development workflow
- Coding standards
- Testing
- Opening a pull request
- Stellar Wave Program
- Adding yourself to the contributors list
- Node.js 20 or 22 (both are tested in CI)
- pnpm 10 — install with
npm install -g pnpm@10 - Git
git clone https://github.com/determined-001/orbital_stellar.git
cd orbital_stellar
pnpm installThat installs all workspace packages. No additional steps are needed to run the test suite or typecheck.
orbital/
├── packages/
│ ├── pulse-core/ # EventEngine, Watcher, Horizon + RPC streaming
│ ├── pulse-webhooks/ # HMAC delivery, retry, SSRF protection
│ └── pulse-notify/ # React hooks
├── apps/
│ └── web/ # Next.js marketing + documentation site
├── tsconfig.base.json # Shared TypeScript config
└── pnpm-workspace.yaml
Each package is an independent TypeScript project with its own tsconfig.json, package.json, and test suite.
Typecheck everything:
pnpm -r typecheckTypecheck one package:
pnpm tsc --noEmit -p packages/pulse-core/tsconfig.jsonRun all tests:
pnpm testRun tests for one package:
pnpm --filter @orbital-stellar/pulse-core testRun tests in watch mode:
pnpm --filter @orbital-stellar/pulse-core exec vitestStart the marketing/docs site:
pnpm --filter orbital/web dev- TypeScript strict mode is on everywhere — no
any, no type assertions without justification. - No comments that describe what the code does. Only add a comment when the why is non-obvious (a hidden constraint, a workaround for a specific upstream bug, a subtle invariant).
- No unused exports. If you add a public export, it must be used or documented.
- Error handling at system boundaries only. Don't add try/catch inside internal functions unless there is a clear, specific failure mode to handle.
- Conventional commits — prefix your commit messages:
feat:new behaviourfix:bug fixdocs:documentation onlytest:test onlyrefactor:no behaviour changeperf:performance improvementchore:tooling, deps, config
All packages use Vitest. Tests live in packages/<name>/test/.
- Write a test for every new public API.
- Update existing tests when you change behaviour.
- Coverage is tracked with
@vitest/coverage-v8. Runpnpm --filter @orbital-stellar/pulse-core test:coverageto generate a report.
CI runs tests on Node 20 and Node 22. Make sure your changes pass on both.
- Find or create an issue that describes the change. Link it in your PR.
- Fork the repo and create a branch:
git checkout -b feat/my-change. - Make your changes, keeping commits focused and conventional.
- Run the full check locally before pushing:
pnpm -r typecheck && pnpm test
- Open the PR against
main. Fill in the template — what changed, why, and how to test it. - Respond to review feedback. A maintainer will review within a few days.
PRs that change public APIs require a description of the migration path. Breaking changes will not be merged until a major version is planned.
Orbital participates in the Drips Stellar Wave Program. Issues tagged Stellar Wave are eligible for point rewards.
Complexity tiers:
| Label | Points |
|---|---|
complexity:trivial |
100 |
complexity:medium |
150 |
complexity:high |
200 |
To claim an issue:
- Comment on the issue to signal intent.
- A maintainer will assign it to you.
- Submit your PR within 14 days of assignment. If you need more time, comment on the issue and we will extend it.
- Issues tagged
good-first-issueare scoped for newcomers — start there if this is your first contribution.
One open issue per contributor at a time for good-first-issue items.
Orbital uses the all-contributors specification to recognize every kind of contribution — code, docs, design, infrastructure, bug reports, reviews, ideas, and more.
The contributor table in the README is maintained by the all-contributors GitHub Action. If your work has been merged and your name is not in the table, you can add yourself in one of two ways.
Comment on any open issue or pull request:
@all-contributors please add @your-github-username for code, doc
Use as many contribution types as apply, separated by commas. The bot will open a pull request that updates .all-contributorsrc and re-renders the README table. A maintainer merges it.
Common contribution types:
| Type | Emoji | When to use |
|---|---|---|
code |
💻 | Merged code in any package |
doc |
📖 | Docs, READMEs, this file, the marketing site content |
infra |
🏗️ | CI workflows, Dependabot config, tooling |
maintenance |
🚧 | Issue triage, PR review, dependency upkeep |
test |
New or significantly expanded tests | |
review |
👀 | Reviewed pull requests |
bug |
🐛 | Reported a confirmed bug |
ideas |
🤔 | Proposed a feature that shipped |
design |
🎨 | UI / visual / brand work |
The full key lives at allcontributors.org/docs/en/emoji-key.
Edit .all-contributorsrc, add an entry under "contributors" with your GitHub login, display name, avatar URL (https://github.com/<username>.png?size=100), profile URL, and a contributions array. Then run npx all-contributors generate to re-render the README table and commit both files together.
The curated table in the README is the all-contributors set — explicitly recognized contributions across every category. It is not the same as the full git author list. For the complete commit history including everyone who has ever pushed code, see the GitHub contributor graph.
If you contributed before all-contributors was adopted (v0.1.0 release timeframe) and your name is in the git history but not the table, please open an issue or comment on a PR with your preferred GitHub login — we will add you.