<?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: Heapstack</title>
    <description>The latest articles on DEV Community by Heapstack (@janderssonse).</description>
    <link>https://dev.to/janderssonse</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%2F1027822%2Ff0b488f3-d211-4256-add3-4e3ce4ccb123.png</url>
      <title>DEV Community: Heapstack</title>
      <link>https://dev.to/janderssonse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/janderssonse"/>
    <language>en</language>
    <item>
      <title>FOSDEM 26 - a quick summary</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Wed, 11 Feb 2026 22:31:15 +0000</pubDate>
      <link>https://dev.to/janderssonse/fosdem-26-a-quick-summary-46d2</link>
      <guid>https://dev.to/janderssonse/fosdem-26-a-quick-summary-46d2</guid>
      <description>&lt;p&gt;Another year, another &lt;a href="https://fosdem.org/2026/" rel="noopener noreferrer"&gt;FOSDEM&lt;/a&gt;. I think my first one was 2014, but I’m not sure. I can conclude that just like myself, the hotel I usually stay at has started to be in a small need of renovation, and Brussels nowadays feels a tiny bit like another home. With that, let’s head into a summary of FOSDEM 2026.&lt;/p&gt;

&lt;p&gt;The theme this year was policy, security and regulation. A lot of developers nowadays are very interested in these aspects, so much in fact that you had to line up early to have a chance of attending the crowded rooms. This is good — software engineering is far much more than about the code. The public was the general mix of youngsters, old gray beards, people from the EU departments, academia, companies, public sector, hobbyists. Although the high interest in policy, there were still talks that deep dived into more obscure topics, so I don’t feel FOSDEM is losing its grassroots spirit, even though the talks are evolving.&lt;br&gt;
Were there 10,000 visitors? I can only guess.&lt;/p&gt;

&lt;p&gt;Saturday&lt;/p&gt;

&lt;p&gt;My Saturday started with a strong brew coffee I luckily found at a coffee shop, near the corner of the big university park. At the same time I was a bit stressed, as I started to fill in the bookmarks for the talks of the day. The reality is - You can’t make a plan to stick to for FOSDEM, but you can at least think that you are making one. So in the FOSDEM app, I just ticked off interesting talks during the day, knowing my schedule would be changed many times. And yes it did.&lt;/p&gt;

&lt;p&gt;Heading into the lovely chaos, me and my friends went to the welcome talk first. And… it was the first time for me that the room was so full we could not attend. A sign there were more visitors than ever at FOSDEM 2026? I don’t know. For sure, it was the first time that I missed it. &lt;a href="https://fosdem.org/2026/schedule/event/SFKNTZ-welcome_to_fosdem_2026/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I headed off to a quick talk about “with what and how should we sign our artefacts”. It pointed at the problems with current solutions, and that the infrastructure of Sigstore etc might not be the optimal from a sovereignty aspect. It gave no clear answers to these, but asked for more participation in solving them. It was a call for action. &lt;a href="https://fosdem.org/2026/schedule/event/RFFD3M-sign-your-artefacts/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next up was a talk about the current attestations ecosystem across different programming languages. It gave an overview of what is working and what the current challenges are. One insight was that most package systems have the provenance data, but might not have a standardized easy way to consume it, and it surprised me. &lt;a href="https://fosdem.org/2026/schedule/event/BCFZP7-current-state-programming-language-attestations/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The package name resolution talk came next, and this was the first one where I did not really engage as was doing a bit of coding meanwhile. It’s one of those foundational layers and the talk compared different ecosystems with their assumptions. &lt;a href="https://fosdem.org/2026/schedule/event/BJCN93-name-resolution-in-package-managers/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Signing commits—yes I’m all for it! Here we were presented a solution that adds policy files to the project, instead of outsourcing it to a code hosting platform. An interesting idea, but still not sure yet if I will use the spec in practice. How about signing commits with other standards like SSH-signing. &lt;a href="https://fosdem.org/2026/schedule/event/KFSUCW-sequoia-git/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I made my way to a talk on package registry economics, and while we take these for granted, they are often a sensitive part of our critical infrastructure. Security is not just a technical problem but a sustainability problem. &lt;a href="https://fosdem.org/2026/schedule/event/8WJKEH-package-registry-economics/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Time for lunch, and I don’t recall much. I said hi to some people and had a veggie burger from one of the booths. Quite ok and The FOSDEM way of getting energy.&lt;/p&gt;

&lt;p&gt;Up next for me was a talk on using fuzzing to detect backdoors. It was about applying fuzzing in smarter ways to notice when code behavior starts getting off. Suspicious patterns, unexpected side effects, and highly interesting. &lt;a href="https://fosdem.org/2026/schedule/event/BHNWLN-rosa-backdoor-detector/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ended the FOSDEM day with a talk on VEX (Vulnerability Exploitability eXchange). We can just accept that vulnerabilities are going to keep being discovered, so how can we communicate “what matters in all the information” in a way that both tools and humans can act on? &lt;a href="https://fosdem.org/2026/schedule/event/8CGNGA-vex_-_cutting_through_the_noise_in_software_supply_chain_security/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, food, long walk admiring the architecture of Brussels. Me and my friends ended up for a brief stint at a local pub, and then with a buzzing brain off to the hotel for a well-deserved sleep.:)&lt;/p&gt;

&lt;p&gt;Sunday&lt;/p&gt;

&lt;p&gt;Same place as Saturday, same brew coffee, energy restored. Filled out the schedule and off I went.&lt;/p&gt;

&lt;p&gt;I started with a talk on Contextual SBOMs where the core idea is to build relationships between SBOMs so they have a deeper context beyond being these massive, flat ingredient lists. “What matters in this particular situation?” Often we generate SBOMs but the important thing is really, how do we use them and how do they improve our processes of handling security and license issues. &lt;a href="https://fosdem.org/2026/schedule/event/8R99HP-contextual-sbom/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right after that was a talk on integrating VEX into open source workflows. Again it focused on how we can diminish the load of CVEs—and with VEX how we can improve our update flows. &lt;a href="https://fosdem.org/2026/schedule/event/NLCRCU-integrating-vex-into-oss/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a focus on supply chain security into CRA. First up was a session on the Cyber Resilience Act, FOSS, and compliance. This first talk was about things I already knew and was just giving an overview, without too much detail. This was for someone new to CRA more than if you’ve had a look already. &lt;a href="https://fosdem.org/2026/schedule/event/R98AQQ-cra_foss_compliance/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this CRA-focused talk came a really good one, watch this. Clear answers, detailed answers. What does it mean for A) a commercial actor, B) a public sector or NGO actor, Open Source Steward, C) a hobbyist maintainer with only sponsorships for basic costs? This was people from the commission’s behalf and I left there with the feeling that CRA is great for citizen safety and great for Open Source developers. I think they succeeded in ensuring that this has the potential to be really good for open source. &lt;a href="https://fosdem.org/2026/schedule/event/EERURR-implementing_the_cyber_resilience_act_-_engaging_with_open_source/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A short talk and crowded talk on SSH logins comparing certificate-based authentication versus OPKSSH. &lt;a href="https://fosdem.org/2026/schedule/event/ST9D39-ssh-logins-cert-vs-opkssh/" rel="noopener noreferrer"&gt;Talk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that I was running low on battery. That was it. Everything caught up and I just wanted a bit of silence, and to relax with some coding, coffee and chatted a bit with people. I found a corner and improved my commitlint tool &lt;a href="https://codeberg.org/Itiquette/gommitlint" rel="noopener noreferrer"&gt;Gommitlint&lt;/a&gt; (please test it:). My friends also started to get tired so we just left… another FOSDEM done. Have you booked your next one?&lt;/p&gt;

</description>
      <category>fosdem</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Moving from GitHub to Codeberg(Forgejo)</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Wed, 21 Jan 2026 06:13:15 +0000</pubDate>
      <link>https://dev.to/janderssonse/moving-from-github-to-codebergforgejo-b3</link>
      <guid>https://dev.to/janderssonse/moving-from-github-to-codebergforgejo-b3</guid>
      <description>&lt;p&gt;NOTE: This post is written from a private developer perspective, not that of my employer.&lt;/p&gt;

