Thanks for helping. Avo is an early preview; bug reports with a diagnostics archive (Help › Report a Problem) are as valuable as code.
Everyone taking part follows the Code of Conduct. Questions belong in Discussions, and security problems in a private report (SECURITY.md).
- Use the forms on New issue: Bug report for Avo itself, App compatibility for an app or game that does not run, Feature request for ideas.
- Attach the diagnostics archive from Help › Report a Problem.
- New issues are labelled
needs triageuntil the maintainer has looked at them;good first issuemarks ones that suit a first contribution.
- Read README.md for the build requirements and docs/architecture.md for how the pieces fit.
- For anything larger than a small fix, open an issue or a discussion first so the approach can be agreed on.
- Host (Swift).
make testmust pass. Keep platform-independent logic inhost/AvoKitwith tests; AppKit and SwiftUI code goes in the Xcode targets, except the UI Avo Hub shares (AvoHazeUIandAvoKeymapUIin AvoKit), which keeps its public API small and its host hooks in KeymapHost.swift. Swift 6 language mode with strict concurrency. New user-facing strings go through the String Catalogs (make stringsafter a build), in English and Indonesian. - Engine (Rust).
cargo testinengine/hvfmust pass; setAVO_VMM_MUTE=1to keep sound tests off the Mac's speakers. Document device behaviour in docs/engine.md. - Android helpers. The helpers in
guest/are built by theirbuild.sh(ormake helpers) and embedded in the daemon as generated Swift files. Commit the regenerated file together with the source change. - Protocol. Change
proto/avo/v1/*.proto, runscripts/gen-proto.sh, bumpPROTOCOL_VERSION_CURRENTonly for incompatible changes, and update docs/protocol.md. Input record layout changes needAVO_UPDATE_GOLDEN=1 swift testand the Java check inguest/bridge-agent/build.sh. - Website.
npm testinwebsite/must pass; wording lives inwebsite/src/i18n/en.jsonandid.json, which must keep the same keys.
- Device profiles. Add
profiles/devices/<id>.jsonwith values from a stockbuild.prop;DeviceProfileTestsvalidates every file. - Keymap profiles. Add
profiles/keymaps/<package>.json. Profiles with shooter mode may not contain repeated taps, macros, or swipes through the aim area;KeymapProfileTestschecks them. Avo does not accept profiles that give an unfair advantage.
Edit branding/tools/generate.py, not the generated files.
- Fork the repository and branch from
main(fix/…,feature/…,docs/…). - Keep each commit to one topic, with an imperative subject line of 72 characters or fewer and a body that explains why.
- Run the tests for what you changed:
make test(host),cargo testinengine/hvf(engine),npm testinwebsite/(website). Avo has no CI for the apps: builds and releases are made on the release Mac, so these local runs are the check. - Open the pull request with the template filled in: what changed, why, and how you tested it (which app or game, which Mac).
mainis protected: changes arrive through pull requests, reviewed by the maintainer (CODEOWNERS), and are squash-merged; conversations must be resolved first.
By contributing you agree that your contribution is licensed under the
project's license (Apache 2.0; BSD-3-Clause for engine/hvf).