🚀 How We Publish an Infinito.Nexus Release

Every Infinito.Nexus release follows the same path. It starts with a green main branch, goes through version number, changelog and tag, and ends with announcements on the blog, Mastodon, LinkedIn, the WhatsApp group and the newsletter. This guide shows who does what and when. :open_book:

:world_map: The Process at a Glance

# Step Who
1 :white_check_mark: main passes CI/CD green CI/CD
2 :1234: Choose the version number (SemVer) Kevin Veen-Birkenbach
3 :label: Add the release to the changelog and tag it Kevin Veen-Birkenbach
4 :writing_hand: Generate the blog article from the changelog entry Main author of the release
5 :clapper_board: Add a tutorial and videos (if possible) Main author of the release
6 :eyes: Review the blog article Kevin Veen-Birkenbach
7 :megaphone: Prepare the Mastodon and LinkedIn posts Main author of the release
8 :speech_balloon: Inform the WhatsApp group and the newsletter Main author of the release

:shuffle_tracks_button: The Workflow as a Diagram

:green_square: Dark green = required · :blue_square: Dark blue = decision · :white_large_square: White, dashed = optional · :red_square: Dark red = stop

%%{init: {"theme": "base", "themeVariables": {"fontSize": "16px", "lineColor": "#475569", "textColor": "#0f172a", "titleColor": "#0f172a", "edgeLabelBackground": "#ffffff"}, "flowchart": {"wrappingWidth": 320, "nodeSpacing": 30, "rankSpacing": 45, "padding": 14}}}%%
flowchart TD
    subgraph GATE["🚦 Gate · CI/CD"]
        A{{"1️⃣ main green in CI/CD?"}}
        X["🛑 No release<br/>fix main first"]
    end

    subgraph REL["🏷️ Release · Kevin Veen-Birkenbach"]
        B{{"2️⃣ What changed?"}}
        B1["💥 Major<br/>14.2.0 ➜ 15.0.0"]
        B2["✨ Minor<br/>14.2.0 ➜ 14.3.0"]
        B3["🐛 Patch<br/>14.2.0 ➜ 14.2.1"]
        C["3️⃣ Changelog entry + Git tag"]
    end

    subgraph BLOG["✍️ Blog · Main author"]
        D["4️⃣ Generate blog article<br/>from changelog entry"]
        E["6️⃣ Review by Kevin Veen-Birkenbach"]
        F["📰 Article goes live"]
    end

    subgraph OPT["➕ Optional · Main author"]
        direction TB
        O1["5️⃣ Developer tutorial<br/>hub.infinito.nexus"]
        O2["5️⃣ Tutorial video<br/>video.infinito.nexus"]
        O3["5️⃣ What's New video<br/>video.infinito.nexus"]
        M["🆘 Need help?<br/>matrix.infinito.nexus"]
        O1 ~~~ O2 ~~~ O3 ~~~ M
    end

    subgraph ANN["📣 Announce · Main author"]
        G["7️⃣ Mastodon<br/>for developers"]
        H["7️⃣ LinkedIn<br/>for business"]
        I["8️⃣ WhatsApp + newsletter<br/>for the community"]
    end

    A -->|no| X
    A -->|yes| B
    B -->|breaking| B1
    B -->|complete features| B2
    B -->|fixes or incomplete features| B3
    B1 & B2 & B3 --> C
    C --> D --> E --> F
    F --> G & H
    G & H --> I
    D -.-> OPT

    classDef required fill:#065f46,stroke:#022c22,stroke-width:2px,color:#ffffff
    classDef decision fill:#1e3a8a,stroke:#172554,stroke-width:2px,color:#ffffff
    classDef optional fill:#ffffff,stroke:#334155,stroke-width:2px,stroke-dasharray:6 4,color:#0f172a
    classDef stop fill:#991b1b,stroke:#450a0a,stroke-width:2px,color:#ffffff
    class B1,B2,B3,C,D,E,F,G,H,I required
    class A,B decision
    class O1,O2,O3,M optional
    class X stop
    style GATE fill:#f1f5f9,stroke:#334155,stroke-width:2px,color:#0f172a
    style REL fill:#f1f5f9,stroke:#334155,stroke-width:2px,color:#0f172a
    style BLOG fill:#f1f5f9,stroke:#334155,stroke-width:2px,color:#0f172a
    style ANN fill:#f1f5f9,stroke:#334155,stroke-width:2px,color:#0f172a
    style OPT fill:#fafafa,stroke:#334155,stroke-width:2px,stroke-dasharray:6 4,color:#0f172a

