The most common cause of broken anchors in Markdown is placing emojis at the start of a header. Different parsers (GitHub, VS Code, IntelliJ) handle the slug generation for emojis differently (some strip them, some encode them).
To fix this while keeping the "beautiful" aesthetic, I have moved the emojis to the end of the headers. This guarantees that the generated link ID will always be standard text (e.g., #code-of-conduct), ensuring the Table of Contents works everywhere.
Here is the fixed CONTRIBUTING.md:
First off, thank you for considering contributing to Lynk! It's people like you that make the open-source community such an amazing place to learn, inspire, and create.
We welcome contributions of all forms: bug fixes, new features, documentation improvements, and performance optimizations. This document guides you through the process of contributing to maintain the high quality and performance standards of the platform.
- Code of Conduct
- Getting Started
- Reporting Issues
- Development Workflow
- Coding Standards
- Commit Guidelines
- Pull Request Process
By participating in this project, you are expected to uphold our Code of Conduct. We expect all contributors to treat one another with respect and professionalism. Harassment or abusive behavior will not be tolerated.
- Fork the repository on GitHub.
- Clone your fork locally:
git clone https://github.com/YOUR-USERNAME/Lynk.git cd Lynk - Set up the environment following the instructions in the README.md. Ensure you have Docker running and certificates generated.
- Create a branch for your specific contribution.
We use GitHub Issues to track bugs. Report a bug by opening a new issue; it's that easy! Great Bug Reports tend to have:
- A quick summary and/or background.
- Steps to reproduce (be specific!).
- What you expected would happen vs. what actually happened.
- Logs, screenshots, or infrastructure details (e.g., "Kafka container crashed with error X").
We love new ideas. If you want to suggest a feature, please open an issue and tag it as enhancement. Describe the use case and why it fits into the Lynk architecture.
We follow a standard Feature Branch workflow.
- Sync your fork: Keep your
mainbranch up to date with the original repository. - Create a Branch:
git checkout -b feature/my-amazing-feature # or git checkout -b fix/memory-leak-issue - Code: Implement your changes.
- Test: Run the specific service tests and ensure the docker environment is stable.
Since Lynk is a high-performance reactive platform, we have strict guidelines to ensure stability.
- Follow the official Kotlin Style Guide.
- Code should be concise but readable. Prefer expression bodies for simple functions.
- Immutability: Prefer
valovervarand immutable data structures wherever possible.
This project uses Spring WebFlux (Project Reactor).
- 🚫 NEVER block the main thread. Avoid
Thread.sleep(), blocking JDBC calls, or.block()/.blockFirst()in production code. - ✅ ALWAYS use non-blocking operators (
flatMap,map,zip,filter). - If you must wrap a blocking call (e.g., a legacy library), offload it to a bounded elastic scheduler:
Mono.fromCallable { blockingCall() } .subscribeOn(Schedulers.boundedElastic())
- Unit Tests: Required for all business logic. Use JUnit 5 and Mockk.
- Integration Tests: We use Testcontainers for verifying interactions with Postgres, Cassandra, and Kafka. Do not mock the database in integration tests; spin up the container.
We follow the Conventional Commits specification. This allows us to automatically generate changelogs.
Format: <type>(<scope>): <subject>
Types:
feat: A new featurefix: A bug fixdocs: Documentation only changesstyle: Changes that do not affect the meaning of the code (white-space, formatting, etc)refactor: A code change that neither fixes a bug nor adds a featureperf: A code change that improves performancetest: Adding missing tests or correcting existing testschore: Changes to the build process or auxiliary tools (e.g., Dockerfile, CI/CD)
Examples:
feat(auth): implement TOTP verification logicfix(messaging): resolve race condition in room creationchore(infra): update kafka docker image version
- Self-Review: Look through your code one last time. Did you leave any
TODOs orprintstatements? - Update Documentation: If you changed an API or environment variable, update the
README.mdor Swagger docs. - Run Tests: Ensure
./gradlew testpasses locally. - Open PR:
- Target the
mainbranch. - Reference any relevant issues (e.g., "Closes #42").
- Provide a clear description of what you changed and why.
- Target the
- Review: Maintainers will review your code. Be open to feedback!
Happy Coding! 🚀