&lt;p&gt;I've started migrating my active projects from GitHub to Codeberg.&lt;br&gt;
Codeberg is a European open-source alternative that overall resembles GitHub—a code collaboration platform. I'd been considering it for a while, and now that it's almost done, I wanted to share my thoughts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One thing I've increasingly felt about GitHub is that they ignore basic, important developer features while prioritizing other unrequested ones. What I miss includes fast-forward merges for linear history, rebase-only repos, SHA256 support, and AsciiDoc rendering that's still missing or broken. The whole markup rendering is a mess with uneven support for different formats.&lt;br&gt;
Full token security has been requested for a long time, yet we still have to use old, insecure Classic tokens for publishing packages (fine-grained tokens aren't done). Many solutions end up 80% done and then seem to stall.&lt;br&gt;
Maybe it's telling that the open source parts, like the GitHub markup repo, seem abandoned. There are issues sitting for years, and the commit history shows no steady stewardship.&lt;br&gt;
Overall it feels like GitHub has, in some areas, stopped prioritizing developer community needs and technical excellence.&lt;br&gt;
Much of GitHub is historically good too, of course, but I expect far more technical drive and listening to the developer community from such a widely used global service.&lt;/p&gt;

&lt;p&gt;But not only that—lately I've also been thinking more about how important digital sovereignty is; no surprise, given the crises around us. GitHub is under US law, which has unfortunately become a liability. The idea of developers being cut off from their projects because of "tweet-of-the-day-and-it's-consequences"-politics is no longer far-fetched. Developers have historically been banned from the platform in regards to US sanctions. My, and many other developers', trust in US data services was already damaged by the stories of FISA702 and the NSA way back, and it hasn't grown stronger in recent years, in particular the two latest ones. Against that backdrop, supporting an initiative in Europe, under EU law, feels both motivated and straightforward.&lt;/p&gt;

&lt;p&gt;So, if not GitHub, what then?&lt;br&gt;
I looked around.&lt;br&gt;
GitLab?&lt;br&gt;
I also like GitLab a lot and have used it for years at work and privately. It's partly open source, which is better than GitHub's total black box. But I wanted something European, more community-driven—something where I could fix a feature myself if the platform didn't.&lt;br&gt;
Sourcehut?&lt;br&gt;
No—too bare-bones.&lt;/p&gt;

&lt;p&gt;The choice fell on Codeberg.&lt;br&gt;
Codeberg is run by a non-profit foundation that runs on the open-source project Forgejo. You can self-host components like runners, you can contribute solutions and future directions, and the foundation is EU-based. It's not just another "GitHub" clone.&lt;br&gt;
For example, they're working on adding federation support.&lt;br&gt;
Forgejo is written in Go, and it shows—the platform feels snappy and fast.&lt;/p&gt;

&lt;p&gt;I started moving my projects over. Transferring code, features like Pages, and Renovate was fairly easy. Setting up more advanced CI flows required extra work, partly because there are still unresolved issues. You also have to set up your own runners (I used Podman-based ones).While Forgejo Actions are similar to GitHub Actions, there are some differences in how they work. So expect to miss features you're used to having from GitHub Actions and maybe GitLab CI.&lt;/p&gt;

&lt;p&gt;Sure, the goal is probably not for Codeberg to reach feature parity with GitHub and others, but as an end user every such feature helps me migrate. So personally I hope they get even closer to parity.&lt;br&gt;
That doesn't rule out solving the same user needs in even better ways.&lt;/p&gt;

&lt;p&gt;I will still work on GitHub, and will keep contributing to projects there, both for myself and for my job. My point is simply that it’s worth thinking about who owns FOSS infrastructure and who controls it sometimes. If there are equivalent alternatives, maybe choose them instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're a tech-minded &lt;strong&gt;individual&lt;/strong&gt; with accounts or projects already on GitHub, GitLab, etc, I'd definitely say—give Codeberg a shot for your projects.Set up a Runner and get started.&lt;br&gt;
If you're an &lt;strong&gt;organization&lt;/strong&gt;, I'd suggest waiting until some of the missing features are resolved (or maybe better, start to fix them).&lt;/p&gt;

&lt;p&gt;PS Here's a post about the rough edges I hit during the migration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://itiquette.codeberg.page/posts/codeberg-missing-features/" rel="noopener noreferrer"&gt;What I found missing on Codeberg as a new user&lt;/a&gt; - my practical notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Relevant References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.codeberg.org/getting-started/what-is-codeberg/" rel="noopener noreferrer"&gt;What is Codeberg?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forgejo.org/" rel="noopener noreferrer"&gt;Forgejo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nlnet.nl/project/ForgeFed/" rel="noopener noreferrer"&gt;Forge federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geekwire.com/2025/github-will-join-microsofts-coreai-group-with-departure-of-ceo-thomas-dohmke/" rel="noopener noreferrer"&gt;GitHub absorbed into Microsoft CoreAI division&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ziglang.org/news/migrating-from-github-to-codeberg/" rel="noopener noreferrer"&gt;Zig project on why they migrate to Codeberg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/roadmap/issues/72" rel="noopener noreferrer"&gt;SHA256 support in GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/orgs/community/discussions/6652" rel="noopener noreferrer"&gt;Fast-forward merge only on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/markup/issues?q=asciidoc" rel="noopener noreferrer"&gt;AsciiDoc rendering issues on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/orgs/community/discussions/36441" rel="noopener noreferrer"&gt;Token scoping limitations on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.andrlik.org/dispatches/migrating-from-github-motivation/" rel="noopener noreferrer"&gt;A user on why they migrate away from GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theregister.com/2022/06/30/software_freedom_conservancy_quits_github/" rel="noopener noreferrer"&gt;A large open source organization leaves GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>codeberg</category>
      <category>forgejo</category>
    </item>
    <item>
      <title>Gommitlint - a tool for keeping your commit quality</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Fri, 16 Jan 2026 11:43:29 +0000</pubDate>
      <link>https://dev.to/janderssonse/gommitlint-a-tool-for-keeping-your-commit-quality-3gd0</link>
      <guid>https://dev.to/janderssonse/gommitlint-a-tool-for-keeping-your-commit-quality-3gd0</guid>
      <description>&lt;p&gt;Commit messages matter.&lt;br&gt;
Yet many of us still toss out a "fix stuff" or "wip" when we're moving fast. Maybe you let an AI agent vibe‑commit whatever it feels like.&lt;br&gt;
That's totally fine in test branches, where you can clean them up later, but not in the main branch. The effort to write a good commit message is the same as writing a bad one. Although, the difference shows up six months later when you dig through the git logs and the messages don't give a clear picture of what happened.&lt;/p&gt;

&lt;p&gt;I’ve written before about keeping a clean Git history and signing commits for security. Those posts were about &lt;em&gt;how&lt;/em&gt;. But knowing and doing consistently are two different things. People (and perhaps even more so AI agents) forget.&lt;/p&gt;

&lt;p&gt;Over the years I’ve tried several commit‑lint tools, but none have made me fully satisfied. Some were JS‑ or Python‑based, which means depending on a runtime ecosystem just to validate a commit message. Others looked very promising, like "conform", but are now almost abandoned with issue lists that does not get addressed.&lt;/p&gt;

&lt;p&gt;I wanted a linter as a single binary, without runtime dependencies, that works out of the box and comes with sensible (in my view) defaults. The result was that I created Gommitlint. And I think it turned out pretty OK.&lt;br&gt;
The goal was a tool that works just as well as a CLI tool as in a CI flow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bu5k98uwh2h9jb0b8eg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bu5k98uwh2h9jb0b8eg.png" alt=" " width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gommitlint is thus a Git commit linter — a CLI tool written in Go for commit messages.&lt;br&gt;
It validates commit messages against different configurable rules, for example Conventional Commits format, length and style of the subject line, sign‑off (DCO), cryptographic signatures (GPG or SSH), spelling, linear history, and limits for how far a branch may get ahead.&lt;br&gt;
It can validate individual commits, commit ranges, entire branches against a base branch, or commit messages from stdin or files.&lt;br&gt;
Since it’s a static binary it’s perfect for small container images and CI flows.&lt;/p&gt;

&lt;p&gt;It runs in three modes: as a CLI for manual validation, as Git hooks (commit‑msg and pre‑push) to catch problems before they end up in history, and in CI/CD pipelines as a quality check.&lt;/p&gt;

&lt;p&gt;Effort has gone into following good CLI UX practices, with the idea that it’s the small things that make a tool pleasant to use.&lt;/p&gt;

&lt;p&gt;Tools that require initial configuration are demanding, so Gommitlint immediately enables several rules out of the box if no other configuration is provided: subject line max 100 characters and imperative mood, Conventional Commits format, sign‑off requirement, cryptographic signature verification, spell checking, linear history, and branch‑ahead limits.&lt;br&gt;
You can disable or customize all of this as you like. The point is that it does something sensible right away without a config file.&lt;/p&gt;

&lt;p&gt;The program supports installing git hooks, locally as well as globally.&lt;br&gt;
For example: run &lt;code&gt;gommitlint hook install --global&lt;/code&gt; and each commit will be validated before it’s created, for all projects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gommitlint validate &lt;span class="nt"&gt;--base-branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;main &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I learned a lot by building this project from scratch — everything from the Go ecosystem and hexagonal architecture in practice to good CLI design and more DevOps patterns. In side projects, the learning and insights are at least as valuable as the result.&lt;/p&gt;

&lt;p&gt;The process was a mix of manual craft and AI prompting.&lt;br&gt;
I wrote the base by hand, used AI to improve, analyze, and build out, went back to handwork and then AI again. And so on. There are a few parts I need to clean up more.&lt;/p&gt;

&lt;p&gt;Gommitlint is open source (EUPL‑1.2) and available as binaries for Linux and BSD (and an untested and unsupported binary for macOS), system packages (.deb, .rpm, .apk) and container images.&lt;/p&gt;

&lt;p&gt;Releases before the 1.0.0-series will have some embarrassing bugs or documentation misses, that is part of the deal. But, if you want to make it even better, issues, suggestions and contributions are welcome.&lt;/p&gt;

&lt;p&gt;Happy Linting!&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codeberg.org/itiquette/gommitlint" rel="noopener noreferrer"&gt;Gommitlint on Codeberg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.org/itiquette/gommitlint-action" rel="noopener noreferrer"&gt;Gommitlint-Action on Codeberg (Forgejo-Action)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/itiquette/gommitlint-action" rel="noopener noreferrer"&gt;Gommitlint-Action on GitHub (GitHub-Action)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Related posts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/janderssonse/keep-a-clean-git-history-with-git-rebase-and-conventional-commits-3ij6"&gt;A clean Git history with Git Rebase and Conventional Commits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3"&gt;Git signoff and signing like a champ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>cli</category>
      <category>commit</category>
      <category>security</category>
    </item>
    <item>
      <title>Translating Free Software - why bother</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Thu, 29 May 2025 09:07:49 +0000</pubDate>
      <link>https://dev.to/janderssonse/translating-free-software-why-21nc</link>
      <guid>https://dev.to/janderssonse/translating-free-software-why-21nc</guid>
      <description>&lt;p&gt;I’ve been translating free software on and off for years. It started with wanting to translate a project I used daily, and then it continued because it was interesting and fun. In this post I want to share a few thoughts about why translations are important, and what’s worth keeping in mind in this context.&lt;br&gt;
Why Bother at all?&lt;/p&gt;

&lt;p&gt;The simple answer is that good translations means more people can use tools in their own language. But it’s more than that.&lt;/p&gt;

&lt;p&gt;A shared language is one of the strongest bonds holding a society together. It brings people closer and is deeply tied to people’s cultural identity. We are often pretty good at adopting anglicisms in the IT world, but there is value in preserving and using your beautiful mother tongue when possible. When making the software available in your native language, you help that preservation.&lt;/p&gt;

&lt;p&gt;When you translate software, you learn a lot about the programs at a deep level. You discover features you never knew were there, and you get to think about how the user experience is built. It makes you truly understand both the program and the technology behind how it works.&lt;/p&gt;

&lt;p&gt;AI translations are impressive. I use them all the time to do the groundwork. But they still miss meanings and linguistic nuances, and they need a human to review them, line by line. Human translators will still be needed for review and language quality.&lt;/p&gt;

&lt;p&gt;If you want to help with free software but don’t code, translating is a great way to start. You get to be part of a project, learn how open source workflows and practices function, and make a real difference—without writing any code at all.&lt;br&gt;
Challenges&lt;/p&gt;

&lt;p&gt;You don’t need to be a professional translator who makes a living translating Japanese haiku day in and day out, but you do need decent language skills. Good spelling and grammar aren’t optional. Bad translations can mess up how well software works and make it look amateurish. In the worst cases, they can even cause problems in the translated software.&lt;/p&gt;

&lt;p&gt;Keeping things consistent is another big headache. Using the same words everywhere sounds easy until you face the English word “file” and have to choose between fil, arkiv, or dokument in Swedish. What makes sense depends on the situation, and sometimes you just don’t have enough information.&lt;/p&gt;

&lt;p&gt;Sometimes you also need to learn entirely new domains in depth. Can you translate an advanced video editor—or maybe software for birdwatching—without knowing the domain terminology? Usually not. Most of the time you need to dive deep into the domain of the software you translate.&lt;/p&gt;

&lt;p&gt;Translating can take a lot of time. It can become a way to get things done while putting off other tasks. You see immediate progress, which feels good. But it’s easy for hours to slip by without noticing. Setting time limits helps keep things balanced.&lt;/p&gt;

&lt;p&gt;Good software changes constantly. That means translations need constant updates. Keeping up with this over time can be challenging.&lt;/p&gt;

&lt;p&gt;And the hardest part? Translating technical ideas where there isn’t an established word for it yet. Technology moves fast, and language doesn’t always keep up. Bridging that gap takes creativity and a good feel for language. Sometimes you just have to choose a word and see if it holds up over time.&lt;/p&gt;

&lt;p&gt;That’s all for now. If this got you thinking, check out &lt;a href="https://itiquette.codeberg.page/translations/" rel="noopener noreferrer"&gt;Translations &lt;/a&gt;for tips on how to get started. Good luck with translating!&lt;/p&gt;

&lt;p&gt;🇪🇸 Spanish | 🇬🇧 English | 🇮🇳 Hindi | 🇧🇩 Bengali | 🇵🇹 Portuguese | 🇯🇵 Japanese | 🇵🇰 Urdu | 🇫🇷 French | 🇩🇪 German | 🇹🇷 Turkish | 🇰🇷 Korean | 🇻🇳 Vietnamese | 🇹🇼 Taiwanese | 🇮🇷 Persian (Farsi) | 🇨🇳 Chinese (Mandarin) | 🇮🇹 Italian | 🇮🇩 Indonesian | 🇵🇱 Polish | 🇹🇭 Thai | 🇺🇦 Ukrainian | 🇳🇱 Dutch | 🇷🇴 Romanian | 🇸🇦 Arabic | 🇸🇪 Swedish | 🇬🇷 Greek | 🇪🇬 Egyptian Arabic | 🇭🇺 Hungarian | 🇮🇱 Hebrew | 🇵🇭 Filipino/Tagalog&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>l18n</category>
      <category>l10n</category>
      <category>localization</category>
    </item>
    <item>
      <title>From Hack Idea to Release: Reflections on Creating and Releasing a Open Source Project</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Thu, 12 Sep 2024 10:00:28 +0000</pubDate>
      <link>https://dev.to/janderssonse/from-friday-hack-to-release-reflections-on-creating-and-releasing-a-open-source-project-1ljg</link>
      <guid>https://dev.to/janderssonse/from-friday-hack-to-release-reflections-on-creating-and-releasing-a-open-source-project-1ljg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part of a series aimed at beginner and intermediate developers, releasing or intrigued by releasing their ideas as Open Source Projects.&lt;br&gt;
These reflections are biased and personal. More articles are planned. By sharing some reflections, I hope to inspire you to do your own projects&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reflections (this)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Learning Go lang as a Java Developer (TODO)&lt;/li&gt;
&lt;li&gt;Open Source Health and Community files (TODO)&lt;/li&gt;
&lt;li&gt;Open Source Security (TODO)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foilb8c942q1hne7vtwom.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foilb8c942q1hne7vtwom.png" alt=" " width="792" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The needs
&lt;/h2&gt;

&lt;p&gt;It all started years ago. I now and then needed something that seemed to always involve recreating the same old Bash script, either by me or someone else.&lt;br&gt;
The overall requirements were simple, as they often are at a high level.&lt;br&gt;
What we developers mostly do is really just about shuffling information from point A to point B, right?&lt;/p&gt;

&lt;p&gt;Here, the goal was to mirror a bunch of Git repositories - to another Git provider, to disk, to an archive format, in a CLI app.&lt;br&gt;
I needed this privately and in my work role. I've seen people struggle, investing a lot of time doing these things manually, and that bothers me.&lt;/p&gt;

&lt;p&gt;Yet, it always seemed to stay as a simple Bash script. Quickly done, but as soon as anything extra had to be added - special cases, error handling, modularization, packaging, etc. - Bash scripts don't hold up for bigger tools, as most of us would agree.&lt;/p&gt;

&lt;p&gt;So I decided to create a full CLI application for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pre-Decisions to be Made
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does such a tool exist already?
&lt;/h3&gt;

&lt;p&gt;The first thing to do was to not reinvent the wheel.&lt;br&gt;
There exist a few tools that are Open Source and solve this problem. At least one written in Go, a few Bash scripts, and if counting import functions like the one in Gitea.&lt;br&gt;
I tried them out, but I couldn't find any that worked fully the way I wanted. And as I had other ideas of where I wanted to take the project, I decided not to deep dive into&lt;br&gt;
starting to apply patches to the existing projects.&lt;/p&gt;

&lt;p&gt;There also exist a few commercial tools, but I felt this small a tool is something that should also exist in Open Source forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; There was a place for this CLI tool in this world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hacking on it at Work-hackdays or in Private free time?
&lt;/h3&gt;

&lt;p&gt;We have hacking time at work at the end of sprints and on other occasions. One approach would be to hack on it during these occasions over time, crafting it into something useful.&lt;br&gt;
I quickly decided to do it fully in my private spare time instead, for the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hack opportunities at work should be used for short bursts of learning and creativity, not long-term carving of a full project.&lt;/li&gt;
&lt;li&gt;The solution doesn't fit into the core organization's business - it would always be an odd duck there if so.&lt;/li&gt;
&lt;li&gt;Tying it to work would make it feel like just more work - I'm doing this for fun and learning Go etc - it would put pressure and stress on me.&lt;/li&gt;
&lt;li&gt;Doing it on the work-hackdays would take forever. A few hours, spread over weeks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; I should do it for fun in my spare time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choice of Technology Stack
&lt;/h3&gt;

&lt;p&gt;I've spent most of my time over the years in the Java/Kotlin world, with a few projects in JS/TS, Python/Ruby, and like every senior developer, dabbling in other at times.&lt;br&gt;
For a long time though, I've wanted to really learn Go and/or Rust. So this would be an opportunity to get the motivation to dive into a new languague&lt;br&gt;
The reason I picked Go is that quite a few CLI applications in the Open Source DevOps world are written in it, and I want to be able to submit patches to third-party projects at times. Also, writing in Go means one binary with many target architectures.&lt;/p&gt;

&lt;p&gt;I was considering doing it in Java, for example, with Pico CLI and GraalVM of which &lt;a href="https://github.com/janderssonse/sariftool" rel="noopener noreferrer"&gt;of which I had a good impression since earlier tries&lt;/a&gt; but I decided that I really wanted to learn Go instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; I should do it in Go and learn from that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Learning Goals
&lt;/h2&gt;

&lt;p&gt;With this, I also wanted to delve deeper into the subjects of delivering a nicely packaged Open Source project, following most of the Security practices - scorecards, SLSA,&lt;br&gt;&lt;br&gt;
and using tools like GoRelease to create builds of various kinds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Take the opportunity to learn and delve into topics of your choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the Scope
&lt;/h2&gt;

&lt;p&gt;As I planned to experiment a lot, and I was totally new to Go, I knew I would do a lot of unstructured work.&lt;br&gt;
Here it was important to set the scope - when would it be good enough for an alpha release?&lt;br&gt;
I early on decided on what functionality it should have, and as tempting as it would be to sit and refine and expand it further, this was good.&lt;br&gt;
I could sit with this for a long time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Release the project as alpha when you are equally embarrassed and proud of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estimation - How Hard Can It Be?
&lt;/h2&gt;

&lt;p&gt;Learning a new language is a small part of learning the language itself, but much more about learning the ecosystem and its idioms.&lt;br&gt;
What libraries are used, how are they used, what are the idiomatic ways of doing this and that?&lt;br&gt;
I would have to spend a large amount of time learning and researching during this project, maybe 50% of the time I would &lt;br&gt;
have spent just coding in a language and ecosystem I know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; Multiply your time estimate by three when learning new core stacks and involving experimentation. The language syntax will be the small thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Creation Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initial Commit
&lt;/h3&gt;

&lt;p&gt;The basic implementation was done in a day - it had no builds, error handling, documentation, edge cases, maintainability, etc.&lt;br&gt;
This is where most Friday hacks end up, and most of them never goes further.&lt;/p&gt;

&lt;p&gt;But as all senior developers know, making something work is many miles from releasing a product.&lt;/p&gt;

&lt;p&gt;Soon done, eh? Not really.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding the Time
&lt;/h3&gt;

&lt;p&gt;At times it was really hard finding the time to spend with the project, especially as I had an exhausting spring at work.&lt;br&gt;
It's not every night that you feel like reading a book for 2 hours about something specific, or learning a new tech.&lt;br&gt;
Or spending time writing documentation. I have kids and a house, and I couldn't afford to let a private project consume me more than other hobbies.&lt;br&gt;
But something always has to give - I ended up watch fewer series, and any gaming has been almost non-existent during this period.&lt;/p&gt;

&lt;p&gt;With that said, while I wish I could spend more time on the project, it was almost always motivating - I had a few night sessions where I slept less and coded or studied,&lt;br&gt;
because I was so excited to get further. Also, when something is fun, it is fun, whether it's lifting weights, writing a book, developing, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Things I Forgot
&lt;/h2&gt;

&lt;p&gt;I've been so used to working in teams for a long time. With a solo project, you have to manage a lot more hats and be quite good in every part of them, not often technical.&lt;br&gt;
I spent quite a lot of time digging into good CLI design and idiomatic choices. Another area was the release process and building binaries for different platforms.&lt;br&gt;
Following SLSA and other standards in Open Source also took time. And we want good test coverage, right?&lt;br&gt;
Working in a team, someone else will hopefully do the logo you wanted, the documentation needed to be written.&lt;br&gt;
Working solo, it's only you or it won't happen.&lt;br&gt;
Writing code is not even 50% of delivering a project. And there's the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Impostor Syndrome Strikes
&lt;/h2&gt;

&lt;p&gt;Impostor Syndrome is common in our knowledge-based developer world. Everyone has different skills, and at any given time, there will always be someone that knows more than you.&lt;br&gt;
Being in a team, you have someone to discuss things with.&lt;br&gt;
Alone, not as much.&lt;/p&gt;

&lt;p&gt;But, it is all about accepting that one will do some stupid things in the code at times.&lt;br&gt;
And, that Open Source isn't about being perfect. It's about learning, solving and releasing things that might be of use to others.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grind
&lt;/h2&gt;

&lt;p&gt;Well, what can I say - it is done when it is done.&lt;/p&gt;

&lt;p&gt;There were a few late nights debugging, refactoring, but also countless moments of flow and dopamine.&lt;/p&gt;

&lt;p&gt;For me, the release time came when I felt the overall architecture in the project would not radically move - I had identified the interfaces, and felt that is extendable.&lt;br&gt;
The codebase is OK.&lt;br&gt;
Most of the basic features are there, and while everything is up for improvements, it is still a base to work on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Aftermath and Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set the scope early:&lt;/strong&gt; Decide where to stop. Set up your project structure, documentation, releases, pipelines, and community guidelines early. Future you will thank past you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't stress, enjoy the learning process:&lt;/strong&gt; It is done when it is done.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be persistent:&lt;/strong&gt; Open source is a marathon, not a sprint. Don't burn out. It is a hobby, not your life. However be persistent. Do a small thing every day.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learn, learn, learn:&lt;/strong&gt; See everything as an opportunity for learning and improving, not as a problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coding is the easy part:&lt;/strong&gt; The main code is what will take you the least time; everything else, like documentation, tests, etc., is where time is spent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do the extras:&lt;/strong&gt; They are as fun as coding. Yes, even documentation can save you hours of explaining and re-explaining. Make it fun if bores you. Docs-as-code, vim-pong, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Take breaks:&lt;/strong&gt; Burnout is real. Step back when you need to. Just like every other creative learning process, do it in batches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the system:&lt;/strong&gt; Use your own dogfood in practice and in the real world as early as possible. Even better, find a person/community to give feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enjoy the journey:&lt;/strong&gt; It is wonderful to create.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complete it:&lt;/strong&gt; There are a zillions half done projects in this world. Complete it. And then realise that the project really just starts after the first release.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use AI as a help:&lt;/strong&gt; I save hours by delegating a bit of boring extras to it, like asking for doc structures, summarizing things, etc. However, don't ever trust it blindly. Review and criticize the answers.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Well, happy hacking and now go and think about what you want to make next!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;The project: &lt;a href="https://github.com/itiquette/git-provider-sync" rel="noopener noreferrer"&gt;Git Provider Sync&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>cli</category>
    </item>
    <item>
      <title>FOSDEM 2024 - Summary and Reflections</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Mon, 05 Feb 2024 11:22:11 +0000</pubDate>
      <link>https://dev.to/janderssonse/fosdem-2024-summary-and-reflections-j3</link>
      <guid>https://dev.to/janderssonse/fosdem-2024-summary-and-reflections-j3</guid>
      <description>&lt;p&gt;Back home from another visit to FOSDEM (the 8th, the 10th? - I'm getting old), and I thought I'd make a short summary with personal reflections.&lt;/p&gt;

&lt;p&gt;So, what is &lt;a href="https://fosdem.org/2024/" rel="noopener noreferrer"&gt;FOSDEM&lt;/a&gt;, in case you don't know? It is one of Europe's biggest developer-focused conferences, mixing everything low-level and high-level in tech in a casual style. From the old obscure and up to the latest trends, you will find them all here. The common pillar is, as the name implies, Free and Open Source projects, with a healthy mix of hobbyists, NGOs, policymakers, and commercial organizations in a relaxed conference setting. Usually, there are also related events (Fringe events), before and after FOSDEM itself. With 900+ speakers, and talks available online for free there is something for everyone. Have a look here to grasp the size and diversity: &lt;a href="https://fosdem.org/2024/schedule/" rel="noopener noreferrer"&gt;Schedule&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Regarding the Fringes, some examples this year were: EU Open Source Policy Summit 2024, Workshop on FOSS license and security compliance tools, The joint 2024 Hackathon of the European Commission and PEReN, and a lot more. The Fringes are a great way to network and have fun in casual settings.&lt;/p&gt;

&lt;p&gt;Usually, I try to attend before the actual FOSDEM event, like the license compliance and SBOM event, but this year, it was pure FOSDEM only. I also went "privately" this year, so that meant a bit more focus on just doing what I felt for at the moment. Anyway, that means these are all personal opinions, not those of my employer!&lt;/p&gt;

&lt;p&gt;Everyone's FOSDEM experience will be different, but here are the topics where I attended during the two days (a healthy mix) with links to the FOSDEM videos and presentations.&lt;/p&gt;

&lt;h2&gt;
  
  
  General Reflections - the TL;DR
&lt;/h2&gt;

&lt;p&gt;First, it is still the same old FOSDEM experience - lots of t-shirts and swag, beards, and the smell of GNU in overcrowded presentation halls:) - but it is really noticeable how the FOSS community has matured and is tackling new challenges on a more mature and abstract policy-related level. There are a lot of focus on regulations, laws, compliance, vulnerabilities, community funding, and how to collaborate to solve all these challenges. Surely, these issues have always been, in different forms, important - Open Source is the pillar on which modern digitalization work. But, most of the developer rooms handling these topics were jam-packed this year! So this is telling, and a good sign - the wide Open Source Challenges are of a broader interest in the developer communities also - it is not only about tech details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security, Policy, and Lawmaking - The Cyber Resilience ACT and the Product Liability Directive (PLD)
&lt;/h2&gt;

&lt;p&gt;There were many chances to dig into the EU Cyber Resilience Act. Simplified, the CRA will regulate software as done today with hardware from a Security perspective, which means that any software on the market will fall under regulation and security demands. And of course, as every software project today mostly consists of Open Source Software (70%-90%), it will have effects on Open Source Software consumers (and producers). In the first drafts, there were many potential problems, but the Security and Open Source Community has together reworked the wordings, so it will (could be) even something beneficial to Open Source, as projects relying on releasing products to the market will also be responsible to report and avoid (fix?) vulnerabilities. This will not be the responsibility of the Open Source projects themselves. But if you are a commercial actor, this will apply.&lt;/p&gt;

&lt;p&gt;But, as of yet, there are many things that will be interesting to see how it plays out in practice here - how will a vendor commercial product make the Open Source project they are using make the project fix the vulnerabilities? Will the vendor fund a fix for the Open Source project? Will they submit a patch? If the project maintainer does not want to fix any issues regardless, will the vendor and maintain, rewrite or what? In my simplified take, I can see that the CRA is a tough and expensive coming-of-age regulation regarding security responsibility for software for commercial vendors and commercial producers. But, as a potentially good thing for Open Source Security and trust, funding and maintenance in the long term. There will be learning pains as such, but in the end, I'm quite positive for what this might mean for Open Source. We will see.&lt;/p&gt;

&lt;p&gt;So, For us as citizens and end consumers, I believe this is a good thing.&lt;/p&gt;

&lt;p&gt;CRA is one example of where policymakers and the real-world communities have worked together to improve the policies, and all parts have done a great job in the end. I applaud unsung heroes here, thanks! Now there will be other up-and-coming policies - like the Interoperable Act - where it is very important to have these discussions and feedback loops between policymakers and communities/producers as we go along. With parts of the EU Commission OSPO in place and other important key players, with the lessons learned from the CRA, and the open discussions, I feel trust in that coming policies will be open to being beneficial to both the EU's digital strategy as a whole and the Open Source community's ecosystem in specific. And where it really counts, for us as citizens and end consumers - us the citizens - as intended.&lt;/p&gt;

&lt;p&gt;See a presentation and overview about CRA &lt;a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3683-the-regulators-are-coming-one-year-on/" rel="noopener noreferrer"&gt;here&lt;/a&gt; and deep dive into EU Open Source Policy details &lt;a href="https://fosdem.org/2024/schedule/track/eu-policy/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SBOMS, Vulnerabilities Handling, and License Compliance
&lt;/h2&gt;

&lt;p&gt;In recent years, we have been talking about Software Bill of Materials - this is in demand by the industry, will be even more in demand by upcoming regulations like CRA, among others. Roughly, it is a component catalog that can be automated and used to check vulnerabilities and license compliance - if the product is the sum of its parts, then this is mostly about declaring the parts in an automated way and, by that way, handle vulnerabilities and license compliance. While it might seem like a simple problem at first, it is not - in fact, a complicated matter, with many interesting real-world challenges to solve. Even if a lot of work has been done, and a lot of effort has gone into creating Open Source tooling and practices, it will take time to get this right.&lt;/p&gt;

&lt;p&gt;Producing an SBOM is in no way a magical security ticket; - How do we get organizations to handle the vulnerabilities quickly, what vulnerabilities should be handled, and what SBOMs are you talking about when you say SBOM - the build, runtime, the container SBOM or what? How far the transient dependency tree should we walk, how do we handle that package managers handle dependencies differently, how do we handle that different tools report different SBOMs, what do we do we all the SBOMS and so on, and so on.&lt;/p&gt;

&lt;p&gt;Have a look at some of the talks (there are videos for most) &lt;a href="https://fosdem.org/2024/schedule/track/software-bill-of-materials/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Public Code and Digital Public Goods
&lt;/h2&gt;

&lt;p&gt;Another fully packed room - yet again, glad to see this - was the talks about Public Code - in brief, code that implements public policy, used for the public good, and by public organizations like governments, public administrations, etc.&lt;/p&gt;

&lt;p&gt;I like the notation of Digital public goods (DPGs) - an umbrella term for open-source software, open standards, open data, open AI systems, and open content collections. This helps us focus on fewer silos, and see that Open-topics are siblings.&lt;/p&gt;

&lt;p&gt;I listened to updates about how Public Code is both heading along and meeting new challenges in Germany, and especially Germany's &lt;a href="https://www.sovereigntechfund.de/" rel="noopener noreferrer"&gt;Sovereign Tech Fund&lt;/a&gt; should be an inspiration for other member states. Basically, it is Germany funding important Open Source Projects. Here is the &lt;a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2818-some-updates-on-public-code-in-germany/" rel="noopener noreferrer"&gt;Public Code in Germany talk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fosdem.org/2024/schedule/track/public-code-and-digital-public-goods/" rel="noopener noreferrer"&gt;Other Public Code And DPG Talks (video stream)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Communities
&lt;/h2&gt;

&lt;p&gt;The community for a product is an important part - for what use is a dead piece of undocumented code repository if it does not solve someone's problem in an easy to understand way (answer: worthless)? So even if community building is not where my own heart lies at in Open Source, (My heart is in making it easy to release, contribute and comply with sec and licensing, knowledge sharing) and truly and fully understand the importance of it.&lt;/p&gt;

&lt;p&gt;I was only briefly in here to feel the positive collaboration spirit, but one of the aspects lifted was funding - it is as important as ever, and still an unsolved issue in Open Source - and a great inspiration has been the work of Germany as mentioned above in the Public Code room, a work more states should follow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fosdem.org/2024/schedule/track/community/" rel="noopener noreferrer"&gt;Other Community Talks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Java
&lt;/h2&gt;

&lt;p&gt;With the recent releases of Java, the Java world is getting exciting again, that has been my opinion for the latest years. I went to a few Java talks, an overview of Quarkus and GraalVM to build native binaries (without JVM) and to a deep dive into Virtual Threads. While Native Java is exciting I would currently not offer it as the main release artifact of my system, but as an experimental side artifact and a companion to the main artifact.&lt;/p&gt;

&lt;p&gt;Virtual Threads are basically lightweight threads, instead of system threads. Something other languages have had for quite a time, think async/await in JS, coroutines in Kotlin, and so on for inspiration. Brian Goetz (Architect for the Java Language at Oracle, and master of concurrency in Java) a while ago said "I think Project Loom (virtual threads) is going to kill Reactive Programming". And I do think I agree with him. Reactive has always felt like forcing in a different paradigm in Java with a shoehorn, and from our real-life experiment with it in my last organization, it was easy to create hard-to-catch bugs in production, which ultimately led us to abandoning it for a Keep-it-simple-practice instead (and also, we headed for Kotlin and Coroutines at the time). Virtual Threads solve roughly the same async problem space in a much elegant and maintainable way. I would recommend anyone on the Reactive train in the Java world to start looking at Virtual Threads instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fosdem.org/2024/schedule/track/free-java/" rel="noopener noreferrer"&gt;Other Java talks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go
&lt;/h2&gt;

&lt;p&gt;Recently, I have dug into the Go-lang world and will soon hopefully have one or two tools to release, written in Go-lang. "Soon":) Actually, I'm a bit obsessed with Go-lang at the moment.&lt;br&gt;
So I hung around on a few Go-lang talks.&lt;/p&gt;

