Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions content/blog/de/titan-von-1-0-bis-3-0.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: 'Von 1.0 bis 3.0: fünfzehn Monate Titan, unser Lobby-Server'
alternativeTitle: 'Rückblick auf 67 Releases, 696 Commits und einen Umbau'
description: 'Ein Rückblick auf Titan, unseren quelloffenen Minestom-Lobbyserver: von Version 1.0 im Juli 2025 über die 2.x-Features bis zur Plattform-Trennung in 3.0 und dem, was als Nächstes kommt.'
description: 'Ein Rückblick auf Titan, unseren quelloffenen Minestom-Lobbyserver: von Version 1.0 im Juli 2025 über die 2.x-Features bis zur Plattform-Trennung in 3.0 und dem Release von 3.1.'
pubDate: '2026-10-13'
releaseDate: '2026-10-13T10:00:00+02:00'
headerImage: 'images/og/blog-de.png'
Expand Down Expand Up @@ -72,19 +72,19 @@ Auf dieser Grundlage kam in 2.x innerhalb von knapp zwei Wochen ein Spielerfeatu

![Ein Spieler springt im Modus Easy über das Jump'n'Run der Lobby: einzelne Landeblöcke schweben zwischen fliegenden Inseln im offenen Himmel](/images/blog/titan-lobby-jump-and-run.webp){width="1600" height="843"}

Hinter den Kulissen ergänzte 2.4 **OpenTelemetry-Tracing und Metriken**, damit wir sehen, was langsam ist, bevor du es merkst. 2.6 brachte außerdem einen **Boot-Smoke-Test**: CI startet jetzt das ausgelieferte Jar mit der echten Konfiguration. Er ist eine Konsequenz aus einem Vorfall am Release-Tag, an dem ein Bibliotheksupdate Build und Unit-Tests durchlief, die Lobby aber nicht starten ließ.
Hinter den Kulissen ergänzte 2.4 **OpenTelemetry-Tracing und Metriken**, damit wir sehen, was langsam ist, bevor du es merkst. 2.6 brachte außerdem einen **Boot-Smoke-Test**: CI startet jetzt das ausgelieferte Jar mit der echten Konfiguration. Der Boot-Test war bereits in Arbeit und wurde 17 Minuten nach dem Fix des Vorfalls am Release-Tag gemergt, als ein Bibliotheksupdate Build und Unit-Tests durchlief, die Lobby aber nicht starten ließ. Seitdem sollte so ein Fehler in der CI auffallen.

## Version 3: ein Kern, mehrere Plattformen (10. Oktober 2026)

**3.0.0 ist ein Breaking Change für alle, die Titan selbst betreiben.** Der Start läuft jetzt über einen kleinen Vertrag `ServerBootstrap`, den Java über den `ServiceLoader` auswählt. Minestom-Extensions, CloudNet und LuckPerms liegen jeweils in einem eigenen **Plattform-Modul**. 3.0.1 folgte am selben Abend und übersetzte den Lobby-Switcher ins Deutsche und Englische. Die Details folgen in zwei Deep-Dives: am 20. Oktober zur Plattform-Trennung in 3.0 und am 27. Oktober dazu, warum grüne Tests keine startende Lobby bedeuten.

## Was als Nächstes kommt
## Schon als Nächstes: Titan 3.1

Einige Verbesserungen sind bereits in Review:
Während dieser Beitrag entstand, ist [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) erschienen und läuft bereits in der Lobby:

- Im Navigator verbindest du dich mit einem Linksklick, ein Rechtsklick teleportiert dich vor das passende Portal.
- Live-Spielerzahlen für jeden Modus im Navigator.
- Ein Fix, der jeder Lobby ihr echtes Spielerlimit an CloudNet meldet.
- Der Navigator zeigt die Spielerzahl für jeden Modus.
- Jede Lobby meldet CloudNet jetzt ihr echtes Spielerlimit statt 1, sodass der Lobby-Switcher nicht mehr „Voll (2/1)“ anzeigt.

## Mitmachen

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,11 @@ Die CloudNet-Bridge wird als Minestom-Extension geladen und war vom selben Versi

Die Änderung haben wir upstream als [CloudNet PR #1906](https://github.com/CloudNetService/CloudNet/pull/1906) eingereicht: "update minestom to v2026.10.07-26.2", mit dem Fehler `NoSuchMethodError: ConnectionManager#getOnlinePlayers()` als Begründung. Der PR wurde am 11. Oktober 2026 gemergt. Auch unser Fork der CloudNet-Bridge enthält diesen Versionssprung.

## Der Boot-Test als Konsequenz
## Der Boot-Test

Der Fehler wurde beim echten Start sichtbar, nicht durch einen Test. Danach kam der Boot-Test: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398) mit dem Titel "boot the shipped jar and parse a real application.yaml" wurde 17 Minuten nach dem LuckPerms-Fix gemergt, um 17:59 UTC. Er startet das ausgelieferte Jar in einem eigenen Prozess und liest die echte `application.yaml` mit dem Produktionsparser. Das ist ein Smoke-Test im engeren Sinn: Er baut nichts neu, sondern prüft das Ergebnis, das ohnehin auf den Server kommt. Zum Zeitpunkt des Vorfalls gab es ihn auf dem Hauptzweig noch nicht, und die PR-Beschreibung des Fixes hält das ausdrücklich fest.
Der Fehler wurde beim echten Start sichtbar, nicht durch einen Test. Der Boot-Test war ohnehin schon geplant und ist nicht wegen des Vorfalls entstanden: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398) mit dem Titel "boot the shipped jar and parse a real application.yaml" wurde 17 Minuten nach dem LuckPerms-Fix gemergt, um 17:59 UTC. Er startet das ausgelieferte Jar in einem eigenen Prozess und liest die echte `application.yaml` mit dem Produktionsparser. Das ist ein Smoke-Test im engeren Sinn: Er baut nichts neu, sondern prüft das Ergebnis, das ohnehin auf den Server kommt. Zum Zeitpunkt des Vorfalls gab es ihn auf dem Hauptzweig noch nicht, und die PR-Beschreibung des Fixes hält das ausdrücklich fest.

