How to Contribute to Open Source
Your first contribution doesn't have to be code. Here's how to find projects, make contributions that get accepted, and become part of the community.
Why contribute?
For yourself:
- Learn by working on real codebases
- Build a public portfolio
- Practice collaboration and code review
- Gain experience with professional workflows
For your career:
- Demonstrate skills to potential employers
- Build relationships with developers
- Get your name on projects people use
- Learn from experienced developers
For the community:
- Improve tools you use
- Help others facing the same problems
- Sustain software everyone depends on
- Give back to projects that helped you
Contributions that aren’t code
Non-code contributions are often more needed than code:
Documentation
- Fix typos and unclear explanations
- Write tutorials and examples
- Translate docs to other languages
- Add missing information you wish existed
Why it matters: Good docs attract users. Bad docs drive them away. Most developers hate writing documentation. You fill a real gap.
Bug reports
- Report issues with clear reproduction steps
- Test and verify other people’s bug reports
- Identify and report security issues (responsibly)
A good bug report includes:
## Description
What happened vs. what should have happened
## Steps to reproduce
1. Do X
2. Then Y
3. Then Z
## Environment
- OS: macOS 14.0
- Version: 2.3.1
- Node: 18.0.0
## Logs/Screenshots
[paste relevant error messages or screenshots]Testing
- Test new releases before they ship
- Write automated tests for untested code
- Verify bugs are fixed after patches
- Test on different platforms/environments
Community support
- Answer questions on forums, Discord, Stack Overflow
- Help newcomers get started
- Triage issues (categorize, check for duplicates)
- Review pull requests (even without merge access)
Design and UX
- Improve UI/UX
- Create graphics, icons, logos
- Write user-facing copy
- Conduct usability reviews
Finding your first project
Start with what you use
What open-source tools do you use daily?
- A library in your project
- A framework you’re learning
- A tool you rely on
- Something you wish worked better
You already understand the project as a user. That’s valuable context.
Look for “good first issue” labels
Most projects label beginner-friendly issues:
good first issuefirst-timers-onlyhelp wantedbeginnereasy
Where to find them:
- GitHub:
label:"good first issue" is:open - goodfirstissue.dev
- firsttimersonly.com
- up-for-grabs.net
Assess the project first
Before contributing, check:
- Is it active? Recent commits? Responsive maintainers?
- Are PRs getting merged? Or sitting for months?
- Is the community welcoming? Read some issue discussions
- Are contribution guidelines clear? Look for CONTRIBUTING.md
- Is there a Code of Conduct? Sign of healthy community norms
A “good first issue” on an abandoned project is a waste of time.
The contribution workflow
1. Read the contribution guidelines
Most projects have a CONTRIBUTING.md file explaining:
- How to set up the development environment
- Code style requirements
- How to run tests
- What a good PR looks like
- Communication expectations
Follow these guidelines exactly. Ignoring them signals you didn’t bother reading them.
2. Communicate your intent
Before spending hours on a contribution:
Hi! I'd like to work on this issue. My approach would be:
1. [Brief description of your plan]
Is this the right direction? Is anyone else already working on this?This prevents:
- Working on something someone else is doing
- Taking the wrong approach
- Wasted effort on low-priority issues
3. Fork and clone
# Fork on GitHub (button on the project page)
# Clone your fork
git clone https://github.com/YOUR-USERNAME/project.git
# Add upstream remote
cd project
git remote add upstream https://github.com/ORIGINAL-OWNER/project.git4. Create a branch
# Get latest changes
git fetch upstream
git checkout main
git merge upstream/main
# Create feature branch
git checkout -b fix/typo-in-readmeBranch naming conventions vary. Common patterns:
fix/descriptionfeature/descriptiondocs/description
5. Make your changes
- Follow the code style of the project
- Write tests if applicable
- Update documentation if needed
- Keep changes focused (one issue per PR)
6. Test your changes
# Run the project's test suite
npm test
# or
pytest
# or whatever the project usesUntested code often has bugs. Passing tests give maintainers confidence.
7. Commit with a good message
git commit -m "Fix typo in installation docs
The word 'recieve' should be 'receive'.
Fixes #123"Good commit messages:
- Start with a verb (Fix, Add, Update, Remove)
- Are specific about what changed
- Reference the issue number if applicable
- Explain why if not obvious
8. Push and open a PR
git push origin fix/typo-in-readmeThen open a pull request on GitHub. Include:
## Description
Brief description of what this PR does
## Related Issue
Fixes #123
## Changes
- Fixed typo in README
- Updated example code to match
## Testing
- [ ] Existing tests pass
- [ ] Added tests for new functionality
## Screenshots (if applicable)
[Before/after if it's a UI change]9. Respond to feedback
Maintainers may:
- Ask questions
- Request changes
- Suggest different approaches
- Ask you to rebase
This is normal. Code review improves quality. Respond thoughtfully:
Good point, I'll update that. Let me know if this revision looks better.Don’t take feedback personally. Maintainers are often terse because they review many PRs.
10. Get merged (or not)
If merged: congratulations! You’re an open-source contributor.
If rejected: ask for feedback. Learn. Try again. Rejection is part of the process.
Your first contribution ideas
Easiest (start here)
- Fix a typo in documentation
- Improve a confusing error message
- Add a missing documentation section
- Update outdated examples
Moderate
- Write a test for untested code
- Fix a bug from the issue tracker
- Add missing TypeScript types
- Improve accessibility
More involved
- Implement a requested feature
- Refactor messy code
- Add internationalization
- Improve performance
Common mistakes to avoid
Not reading guidelines
Every project has conventions. Ignoring them wastes everyone’s time.
Giant PRs
Large PRs are hard to review. Split big changes into smaller, focused PRs.
Changing too much
A bug fix shouldn’t also refactor unrelated code. Stay focused.
Disappearing
If you can’t finish, say so. Let others pick up the work.
Taking feedback personally
Code review is about the code, not you. Defensiveness makes collaboration hard.
Expecting immediate responses
Maintainers are busy (often unpaid). Be patient.
After your first contribution
Keep contributing to the same project
- You already know the codebase
- Maintainers know you
- Deeper involvement has more impact
Try other projects
- Broaden your experience
- Learn different codebases and cultures
- Find where you fit best
Become a regular contributor
- Review others’ PRs
- Help in discussions
- Triage issues
- Eventually: become a maintainer
Give back differently
- Write about your experience
- Help newcomers
- Speak at meetups about the project
- Sponsor maintainers financially
The unwritten rules
Be respectful: Maintainers volunteer their time.
Be patient: Response times vary. Days or weeks is normal.
Be humble: Even experts make mistakes.
Be helpful: Answer questions from others. Pay it forward.
Be reliable: If you commit to something, follow through.
Be grateful: Thank maintainers. It’s often thankless work.
Further reading
- What is open source? : The ecosystem you’re joining
- How to collaborate on GitHub : PR workflow in detail
- Git vs GitHub : Understanding the tools
- Developer community programs : Formal recognition programs
Frequently asked questions