&lt;p&gt;News in Golang 1.2x - and here, as promised - Go-lang evolves slowly. So while no revolutionary additions, but minor good things like min, max etc &lt;a href="https://antonz.org/go-1-22/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also got my eyes  on &lt;a href="https://goreleaser.com/" rel="noopener noreferrer"&gt;GoReleaser&lt;/a&gt;, which I will use in my (Go) projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fosdem.org/2024/schedule/track/go/" rel="noopener noreferrer"&gt;Other Go talks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Missed
&lt;/h2&gt;

&lt;p&gt;A lot of talks, talking to you, and filter coffee! &lt;/p&gt;

&lt;p&gt;Besides that, I said hi to some old and some new faces, had a couple of Belgian beers and mussels, and just had a great time. As always at FOSDEM!&lt;/p&gt;

&lt;p&gt;So that's all. Today, I'm just processing the whole experience and loading up the batteries.&lt;/p&gt;

</description>
      <category>fosdem</category>
      <category>sbom</category>
      <category>cra</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Open Source is More Secure than Closed Source because Closed Source is More Secure than Open Source</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Thu, 23 Nov 2023 21:18:43 +0000</pubDate>
      <link>https://dev.to/janderssonse/open-source-is-more-secure-than-closed-source-because-closed-source-is-more-secure-than-open-source-54fm</link>
      <guid>https://dev.to/janderssonse/open-source-is-more-secure-than-closed-source-because-closed-source-is-more-secure-than-open-source-54fm</guid>
      <description>&lt;p&gt;The other day I had a discussion about whether source code is more secure when hidden out of sight — a valid discussion point that sometimes comes up. So, I thought I'd write a little opinionated post on why it is both.&lt;/p&gt;