:one: Prerequisite: main Is Green :white_check_mark:

Releases are published regularly by Kevin Veen-Birkenbach, always based on the current main branch.

The full CI/CD pipeline on main must pass green first. If even one job is red, there is no release. :stop_sign:

:magnifying_glass_tilted_left: The integration status shows whether the last main run is green.

:two: Choose the Version Number :1234:

We follow Semantic Versioning. A release tag has the form vMAJOR.MINOR.PATCH, for example v14.2.0. Which part goes up depends on what the release contains:

Release type When? What changes? Example
:collision: Major The release is breaking: existing setups need changes before they work again. First number +1, all others reset to 0 v14.2.0 ➜ v15.0.0
:sparkles: Minor Complete new features arrive and nothing breaks. Second number +1, last one reset to 0 v14.2.0 ➜ v14.3.0
:bug: Patch Bugs get fixed, or features ship that are not complete yet. Last number +1 v14.2.0 ➜ v14.2.1

:warning: Only complete changes are ready for at least a (beta) minor release. Anything incomplete ships as a patch release at most. For example, a feature or app without full Swarm and Tor support is never more than a patch release.

:three: Publish the Release :label:

Publishing a release takes two steps:

  1. :memo: Add it to the changelog as a new section ## [<version>] - <YYYY-MM-DD> with the parts For Users and For Developers.
  2. :label: Create the Git tag v<version> and push it.

Pushing the tag automatically starts the CI job that publishes the release images. The release docs have the technical details.

:four: Generate the Blog Article :writing_hand:

After the release is out, the main author of the release creates an article for blog.infinito.nexus. The main author is whoever delivered the core of the release. For a breaking major release, for example, that is the person who introduced the breaking changes.

:bullseye: Audience: end users and customers

Article checklist:

  • :memo: Generated from the changelog entry, above all from its For Users part
  • :link: Links to the changelog entry at s.infinito.nexus/changelog
  • :bust_in_silhouette: Written from the user’s perspective: What can I do now that I couldn’t do before? No developer jargon, no internals.
  • :sparkles: Focus on new features and what they bring to the user
  • :card_index_dividers: Category: Release
  • :bookmark: Relevant tags, for example the affected apps and topics
  • :framed_picture: A fitting header image that contains the Infinito.Nexus logo :link:

:five: Add a Tutorial and Videos (If Possible) :clapper_board:

If the release brings something that needs to be explained, the main author also provides:

:robot: Tip: There are Claude skills that make this easy. Just record a video and let them add animations to it.

:sos_button: Need help? Ask in the matching rooms on matrix.infinito.nexus.

:six: Review :eyes:

Once the article is written, Kevin Veen-Birkenbach reviews it. The article goes live only after that review, and then the next steps follow.

:seven: Prepare the Social Media Posts :megaphone:

After the review, the author prepares a Mastodon post and a LinkedIn post. Each channel speaks to its own audience:

Channel Audience Focus
:newspaper: Blog End users and customers New features from the user’s point of view
:elephant: Mastodon Developers, IT people, hackers What is new in Infinito.Nexus?
:briefcase: LinkedIn Business contacts What value does the release add?

:elephant: Mastodon

The goal is to show the IT community what is new in Infinito.Nexus. The author shares the blog article with this post on microblog.infinito.nexus.

  • :scissors: Short: about 400 characters
  • :hash: As many relevant hashtags as possible, for example #InfinitoNexus #OpenSource #SelfHosting #FOSS #DevOps #Ansible #Docker #Linux #Homelab
  • :framed_picture: Attach the blog article’s header image
  • :link: Link to the blog article

:briefcase: LinkedIn

Posted on the Infinito.Nexus LinkedIn page.

  • :scissors: Short and to the point
  • :briefcase: Written for business contacts: business value instead of technical details
  • :link: Link to the blog article

:eight: Inform the Community :speech_balloon:

Finally, the author announces the release, each time with a link to the blog article:

  • :mobile_phone: in the relevant WhatsApp group
  • :e_mail: through the newsletter

Questions or ideas about the release process? Just reply in this thread. :raising_hands: