<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Xavi</title>
    <description>The latest articles on DEV Community by Xavi (@f0rty).</description>
    <link>https://dev.to/f0rty</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1989075%2F62e50d46-05d2-4435-a627-6c48e0cced64.jpeg</url>
      <title>DEV Community: Xavi</title>
      <link>https://dev.to/f0rty</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/f0rty"/>
    <language>en</language>
    <item>
      <title>How I shipped my first GitHub release (and what I learned)</title>
      <dc:creator>Xavi</dc:creator>
      <pubDate>Mon, 18 May 2026 00:35:12 +0000</pubDate>
      <link>https://dev.to/f0rty/how-i-shipped-my-first-github-release-and-what-i-learned-517g</link>
      <guid>https://dev.to/f0rty/how-i-shipped-my-first-github-release-and-what-i-learned-517g</guid>
      <description>&lt;h2&gt;
  
  
  My journey with Git
&lt;/h2&gt;

&lt;p&gt;Software development and I have never really been the best of friends — which is exactly why I avoided going too deep into it for a long time. But as I work towards becoming a junior IT specialist, I’ve been forcing myself to properly learn Git instead of just memorising enough commands to survive.&lt;/p&gt;

&lt;p&gt;Following the &lt;a href="https://roadmap.sh/git-github" rel="noopener noreferrer"&gt;roadmap.sh Git &amp;amp; GitHub roadmap&lt;/a&gt;, I went from knowing the basics to actually understanding releases — not just pushing to &lt;code&gt;main&lt;/code&gt; and hoping for the best.&lt;/p&gt;

&lt;p&gt;Today I shipped my first ever tagged, released, and wikied project. Here’s what that looked like.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wordle.py
&lt;/h2&gt;

&lt;p&gt;Meet the project: a terminal clone of Wordle written in Python.&lt;/p&gt;

&lt;p&gt;Guess the hidden 5-letter word in 6 tries, get symbol feedback on each guess, and try not to lose your mind.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://github.com/xaviermontane/Wordle" rel="noopener noreferrer"&gt;github.com/xaviermontane/Wordle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had two goals with this project.&lt;/p&gt;

&lt;p&gt;First, sharpen my Python and CLI skills on something more interesting than another to-do app.&lt;/p&gt;

&lt;p&gt;Second — and I’ll let you in on a secret — I eventually want to reverse engineer a Wordle cracker from the game’s core logic. But that’s a story for another post.&lt;/p&gt;

&lt;p&gt;For now it’s terminal-only, though I’d love to eventually port it into something more visual. Today’s goal was simpler:&lt;/p&gt;

&lt;p&gt;Ship it properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I didn’t know before today
&lt;/h2&gt;

&lt;p&gt;Turns out there’s a lot more to releases than just pushing code to GitHub and calling it a day.&lt;/p&gt;

&lt;p&gt;Here’s what genuinely surprised me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tags are &lt;strong&gt;not branches&lt;/strong&gt; — they’re permanent references to a specific commit&lt;/li&gt;
&lt;li&gt;There are two types of tags:

&lt;ul&gt;
&lt;li&gt;lightweight tags (basically just a named pointer)&lt;/li&gt;
&lt;li&gt;annotated tags (full Git objects containing metadata, author, date, and messages)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;GitHub Releases are built &lt;em&gt;on top of tags&lt;/em&gt;, not the other way around&lt;/li&gt;

&lt;li&gt;Release notes and READMEs serve completely different purposes:

&lt;ul&gt;
&lt;li&gt;README = evergreen project documentation&lt;/li&gt;
&lt;li&gt;Release notes = what changed in this version specifically&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;That last point especially changed how I think about documenting projects.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The process I followed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a meaningful annotated tag
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.0.0 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Terminal Wordle in Python — 6-guess game with colour-coded feedback and custom word list support"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I quickly realised &lt;code&gt;"stable release"&lt;/code&gt; is a terrible tag message.&lt;/p&gt;

&lt;p&gt;Tag annotations show up in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git show&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitHub’s tag UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the message should actually explain what shipped.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Push the tag explicitly
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This caught me off guard the first time.&lt;/p&gt;

&lt;p&gt;Tags don’t automatically push with a normal &lt;code&gt;git push&lt;/code&gt;. You either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;push them individually&lt;/li&gt;
&lt;li&gt;or use &lt;code&gt;git push --tags&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tiny detail, but one that confused me immediately.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Build the release page properly
&lt;/h3&gt;

&lt;p&gt;Instead of treating the release like an afterthought, I wrote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;actual release notes&lt;/li&gt;
&lt;li&gt;a summary of what shipped&lt;/li&gt;
&lt;li&gt;a “What’s Next” section&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted someone landing on the repo to immediately understand:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;what the project does&lt;/li&gt;
&lt;li&gt;what changed&lt;/li&gt;
&lt;li&gt;whether the project is still active&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  4. Create the wiki
&lt;/h3&gt;

&lt;p&gt;I also built a small wiki containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Home&lt;/li&gt;
&lt;li&gt;How to Play&lt;/li&gt;
&lt;li&gt;Custom Word Lists&lt;/li&gt;
&lt;li&gt;Changelog&lt;/li&gt;
&lt;li&gt;Roadmap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping longer-form documentation inside the wiki made the repo itself feel way cleaner.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I’d do differently next time
&lt;/h2&gt;

&lt;p&gt;A few things became obvious almost immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Start at &lt;code&gt;v0.1.0&lt;/code&gt;, not &lt;code&gt;v1.0.0&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v1.0.0&lt;/code&gt; implies a level of stability I probably wasn’t ready to promise on a 9-commit repo&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Use conventional commits from day one&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feat:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fix:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chore:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This becomes especially useful once GitHub starts auto-generating release notes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up CI before the first release

&lt;ul&gt;
&lt;li&gt;even a tiny “does this run?” workflow is infinitely better than nothing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;If you’d like to try the project, feel free to clone it and mess around with it.&lt;/p&gt;

&lt;p&gt;Any support is massively appreciated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stars&lt;/li&gt;
&lt;li&gt;forks&lt;/li&gt;
&lt;li&gt;issues&lt;/li&gt;
&lt;li&gt;feedback&lt;/li&gt;
&lt;li&gt;all of it ⭐&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;v1.0.1&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fixing a bug I spotted in my own word list (&lt;code&gt;STRIN&lt;/code&gt; is apparently not a real word)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;v1.1.0&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ANSI colour output so feedback becomes green/yellow/grey instead of symbols&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Full roadmap:&lt;br&gt;
→ &lt;a href="https://github.com/xaviermontane/Wordle/wiki" rel="noopener noreferrer"&gt;github.com/xaviermontane/Wordle/wiki&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources that helped me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://semver.org" rel="noopener noreferrer"&gt;Semantic Versioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keepachangelog.com" rel="noopener noreferrer"&gt;Keep a Changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository" rel="noopener noreferrer"&gt;GitHub Docs — Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Thank you!
&lt;/h2&gt;

&lt;p&gt;If you made it this far, genuinely thank you.&lt;/p&gt;

&lt;p&gt;This is one of my first technical posts, and honestly just writing it helped me consolidate everything I learned today. If it helps even one person understand Git releases a little better, that’s already a win to me.&lt;/p&gt;

&lt;p&gt;If you’re also learning Git from scratch:&lt;br&gt;
you’re not alone — we’re all figuring it out one release at a time.&lt;/p&gt;

&lt;p&gt;f40 ── .✦&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>git</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