&lt;p&gt;And without further suspense, it is as simple as that. Because it depends. It depends on project maintenance, processes around it, and project maturity.&lt;/p&gt;

&lt;p&gt;And this depends has proven itself in real life over the years. We can just look at the former closed-source giants, like Microsoft, which has had countless security breaches over the years, Apple and other friends with a heavy usage of closed source. While open-source software also has its daily bugs and security breaches, just like the weekly security patches and zero-day issues in Closed software that arrives in a never ending stream.&lt;/p&gt;

&lt;p&gt;So the sad outcome is that a skilled attacker will find your bugs (vulnerabilities) regardless of code visibility. Maybe, just maybe, you can delay the finding by obscurity. But it will find you in the end if the project is interesting enough for someone to put time and effort into.&lt;/p&gt;

&lt;p&gt;And, if the argument still seems to ring true after pondering this, why the heck is every piece of software we are currently running and basing our life's on running on open source as a base and dependency? Why has the European Union accepted it as a key for their digital strategy? Why has the White House listed open source as a must in their Cyber Security agenda if it's so unsecure? Why has big tech adopted it so hard? We might be nuts or...&lt;/p&gt;

&lt;p&gt;Or, because &lt;strong&gt;the visibility of the code has proven itself not to matter as much as we might think&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If so, what can we &lt;strong&gt;REALLY&lt;/strong&gt; do to improve security in a meaningful way in our open and closed projects?&lt;/p&gt;

