Thank you for your interest in contributing to LockedIn! This document provides guidelines and instructions to make the contribution process smooth for everyone.
This project adheres to a Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behaviour by opening an issue.
If you find a bug, please open an issue with the following information:
- Summary — A clear and descriptive title.
- Steps to reproduce — Detailed steps to reproduce the behaviour.
- Expected behaviour — What you expected to happen.
- Actual behaviour — What actually happened.
- Environment — OS, Android version, device model, backend version, etc.
- Screenshots / Logs — If applicable.
Feature requests are welcome. Please open an issue and include:
- A clear description of the feature and the problem it solves.
- Any alternative solutions you have considered.
- Mockups or diagrams if relevant.
- Fork the repository.
- Create a feature branch from
main:git checkout -b feature/your-feature-name
- Make your changes (see Coding Guidelines).
- Commit your changes (see Commit Messages).
- Push to your fork and open a Pull Request.
Requirements: Python 3.11+, Docker & Docker Compose.
cd backend
# Option A: Run with Docker (recommended)
docker compose up -d
# Option B: Run locally
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadCreate a .env file with the required secrets before starting the server. See backend/README.md for the full list of environment variables.
Requirements: Android Studio Giraffe (2022.3.1) or newer.
- Open the
LockedIn/directory in Android Studio. - Let Gradle sync the dependencies.
- Run on an emulator or connected device (min SDK 24).
- Write clear, self-documenting code. Add comments only where the why is not obvious.
- Keep functions and classes small and focused.
- Follow existing patterns and conventions already present in the codebase.
- Follow PEP 8 style.
- Use type hints for function signatures.
- Use
async/awaitfor all I/O-bound operations. - Add docstrings to public functions and classes.
- Follow the Kotlin coding conventions.
- Use Jetpack Compose for all new UI work.
- Follow the existing MVVM architecture with repositories.
- Never log or print secrets, keys, or passwords.
- All cryptographic operations must happen on the client. The server must remain zero-knowledge.
- Use well-established libraries for cryptography — do not roll your own.
Use clear, descriptive commit messages. We recommend the Conventional Commits format:
<type>(<scope>): <short summary>
<optional body>
Types: feat, fix, docs, style, refactor, test, chore, ci.
Examples:
feat(backend): add password update endpoint
fix(android): fix crash on empty vault screen
docs: update README with deployment instructions
- Ensure your branch is up to date with
main. - Verify that the backend tests pass:
cd backend bash test_vault.sh - Verify that the Android app builds successfully:
cd LockedIn ./gradlew assembleDebug - Fill in the PR template with a description of your changes and any related issues.
- Request a review from at least one maintainer.
- Once approved and CI passes, a maintainer will merge your PR.
Thank you for helping make LockedIn better!