Der Boot-Test prüft genau das, was unsere Unit-Tests nicht prüfen konnten: ob das Artefakt, das wir ausliefern, überhaupt startet. Ein Start des ausgelieferten Jars hätte den Fehler vor dem Release sichtbar gemacht.
Der Boot-Test prüft genau das, was unsere Unit-Tests nicht prüfen konnten: ob das Artefakt, das wir ausliefern, überhaupt startet. Ein Start des ausgelieferten Jars hätte den Fehler vor dem Release sehr wahrscheinlich sichtbar gemacht.

## Der Zeitablauf

Expand Down
14 changes: 7 additions & 7 deletions content/blog/en/titan-from-1-0-to-3-0.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: 'From 1.0 to 3.0: fifteen months of Titan, our lobby server'
alternativeTitle: 'A retrospective on 67 releases, 696 commits and one rebuild'
description: 'A look back at Titan, our open-source Minestom lobby server: from the 1.0 release in July 2025 through the 2.x features to the 3.0 platform split, and what comes next.'
description: 'A look back at Titan, our open-source Minestom lobby server: from the 1.0 release in July 2025 through the 2.x features to the 3.0 platform split and the 3.1 release.'
pubDate: '2026-10-13'
releaseDate: '2026-10-13T10:00:00+02:00'
headerImage: 'images/og/blog-en.png'
Expand Down Expand Up @@ -72,19 +72,19 @@ On top of that foundation, 2.x shipped one player-facing feature after another i

![A player jumps along the lobby jump'n'run in easy mode: single landing blocks hang in open sky between floating islands](/images/blog/titan-lobby-jump-and-run.webp){width="1600" height="843"}

Behind the scenes, 2.4 added **OpenTelemetry tracing and metrics**, so we can see what is slow before you notice it. 2.6 also brought a **boot smoke test**: CI now starts the shipped jar with the real configuration. It is a direct consequence of an incident on release day, when a library update passed the build and every unit test but kept the lobby from starting.
Behind the scenes, 2.4 added **OpenTelemetry tracing and metrics**, so we can see what is slow before you notice it. 2.6 also brought a **boot smoke test**: CI now starts the shipped jar with the real configuration. The boot test was already in progress and was merged 17 minutes after the fix for the release-day incident, when a library update passed the build and every unit test but kept the lobby from starting. Since then, a failure like this should surface in CI.

## Version 3: one core, several platforms (October 10, 2026)

**3.0.0 is a breaking change for anyone running Titan themselves.** Startup now goes through a small `ServerBootstrap` contract, selected via Java's `ServiceLoader`, and Minestom extensions, CloudNet and LuckPerms each live in their own **platform module**. 3.0.1 followed the same evening and translated the lobby switcher into German and English. The details follow in two deep-dive posts: on October 20 about the 3.0 platform split, and on October 27 about why green tests did not mean a lobby that boots.

## What's next
## Already next: Titan 3.1

Several improvements are already in review:
While this post was being written, [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) was released, and it is already running in the lobby:

- In the navigator, left-click to connect and right-click to teleport in front of the matching portal.
- Live player counts for every mode in the navigator.
- A fix that reports each lobby's real player limit to CloudNet.
- In the navigator, left-click connects you and right-click teleports you in front of the matching portal.
- The navigator shows the player count for every mode.
- Each lobby now reports its real player limit to CloudNet instead of 1, so the lobby switcher no longer shows "Full (2/1)".

## Get involved

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,11 @@ The CloudNet bridge is loaded as a Minestom extension and was affected by the sa

We submitted the change upstream as [CloudNet PR #1906](https://github.com/CloudNetService/CloudNet/pull/1906): "update minestom to v2026.10.07-26.2", with the `NoSuchMethodError: ConnectionManager#getOnlinePlayers()` as its motivation. The PR was merged on 11 October 2026. Our fork of the CloudNet bridge also contains this version bump.

## The boot test as a consequence
## The boot test

The failure became visible when the server was actually started, not through a test. Afterwards came the boot test: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398), titled "boot the shipped jar and parse a real application.yaml", was merged 17 minutes after the LuckPerms fix, at 17:59 UTC. It starts the shipped jar in its own process and reads the real `application.yaml` with the production parser. This is a smoke test in the narrow sense: it builds nothing new and checks the result that would go to the server anyway. At the time of the incident it did not yet exist on the main branch, and the PR description of the fix says so explicitly.
The failure became visible when the server was actually started, not through a test. The boot test was already planned and was not created because of the incident: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398), titled "boot the shipped jar and parse a real application.yaml", was merged 17 minutes after the LuckPerms fix, at 17:59 UTC. It starts the shipped jar in its own process and reads the real `application.yaml` with the production parser. This is a smoke test in the narrow sense: it builds nothing new and checks the result that would go to the server anyway. At the time of the incident it did not yet exist on the main branch, and the PR description of the fix says so explicitly.

The boot test checks exactly what our unit tests could not: whether the artifact we ship starts at all. Starting the shipped jar would have made this failure visible before the release.
The boot test checks exactly what our unit tests could not: whether the artifact we ship starts at all. Starting the shipped jar would very likely have made this failure visible before the release.

## The timeline

Expand Down
Loading