<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>alchemmist — Open-Source</title><link>https://alchemmist.xyz/tags/open-source/</link><description>Последние записи в блоге alchemmist</description><generator>Hugo 0.163.3</generator><language>en</language><atom:link href="https://alchemmist.xyz/tags/open-source/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Wed, 11 Feb 2026 12:21:00 +0300</lastBuildDate><item><title>How to contribute</title><link>https://alchemmist.xyz/articles/how-we-contribute/</link><pubDate>Wed, 11 Feb 2026 12:21:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/articles/how-we-contribute/</guid><description>This is a short beginner’s guide on how to work with open source within GitHub flow practices. All examples will use the GitHub platform, but other repository hosting services that provide the necessary functionality to implement GitHub flow can also be used. Here you can find a classic way to contribute to almost any project, as well as learn a few tips and hacks.
So, where does any contribution begin? Ideally, with a problem. A problem can be called anything, including a lack of new features, missing or incomplete documentation pages on a specific topic, some question, or simply trivial bugs that exist everywhere. You personally will not confuse a problem with anything else, because it will be accompanied by an itchy feeling that “something is annoying.” But will this be a problem for other users and developers? In order to understand this and synchronize your perception with the team’s perception, an issue exists.</description><content:encoded><![CDATA[<p>This is a short beginner’s guide on how to work with open source
within GitHub flow practices. All examples will use the GitHub
platform, but other repository hosting services that provide the
necessary functionality to implement GitHub flow can also be
used. Here you can find a classic way to contribute to almost any
project, as well as learn a few tips and hacks.</p>
<p>So, where does any contribution begin? Ideally, with a problem.
A problem can be called anything, including a lack of new
features, missing or incomplete documentation pages on a specific
topic, some question, or simply trivial bugs that exist
everywhere. You personally will not confuse a problem with
anything else, because it will be accompanied by an itchy feeling
that “something is annoying.” But will this be a problem for
other users and developers? In order to understand this and
synchronize your perception with the team’s perception, an issue
exists.</p>





<blockquote class="markdown-alert markdown-alert--caution">
  <div class="markdown-alert__title">
    
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    

    
      CONTRIBUTION.md
    
  </div>

  <p>Every project has its own established rules on how to
participate in it. These rules are described either in
<code>README.md</code> in a separate “Contribution” paragraph, or in
a special <code>CONTRIBUTION.md</code> file. Be sure to read it at the
very beginning. This file has the highest priority. That is,
even if you understand that some practices deviate from the
correct scheme that we will consider below, you should still
follow them. Some large projects, such as <code>Postgres</code> or
<code>linux-kernel</code>, still work entirely via mailing lists. One
should respect the traditions that have formed in the
repository, even if they now look like legacy.</p>
</blockquote>

<h2 id="1-issue">
  <a class="link" href="#1-issue">
    #
  </a>
  1. Issue
</h2>

<p>An issue is a ticket that is stored in the repository. Anyone who
comes to the repository can create it. But I recommend that
before rushing to describe your problem, you make several
attempts to search for similar issues, so as not to burden the
repository maintainers with unnecessary work. Let’s see how this
can be done:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh issue list --search <span class="s2">&#34;app crashed&#34;</span>
</span></span></code></pre></div><blockquote class="markdown-blockquote">
  <p>This and all further examples will use the official <code>gh</code>
utility. It allows you to perform all basic GitHub operations
from the console. I recommend using it for simple operations to
speed up your workflow.</p>

</blockquote>
<p>The <code>search</code> parameter allows you to add various search filters
directly inside it. Let’s try to add them:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh issue list --search <span class="s2">&#34;app crashed is:open label:bug created:&gt;2024-01-01&#34;</span>
</span></span></code></pre></div><p>It is quite possible, especially in large projects, that this
will allow you to find an already created ticket for your problem
and even find a solution or answer in it. If not, then do not
hesitate to open a new issue. The following scheme will help
structure it in the best way:</p>
<pre class="mermaid">
  graph LR
    A[Excepted] ---&gt; B(&#34;Action (run/click/etc)&#34;)
    B ---&gt; C[Got]
</pre>

<p>In large projects, there are issue templates that will help you
format an issue according to the standards adopted in that
project. You can create an issue with the command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh issue create
</span></span></code></pre></div><p>Another excellent practice is providing a Docker image in which
the entire environment is configured and the problem is
guaranteed to be reproducible. Or at least provide a log.
A professional approach would also be to localize the problem as
much as possible. For example, you received an error in the
following file:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">fruits</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logistic</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="n">fruits</span><span class="o">.</span><span class="n">Apple</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">basket</span> <span class="o">=</span> <span class="n">fruits</span><span class="o">.</span><span class="n">MakeBasket</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">basket</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">logistic</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">basket</span><span class="p">)</span>
</span></span></code></pre></div><p>Of course, you could write exactly this in the issue. But it
would be even better to independently experiment with this code
and understand what exactly is wrong. For example, check whether
the apple was successfully added to the basket:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">basket</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">basket</span><span class="o">.</span><span class="n">content</span><span class="p">())</span>
</span></span></code></pre></div><p>Perhaps the problem is that we are trying to send an empty
basket, which would mean a bug in the <code>put</code> method. Or perhaps
the problem is in the <code>send</code> method after all. In this way, we
cut off the unnecessary, leaving the essence of the problem in
the issue message.</p>
<p>Remember that even the fact of successfully creating an issue—for
example, proposing a valuable feature or discovering a real bug
or vulnerability—is already a contribution to the project, and
that is already a success. A failure, on the other hand, would be
creating a duplicate issue or overloading maintainers with
unnecessary context.</p>

<h2 id="2-fork">
  <a class="link" href="#2-fork">
    #
  </a>
  2. Fork
</h2>

<p>When you understand which problem you are solving and are
convinced that it is really a problem, you can move on to solving
it. To do this, you should first fork the repository. This will
be valuable support for you if, for example, you are testing CI
or simply getting far ahead of the original repository, and it
will also allow you to send pull requests, since you most likely
do not have permission to make changes to the original
repository:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh repo fork &lt;OWNER&gt;/&lt;REPO&gt;
</span></span></code></pre></div><p>After cloning the fork locally, make changes in a separate
branch, which it will be more convenient to name after the issue
number you are trying to close. Why? Because in a short, concise
branch name it is <strong>far</strong> from always possible to express the
essence of the problem, which may have taken several months of
discussion in the ticket. Therefore, it is much more convenient
to simply refer to it by the issue number:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git switch -c <span class="m">42</span>
</span></span></code></pre></div><p>In GitHub flow, we do not create a complex branch structure where
each branch has its own meaning. Instead, we have a master branch
into which only changes that have passed all checks are merged.
These changes come there from many so-called feature branches,
which we propose to tie to specific issues. And from time to
time, we release a version from the master branch. As a result,
we get a fairly concise structure:</p>
<pre class="mermaid">
  %%{init: {
  &#34;gitGraph&#34;: {
    &#34;tagLabelColor&#34;: &#34;#ffffff&#34;,
    &#34;tagLabelBackground&#34;: &#34;#d73a49&#34;
  }
}}%%
gitGraph
    commit
    commit
    branch &#34;42&#34;
    checkout &#34;42&#34;
    commit
    commit
    checkout main
    merge &#34;42&#34;
    commit tag: &#34;🚩 v1.1.23&#34;

    branch &#34;44&#34;
    checkout &#34;44&#34;
    commit
    commit
    commit
    checkout main
    merge &#34;44&#34;
    commit tag: &#34;🚩 v1.2.0&#34;
</pre>

<p>Also, do not forget to synchronize your <code>fork</code> so as not to lose
connection with the original project:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh repo sync &lt;your-username&gt;/&lt;fork-repo&gt; --branch main
</span></span></code></pre></div>
<h2 id="3-pull-request">
  <a class="link" href="#3-pull-request">
    #
  </a>
  3. Pull request
</h2>

<p>When the changes are made and committed, you can send a pull
request. The most convenient way is to simply stay on your branch
and run the command below. <code>gh</code> will form a suitable pull request
itself:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh pr create
</span></span></code></pre></div><p>After creating the PR, checks may automatically start if CI is
configured in the repository. And this is great. Because checks
simplify and speed up the review process. You can immediately
see, for example, that your code does not pass style checks, or
that you did not write tests for your code and because of this
the code coverage failed. Do not ignore this, but make new
commits in the same branch, and after pushing them they will
automatically be added to the PR and the checks will be
restarted. The repository maintainer will not even begin
reviewing your PR until all checks in it turn green. You can
check the status of the pull request with the command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh pr status
</span></span></code></pre></div><p>Also try to make a neat commit history in the pull request to
simplify the review process.
<a href="https://www.geeksforgeeks.org/git/git-squash/">Squash</a> commits
will help you with this.</p>
<p>When you have broken through all automated checks, do not
hesitate to contact the repository architect and ask for
a review. He will either review your PR himself or delegate it to
someone from the team. On GitHub, this is done simply via a tag:
<code>@username</code>. Often, notifications that a new pull request has
arrived may be disabled, and moreover, the architect will not
know when you have made all the fixes to pass CI. Therefore,
modesty here may lead to the fact that your pull request will
simply not be seen by anyone. This, by the way, also applies to
issues.</p>
<p>If you understand that your pull request completely closes the
issue you were solving, then in the PR messages you can specify
<code>Close #49</code>, and then the issue will be automatically closed
after the pull request is merged.</p>

<h2 id="4-merge">
  <a class="link" href="#4-merge">
    #
  </a>
  4. Merge
</h2>

<p>So, when you have passed all automated checks and manual review,
your code will get into the master branch of the repository, and
you can consider yourself a full-fledged contributor to this
project. Keep it up!</p>
<p>Also pay attention to an interesting practice that, in my
opinion, is very professional. Imagine that you discovered and
reported some bug in an issue. This is already a contribution to
the repository. Next, it is proposed to create a pull request in
which you write a test that reproduces this bug. The test, of
course, will fail. But you send the pull request, thereby adding
this test in a disabled state to the codebase. You can also leave
a <code>TODO</code> tag. And this will become an even greater contribution
to the repository, since you have added a meaningful test, and
this is always very useful. And finally, with a second pull
request, you already submit changes that fix the code so that it
passes this test. And once again you increase your contribution.
Thus, you have left behind a lot of artifacts in the repository:
an issue, an enhanced test system, and a fixed bug. This will be
an excellent example of implementing the TDD (Test Driven
Development) approach.</p>
<br>
<hr>
<br>
<p>Thus, you and I have gone through the full cycle from the problem to the contribution
to the master branch.:</p>
<pre class="mermaid">
  flowchart LR
    BUG[&#34;Find a bug / feature   &#34;] --&gt; ISSUE[&#34;Create Issue  &#34;]
    ISSUE --&gt; DISCUSS[&#34;Discussion  &#34;]
    DISCUSS --&gt; PR[&#34;Open Pull Request  &#34;]
    PR --&gt; CI[&#34;PR Checks with CI 󰦕 &#34;]
    CI --&gt; REVIEW[&#34;Reviewer Reviews PR  &#34;]
    REVIEW --&gt; MERGE[&#34;Merge PR into main  &#34;]
    MERGE --&gt; BUG
</pre>

<p>You can test your strength right now by finding a suitable issue
using these wonderful services:</p>
<ul>
<li><a href="https://goodfirstissue.dev/">Good First Issue</a> — Issues that
are great for beginners.</li>
<li><a href="https://github.com/MunGell/awesome-for-beginners">Awesome for
Beginners</a>
— A collection of projects for beginners.</li>
<li><a href="https://up-for-grabs.net/#/">Up For Grabs</a> — Tasks open for
solving across various technologies.</li>
<li><a href="https://github.com/firstcontributions/first-contributions">First
Contributions</a>
— A repository with a manual and a list of open projects.</li>
<li><a href="https://www.firsttimersonly.com/">First Timers Only</a> — More
similar resources.</li>
</ul>
<p>Do not forget that you yourself can also register your projects
on these resources to attract new developers!</p>





<blockquote class="markdown-alert markdown-alert--note">
  <div class="markdown-alert__title">
    
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    

    
      GitHub CLI
    
  </div>

  <p>If you are interested in productive work with GitHub from the
console using the <code>gh</code> utility, pay attention to it
<a href="https://cli.github.com/manual/">documentation</a>. And also for
that, that <code>gh</code> supports extensions that you can familiarize
yourself with you can use the <code>gh ext browse</code> command or write
your own!</p>
</blockquote>
<p>Some additional reading:</p>
<ul>
<li><a href="https://opensource.guide/how-to-contribute/">Official GitHub
guideline</a></li>
<li><a href="https://navendu.me/posts/pull-requests-like-a-pro/">Pull Requests like a Pro, Navendu
Pottekkat</a></li>
<li><a href="https://dev.to/helloquash/10-common-mistakes-to-avoid-when-contributing-to-open-source-projects-1mna">10 Common Mistakes to Avoid When Contributing to Open Source
Projects</a></li>
<li><a href="https://github-help-wanted.com/open-source/beginners-guide/">Open Source for
Beginners</a></li>
</ul>
]]></content:encoded><category>open-source</category><category>eosp</category></item></channel></rss>