&lt;p&gt;A lot!! Really! Much more than we are doing at this moment. This is where the focus should go if we want REAL secure code. Not into the development model itself. &lt;strong&gt;Into securing and improving the system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And this is much easier now than just a few years ago. The software security world has matured after the latest years of big breaches, and a lot of former expensive or rare tooling has arrived.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Humans make mistakes. Make it easy to do it right and hard to do it wrong. Which means among other things automating&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are some things you could do tomorrow in your projects, no intention means to be complete. I would almost bet that 9 out 10 of you who are reading this are not doing them all (including myself).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automation of checks mistakenly committed of configuration, secrets, IPs, and passwords in commits like gitleaks.&lt;/li&gt;
&lt;li&gt;Automation of checks for supply chain security vulnerabilities (third-party dependencies) with tools like OWASP's tools, Dependabot, Renovated.&lt;/li&gt;
&lt;li&gt;Automation of Static Application Security Testing (SAST) to find insecure code problems.&lt;/li&gt;
&lt;li&gt;Automation of Dynamic Application Security Testing (DAST) to find vulnerabilities.&lt;/li&gt;
&lt;li&gt;Automation of Software Component Analysis (SCA) to focus on third-party dependencies.&lt;/li&gt;
&lt;li&gt;Look over write access to projects.&lt;/li&gt;
&lt;li&gt;Clearly defined processes for code reviews and size of merge request.&lt;/li&gt;
&lt;li&gt;Plan and accept ongoing maintenance to regularly fix issues as they will change weekly.&lt;/li&gt;
&lt;li&gt;Minimizing the container images&lt;/li&gt;
&lt;li&gt;Make it easy and secure and encouragable to report security issues for outsiders and users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outside activities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Pen test bigger releases.&lt;/li&gt;
&lt;li&gt;    Arrange a community Pen test invited hackday with prizes. Break the solutions and find vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And so on, and so on...&lt;/p&gt;

