Thanks for your interest in Perry. This document covers everything you need to land a PR — what to build, how to test, and what the review flow looks like.
For building and installing Perry as a user, see README.md. For runtime/compiler architecture, see CLAUDE.md. This file is about contributing, not using.
All of these are welcome and none are ranked:
- Fix a bug. Check the issue tracker, especially
good first issueandhelp wanted. - Close a TypeScript parity gap. The gap test suite tracks divergences from
node --experimental-strip-types; CLAUDE.md's "TypeScript Parity Status" table is the current scoreboard. - Add a platform backend or widget. See the "To add a new widget" and "Native UI" sections in CLAUDE.md.
- Improve docs or examples. Everything under
docs/src/anddocs/examples/is fair game. - Report an issue. File one even if you don't have a fix — reproducers are themselves a contribution.
Not sure where to start? Open a Discussion and describe what you'd like to work on; we'll help you scope it.
Prerequisites match what CI installs — see .github/workflows/test.yml for the authoritative list. In short:
| Component | Version | Needed for |
|---|---|---|
| Rust | stable | Everything |
Rust nightly + rust-src |
latest | tvOS / watchOS cross-compile only (-Zbuild-std) |
| Node.js | 22 | Parity tests (run_parity_tests.sh) |
| C linker | any | Linking compiled binaries (xcode-select --install / build-essential / MSVC) |
Platform-specific extras — only required if you're touching that backend:
- macOS UI (
perry-ui-macos): Xcode Command Line Tools - iOS / tvOS / watchOS: Xcode + matching SDKs;
rustup target add aarch64-apple-ios-sim - Android (
perry-ui-android): Android NDK ($ANDROID_NDK_HOMEor$ANDROID_HOME/ndk/*);rustup target add aarch64-linux-android - Linux UI (
perry-ui-gtk4):libgtk-4-dev libadwaita-1-dev libpulse-dev pkg-config(Xvfb for headless UI tests) - Windows UI (
perry-ui-windows): MSVC (ilammy/msvc-dev-cmdor avcvars64.batsession)
Build and test the default (platform-independent) workspace:
cargo build --release
cargo test --workspace \
--exclude perry-ui-ios --exclude perry-ui-tvos --exclude perry-ui-watchos \
--exclude perry-ui-gtk4 --exclude perry-ui-android --exclude perry-ui-windowsThe full README Development section has more cargo run recipes (HIR dumps, per-crate rebuilds).
- One logical change. Small PRs land faster. If you find yourself writing "also, I fixed …", split.
- Tests. New behavior needs a test; a bug fix needs a regression test. For compiler changes, drop a
.tsfile undertest-files/exercising the path. For runtime/stdlib,#[test]in the relevant crate. - Docs where user-visible. New CLI flags, new perry.toml fields, new stdlib APIs → update
docs/src/.
- Do not bump
[workspace.package] versioninCargo.toml. - Do not edit
**Current Version:**at the top ofCLAUDE.md. - Do not add a "Recent Changes" entry to
CLAUDE.mdorCHANGELOG.md.
Perry releases frequently — often several patch versions between a PR being opened and merged. If contributors bump the version on their branch, those bumps conflict on merge day through no fault of the contributor. The maintainer folds version + changelog metadata in when landing your PR, so it always matches the actually-shipped release.
We loosely follow Conventional Commits — not enforced, but you'll see feat: / fix: / docs: / chore: / refactor: prefixes in the log. Match that style and your PR reads better in the changelog. A good commit message answers "why" more than "what"; the diff already shows what.
Comment on the issue saying you'd like to take it. We'll assign it to you. If you go quiet for a week or two, we may un-assign to let someone else pick it up — no hard feelings, just keeping the board moving.
Mirroring CI before pushing saves a round trip:
cargo build --release # All crates
./run_parity_tests.sh # Perry vs Node parity (needs Node 22)
./scripts/run_doc_tests.sh # Compile + run every docs/examples/*.tsUI doc-tests launch real windows. On headless hosts, wrap in xvfb-run -a (Linux) or rely on PERRY_UI_TEST_MODE=1 which auto-exits after one frame.
- Bug: open an issue — the template asks for Perry version, target, host OS, and a minimal repro.
- Feature request: open an issue with the "feature request" template.
- Open-ended question, design discussion, "is Perry right for my use case": start a Discussion.
- Security issue: email
ralph@skelpo.comdirectly; please don't file a public issue for anything exploitable.
Participation is governed by the Code of Conduct — tl;dr: be kind, assume good faith, disagree in the open on technical merits. Reports go to ralph@skelpo.com.
Perry is MIT-licensed. By contributing, you agree your contributions are licensed under the same terms. We do not require a CLA or DCO sign-off.