Thanks for your interest in improving ps5upload! Contributions come in via the standard fork + pull request flow — the repository doesn't grant direct push access, so everyone (including regulars) proposes changes the same way.
- Fork the repo to your own account.
- Branch off
mainin your fork:git checkout -b my-change. - Make your change, keeping it focused — one logical change per PR.
- Run the quality gate locally (see below) until it's green.
- Open a pull request against
phantomptr/ps5upload:mainand fill out the PR template (.github/PULL_REQUEST_TEMPLATE.md).
Every PR is gated by CI (the PR gate check) and reviewed by the code
owner before it can merge. PRs are squash-merged, so your branch becomes a
single clean commit on main.
make install # bootstrap the dev env (auto-detects macOS / Linux / Windows)
make build # payload ELF + Rust engine + client UI
make run-client # launch the Tauri dev appSee the README and TESTING.md for the full toolchain (PS5 Payload SDK, Rust, Node 22, Tauri prerequisites).
CI runs the same checks; running them locally first saves a round-trip:
npm run validate # lints + unit/integration tests + typecheck + i18n + buildnpm run validate covers, across all three layers:
- Lints —
cargo fmt/clippy(engine + Tauri shell), ESLint,tsc, script syntax/audit, and the i18n coverage gate. - Unit + integration tests —
cargo test --workspace(protocol, core, engine, pkg, and the mock-FTX2 integration tests — no PS5 required), the Tauri shell tests, and the client Vitest suite.
Other useful targets:
make test # script + engine + payload + client checks
npm run validate:full # adds the payload ELF build (needs PS5_PAYLOAD_SDK)
npm run coverage # frontend + Rust coverage reportsIf your change touches user-facing strings, add the key to
client/src/i18n/locales/en.ts; npm run i18n:check will tell you if a
locale needs an allowlist entry.
- Match the surrounding code's style, naming, and comment density.
- Keep PRs small and reviewable; unrelated cleanups belong in their own PR.
- Hardware-specific behavior (anything that talks to a real PS5) can't be verified in CI — call out in your PR how you tested it on hardware.
- By contributing, you agree your work is licensed under the project's GPLv3.
Open a GitHub issue or ask in the Discord.