&lt;p&gt;Compare an open code base having all of the above steps in place, with documentation in place about the steps taken, or a closed-source base with no other docs "We have rigid security analysis process (trust us)".  Who would you trust has the most security vulnerabilities? Whom would you or I as the end user trust? Whom should the end user trust? I know whom I would bet on.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why we in the Public Sector should foster trust and transparency whenever we can&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I honestly and truly believe that we who work in the Public Sector or similar tax payed jobs should have our goals on reaching our end users. For us in the digitalization services, that might be by means of Open Source, Open Data, good services and such. It has been proven again and again that it can not only help and give our Public Sector colleagues, but we can also receive trust from our real users—the citizens and part of that is we as humans and we as organizations should just admit that we sometimes write crappy solutions - I create bad solutions every day, and so do you and everyone else ( and other days we do it just perfectly). We miss a few things, we sometimes make the wrong decisions, miss some facts and we need improvements. While doing our best to avoid them, we should still acknowledge that we will make these mistakes at times.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is version 0.9 ... it will contains bugs, but belive us, we are doing our best to improve upon it; We are still proud as **** of it and it is really usable - use it and please report the bugs!!. It will be maintained until archived&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;TL;DR&lt;br&gt;
A bug is a bug is a bug. And while we can't avoid them, we can diminish them with good processes and tools. That is and should be the focus. Regardless of the development model. We in the Public Sector have an extra responsibility to be transparent.&lt;/p&gt;

&lt;p&gt;Open Source and Closed Source has already proven itself in our global infrastructure. Don't fall for arguments that one code base is safer or more unsecure due &lt;strong&gt;the Source visibilty itself.&lt;/strong&gt; Instead focus on what really means something regarding security, &lt;strong&gt;like security quality actions, reviews and system runtime security actions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Security_through_obscurity" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Security_through_obscurity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://csrc.nist.gov/publications/nistpubs/800-123/SP800-123.pdf" rel="noopener noreferrer"&gt;http://csrc.nist.gov/publications/nistpubs/800-123/SP800-123.pdf&lt;/a&gt; - The National Institute of Standards and Technology (NIST) in the United States recommends against this practice: "System security should not depend on the secrecy of the implementation or its components.&lt;/p&gt;

&lt;p&gt;ISO27001 - I think some misunderstandings come from this, but read the answer here. &lt;a href="https://security.stackexchange.com/questions/221644/is-the-iso-iec-27001-standard-incompatible-with-free-open-source-software" rel="noopener noreferrer"&gt;https://security.stackexchange.com/questions/221644/is-the-iso-iec-27001-standard-incompatible-with-free-open-source-software&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The "linear git commit history with signing in GitHub-UI"-workaround</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Tue, 10 Oct 2023 20:48:19 +0000</pubDate>
      <link>https://dev.to/janderssonse/the-linear-git-commit-history-with-signing-in-github-ui-workaround-2cej</link>
      <guid>https://dev.to/janderssonse/the-linear-git-commit-history-with-signing-in-github-ui-workaround-2cej</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;I prefer maintaining a linear Git history, where features are added in traceable portions. This approach has many benefits, as it makes it easy to track what has happened earlier in the project. Such a workflow often necessitates the frequent use of Git rebase capabilities, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rebasing the feature branch into a coherent feature chunk.&lt;/li&gt;
&lt;li&gt;Rebasing it against the main branch to keep it on top of other changes.&lt;/li&gt;
&lt;li&gt;And so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another Git/Git-service feature I appreciate is the ability to sign commits, which UI-wise results in a green "Verified" label on the Git-service's UI. This adds an extra layer of trust regarding the identity of the commit/feature submitter.&lt;/p&gt;

&lt;p&gt;Every major Git service provider, including GitLab, BitBucket, and GitHub, supports this workflow. Or do they?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem:
&lt;/h2&gt;

&lt;p&gt;To be honest, GitHub has a issue in this regard. In short, when performing a rebase action in the GitHub UI, it will rewrite your commits, even if the feature branch could be merged without merge commits. This means you will lose your signed verification signature — quite a horror!&lt;/p&gt;

&lt;p&gt;Note, Other major platforms will perform the expected fast-forward-only merge in the same case, meaning they won't create any merge commits. This allows you to simply add the commit on top of the main branch, preserving the signature.&lt;/p&gt;

&lt;p&gt;This is a known GitHub-problem, as evidenced by discussions at &lt;a href="https://github.com/orgs/community/discussions/5524" rel="noopener noreferrer"&gt;GitHub Community&lt;/a&gt; and &lt;a href="https://stackoverflow.com/questions/62950018/verified-signatures-are-gone-after-i-pressed-rebase-and-merge" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;GitHub has also acknowledged this issue with their platform. It is highlighted &lt;a href="https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification#signature-verification-for-rebase-and-merge" rel="noopener noreferrer"&gt;in their documentation&lt;/a&gt; and has received a response from their support:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a known issue we are tracking internally and a pain point for a number of folks....&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Currently, reverted pull requests created from a previously squash and merge pull request or a rebase and merge pull request are indeed not signed...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While we don’t yet have a specific ETA for when this might be implemented...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pain point?! YES!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workaround:
&lt;/h2&gt;

&lt;p&gt;So, what can you do? Just follow their advice in their documentation: "&lt;em&gt;&lt;strong&gt;A workaround for this is to rebase and merge locally, and then push the changes to the pull request's base branch.&lt;/strong&gt;&lt;/em&gt;" Aha, seems easy in words, but how can you translate this into terminal commands?&lt;/p&gt;

&lt;p&gt;For example, if you have a pull request that you are ready to merge:&lt;/p&gt;

&lt;p&gt;First, fetch the pull request locally by creating a feature branch for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch origin pull/&amp;lt;PULL-REQUEST-NUMBER&amp;gt;/head:&amp;lt;NAME-YOU-WANT-THE-PR-BRANCH-TO-HAVE-LOCALLY&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, while on your &lt;strong&gt;base branch i.e main&lt;/strong&gt;, merge the locally fetched PR branch into it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge &lt;span class="nt"&gt;--ff-only&lt;/span&gt; &amp;lt;THE-LOCAL-PR-BRANCH&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, push it to the base branch.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;GitHub will now close the pull request as merged, and you will have a clean commit history with the signed commit intact.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Summary:
&lt;/h2&gt;

&lt;p&gt;Is pushing to the main branch a hackish? Yes, but until GitHub fixes this problem, it is the only way and they recommend it in the documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other
&lt;/h2&gt;

&lt;p&gt;Other Git related articles on DEV from me:&lt;br&gt;
&lt;a href="https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3"&gt;Git signing and signoff like a champ&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/janderssonse/keep-a-clean-git-history-with-git-rebase-and-conventional-commits-3ij6"&gt;A clean Git history with Git Rebase and Conventional Commits&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>opensource</category>
      <category>workaround</category>
    </item>
    <item>
      <title>A clean Git history with Git Rebase and Conventional Commits</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Sun, 12 Mar 2023 19:11:46 +0000</pubDate>
      <link>https://dev.to/janderssonse/keep-a-clean-git-history-with-git-rebase-and-conventional-commits-3ij6</link>
      <guid>https://dev.to/janderssonse/keep-a-clean-git-history-with-git-rebase-and-conventional-commits-3ij6</guid>
      <description>&lt;p&gt;&lt;em&gt;Other Git related articles on DEV from me:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3"&gt;Git signing and signoff like a champ&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/janderssonse/the-linear-git-commit-history-with-signing-in-github-ui-workaround-2cej"&gt;The "linear-git-commit-history-with-signing-in-github-ui"-workaround&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;As developers we always strive to improve and simplify our processes. One important motivator is less time spent on future guesswork. We also would like that new developers in our projects will be able to quickly focus on their task instead of diving into a mess of lasagna and spaghetti code. &lt;br&gt;
And we all know that the "new developer" is in many cases you, a half year later when you are wondering what the hell you were thinking about many commits earlier.&lt;/p&gt;

&lt;p&gt;One part of making life simpler for everyone is by keeping a clean Git history. Now, What is a clean Git History? Well, you can find different opinions on that, but for me (and quite a few projects) a nice Git history:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tells the reader something in an expected understandable way&lt;/li&gt;
&lt;li&gt;makes a feature coherent. &lt;/li&gt;
&lt;li&gt;makes it easy to revert or cherry pick a feature&lt;/li&gt;
&lt;li&gt;tells the reader that the former contributors cared about the project and new contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, caring about your Git history is a well spent investment for your projects, and surely worth the small extra time it might take to learn.&lt;/p&gt;

&lt;p&gt;This article will give you a short opinionated lightweight view  of how to achieve that.&lt;/p&gt;
&lt;h2&gt;
  
  
  The basic rules:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The commit that goes into the main (or develop etc) branch should aim to be atomic, aiming to contain only the feature you are working on&lt;/li&gt;
&lt;li&gt;While working in your feature branch, your commit messages can look in whatever way you wish: wip and so on. But, the important thing is that &lt;em&gt;when you are done with your feature and ready to go for a Pull Request you first rebase your feature branch and clean up your commits&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The feature commit should have a clear defined message - Don't re-invent here - There exists a fairly used and accepted convention called &lt;a href="https://www.conventionalcommits.org" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;, so we are going to use that.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Rebase and avoiding merge commits
&lt;/h2&gt;

&lt;p&gt;Rebasing might sound scary if you are not familiar with it, (overwriting history, yikes?), but it is really not after you got the hang of where to, and how to. It puts your commits on top of whatever you rebase against.&lt;/p&gt;

