Skip to main content


We ❀️ every form of contribution. The following document aims to provide enough context to work with our codebase and to open pull requests that follow our conventions. If this document does not provide enough help, open a new issue and we'll gladly help you get started.

Work with the code#

Airy Core uses Bazel to build and test itself. We suggest you to install bazelisk, a small utility that will install the right version of Bazel for you.


You can build the whole platform using the following command:

bazel build //...

and build a specific project like so:

bazel build //backend/api/communication:all


To run tests, execute the following command:

bazel test //...

You can also run tests of a specific project like so:

bazel test //backend/conversations/api/communication:all


You can lint the entire code base by executing the ./scripts/ script.

We use language specific linters:

Java, buildifier and prettier are ran as test targets for each package, so you can run:

bazel test //my/package:checkstyle
bazel test //my/package:prettier
bazel test //my/package:buildifier

You can also run:

bazel run //:fix

to try fixing issues automatically (not supported for checkstyle).

Managing dependencies#

If you add, remove, or change a dependency from the maven_install, you must re-pin dependencies using the following command:

bazel run @unpinned_maven//:pin

Exploring the code base#

Bazel has an extensive query language you can use to dig deeper into projects. Here are a few examples:

# show all deps of a given project
bazel query "deps(//backend/api/conversations:all)" --output label
# show the available tests of a given project
bazel query "tests(//backend/api/conversations:all)" --output label
# show all the packages under a specific path
bazel query "backend/..." --output package

If you are not familiar with a specific project, you can also run the following query:

bazel query "backend/..."

The query shows all the targets produced under that specified package. It can help getting started.

Bazel also offers a friendly and powerful autocompletion, please refer to this document to install it locally.

Naming conventions#

In order to organize our releases in the best possible way, we follow a few critical conventions.


Branches must abide to the following format:


branch-type is defined as follows:

  • feature or feat are used for feature branches
  • bug, fix, hotfix are used for bug fixes
  • doc or docs are used for documentation changes
  • chore is used for maintenance tasks on the repo

The description field must use kebab case.

Given these conventions here are a few examples:



To keep a clean track of what is being released, every feature must contain only one commit when merged. The commit message of the squashed commit is very important, since it will be used to keep track of the features in a release.

The conventional format is: [#issue] - description. For the example, if your pull request refers to the issue "Introduce meaning of life" with number 42, the squashed commit message must be:

[#42] Introduce meaning of life
Fixes #42
Last updated on