First off, thanks for taking the time to contribute! 🎉
- Fork the repository
- Clone your fork:
git clone https://github.com/your-username/nobodywho.git - Create a new branch:
git checkout -b feature/amazing-feature - Make your changes
- Push to your fork:
git push origin feature/amazing-feature - Open a Pull Request
Run the setup script once after cloning:
./setup.shThis installs just (if not already present) and wires up the pre-push hook. After that, just check is available as a manual command and tolerates uncommitted changes. On git push, the hook runs just check --require-clean, which also fails if formatting or generated files differ from what is committed.
- Install Nix package manager (if you haven't already)
- Enable flakes: Add
experimental-features = nix-command flakesto your Nix config - Run
nix developfrom any directory in the repo. This activates a development shell with all required tools and sets up the pre-push hook automatically — no need to runsetup.sh. - Install the stable rust toolchain using rustup (if you haven't already).
- To compile the plugin: run
cargo buildfrom the nobodywho dir to build the plugin. - Set the TEST_MODEL env var to be a path to a Qwen 2.5 1.5B Instruct model in the GGUF format.
- To run unit tests: run
cargo test -- --nocapture --test-threads=1from the nobodywho dir - When done, run
nix flake checkto run all tests.
- Install rustup and the rust stable toolchain
- Install cmake, llvm, and msvc.
- Install the Vulkan SDK, and set the VULKAN_SDK environment variable.
- To compile the plugin: run
cargo buildfrom the nobodywho dir to build the plugin. - Set the TEST_MODEL env var to be a path to a Qwen 2.5 1.5B Instruct model in the GGUF format.
- To run unit tests: run
cargo test -- --nocapture --test-threads=1from the nobodywho dir
- Make sure all tests pass
- Link any relevant issues in your PR description
- If the change affects users, add a change file with
just change(see Changelog entries). Otherwise ask a maintainer to add theno-changeloglabel; CI fails without one or the other. Don't editCHANGELOG.mddirectly: CI fails that too, unless a maintainer adds theedit-changeloglabel for a deliberate edit such as fixing a past entry. - The PR will be merged once you have the sign-off of at least one maintainer
Pending changes are described as files in .changeset/ rather than edited into CHANGELOG.md directly. Each binding is versioned and released on its own, and at release time these files are turned into a dated CHANGELOG.md entry and each released binding's next version. just change asks which bindings the change affects, which changelog section it belongs in, how big a bump it is, a description and a file name, and writes a file like this:
---
section: changed
bindings:
python: minor
flutter: major
---
One or two sentences describing the change for users.sectionis the Keep a Changelog section:added,changed,deprecated,removed,fixedorsecurity.- Under
bindings, list every binding whose users will notice the change, and only those. A change incore/usually affects all six:python,godot,flutter,kotlin,react-nativeandswift. - Pick the bump per binding:
majorif existing code can break (removed or renamed API, changed signature or behaviour, newly rejected input),minorfor new functionality or other changes,patchfor bug fixes.just changesuggests a bump from the section (minorforaddedanddeprecated,majorforremoved,patchforfixedandsecurity, none forchanged) and gives every binding the same bump; edit the file if they should differ. - Don't name the affected bindings or mark the change as breaking in the text;
CHANGELOG.mdadds both from the frontmatter. - Write two files if the wording should differ between bindings.
just check-changesets validates the files, and just next-versions previews the CHANGELOG.md entry they would produce. Don't add entries for internal maintenance, CI, or documentation-only changes.
At release time, just prepare-release bumps the version files, writes the CHANGELOG.md entry (and Flutter's pub.dev changelog) and deletes the consumed change files. The release skill describes the full process, including tagging.
- Follow the existing code style
- Use meaningful variable and function names
- Write tests for new features
- Keep commits atomic and write clear commit messages
- Join our Discord or Matrix for discussions
- Be nice to others (see our Code of Conduct)
- Ask questions if you're stuck
By contributing, you agree that your contributions will be licensed under the same license as the project (see LICENSE file).