&lt;p&gt;Instead of when you do Pull Requests with merge:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hmdmzfzh8zn0siqixle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hmdmzfzh8zn0siqixle.png" alt=" " width="800" height="536"&gt;&lt;/a&gt;  &lt;em&gt;"Merging main into the feature branch" by Atlassian is licensed under &lt;a href="https://creativecommons.org/licenses/by/2.5/au/" rel="noopener noreferrer"&gt;CC BY 2.5 AU&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You will do this with rebase:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc775oygk6i2llbarvap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgc775oygk6i2llbarvap.png" alt=" " width="800" height="545"&gt;&lt;/a&gt;  &lt;em&gt;"Rebasing the feature branch onto main" by Atlassian is licensed under &lt;a href="https://creativecommons.org/licenses/by/2.5/au/" rel="noopener noreferrer"&gt;CC BY 2.5 AU&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And in practice, the history of your commit graph will look like the one to the right, instead of the one to the left:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzwva7ioevtmr68f0fal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzwva7ioevtmr68f0fal.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;em&gt;"Messy left vs linear right" by Unknown is licensed under Unknown&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Much cleaner to follow and understand. And, just ignore the commit messages themselves for now - we will improve upon that soon.&lt;/p&gt;

&lt;p&gt;Basically you will use rebase in a few different ways.&lt;br&gt;
One is when you pull from the current branch. &lt;em&gt;Always&lt;/em&gt; use pull with --rebase flag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git pull --rebase 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another case is when you pull your changes from main/develop into your feature branch&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;
git rebase --interactive origin/main

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(instead of doing git merge )&lt;/p&gt;

&lt;p&gt;Finally, the last case is when you squash all your features in your feature branch - before submitting your Pull/Merge-Request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;git rebase --interactive &amp;lt;sha-with-the-commit-you-are-squashing-from&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article wont go into every detail about learning you how to rebase, as there are many good articles about that already - I recommend that you read more about it in the following links: &lt;br&gt;
&lt;a href="https://www.atlassian.com/git/tutorials/merging-vs-rebasing" rel="noopener noreferrer"&gt;Merge vs Rebase&lt;/a&gt; &lt;br&gt;
&lt;a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing" rel="noopener noreferrer"&gt;Git Rebasing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, then practice. Set up a git project and add a few commits, and a branch or two and start experimenting. If you don't try it for real, you will never feel comfortable. &lt;/p&gt;

&lt;p&gt;So, now we now how to get a linear, easy to follow Git graph. But if you look at the earlier comparison picture above, there is still much to improve upon regarding the commit messages themselves.&lt;/p&gt;

&lt;p&gt;Enter..&lt;/p&gt;
&lt;h2&gt;
  
  
  Conventional Commits
&lt;/h2&gt;

&lt;p&gt;It is a simple convention that is used in quite a few Open Source projects. I think it originated in the Angular community (not sure here). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7ir9cb8kk4diamivja0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7ir9cb8kk4diamivja0.png" alt=" " width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Conventional Commit format looks roughly like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;lt;type(optional scope): imperative of what it does&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So a practical example message could then look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;fix: add a validator for the fluxcapacitor class&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But, for the real format read &lt;a href="https://www.conventionalcommits.org" rel="noopener noreferrer"&gt;more about Conventional Commits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The great thing of not re-inventing things like commit message standards is that you &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bypass endless organisation and team discussions about how to do things in certain way. Instead you can agree, avoid distractions and focus on the important work - making a good product&lt;/li&gt;
&lt;li&gt;make it easier for new people to dive in to the project&lt;/li&gt;
&lt;li&gt;can use tools written for that standard - in the case of Conventional Commits, autogenerate changelogs and more.&lt;/li&gt;
&lt;li&gt;write better commit messages, as you have to give them a bit of thought&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  A rebase/conventional commit workflow example in practice
&lt;/h2&gt;

&lt;p&gt;Lets walk through the life of fictional feature branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start&lt;/strong&gt;: You start your feature-branch from a branch, here main, (but might as well be develop or however you are working with branches).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git switch -c feature/my-branch
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;working....&lt;/p&gt;

&lt;p&gt;taking a long break so&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git commit -m 'chore: a commit'

git push -u origin feature/my-branch
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;working ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git commit -m 'wip gotta go'

git push
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ah, meanwhile, new features (commits) was added to main by collegue Knuth, so you update your feature branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;
git rebase -i origin/main
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;back to working...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git commit -m 'docs: last docs update'

git push
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, ready to proudly clean up our feature commit history, before submitting a Pull/Merge Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;git rebase -i &amp;lt;sha-to-latest-commit-before-the-feature-branch&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OR, if you read my &lt;a href="https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3"&gt;article about signoff and signing&lt;/a&gt; :) :)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;git rebase -i --signoff --gpg-sign &amp;lt;sha-hash-of-the-commit-before the-the-feature-branch&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you will enter Git's interactive rebasing mode, which shows a list of the commits (from the hash you choose), and you get a list of options too. &lt;/p&gt;

&lt;p&gt;Default 'pick' just takes the commit as is. Most often I do r (reword) for the top commit (oldest) and f (fixup) for the others. f means the commit contents will be squashed into the previous commit, and so we will end up with a single commit that we got the chance to reword. But see the example in next section.&lt;/p&gt;

&lt;p&gt;So, With a lot of in work-in-progress commits on the feature-branch, you want to squash every commit with 'f' so there only will be one commit on the end. Except the last one that you want to reword with 'r'.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkpsamxejjto5k3k7jh1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkpsamxejjto5k3k7jh1.png" alt=" " width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After saving, you are given the dialouge to reword the commit you choose 'r' for. So just rewrite the commit header message as you please, here as a Conventional Commit: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwq2t7cubn4aq2us9hxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwq2t7cubn4aq2us9hxv.png" alt=" " width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, after saving, and rebase signals done succesfully, you do a quick sanity check that everythings seems fine and then force push (to the feature branch).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;
git push --force-with-lease

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done! Oh,,, then you remember - you want to improve your feature commit by adding a detailed description. So you rebase again (the now cleaned up, single commit), and add a description body.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p3jxz7fbr7r93ig4gwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p3jxz7fbr7r93ig4gwy.png" alt=" " width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, as you have rewritten your feature branch history again, you will also need to force push again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git push --force-with-lease
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And cheers - open a Pull Request after verifying everything was fine. &lt;/p&gt;

&lt;p&gt;F.A.Q&lt;/p&gt;

&lt;p&gt;&lt;em&gt;When should I not rebase?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never rebase and force push to a public branch without telling everyone first. In other words, only force push to your feature branch. That is a golden rule, because if you do push to common branches, you might overwrite others commits, mess up their forks and, in general create confusion for other developers. However as long as you are in your feature branch, do as you please. There are advanced cases where you want to, or even need to force push to main/develop etc, but that is out scope for this article.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Is rebasing widely used?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When submitting to Open Source projects it is not uncommon to get comments in the style of "&lt;em&gt;looks fine, but please rebase your feature branch into one feature&lt;/em&gt;",&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What is the --force-with-lease good for?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you force push, make a habit of using --force-with-lease option instead of --force, for a bit of extra safety - it will stop you from overwriting other peoples eventual added changes and stop the push.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Should I always add a Git description?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You be the judge, but for big or hard to understand features, please take the care to add a longer description (body) besides the header message.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Should I sign and signoff commits?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes, why not really? See &lt;a href="https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3"&gt;Sign and signoff your feature commits&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;How can I enforce this in GitLab?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To enforce a linear history in GitLab UI:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bicl8xzgl88hq3e7xn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bicl8xzgl88hq3e7xn8.png" alt=" " width="800" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How can I enforce this in GitHub?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To enforce a linear history in GitHub UI:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgygj7cddnsftnfmdgqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgygj7cddnsftnfmdgqi.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, if you also sign your commits - Sadly Rebase with UI is broken in GitHub, and you will lose your signature. There is a simple CLI workaround, read more under the &lt;a href="https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3"&gt;F.A.Q in this article for a workaround hint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Can I reuse this information?&lt;/em&gt;&lt;br&gt;
&lt;em&gt;All content in this article is licensed under the &lt;a href="https://creativecommons.org/share-your-work/public-domain/cc0/" rel="noopener noreferrer"&gt;CC0&lt;/a&gt; if not stated otherwise. Which means, use as you please, no need for any attribution. Please add suggestions and corrections if I mixed up something, or that you feel something important is missing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>conventionalcommits</category>
      <category>rebase</category>
    </item>
    <item>
      <title>Git signoff and signing like a champ</title>
      <dc:creator>Heapstack</dc:creator>
      <pubDate>Thu, 16 Feb 2023 18:10:53 +0000</pubDate>
      <link>https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3</link>
      <guid>https://dev.to/janderssonse/git-signoff-and-signing-like-a-champ-41f3</guid>
      <description>&lt;p&gt;&lt;em&gt;Other Git related articles on DEV from me:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://dev.to/janderssonse/keep-a-clean-git-history-with-git-rebase-and-conventional-commits-3ij6"&gt;A clean Git history with Git Rebase and Conventional Commits&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/janderssonse/the-linear-git-commit-history-with-signing-in-github-ui-workaround-2cej"&gt;The "linear-git-commit-history-with-signing-in-github-ui"-workaround&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Signing and sign-off your Git commits for improved security, contributions assurance and contributor history? What's not to like? Well, Let's jump right in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why?&lt;/em&gt;&lt;/strong&gt;: Summarized as short and simple as possible &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git Sign-off is a de facto standard way in the Open Source communities about ensuring to the project you are contributing to that _you _have the right to submit your content. Often together with an note in the projects CONTRIBUTING.md, that you agree to the DCO-standard by doing a sign-off (see the F.A.Q for a short summary of the DCO). Also, Sign-off's helps improving the git history tracking of whom submitted what.&lt;/li&gt;
