Development ideology
The Signal team holds six principles that shape every design decision in the app. Understanding them will help you write code that fits the project.The answer is not more options
The answer is not more options
If you feel compelled to add a preference that is exposed to the user, it is very possible you have made a wrong turn somewhere. Simplicity is a feature.
The user doesn't know what a key is
The user doesn't know what a key is
Minimize the points at which a user is exposed to cryptographic terminology as much as possible. Abstractions must be invisible.
There are no power users
There are no power users
The idea that some users “understand” concepts better than others has proven to be, for the most part, false. If anything, so-called power users are more dangerous than the rest — avoid exposing dangerous functionality to them.
If it's 'like PGP,' it's wrong
If it's 'like PGP,' it's wrong
PGP is the guide for what not to do. Complexity, key management ceremony, and user-visible identifiers are all failure modes.
It's an asynchronous world
It's an asynchronous world
Be wary of anything that is anti-asynchronous: ACKs, protocol confirmations, or any protocol-level advisory message.
There is no such thing as time
There is no such thing as time
Protocol ideas that require synchronized clocks are doomed to failure.
Finding issues to work on
The GitHub issue tracker is used exclusively for bugs in the Android client — not feature requests or general discussion.Bug tracker
Search open and closed issues before filing a new one. Every open issue is tracked and read by the team.
Community forum
Feature requests, larger change proposals, and general discussion belong on the community forum.
- Look for issues labelled as good first candidates in the open issues list.
- Propose larger features on the community forum before writing any code — large changes require coordination across Android, iOS, and Desktop.
- Check closed issues to understand what has already been tried.
Signing the CLA
You must sign the Contributor License Agreement before your pull request can be merged. Sign the CLA at signal.org/cla/. This is a one-time requirement per contributor.Pull request guidelines
Smaller is better
Large pull requests are significantly less likely to be accepted. Big features often require protocol modifications and a staged rollout coordinated across millions of users on multiple platforms.The Signal team is small. A focused PR with a clear scope is much easier to review and ship than a sprawling change.
Submit finished, well-tested PRs
- Do not submit pull requests that are still a work in progress.
- Test your changes thoroughly before opening a PR.
- Follow the code style guidelines — run
./gradlew formatbefore pushing. - One concern per pull request. Do not bundle unrelated fixes.
Be patient
If your pull request follows all the guidelines above but has not been merged, the team likely has not had time to review it yet. Merging can sometimes take a while.Ways to contribute beyond code
Contributing to Signal does not require writing Kotlin or Java. There are several other valuable ways to get involved:Translations
Help translate Signal into your language on the community forum’s translation section.
Bug reports
Write useful, reproducible bug reports. Search existing issues first to avoid duplicates.
Documentation
Improve the wiki, fix inaccuracies, or add missing information.
Donations
Signal is a non-profit. Donations help fund ongoing development and infrastructure.
- Redirecting support questions to support@signal.org and the Signal Support Center.
- Redirecting non-bug discussions to the community forum.
- Finding and marking duplicate issues.
- Reproducing reported issues and adding troubleshooting details.
- Testing other contributors’ pull requests.
- Sharing Signal with friends and family.
