9 min read
On this page

Your First Contribution

Finding the Right Project

The hardest part of contributing to open source is not writing the code. It is finding a project where your contribution will be welcomed, reviewed, and merged. Many first-time contributors pick a high-profile project, spend hours on a feature, and submit a PR that sits unreviewed for months. This is discouraging and avoidable.

Start With Projects You Use

The best first contribution is to a project you already use. You understand the problem domain. You know where the documentation is confusing because you struggled with it. You know which error messages are unhelpful because you hit them.

If you use VS Code daily, you know its quirks. If you deploy with Docker Compose, you have opinions about the CLI flags. If you write tests with pytest, you have encountered edge cases. These are all open source projects that accept contributions.

Contributing to a project you use has another advantage: motivation. Fixing a bug that annoys you every day is more motivating than fixing a bug in a project you found on a "good first issues" list.

Good First Issue Labels

Most well-maintained projects tag beginner-friendly issues with labels like "good first issue," "help wanted," "beginner," or "easy." These issues are selected by maintainers as entry points: small in scope, well-defined, and unlikely to require deep knowledge of the codebase.

GitHub's search makes finding these easy. Search for is:issue is:open label:"good first issue" language:python (or whatever language you prefer). Filter by recent activity to avoid stale issues.

Some organizations curate first-timer experiences:

  • Kubernetes: The good-first-issue label is actively maintained, and the contributor guide is comprehensive
  • Rust: The compiler team tags issues with E-easy and E-mentor, where a mentor is assigned to help
  • React: Beginner issues are less common because the codebase is complex, but documentation contributions are always welcome

Documentation Fixes

Documentation is chronically neglected in open source. Typos, outdated examples, broken links, missing installation steps — these are everywhere. Fixing them requires no deep knowledge of the codebase, but they genuinely improve the project.

Do not undervalue documentation contributions. A first-time user who fixes the README because the installation instructions were wrong has improved the experience for every future user. Many maintainers have said that documentation PRs are the most valuable contributions they receive.

The Contribution Workflow

Every contribution follows the same basic workflow: fork, branch, change, test, PR. The details vary by project, but the structure is universal.

Step 1: Read the CONTRIBUTING.md

Before writing a single line of code, read the project's contribution guide. This file tells you:

  • How to set up the development environment
  • What coding style to follow
  • How to run tests
  • What the PR process looks like
  • Whether you need to sign a CLA (Contributor License Agreement)
  • How to format commit messages

Ignoring CONTRIBUTING.md is the most common first-timer mistake. If the project requires signed commits and you submit unsigned ones, the maintainer has to ask you to fix it. If the project uses a specific test framework and you use a different one, your PR will be rejected. Read the guide first.

Step 2: Fork & Clone

Fork the repository on GitHub (or GitLab, depending on where the project lives). Clone your fork locally. Add the upstream repository as a remote so you can pull changes:

FORK the repository on GitHub (creates your-username/project)

CLONE your fork locally
    git clone https://github.com/your-username/project.git

ADD the original repository as "upstream"
    cd project
    git remote add upstream https://github.com/original-org/project.git

Step 3: Create a Branch

Never work on the main branch. Create a feature branch with a descriptive name:

CREATE a branch from the latest upstream main
    git fetch upstream
    git checkout -b fix-typo-in-readme upstream/main

Branch names like fix-typo-in-readme, add-timeout-to-http-client, or issue-1234-null-check tell reviewers what to expect before they open the PR.

Step 4: Make Your Change

Keep the change small and focused. A PR that fixes one typo will be merged in minutes. A PR that fixes a typo, refactors two functions, and adds a feature will sit in review for weeks — if it gets reviewed at all.

Step 5: Run the Tests

Run the project's test suite before submitting. If your change breaks existing tests, fix it before the maintainer has to tell you. If the project has linting or formatting requirements, run those too:

RUN the project's test suite
    cargo test           // Rust
    npm test             // JavaScript
    pytest               // Python
    go test ./...        // Go

RUN any formatting/linting checks
    cargo fmt --check    // Rust
    npm run lint         // JavaScript
    black --check .      // Python

Step 6: Submit the Pull Request

Push your branch to your fork and open a PR against the upstream repository. Write a clear description: what you changed, why you changed it, and how you tested it. If the change relates to an issue, link the issue.

Then wait. Maintainers are busy. Response times range from hours to weeks depending on the project. Do not ping the maintainer after one day. If a week passes with no response, a polite "Is there anything I can improve in this PR?" is appropriate.