&lt;li&gt;Git Signing adds an extra layer of trust regarding your commits. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, in essence, they are solutions to different problems, to increase your project security, trust, and traceability. It is easy to mix up their names (and their short flags versions &lt;code&gt;-s&lt;/code&gt; vs &lt;code&gt;-S&lt;/code&gt;:) but they are different concepts. Both have fairly good support in modern versions of Git Services like for example GitLab and GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are they cumbersome to configure?&lt;/strong&gt;: No, as we will see. Configure once and mostly forget about it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do they work in practice?&lt;/strong&gt;: Basically: Sign-off adds an extra comment to your commits - "you sign them off"!&lt;br&gt;
 &lt;br&gt;
Sign-off example :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git log
&lt;span class="go"&gt;

&lt;/span&gt;&lt;span class="c"&gt;........
&lt;/span&gt;&lt;span class="go"&gt;
feat: add a test for the superservice

&lt;/span&gt;&lt;span class="gp"&gt;Signed-off-by: Heap Stacksson &amp;lt;heap.stacksson@example.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Signing then. Well, as you might expect, it signs your commits cryptographically (by gpg- or ssh-key):&lt;/p&gt;

&lt;p&gt;Signing example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git log &lt;span class="nt"&gt;--show-signature&lt;/span&gt; 
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;commit f3974852488dde8b4cd087d5b5a27817d3358777 (HEAD -&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;feature/show-sign-example, tag: 300.0.1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Good "git" signature for heap.stacksson@example.com with ED25519 key SHA256:ABCToTLNtOKINCIuFYusrK+ohNbr5R4V9igTmCqciN4
&lt;/span&gt;&lt;span class="gp"&gt;Author: Heap Stacksson &amp;lt;heap.stacksson@example.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Date: Thu Feb 29 04:36:44 2024 +0100
feat: add a test for the superservice

&lt;/span&gt;&lt;span class="gp"&gt;Signed-off-by: Heap Stacksson &amp;lt;heap.stacksson@example.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and as mentioned, the common Git services have pretty good support for these methods. Here is an example from GitHub for how signing is implemented visually:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnn46n8ximtueqgetjl23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnn46n8ximtueqgetjl23.png" alt=" " width="800" height="297"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;"GitHub sign verification example", © by GitHub is licensed under &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="noopener noreferrer"&gt;CC-BY-SA&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Set up Git Sign-off
&lt;/h2&gt;

&lt;p&gt;Add the &lt;code&gt;-s&lt;/code&gt; or the &lt;code&gt;--signoff&lt;/code&gt; flag to your commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git commit &lt;span class="nt"&gt;--signoff&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'chore: this commit will be signoff:ed'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Set up Git Signing (before Git version 2.34.0, with GPG-key)
&lt;/h2&gt;

&lt;p&gt;If your Git version is less than 2.34.0 (or if you just prefer GPG-signing anyway) you need to supply a gpg-key for signing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are many articles on how to generate and add a gpg-key to your hosted Git service, so I  will leave that part to you (See, for example &lt;a href="https://docs.gitlab.com/ee/user/project/repository/gpg_signed_commits/#create-a-gpg-key" rel="noopener noreferrer"&gt;GitLab's excellent guide&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;Add the &lt;code&gt;-S&lt;/code&gt; or the &lt;code&gt;--gpg-sign&lt;/code&gt; flag to your commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;--gpg-sign&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'chore: this will sign your commit'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for signing tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git tag &lt;span class="nt"&gt;-s&lt;/span&gt; thetag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Set up Git Signing (Git version 2.34.0++, with ssh-key)
&lt;/h2&gt;

&lt;p&gt;Git introduced signing with ssh-keys from 2.34.0 and upwards. This simplifies life, as you most likely already have a ssh-key for your Git chores, and don't need to keep track of an extra gpg-key.&lt;br&gt;
The ssh feature also needs a fairly modern openssh version,8.8++, and finally, for visual candy, a fairly modern instance of GitLab etc, (cloud GitHub already supports this visually) so that your signatures are visually shown.&lt;br&gt;
Note: Using gpg-keys after Git 2.34.0 is still perfectly fine.&lt;/p&gt;

&lt;p&gt;Configure git to use ssh-key for signing instead of gpg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; gpg.format ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give it your public ssh-key, inline or filepath:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.signingKey &lt;span class="s1"&gt;'path/to/yourkey.pub'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SSH has no web-of-trust as gpg has, so you will also need to add an allowedSigners file where you add public signatures you trust, including your own. Otherwise verifying signatures will fail.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; ~/.config/git/allowed_signers
&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; gpg.ssh.allowedSignersFile &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/git/allowed_signers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to add your own public ssh-key to this (and your collborators- creating a repo of team public keys for sharing might be a good idea).&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.config/git/allowed_signers

..keys
heap.stacksson@example.com asdfas4949494949adfasfAAAAFASDFASDFSAD9939
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add an Git alias for signoff and signing or configure a global "always sign"
&lt;/h2&gt;

&lt;p&gt;And by using signoff and signing without an alias, you &lt;strong&gt;&lt;em&gt;will&lt;/em&gt;&lt;/strong&gt; forget to add them at times:). Therefore, I highly recommend that you add an git alias so that you can mostly forget about this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.cs commit &lt;span class="nt"&gt;--signoff&lt;/span&gt; &lt;span class="nt"&gt;--gpg-sign&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git cs &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'chore: this commit will be signed off and signed even though I forgot to set the flags'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, You could also configure the global Git configuration to make it "always sign" instead of an alias for you. This is how you would do it, including "always sign tags".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; tag.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.signingkey &amp;lt;KEY ID&amp;gt; &lt;span class="nt"&gt;--see&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;example https://docs.gitlab.com/ee/user/project/repository/gpg_signed_commits/#create-a-gpg-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But, you will still need a  alias for the signoff feature (a global Git configuration to always signoff is not supported by git).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.cs commit &lt;span class="nt"&gt;--signoff&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git cs &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'chore: this commit will be signed-off and signed even though I forgot to set the flags'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  F.A.Q
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;I get an error, "failed to sign commit in my shell"?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You might &lt;a href="https://stackoverflow.com/a/42265848" rel="noopener noreferrer"&gt;need to set the GPG_TTY env var&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt; export GPG_TTY=$&lt;/span&gt;TTY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Should I use GPG or SSH-signing?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Both have pro's cons so it is up to you - for example,  - ssh-key might be easier to configure (no need for extra gpg-key handling, you might already have an ssh-key setup for git needs), but then you need to share the public ssh keys in the mentioned allowed_signatures, to be able to verify. The sharing part is easily handled if using gpg, by uploading the public key to an public key server.&lt;br&gt;
Also, with ssh, if using older GitLab versions, you are going to miss out on the visual support for this. And it won't work with older git/openssh-combos if you are stuck with old development environments/versions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My nice verification signature disappeared when merging/squashing etc in GitLab/GitHub GUI?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Depending on your workflow, Git platform/PR-strategy and merge configuration there might be caveats. There are certainly room for improvements here from GitHub, GitLab and others.&lt;/p&gt;

&lt;p&gt;Some Links about different takes:&lt;br&gt;
&lt;a href="https://github.com/community/community/discussions/10410" rel="noopener noreferrer"&gt;GitHub Discussion about GitHubs Rebase Strategy (a bit broken, GitLabs works better here&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/cloudx/sign-your-code-31oo"&gt;General about signing with gpg&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/49879963/how-squash-and-merge-a-pull-request-with-gpg-signing-via-command-line" rel="noopener noreferrer"&gt;How to squash/merge via CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How can I rebase and with Sign/Signoff?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The git rebase command supports this usecase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--signoff&lt;/span&gt; &lt;span class="nt"&gt;--gpg-sign&lt;/span&gt; &amp;lt;your sha that you are rebasing from&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;What is the DCO mentioned regarding signoffs?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;_The meaning of a signoff depends on the project, but it typically certifies that the committer has the rights to submit this work under the same license (as the project) and agrees to a Developer Certificate of Origin (see &lt;a href="https://developercertificate.org" rel="noopener noreferrer"&gt;https://developercertificate.org&lt;/a&gt; for more information).&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;So, make sure to add something about agreeing to the DCO by Sign-off in your CONTRIBUTING.md, if that applies for your project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;My nice green verified button disappered on GitHub when I choose Rebase on Pull Request with signed commits, with the WebUI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Rebase from the Web-UI on &lt;a href="https://github.com/orgs/community/discussions/5524" rel="noopener noreferrer"&gt;GitHub is broken&lt;/a&gt;. Instead of the expected behaviour (as in Git, GitLab, BitBucket and other providers), it always rewrites the hashes, and your nice verified signature is gone. That means you currently cant keep a linear Git history with signed commits and Rebase. However a CLI workaround is to do as described in the Stack Overflow Question &lt;a href="https://stackoverflow.com/questions/60597400/how-to-do-a-fast-forward-merge-on-github" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;br&gt;
I left a bug report and got this answer "&lt;em&gt;I'm afraid this is a known issue we are tracking internally and a pain point for a number of folks.&lt;/em&gt; ... &lt;em&gt;While we don’t yet have a specific ETA for when this might be implemented&lt;/em&gt;..&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Various interesting links&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.agwa.name/blog/post/ssh_signatures" rel="noopener noreferrer"&gt;More about about SSH signing&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/1962094/what-is-the-sign-off-feature-in-git-for" rel="noopener noreferrer"&gt;Stack Overflow: What is the Signoff for?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All content in this article is licensed under the &lt;a href="https://creativecommons.org/share-your-work/public-domain/cc0/" rel="noopener noreferrer"&gt;CC0&lt;/a&gt; if not stated otherwise. Please add suggestions and corrections if I mixed up something, or that you feel something important is missing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
