Loading
Make your first open-source contribution — from finding a project to submitting a pull request that gets merged.
Open source isn't just altruism — it's one of the most effective career accelerators in tech:
You don't need to be an expert to contribute. Every project needs documentation fixes, test coverage, accessibility improvements, and bug reports.
Open source is for everyone, not just senior engineers.
Look for projects that are:
Where to find beginner-friendly issues:
good first issue, help wanted, beginner-friendlyEvaluate before committing:
| Signal | Good sign | Red flag | | ------------- | --------------------------------- | ------------------------------ | | Response time | PRs reviewed within a week | PRs sitting for months | | Tone | Welcoming, constructive feedback | Dismissive or hostile comments | | Documentation | Clear CONTRIBUTING.md | No contribution guide | | Issue labels | Organized, labeled for difficulty | Hundreds of unlabeled issues |
Browse GitHub and bookmark 2-3 projects you'd like to contribute to.
Every contribution starts with getting the project running on your machine:
Read these files first:
README.md — Project overview and setup instructionsCONTRIBUTING.md — Contribution guidelines and workflow.github/PULL_REQUEST_TEMPLATE.md — What to include in your PRCODE_OF_CONDUCT.md — Community behavior standardsA working local setup is the foundation for contributing.
The contribution workflow:
Good first contributions:
good first issueContribution quality checklist:
Start small. A merged typo fix is infinitely more valuable than an unfinished feature PR.
Your PR description should make the reviewer's job easy:
PR etiquette:
A well-written PR description significantly increases your chances of getting merged.
Code review is where you learn the most. Here's how to handle it:
When you receive feedback:
Common review requests and what they mean:
| Request | What they want | | --------------------------- | -------------------------------------------- | | "Could you add a test?" | Verify your change works and doesn't regress | | "Nit: naming" | Rename for clarity (not a blocker) | | "What about edge case X?" | Handle null, empty, or unusual inputs | | "Could you simplify this?" | The logic is correct but hard to follow | | "Let's discuss in an issue" | The change is bigger than expected |
If you disagree with feedback:
Code review is mentorship, not criticism. Embrace it.
Weekly cadence:
good first issue labelsLevel up over time:
Track your contributions:
Consistency compounds. One small contribution per week transforms your career.
What's next? Learn How to Build a Developer Portfolio to showcase your skills to employers and clients.
# 1. Fork the repository (click "Fork" on GitHub)
# 2. Clone your fork
git clone git@github.com:YOUR-USERNAME/project-name.git
cd project-name
# 3. Add the original repo as "upstream"
git remote add upstream git@github.com:ORIGINAL-OWNER/project-name.git
# 4. Install dependencies
npm install # or yarn, pnpm — check the README
# 5. Run the project
npm run dev # or whatever the README says
# 6. Run tests to make sure everything works
npm test# 1. Create a branch for your change
git checkout -b fix/typo-in-readme
# 2. Make your changes
# (edit files, run tests, verify it works)
# 3. Commit with a clear message
git commit -m "fix(docs): correct typo in installation instructions"
# 4. Push to your fork
git push origin fix/typo-in-readme
# 5. Open a Pull Request on GitHub## What
Fix the installation command in README.md — the npm package name
was incorrect (missing the @scope prefix).
## Why
New users following the getting started guide get a "package not found"
error because `npm install project` should be `npm install @org/project`.
## How
Updated the installation command in README.md line 42.
## Testing
- Verified the correct package name on npmjs.com
- Followed the updated instructions from a clean directory// Reviewer says: "Could you extract this into a helper function?"
// Good response:
"Great idea! I've extracted it into `formatUserName()` in utils.ts.
Let me know if the naming works for you."
// Bad response:
"But it works fine as is."