Understanding the Codebase Before Changing It

Jumping into unfamiliar code and making changes is a recipe for rejected PRs. Spend time understanding the codebase before modifying it.

Read the Architecture

Many projects have an ARCHITECTURE.md or a section in the README explaining how the codebase is organized. The Rust compiler has an extensive dev guide. Kubernetes has a contributor guide with architecture overviews. Read these before diving into the code.

Follow the Call Chain

If you are fixing a bug, start at the symptom and trace the code path. If an API returns the wrong error code, find the handler, follow the logic, and identify where the error is constructed. Understanding the call chain helps you make changes that fit the project's patterns rather than introducing new ones.

Look at Recent PRs

Reading merged PRs teaches you the project's norms. How big are typical PRs? How do contributors format their descriptions? What level of test coverage is expected? How do maintainers give feedback? Spending 30 minutes reading recent PRs will save you hours of rework.

Your First PR Will Probably Be Small

Your first merged PR will likely be one of these:

  • Fix a typo in documentation
  • Update an outdated dependency version
  • Add a missing test case
  • Improve an error message
  • Fix a broken link in the README

This is normal and good. Small PRs build trust with the maintainers. They learn that you follow the project's conventions, write clear descriptions, and respond to feedback. Once you have a few small PRs merged, the maintainers will be more receptive to larger contributions.

The Linux kernel's documentation explicitly recommends that new contributors start with trivial patches — coding style fixes, typo corrections, and documentation improvements. Even experienced developers are expected to start small when joining a new subsystem.

Handling Feedback & Rejection

Code Review Is Not Personal

When a maintainer requests changes on your PR, they are not criticizing you. They are maintaining the quality and consistency of a codebase that may have hundreds of contributors. Respond promptly, make the requested changes, and ask questions if the feedback is unclear.

Rejection Happens

Sometimes your PR will be rejected. The feature might not align with the project's direction. The implementation might not be the approach the maintainers prefer. The issue might have been solved by someone else while your PR was in review.

This is normal. The Kubernetes project rejects roughly half of all PRs. React's maintainers close feature requests that do not align with their vision. Do not take it personally. Ask for feedback, learn from it, and try again with a different contribution.

Stale PRs

Some PRs never get reviewed. The maintainer might be busy, burned out, or inactive. If your PR sits for more than two weeks with no response, check the project's activity. If the project itself is active (recent commits, other PRs being merged), ping politely. If the project appears dormant, consider whether your contribution would be better directed elsewhere.

Common Pitfalls

Submitting a PR Without Reading CONTRIBUTING.md

Every project has conventions. Some require signed commits. Some use specific commit message formats (Conventional Commits, Angular-style). Some require that you open an issue before submitting a PR. Ignoring these conventions wastes your time and the maintainer's time.

Making the PR Too Large

A PR that touches 50 files and changes 2,000 lines is exhausting to review. Maintainers will delay reviewing it, request that you split it, or reject it outright. Keep PRs small. If a contribution requires large changes, discuss the approach in an issue first and break the work into multiple PRs.

Not Running Tests Locally

Submitting a PR that fails CI is a signal that you did not test your changes. It wastes CI resources and maintainer attention. Always run the test suite locally before pushing. If you cannot get the test suite to pass locally due to environment differences, mention that in the PR description.

Expecting Immediate Review

Open source maintainers are not on-call for your PR. Many maintain projects in their spare time, unpaid. A PR submitted on Monday might not be reviewed until the following week. Patience is a requirement. If you need something urgent, consider whether a fork with your changes is more appropriate than waiting for upstream review.

Bikeshedding on Your First Contribution

Do not open your first interaction with a project by proposing a major refactoring, arguing about code style, or suggesting that the project adopt a different framework. Build credibility through small contributions first. Once you have established trust, your opinions on larger decisions will carry more weight.

Key Takeaways

  1. Start with projects you already use — you understand the problem domain and have natural motivation.
  2. Read CONTRIBUTING.md before writing any code. Following the project's conventions is the simplest way to get your PR merged.
  3. Keep your first PR small: a documentation fix, a test case, or a bug fix. Build trust before attempting large contributions.
  4. The workflow is universal: fork, branch, change, test, PR. Master this sequence and you can contribute to any project.
  5. Code review feedback is about the code, not about you. Respond promptly and learn from it.
  6. Patience is essential. Maintainers are busy, reviews take time, and rejection is part of the process.