<?xml version="1.0" encoding="utf-8"?>







<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
  <title>Vitalij Mik</title>
  <subtitle>Persönliche Webseite und Blog</subtitle>
  <id>https://blackscorp.github.io/feed.xml</id>
  <link href="https://blackscorp.github.io/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://blackscorp.github.io/blog/" rel="alternate"/>
  <updated>2026-11-08T10:21:35+00:00</updated>
  <author><name>Vitalij Mik</name></author>
  
  <entry>
    <title>Das Problem mit den Händen</title>
    <id>https://blackscorp.github.io/blog/das-problem-mit-den-haenden/</id>
    <link href="https://blackscorp.github.io/blog/das-problem-mit-den-haenden/" rel="alternate"/>
    <published>2026-11-02T00:00:00+00:00</published>
    <updated>2026-11-02T00:00:00+00:00</updated>
    <summary>Aus einem 2D-Konzept soll eine 3D-Figur in Blender entstehen. Die KI schafft es bei sechs Versuchen nicht, die Arme korrekt in eine T-Pose zu bringen. Ein Erfahrungsbericht über verdrehte Hände, kopierte Rückansichten und die Grenzen von Bild-KI.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/das-problem-mit-den-haenden/">&lt;p&gt;In meinem &lt;a href=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/&quot;&gt;letzten Beitrag&lt;/a&gt; habe ich versucht, aus einem 2D-Bild eine 3D-Figur zu erstellen. Das hat nicht sonderlich gut funktioniert, also habe ich mir gedacht, ich erstelle die 3D-Figur selbst in Blender. Schließlich habe ich ja ein 2D-Bild, das ich als Referenz benutzen kann.&lt;/p&gt;

&lt;p&gt;Damals habe ich mir das Bild nur grob angeschaut. Bei der Vorbereitung der Bilder für Blender sind mir dann die ersten Fehler aufgefallen, also wollte ich die erstmal verbessern. Der erste Fehler war die Ansicht von hinten: Die KI hat einfach den vorderen Teil kopiert und das wars. Also musste ich das erstmal nachbessern.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/das-problem-mit-den-haenden/concept.webp&quot; alt=&quot;Konzeptzeichnung der Roboterfigur in fünf Ansichten: vorne, Seite, hinten, von oben und von unten, mit korrigierter Rückansicht&quot; width=&quot;1264&quot; height=&quot;843&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Das Bild habe ich dann in Einzelbilder aufgeteilt und in Blender als Referenz hinterlegt. Als ich dann seitlich draufgeschaut habe, ist mir aufgefallen, dass ich die Breite der Brust und der Hüfte nicht bestimmen kann. Der Arm ist seitlich drüber. Ich benötige also eine T-Pose, und ab hier ging es los mit den Problemen.&lt;/p&gt;

&lt;p&gt;Eigentlich dachte ich mir, wie schwer kann es denn sein, die Arme einfach auf Schulterhöhe zu bringen.&lt;/p&gt;

&lt;p&gt;So sah das erste Ergebnis aus:&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/das-problem-mit-den-haenden/versuch1.webp&quot; alt=&quot;Versuch 1: Die Figur steht von hinten in T-Pose, die offenen Hände zeigen mit dem Handrücken nach vorne&quot; width=&quot;541&quot; height=&quot;564&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Dann sagte ich der KI, dass die Hände so nicht aussehen, bitte korrekt umdrehen.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/das-problem-mit-den-haenden/versuch2.webp&quot; alt=&quot;Versuch 2: Fast unverändert, an den Fingerspitzen hängen einzelne verdrehte Finger&quot; width=&quot;539&quot; height=&quot;564&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Hat wohl auch nicht funktioniert. Das wurde in Codex generiert. Ich dachte mir, ich probiere mal Google Gemini aus. Habe ihm das originale Konzept hochgeladen und dachte, dass Gemini es eventuell besser hinkriegt.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/das-problem-mit-den-haenden/versuch3.webp&quot; alt=&quot;Versuch 3 mit Gemini: Die Arme knicken im Ellbogen nach unten ab, am Rücken ist noch ein alter Arm sichtbar&quot; width=&quot;468&quot; height=&quot;564&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Die alten Arme waren noch drin. Nächster Versuch.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/das-problem-mit-den-haenden/versuch4.webp&quot; alt=&quot;Versuch 4: Die Arme sind gestreckt, aber beide Hände sind zu Fäusten mit abgespreizten Daumen nach oben verdreht&quot; width=&quot;473&quot; height=&quot;564&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Keine Ahnung, wieso die Daumen da jetzt oben sind. Dann dachte ich mir, vielleicht hilft ein neuer Chat mit frischem Kontext.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/das-problem-mit-den-haenden/versuch5.webp&quot; alt=&quot;Versuch 5: Neue Sitzung, T-Pose sitzt, die Hände sind aber nur zu Klauen zusammengefaltete Finger&quot; width=&quot;436&quot; height=&quot;564&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Ab diesem Zeitpunkt gebe ich erstmal auf. Ich habe ja die Hand von oben, unten und von der Seite. Das, was hinten wird, wird sich dann vermutlich von alleine ergeben.&lt;/p&gt;

&lt;p&gt;Vielleicht sollte man das Thema nicht zu perfektionistisch angehen. Ich fand es aber interessant, wie oft ich versucht habe, die Hand zu verbessern, und am Ende bin ich nicht zu einem guten Ergebnis gekommen. Bei den Bildern habe ich ja nur die Hände gezeigt. Dazwischen sind noch mehr Fehler immer wieder aufgetreten.&lt;/p&gt;

&lt;p&gt;Es gab falsche Proportionen, falsche Farben, Hände in anderen Darstellungen waren verdreht.&lt;/p&gt;

&lt;p&gt;Ich glaube, wenn man da nicht genauer auf die Details schaut und offensichtliche Dinge falsch dargestellt werden, kann das Spiel sehr schnell als “KI-Slop” angesehen werden.&lt;/p&gt;
</content>
    <category term="ki"/><category term="3d"/><category term="blender"/><category term="gamedev"/>
  </entry>
  
  <entry>
    <title>Goose statt Crush: weniger Tokens für die gleiche Arbeit</title>
    <id>https://blackscorp.github.io/blog/goose-statt-crush-weniger-tokens-fuer-die-gleiche-arbeit/</id>
    <link href="https://blackscorp.github.io/blog/goose-statt-crush-weniger-tokens-fuer-die-gleiche-arbeit/" rel="alternate"/>
    <published>2026-10-31T00:00:00+00:00</published>
    <updated>2026-10-31T00:00:00+00:00</updated>
    <summary>goose CLI gegen Crush im direkten Vergleich: Wie viele Tokens kostet ein einfaches „Hi“, was bringt ein echter Rust- und Zig-Build unter Void Linux, und wo liegen die Unterschiede bei RAM, Providern und Bedienung?</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/goose-statt-crush-weniger-tokens-fuer-die-gleiche-arbeit/">&lt;p&gt;Jetzt, wo ich &lt;a href=&quot;/blog/von-codex-abo-zu-deepseek-pay-per-use/&quot;&gt;auf DeepSeek umgestiegen bin&lt;/a&gt; und genauer sehen kann, wofür ich Tokens ausgebe, wollte ich mir mal die Agenten anschauen, die ich verwende. Bei Codex hatte ich Codex CLI und Crush zusammen benutzt. Mir ist immer wieder aufgefallen, dass ich mit Crush relativ früh an mein Stunden-Limit gekommen bin.&lt;/p&gt;

&lt;p&gt;Tatsächlich haben sich auch andere mit der Frage des Tokenverbrauchs beschäftigt, und so bin ich auf den Artikel hier gekommen: &lt;a href=&quot;https://arxiv.org/pdf/2607.22585&quot;&gt;https://arxiv.org/pdf/2607.22585&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hier wird goose CLI als Basis genommen und mit OpenHands und OpenCode verglichen. Der Beitrag ist von Juni 2026, es kann also sein, dass das zum Zeitpunkt, wo du es liest, nicht mehr stimmt.&lt;/p&gt;

&lt;p&gt;Auf jeden Fall fand ich interessant, dass goose CLI 40-mal weniger Tokens verbraucht als OpenCode. Damit kann man für das gleiche Geld die gleiche Leistung erbringen.&lt;/p&gt;

&lt;h2 id=&quot;warum-ich-bei-goose-wieder-vorbeigeschaut-habe&quot;&gt;Warum ich bei goose wieder vorbeigeschaut habe&lt;/h2&gt;

&lt;p&gt;Goose kannte ich schon früher. Ich habe es immer wieder lokal mit einem 9B-Modell getestet, leider funktionierte es damals nicht so gut. Das 9B-Modell konnte die Toolcalls in goose nicht besonders gut umsetzen, oft gab es Fehler und Endlosschleifen.&lt;/p&gt;

&lt;p&gt;Anschließend habe ich dann Crush gefunden, und damit konnte ich mit einem 9B-Modell lokal arbeiten. Das Problem war aber, dass ich nicht nur ein 9B-Modell hatte, sondern auch nur ein ca. 42k-Token-Fenster. Meine Grafikkarte RTX 3060 Ti hat nur 8 GB VRAM, und ich bin da eingeschränkt.&lt;/p&gt;

&lt;p&gt;Das heißt, Crush konnte zwar besser die Tools aufrufen und Dateien lesen, aber ich hatte dafür immer wieder Context-Zusammenfassungen, wo dann Inhalte aus dem Kontext geflogen sind. Es war also nur möglich, kleine Dinge umzusetzen.&lt;/p&gt;

&lt;p&gt;Zum aktuellen Zeitpunkt kann man also nichts Wesentliches mit wenig VRAM lokal umsetzen.&lt;/p&gt;

&lt;h2 id=&quot;der-erste-test-ein-einfaches-hi&quot;&gt;Der erste Test: ein einfaches „Hi“&lt;/h2&gt;

&lt;p&gt;Wie dem auch sei, ich habe mir also goose installiert und als Erstes einfach nur „Hi“ getestet, um den initialen Tokenverbrauch zu messen.&lt;/p&gt;

&lt;p&gt;Bei Crush habe ich ca. 12k Tokens benutzt.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/goose-statt-crush-weniger-tokens-fuer-die-gleiche-arbeit/crush.webp&quot; alt=&quot;Crush im Terminal mit DeepSeek V4.1 Flash: Nach einer einfachen Begrüßung zeigt die Statuszeile 12,8k verbrauchte Tokens&quot; width=&quot;371&quot; height=&quot;274&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Man muss hier aber bedenken, dass ich die Crush-Toolcalls schon eingeschränkt habe. Ich habe zum Beispiel alle LSP-Tools deaktiviert, da ich lokal kein LSP verwende.&lt;/p&gt;

&lt;p&gt;Und hier haben wir goose:&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/goose-statt-crush-weniger-tokens-fuer-die-gleiche-arbeit/goose.webp&quot; alt=&quot;goose CLI nach dem Befehl „hi“: Antwort in 1,43 Sekunden, Statuszeile zeigt 4k von 1,0M Tokens verbraucht&quot; width=&quot;374&quot; height=&quot;184&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;4k Tokens bei einem einfachen „Hi“. Sind auf jeden Fall dreimal so wenig.&lt;/p&gt;

&lt;h2 id=&quot;die-komplexere-aufgabe&quot;&gt;Die komplexere Aufgabe&lt;/h2&gt;

&lt;p&gt;Als Nächstes wollte ich eine komplexere Aufgabe umsetzen, damit ich den Vergleich zu gestern habe. Ich ließ goose das, was ich vorher über bash installiert hatte, als Paket zu Void hinzufügen. Dazu kam noch das Paket lightpanda. Das ist ein Headless-Browser für KI, damit man auch Inhalte von Webseiten laden kann, die JavaScript benötigen, ohne extra Chrome oder Firefox im Headless-Modus zu starten.&lt;/p&gt;

&lt;p&gt;Das Ganze war ein Rust- und Zig-Build. Mir ist in der Statistik in DeepSeek aufgefallen, dass man mit goose wirklich weniger Tokens benutzt und mehr Output-Tokens generiert werden.&lt;/p&gt;

&lt;p&gt;Output-Tokens sind eigentlich die wichtigen Tokens. Das ist ja das Wissen, das ausgegeben wird.&lt;/p&gt;

&lt;p&gt;Ich bin mir noch unsicher, wie ich die Statistik selbst bewerten soll. Ich habe weniger Tokens gebraucht für eine komplexe Aufgabe, aber genauso viel bezahlt, weil eben mehr Output-Tokens kamen. Vielleicht kann man das noch mit dem caveman skill besser steuern.&lt;/p&gt;

&lt;p&gt;Ich sammle aktuell nur Erfahrungen, konkret kann ich noch nichts sagen.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/goose-statt-crush-weniger-tokens-fuer-die-gleiche-arbeit/deepseek-stats.webp&quot; alt=&quot;DeepSeek-API-Statistik für den 30.10.2026: 41,3 Millionen Tokens, davon 12,1 Millionen Input-Tokens aus dem Cache, 430.040 Input-Tokens ohne Cache und 150.262 Output-Tokens, Gesamtkosten 0,40 US-Dollar&quot; width=&quot;968&quot; height=&quot;892&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;h2 id=&quot;was-ich-von-einem-agenten-erwarte&quot;&gt;Was ich von einem Agenten erwarte&lt;/h2&gt;

&lt;p&gt;Eigentlich habe ich relativ einfache Anforderungen an den Agenten:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Er soll wenige Tokens verbrauchen&lt;/li&gt;
  &lt;li&gt;Er soll konfigurierbar und erweiterbar sein&lt;/li&gt;
  &lt;li&gt;Er soll meine Provider unterstützen&lt;/li&gt;
  &lt;li&gt;Er soll wenig RAM verbrauchen&lt;/li&gt;
  &lt;li&gt;Er soll gut aussehen und gut bedienbar sein&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;goose-vs-crush&quot;&gt;Goose vs. Crush&lt;/h2&gt;

&lt;p&gt;Goose verbraucht bei mir ca. 240 MB RAM, während Crush nur bei 88 MB liegt. RAM-Nutzung ist relevant, wenn Subagenten gestartet werden. Codex war bei 300 MB. Hier gewinnt Crush natürlich.&lt;/p&gt;

&lt;p&gt;Konfigurierbar und erweiterbar sind beide. Aber ich glaube, in goose könnte ich sogar den System-Prompt anpassen. Bei Crush geht es nicht. Ich kann höchstens eigenen Text dazuschreiben. Ich würde hier noch sagen, es ist ein Unentschieden, da ich mich mit goose noch nicht so stark beschäftigt habe.&lt;/p&gt;

&lt;p&gt;Goose unterstützt DeepSeek direkt als Provider, während man es bei Crush manuell konfigurieren musste. Es gibt zwar DeepSeek, aber das wird über irgendeinen Open Router angeboten und nicht das direkte. Hier ist goose dann besser.&lt;/p&gt;

&lt;p&gt;Vom Aussehen her gewinnt Crush. Es sieht viel besser aus. Tool-Ausgaben werden versteckt, man sieht im Output am Ende nur das, was einen wirklich interessiert. Bei goose wird alles in der Konsole ausgegeben und man muss ständig scrollen, das ist nicht besonders schön.&lt;/p&gt;

&lt;p&gt;Goose hat noch zwei weitere Vorteile. Es gibt goose Desktop, das im Grunde wie Claude oder Codex Desktop aussieht. Wenn man eher so ein Interface bevorzugt, hat man die Möglichkeit, es zu nutzen.&lt;/p&gt;

&lt;p&gt;Außerdem hat goose ACP-Unterstützung. Ich kann goose im Editor Zed konfigurieren und benutzen. Dann wäre vermutlich die Tool-Ausgabe und Übersichtlichkeit besser als bei der CLI-Lösung.&lt;/p&gt;

&lt;p&gt;Crush hat noch den Nachteil, dass es in jedem Projekt einen .crush-Ordner anlegt, mit einer SQLite-Datenbank und weiteren Dingen. Goose legt das irgendwo zentral ab. Wenn ich es mal löschen will, lösche ich einen Ordner und fertig.&lt;/p&gt;

&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;

&lt;p&gt;Also hat alles bisher Vor- und Nachteile. Ich denke, ich muss es mehr in meinen Projekten einsetzen, um ein besseres Urteil zu fällen.&lt;/p&gt;

&lt;p&gt;Eigentlich bevorzuge ich Crush auf der CLI. Vermutlich wäre das Beste, Crush zu forken und den System-Prompt sowie die Tool-Beschreibung für Bash zu verändern. Dann würde ich direkt weniger Tokens verbrauchen. Aber ich denke, ich werde erstmal Goose über den Zed-Editor als ACP einsetzen und schauen, wie gut es funktioniert.&lt;/p&gt;

&lt;h2 id=&quot;weiterführende-links&quot;&gt;Weiterführende Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/block/goose&quot;&gt;goose: Open-Source-KI-Agent&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/charmbracelet/crush&quot;&gt;Crush: Coding-Agent im Terminal&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed Editor mit ACP-Unterstützung&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://lightpanda.io/&quot;&gt;Lightpanda: Headless-Browser für KI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/void-linux/void-packages&quot;&gt;Void Packages auf GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <category term="ki"/><category term="coding"/><category term="deepseek"/><category term="cost"/><category term="agents"/>
  </entry>
  
  <entry>
    <title>Von Codex-Abo zu DeepSeek Pay-per-Use: mein Fazit nach dem ersten Tag</title>
    <id>https://blackscorp.github.io/blog/von-codex-abo-zu-deepseek-pay-per-use/</id>
    <link href="https://blackscorp.github.io/blog/von-codex-abo-zu-deepseek-pay-per-use/" rel="alternate"/>
    <published>2026-10-30T00:00:00+00:00</published>
    <updated>2026-10-30T00:00:00+00:00</updated>
    <summary>Ich habe mein Codex-Abo aufgegeben und nutze DeepSeek im Pay-per-Use-Modell. Was mich am Tageslimit gestört hat, wie viel Tokens ich verbrauche und was 22 Millionen Tokens am Ende gekostet haben.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/von-codex-abo-zu-deepseek-pay-per-use/">&lt;p&gt;Stell dir vor, du zahlst jeden Monat 23 €, um in deiner Freizeit mit KI zu programmieren, und nach ein paar Stunden bist du gezwungen, eine Pause einzulegen, weil dein 5-Stunden-Limit erreicht ist. Wenn du aber mal einen Tag nichts machst, wird dir dieses Limit nicht gutgeschrieben.&lt;/p&gt;

&lt;p&gt;Wenn du also einen vollen Monat lang nicht programmierst, zahlst du trotzdem weiterhin 23 €. Das hat mich aktuell so derart frustriert, dass ich mich mal nach Alternativen umgeschaut habe.&lt;/p&gt;

&lt;p&gt;Mein Use Case ist eigentlich ein einfacher. Nach der Arbeit so ab 17 Uhr arbeite ich ein paar Stunden an einem Projekt. Die KI entscheidet nicht für mich, sie muss nicht über Nacht laufen. Sie soll einfach nur das machen, was ich will. Also nichts Intensives. Ich bin kein Poweruser. Aber dennoch bin ich besonders am Wochenende immer wieder an mein Limit gekommen.&lt;/p&gt;

&lt;p&gt;Ich habe mir meine Statistik angeschaut: In den letzten 7 Tagen habe ich ca. 72 Millionen Tokens benutzt. Leider sieht man in der Oberfläche von Codex nicht, ob das gecachte Tokens waren und wie sich die Summe auf Input, Cache und Output verteilt.&lt;/p&gt;

&lt;p&gt;Es gab auch Tage, an denen ich nichts getan habe, und man hatte die ganze Zeit im Hinterkopf: „Wenn ich heute das Limit nicht aufbrauche, dann ist das Geld weg.”&lt;/p&gt;

&lt;p&gt;Ich habe mir also mal die Benchmarks der anderen Modelle angeschaut. Vorher hatte ich GPT6 Luna benutzt, das war für meine Zwecke völlig ausreichend. In der Liste habe ich dann DeepSeek V4.1 Flash gesehen, und es war besser als Luna bewertet.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/von-codex-abo-zu-deepseek-pay-per-use/benchmarks.webp&quot; srcset=&quot;/blog/von-codex-abo-zu-deepseek-pay-per-use/benchmarks-mobile.webp 640w, /blog/von-codex-abo-zu-deepseek-pay-per-use/benchmarks-tablet.webp 1024w, /blog/von-codex-abo-zu-deepseek-pay-per-use/benchmarks.webp 1356w&quot; sizes=&quot;(max-width: 680px) calc(100vw - 74px), (max-width: 900px) calc(100vw - 124px), 900px&quot; alt=&quot;Benchmark-Übersicht mehrerer KI-Modelle mit ihren Bewertungen, in der DeepSeek V4.1 Flash besser abschneidet als GPT6 Luna&quot; width=&quot;1356&quot; height=&quot;739&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Auf der Seite von DeepSeek hat mich besonders die Preisliste überzeugt. Du zahlst nur, was du verbrauchst, und außerhalb der Arbeitszeiten in China ist es günstiger. Da ich abends programmiere, liege ich automatisch außerhalb dieser Zeit.&lt;/p&gt;

&lt;p&gt;Ein weiterer Punkt war, dass ich nicht direkt ein Abo abschließen muss. Einfach eine Art Prepaid-Konto: Ich lade eine Summe auf, und wenn sie aufgebraucht ist, kann ich die KI nicht mehr nutzen. Fette Rechnungen können so gar nicht erst entstehen. Ich habe erst mal 2 € aufgeladen und konnte es damit ausprobieren.&lt;/p&gt;

&lt;h2 id=&quot;der-erste-echte-test-pakete-unter-void-linux&quot;&gt;Der erste echte Test: Pakete unter Void Linux&lt;/h2&gt;

&lt;p&gt;Heute wollte ich mein Void-Linux-System etwas aktualisieren, und die Pakete waren dafür ein guter Test-Use-Case.&lt;/p&gt;

&lt;p&gt;Bei Void Linux klont man das Paket-Repository lokal über Git. Pro Paket gibt es eine Template-Datei, in der die Version, die Art des Builds und die Build-Abhängigkeiten stehen. Außerdem steht dort zu jedem Paket der GitHub-Pfad.&lt;/p&gt;

&lt;p&gt;Ich ließ mir also Code generieren. Der Code enthält eine feste Liste an Paketen, die ich aktualisieren will. Für diese Pakete wird die Template-Datei herausgesucht und die aktuelle Version ausgelesen. Danach wird auf GitHub beim Paket geschaut, ob es eine neuere Version gibt. Wenn ja, wird die neue Version ins Template geschrieben, anschließend der Build-Prozess angestoßen und danach die Build-Abhängigkeiten wieder gelöscht.&lt;/p&gt;

&lt;p&gt;Heute habe ich OBS auf die Version 33.0 aktualisiert. Die neue Version braucht FFmpeg 8, das Void gar nicht hat. Also hat die KI mir ein neues Template angelegt, damit ich OBS über das Skript neu bauen kann. Natürlich wurde der Build-Prozess vorher lokal getestet, und für das Template hat sie die richtigen Dev-Abhängigkeiten ermittelt und eingetragen.&lt;/p&gt;

&lt;p&gt;Den Code kannst du hier finden: &lt;a href=&quot;https://gist.github.com/BlackScorp/4b2cbdd0305a012501fc732f6e2a7347&quot;&gt;https://gist.github.com/BlackScorp/4b2cbdd0305a012501fc732f6e2a7347&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Du siehst also, es war etwas mehr als „färbe den Button grün”.&lt;/p&gt;

&lt;h2 id=&quot;was-das-am-ende-gekostet-hat&quot;&gt;Was das am Ende gekostet hat&lt;/h2&gt;

&lt;p&gt;Ich glaube generell, dass man sich auf die Benchmarks mittlerweile nicht mehr verlassen kann. Alles, was in der Größenordnung von Qwen 3.8 27B oder darüber aufgelistet ist, reicht für die normalen Tasks völlig aus.&lt;/p&gt;

&lt;p&gt;Ich vergleiche die Benchmarks gern mit der Formel 1. In der Regel reicht dir auch ein Fiat, um von A nach B zu kommen. Die Formel-1-Autos sind für den normalen Verbraucher nicht relevant.&lt;/p&gt;

&lt;p&gt;Mit dem heutigen Task habe ich etwas über 22 Millionen Tokens verbraucht, und das hat mich 14 Cent gekostet. Bei Codex wären es bei 23 € auf 30 Tage gerechnet 0,77 € pro Tag. Das heißt, ich konnte vermutlich am Ende des Tages mehr machen für weniger Geld.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/von-codex-abo-zu-deepseek-pay-per-use/tokens.webp&quot; srcset=&quot;/blog/von-codex-abo-zu-deepseek-pay-per-use/tokens-mobile.webp 640w, /blog/von-codex-abo-zu-deepseek-pay-per-use/tokens-tablet.webp 1024w, /blog/von-codex-abo-zu-deepseek-pay-per-use/tokens.webp 1026w&quot; sizes=&quot;(max-width: 680px) calc(100vw - 74px), (max-width: 900px) calc(100vw - 124px), 900px&quot; alt=&quot;Screenshot der Token-Abrechnung von DeepSeek: über 22 Millionen verbrauchte Tokens, aufgeteilt auf Input, Cache und Output, für einen Gesamtpreis von 14 Cent&quot; width=&quot;1026&quot; height=&quot;914&quot; loading=&quot;lazy&quot; /&gt;
  
&lt;/figure&gt;

&lt;p&gt;Und wenn ich mal nichts tue, kostet es mich auch nichts. Natürlich ist das nur ein einziger Tag, ich muss da noch mehr Erfahrung sammeln. Bisher ist es aber doch positiv.&lt;/p&gt;

&lt;h2 id=&quot;ein-negativer-punkt&quot;&gt;Ein negativer Punkt&lt;/h2&gt;

&lt;p&gt;Ich habe den Agenten „Crush” verwendet und habe das Gefühl, dass damit irgendwie mehr Tokens verbrannt werden. Mit dem Agenten bin ich bei Codex schneller an das Limit gekommen als mit der CLI von Codex selbst. Das werde ich morgen mal mit dem Client von DeepSeek selbst ausprobieren.&lt;/p&gt;

&lt;p&gt;Und ich kann keine Bilder über DeepSeek generieren, nur anschauen und verstehen kann es sie. Ich denke aber, dass ich für diesen Fall einfach Google Gemini verwenden werde. Da habe ich 100 freie Bilder am Tag, die ich generieren kann, das sollte reichen.&lt;/p&gt;

&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;

&lt;p&gt;Wenn du einen ähnlichen Use Case wie ich hast, dann probiere DeepSeek mal aus. Ein Prepaid-Guthaben macht den Einstieg leicht, und man sieht direkt, was ein einzelner Task wirklich kostet.&lt;/p&gt;

&lt;h2 id=&quot;weiterführende-links&quot;&gt;Weiterführende Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://platform.deepseek.com/&quot;&gt;DeepSeek Platform: Guthaben aufladen und API-Keys verwalten&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://api-docs.deepseek.com/quick_start/pricing&quot;&gt;DeepSeek API: Preise und Modelle&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/charmbracelet/crush&quot;&gt;Crush: Coding-Agent im Terminal&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.voidlinux.org/&quot;&gt;Void Linux: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/void-linux/void-packages&quot;&gt;Void Packages auf GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gemini.google.com/&quot;&gt;Google Gemini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <category term="ki"/><category term="coding"/><category term="deepseek"/><category term="cost"/>
  </entry>
  
  <entry>
    <title>2D zu 3D ist schwieriger, als man denkt</title>
    <id>https://blackscorp.github.io/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/</id>
    <link href="https://blackscorp.github.io/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/" rel="alternate"/>
    <published>2026-10-29T00:00:00+00:00</published>
    <updated>2026-10-29T00:00:00+00:00</updated>
    <summary>Heute habe ich ein Mecha-Konzept entwickelt und versucht, daraus mit Visual Hull ein 3D-Modell zu erstellen. Das Ergebnis hat mir gezeigt, dass der Schritt von 2D zu 3D schwieriger ist als gedacht.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/">&lt;p&gt;Heute wollte ich mal zur Abwechlung etwas visuelles gestalten. Ich dachte ich beginne mit der Hauptfigur, schließlich werde ich die in der nächsten Entwicklung immer wieder sehen.&lt;/p&gt;

&lt;p&gt;Wie fängt man da überhaupt an? Ich habe in dem Bereich keine Erfahrung. Auf jeden Fall wollte ich Mechas haben. Ich habe immer Mechas geliebt. Die Animes wie “Vision of Escaflown” oder “Gundam Brotherhood of Steel” sehen extrem gut aus. Früher habe ich auch viele Stunden in das MMORPG RF Online invistiert und das nur wegen der Rasse “Accretia”. Also habe ich die Beispiele als Vorlage benutzt. Ich lies Codex erstmal ein paar Referenzbilder downloaden und anschließend mir ein Concept Art daraus generieren als Basis.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/first_concept.webp&quot; srcset=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/first_concept-mobile.webp 640w, /blog/2d-zu-3d-ist-schwieriger-als-man-denkt/first_concept-tablet.webp 1024w, /blog/2d-zu-3d-ist-schwieriger-als-man-denkt/first_concept.webp 1606w&quot; sizes=&quot;(max-width: 680px) calc(100vw - 74px), (max-width: 900px) calc(100vw - 124px), 900px&quot; alt=&quot;KI-generierte Konzeptzeichnung mit drei Ansichten eines dunklen Mechas mit hellen Panzerplatten und rotem Stoff&quot; width=&quot;1606&quot; height=&quot;979&quot; loading=&quot;lazy&quot; /&gt;
  &lt;figcaption&gt;KI-generiertes Bild&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Das Ergebnis sieht echt super aus. Im Spiel wäre das für mich eher die Endgame Ausrüstung also wollte ich das als Basis nehmen und vereinfachen. Man muss ja irgendwo unten Anfangen und sich dann hoch hinaus arbeiten. Also gab es einige Iterationen. Und für den Anfang sah das für mich am besten aus.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/level-0-final.webp&quot; srcset=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/level-0-final-mobile.webp 640w, /blog/2d-zu-3d-ist-schwieriger-als-man-denkt/level-0-final-tablet.webp 1024w, /blog/2d-zu-3d-ist-schwieriger-als-man-denkt/level-0-final.webp 1312w&quot; sizes=&quot;(max-width: 680px) calc(100vw - 74px), (max-width: 900px) calc(100vw - 124px), 900px&quot; alt=&quot;KI-generiertes Ganzkörperkonzept eines Mechas mit dunklem Gelenkrahmen, hellen Panzerplatten, blau leuchtendem Visier und rotem Schal&quot; width=&quot;1312&quot; height=&quot;1199&quot; loading=&quot;lazy&quot; /&gt;
  &lt;figcaption&gt;KI-generiertes Bild&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Es hat weniger details als das Original aber mir fehlten einfach die Fähigkeit es besser zu beschreiben und ich dachte mir, ich mache es wie bei Software. Es wird nach und nach einfach verbessert und fertig. Es ist also v0.1-alpha&lt;/p&gt;

&lt;p&gt;Jetzt kam das nächste Problem. Das Bild steht, aber ich brauche es als 3D Objekt damit ich es eben Animieren kann. Es gibt viele Anbieter bei denen man mittels KI ein Bild hochladen kann und daraus entsteht dann ein 3D Model. Ich will diese aktuell nicht verwenden weil ich einfach nicht extra Geld ausgeben will. Ich zahle ja jetzt schon für Codex.&lt;/p&gt;

&lt;p&gt;Eine andere Methode wäre “Visual Hull”. Dabei wird ein 2D Bild in unterschiedlichen Perspektiven. Also Link, Vorne, Hinten, Oben und Unten abgebildet. Es wird daraus eine Silouette ermittelt und dann kann man die einzelnen Punkte zusammen verbinden.&lt;/p&gt;

&lt;p&gt;Der nächste Schritt wäre also mein Konzept Orthogonal zu generieren mit den einzelnen Seiten. Das Ergebnis sieht so aus.&lt;/p&gt;

&lt;figure class=&quot;article-image-figure&quot;&gt;
  &lt;img class=&quot;article-image&quot; src=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/turnaround.webp&quot; srcset=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/turnaround-mobile.webp 640w, /blog/2d-zu-3d-ist-schwieriger-als-man-denkt/turnaround-tablet.webp 1024w, /blog/2d-zu-3d-ist-schwieriger-als-man-denkt/turnaround.webp 1536w&quot; sizes=&quot;(max-width: 680px) calc(100vw - 74px), (max-width: 900px) calc(100vw - 124px), 900px&quot; alt=&quot;KI-generiertes Turnaround-Sheet des Mechas mit Vorder-, Seiten- und Rückansicht sowie Ansichten von oben und unten&quot; width=&quot;1536&quot; height=&quot;1024&quot; loading=&quot;lazy&quot; /&gt;
  &lt;figcaption&gt;KI-generiertes Bild&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Mit GTP-6 Luna und Medium können da echt gute Bilder entstehen. Ich dachte mir das Ergebnis wäre schon fast fertig. Nur noch ein bisschen.&lt;/p&gt;

&lt;p&gt;Codex hat anschließend die Bilder einzeln ausgeschnitten, den Hintergrund Transparent gemacht und ein Python Script geschrieben was de Visual Hull nachbilden soll.&lt;/p&gt;

&lt;p&gt;Das Ergebnis sah dann überhaupt nicht gut aus&lt;/p&gt;

&lt;model-viewer src=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/visual-hull.glb&quot; alt=&quot;Grobes, graues 3D-Blockout des Mechas mit kantigem Körper und einfachen Gliedmaßen&quot; camera-controls=&quot;&quot; camera-orbit=&quot;0deg 75deg 3m&quot; min-camera-orbit=&quot;auto 0deg auto&quot; max-camera-orbit=&quot;auto 180deg auto&quot; shadow-intensity=&quot;1&quot; exposure=&quot;1&quot;&gt;&lt;/model-viewer&gt;

&lt;p&gt;Es gibt also schon ein Grund wieso die Anbieter für 3D Modelle, Geld verlangen. Das Thema habe ich mir einfacher vorgestellt.&lt;/p&gt;

&lt;p&gt;Blender hat ja auch einen MCP-Server. Damit kann eine KI ebenfalls Modelle erstellen. Das habe ich natürlich ausprobiert, und dabei ist Folgendes herausgekommen:&lt;/p&gt;

&lt;model-viewer src=&quot;/blog/2d-zu-3d-ist-schwieriger-als-man-denkt/blender-mcp.glb&quot; alt=&quot;Mit Blender MCP erstelltes 3D-Modell des Mechas&quot; camera-controls=&quot;&quot; camera-orbit=&quot;0deg 75deg 3m&quot; min-camera-orbit=&quot;auto 0deg auto&quot; max-camera-orbit=&quot;auto 180deg auto&quot; shadow-intensity=&quot;1&quot; exposure=&quot;1&quot;&gt;&lt;/model-viewer&gt;

&lt;p&gt;Ich glaube aber, dass ich da erst einmal keine Zeit investieren will. Ich habe ja das Bild aus allen Seitenansichten. Als Nächstes werde ich mich selbst an Blender setzen und die Figur erstellen.&lt;/p&gt;

&lt;p&gt;Ich habe früher schon mit Blender experementiert und ein paar Tutorials abgearbeitet, mal sehen ob ich mich noch an alles erinnern kann und ob der Skill wie mit Fahrradfahren ist.&lt;/p&gt;

&lt;p&gt;Aber generell kann man sagen, dass man die KI für eine Konzeption sehr gut verwendne kann, wahrscheinlich fehlen mir Skills um Probleme in den Bildern jetzt schon zu erkennen. Das werde ich wohl in der Zukunft dann herausfinden.&lt;/p&gt;
</content>
    <category term="gamedev"/><category term="rpg"/><category term="blender"/><category term="3d"/><category term="ki"/>
  </entry>
  
  <entry>
    <title>Loot und Inventar in Godot: UI mit eigenen Szenen umsetzen</title>
    <id>https://blackscorp.github.io/blog/loot-und-inventar-in-godot-ui-mit-eigenen-szenen-umsetzen/</id>
    <link href="https://blackscorp.github.io/blog/loot-und-inventar-in-godot-ui-mit-eigenen-szenen-umsetzen/" rel="alternate"/>
    <published>2026-10-28T00:00:00+00:00</published>
    <updated>2026-10-28T00:00:00+00:00</updated>
    <summary>So setze ich Loot und Inventar in Godot um: eigene UI-Szenen, Tastatursteuerung und stapelbare Gegenstände im Spielprototyp.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/loot-und-inventar-in-godot-ui-mit-eigenen-szenen-umsetzen/">&lt;p&gt;Heute habe ich mich an Loot und Inventar gesetzt. Schon am Anfang ist mir dabei ein Fehler aufgefallen: Ich hatte die KI nicht wirklich gesteuert. Bei der Demo dachte ich, sie würde schon wissen, was sie tut, und habe ihr zu viel Kontrolle über den Code gelassen, ohne selbst genau genug hinzuschauen.&lt;/p&gt;

&lt;p&gt;Die &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;World.cs&lt;/code&gt; war inzwischen für ziemlich viel zuständig: Gegner spawnen, Animationen abspielen, den Spieler steuern und Eingaben verarbeiten. Als ich dann noch die UI für das Inventar einbauen wollte, landete auch die erst einmal in dieser großen Klasse. Nach mehreren Versuchen war das Inventar trotzdem nicht sichtbar.&lt;/p&gt;

&lt;p&gt;Im normalen Godot-Projekt würde ich dafür eine eigene 2D-Szene anlegen und ein Script schreiben, das sich nur um diese Szene kümmert. Also habe ich der KI den Hinweis gegeben, das Loot-Fenster und das Inventar als eigene Szenen aufzubauen. Das war der Wendepunkt: Die UI bekam eigene Scripts, während die &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;World.cs&lt;/code&gt; die Menüs miteinander verbindet und den Ablauf in der Spielwelt steuert. Danach ließ sich das Verhalten viel besser umsetzen.&lt;/p&gt;

&lt;p&gt;Zum Looten können Gegner eine Beutekiste fallen lassen. Wenn ich in ihrer Nähe die Leertaste drücke, öffnet sich das Loot-Fenster. Dort kann ich alles einsammeln, abbrechen oder einzelne Gegenstände auswählen. Ich kann auch zum Inventar wechseln und Gegenstände zwischen dem Loot und meinem Inventar hin- und herlegen. Gleiche Gegenstände werden dabei als ein Eintrag mit einer Anzahl angezeigt.&lt;/p&gt;

&lt;p&gt;Rückblickend war nicht unbedingt das verwendete Modell – GPT-6 Luna mit Reasoning-Level „mittel“ – der entscheidende Punkt. Viel wichtiger war, dass ich konkreter beschrieben habe, wie die UI in Godot aufgebaut werden soll. Der Hinweis auf eigene Szenen und getrennte Scripts hat geholfen, die Aufgabe in kleinere, verständlichere Teile aufzuteilen.&lt;/p&gt;

&lt;h1 id=&quot;tasten-und-layout&quot;&gt;Tasten und Layout&lt;/h1&gt;

&lt;p&gt;Bei der Umsetzung musste ich mir auch Gedanken über die Steuerung machen. Ich möchte das Spiel zunächst komplett mit der Tastatur spielen und später möglichst auch mit einem Xbox-Controller. Die aktuelle Steuerung funktioniert mit der Tastatur; den Controller habe ich bei der Tastenwahl erst einmal als Ziel im Hinterkopf behalten.&lt;/p&gt;

&lt;p&gt;Auf der Tastatur habe ich deshalb die Taste „J“ als Bestätigung ausgewählt und „K“ zum Abbrechen beziehungsweise Wegwerfen vorgesehen. Mit „W“ und „S“ bewege ich die Auswahl innerhalb des Loot-Fensters oder des Inventars nach oben und unten. Mit „A“ und „D“ wechsle ich zwischen den Bereichen.&lt;/p&gt;

&lt;p&gt;Ein typisches Grid-Layout wollte ich zunächst nicht umsetzen. Für den Anfang sollte eine einfache Liste reichen. Im Grunde dachte ich an Folgendes:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;flowchart LR
subgraph Loot
UI[&quot;`Alles einsammeln | abbrechen
Item 1 2x
Item 2 1x
Item 3 3x
`&quot;]
end
subgraph Inventar
  UI2[&quot;`Item A 1x`&quot;]
end
UI -. Tauschen .-&amp;gt; UI2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das Verhalten war gar nicht so leicht zu erklären. Am besten hat es funktioniert, als ich den Aufbau mit zwei Spalten in Excel verglichen habe: Die erste Spalte ist in Bereiche aufgeteilt. Oben wechselt man zwischen den Loot-Aktionen, unten wählt man die Gegenstände aus. Dazu kommt die zweite Spalte für das Inventar. Mit diesem Bild konnte ich der KI besser beschreiben, wie die Auswahl zwischen den Bereichen funktionieren soll.&lt;/p&gt;

&lt;p&gt;Zum Schluss mussten die Gegenstände noch nach Namen gruppiert werden, damit gleiche Items als Stapel mit ihrer Anzahl erscheinen. Für die Aufbewahrung während des Spiels gibt es eine &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Session&lt;/code&gt;-Klasse. Das ist eine eigene Klasse im Projekt, die von Godots &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Node&lt;/code&gt; erbt. Ihr Inventar ist aktuell eine statische Liste: Es bleibt beim Wechsel zwischen Stadt und Arena erhalten, wird aber noch nicht dauerhaft auf der Festplatte gespeichert.&lt;/p&gt;

&lt;h1 id=&quot;fazit&quot;&gt;Fazit&lt;/h1&gt;

&lt;p&gt;Nach den ersten Tagen merke ich schon, was passiert, wenn ich den Code aus der Hand gebe und nicht genau darauf achte, wie er aufgebaut ist. Die große &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;World.cs&lt;/code&gt; hat die Arbeit an der UI erschwert. Mit eigenen Szenen und Scripts wurde das Ergebnis übersichtlicher und das Verhalten ließ sich besser umsetzen.&lt;/p&gt;

&lt;p&gt;Immerhin kann ich jetzt zwischen Kampfszene und Stadt wechseln, Gegner besiegen und ihren Loot einsammeln. Es fehlt noch ein Ziel im Spiel: Wozu mache ich das Ganze, und was bringt mir der Loot?&lt;/p&gt;

&lt;p&gt;Das sind spätere Fragen. Im Moment denke ich darüber nach, das Projekt mit klareren Regeln und Skills sauber neu anzufangen und mich langsam mehr um die Grafik zu kümmern. Ich merke schon, dass das Aussehen eine wichtige Rolle für den Spielspaß spielt. Vielleicht gehe ich das als Nächstes an.&lt;/p&gt;
</content>
    <category term="gamedev"/><category term="godot"/><category term="rpg"/>
  </entry>
  
  <entry>
    <title>Mein erstes Spiel mit Godot: Roguelike-Idee und erster Prototyp</title>
    <id>https://blackscorp.github.io/blog/erstes-spiel-mit-godot-roguelike-prototyp/</id>
    <link href="https://blackscorp.github.io/blog/erstes-spiel-mit-godot-roguelike-prototyp/" rel="alternate"/>
    <published>2026-10-27T00:00:00+00:00</published>
    <updated>2026-10-27T00:00:00+00:00</updated>
    <summary>Ich entwickle mein erstes Spiel mit Godot: eine Roguelike-Idee mit Kampfinstanz, Gegnern und einem ersten spielbaren Prototyp.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/erstes-spiel-mit-godot-roguelike-prototyp/">&lt;p&gt;Mit diesem Blog habe ich mir einen lang gehegten Wunsch erfüllt. Jetzt ist der nächste dran: Ich möchte mein eigenes Spiel entwickeln.&lt;/p&gt;

&lt;h2 id=&quot;ich-möchte-mein-eigenes-spiel-entwickeln--und-so-sieht-es-momentan-aus&quot;&gt;Ich möchte mein eigenes Spiel entwickeln – und so sieht es momentan aus&lt;/h2&gt;

&lt;p&gt;Im Video ist der aktuelle Stand des Prototyps zu sehen: Ich gehe durch das Portal in die Kampfinstanz und stelle mich den Gegnern. Noch ist das Spiel ganz am Anfang, aber der erste Kampf ist bereits spielbar.&lt;/p&gt;

&lt;figure class=&quot;article-video-figure&quot;&gt;
  &lt;video class=&quot;article-video&quot; controls=&quot;&quot; playsinline=&quot;&quot; preload=&quot;metadata&quot; poster=&quot;/blog/erstes-spiel-mit-godot-roguelike-prototyp/header.webp&quot;&gt;
    &lt;source src=&quot;/blog/erstes-spiel-mit-godot-roguelike-prototyp/demo.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    Dein Browser unterstützt keine Videowiedergabe.
  &lt;/video&gt;
  &lt;figcaption&gt;Der aktuelle Stand des Prototyps.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Bei der Arbeit kenne ich den üblichen Weg: Eine Anforderung steht fest, daraus ergeben sich Akzeptanzkriterien und Aufgaben. Schritt für Schritt entsteht so ein Projekt. Bei meinem Spiel ist es anders. Es gibt noch keine fertige Anforderung und keinen genauen Plan. Da sind erst einmal nur ein paar Ideen und die Frage: Was könnte daraus werden?&lt;/p&gt;

&lt;h2 id=&quot;eine-idee-mit-vielen-durchläufen&quot;&gt;Eine Idee mit vielen Durchläufen&lt;/h2&gt;

&lt;p&gt;Ich spiele gerne Roguelikes. An diesem Genre gefällt mir, dass es kurzfristige Erfolge mit einem langfristigen Ziel verbindet. Im Kampf stelle ich mich Gegnern, sammle Loot und freue mich über jeden gewonnenen Durchlauf. Gleichzeitig arbeite ich auf etwas Größeres hin: Mit dem Ausbau der Stadt möchte ich bessere Ausrüstung bekommen und mich später stärkeren Gegnern stellen.&lt;/p&gt;

&lt;p&gt;In der Stadt beginnt der Spieler seinen Weg. Durch ein Portal gelangt er in ein Gebiet voller Gegner. Wenn er sie besiegt, soll er Beute und Ressourcen mit zurückbringen können. Damit könnte er nach und nach seine Stadt ausbauen: vielleicht mit einer Schmiede, einem Tränkeladen oder Möglichkeiten, Rohstoffe weiterzuverarbeiten.&lt;/p&gt;

&lt;p&gt;Jeder Ausflug durch das Portal wäre dabei ein eigener Run. Die Runs könnten auch bestimmen, wie lange Ausbauten dauern. Ob diese Idee am Ende wirklich Spaß macht, weiß ich noch nicht. Genau das möchte ich herausfinden, indem ich zuerst die grundlegende Spielmechanik entwickle.&lt;/p&gt;

&lt;h2 id=&quot;warum-ich-das-spiel-entwickeln-möchte&quot;&gt;Warum ich das Spiel entwickeln möchte&lt;/h2&gt;

&lt;p&gt;Natürlich gibt es schon viele Spiele. Für mich ist aber nicht nur das fertige Spiel das Ziel, sondern auch der Weg dorthin.&lt;/p&gt;

&lt;p&gt;Ich möchte mich mit C# beschäftigen. Die Sprache erinnert mich in Teilen an PHP, ist aber kompiliert – und eine solche Sprache wollte ich schon lange besser kennenlernen. Außerdem macht mir das Modellieren in Blender Spaß. Es ist für mich eine entspannende Beschäftigung nach der Arbeit und eine gute Alternative zum Doomscrolling.&lt;/p&gt;

&lt;p&gt;Auch beim Einsatz von KI möchte ich dazulernen: Wie muss ein Projekt aufgebaut sein, damit eine KI sinnvoll mitarbeiten kann? Welche Fähigkeiten und Abläufe helfen dabei? Und lässt sich ein Projekt wie dieses gut mit einem GitHub-Kanban-Board organisieren?&lt;/p&gt;

&lt;p&gt;Am Ende würde ich das Spiel gerne veröffentlichen. Als ersten Schritt kann ich mir itch.io vorstellen. Mein erstes Spiel direkt auf Steam zu veröffentlichen, wäre mir vermutlich noch zu früh.&lt;/p&gt;

&lt;p&gt;Ein weiterer Grund für das Projekt ist, dass ich langfristig eine Grafikkarte anschaffen möchte, mit der ich leistungsfähigere KI-Modelle lokal ausprobieren kann. Mich interessiert, wie weit ich bei der Spieleentwicklung mit einem Modell aus der Qwen-Familie komme und wo seine Grenzen liegen. Für welche Aufgaben reicht die lokale KI aus? Wann ist ChatGPT oder ein anderes Frontier-Modell die bessere Wahl? An diesem eigenen Projekt möchte ich solche Modelle ausprobieren und miteinander vergleichen.&lt;/p&gt;

&lt;h2 id=&quot;der-erste-spielbare-schritt&quot;&gt;Der erste spielbare Schritt&lt;/h2&gt;

&lt;p&gt;Für den Anfang wollte ich nicht gleich die ganze Stadt, Beute und Ausbausysteme bauen. Ich brauchte erst einmal eine Figur, die ich steuern kann, und einen Ort, an dem ein Kampf stattfindet.&lt;/p&gt;

&lt;p&gt;Dafür habe ich bei Mixamo ein Schwert-und-Schild-Modell samt Animationspaket heruntergeladen und ein neues Godot-Projekt angelegt. Mit Unterstützung von GPT-5.6 Luna entstand daraus der erste Prototyp: zwei Szenen, eine Figur mit Animationen und eine Steuerung mit WASD. Da ich das Spiel auf meinem Notebook auch ohne Maus spielen möchte, löse ich die Aktionen über die Tastatur. Mit der Leertaste geht es durch das Portal in die Kampfinstanz, mit J greift die Figur an.&lt;/p&gt;

&lt;p&gt;In der Kampfinstanz tauchen Gegner auf. Sie können mich angreifen, ich kann sie besiegen – und ich kann selbst sterben. Für den Moment ist das der Kern des Prototyps. Spieler und Gegner verwenden noch dasselbe Modell; die Gegner sind lediglich rot eingefärbt.&lt;/p&gt;

&lt;p&gt;Danach kamen nach und nach weitere Elemente dazu: eine Schadensanzeige, eine Minimap und ein erster gegnerischer Angriff mit roter Warnfläche. Bleibe ich darin stehen, nehme ich viel Schaden. Entferne ich mich zu weit von den Gegnern, kehren sie an ihre Ausgangsposition zurück und erhalten ihre volle Energie zurück. Außerhalb des Kampfes soll sich außerdem die Lebensenergie meiner Figur wieder auffüllen.&lt;/p&gt;

&lt;p&gt;Mehr ist es noch nicht – und das ist in Ordnung. Der Wechsel von der Stadt in die Kampfinstanz, der Kampf und die Möglichkeit zu sterben bilden meinen ersten spielbaren Versuch. Ob daraus ein spannender Kreislauf werden kann, muss sich noch zeigen. In den nächsten Teilen möchte ich erzählen, wie ich den Prototyp weiterentwickle und welche Ideen dazukommen.&lt;/p&gt;

&lt;h2 id=&quot;quellen&quot;&gt;Quellen&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.godotengine.org/en/stable/tutorials/scripting/c_sharp/index.html&quot;&gt;Godot Engine: C#/.NET&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.mixamo.com/&quot;&gt;Mixamo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://helpx.adobe.com/creative-cloud/help/animate-characters-mixamo.html&quot;&gt;Adobe: 3D-Charaktere mit Mixamo animieren&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <category term="gamedev"/><category term="godot"/><category term="rpg"/>
  </entry>
  
  <entry>
    <title>Dynamische Funktionen mit Jekyll und GitHub Pages</title>
    <id>https://blackscorp.github.io/blog/dynamische-funktionen-mit-jekyll-und-github-pages/</id>
    <link href="https://blackscorp.github.io/blog/dynamische-funktionen-mit-jekyll-und-github-pages/" rel="alternate"/>
    <published>2026-10-25T00:00:00+00:00</published>
    <updated>2026-10-25T00:00:00+00:00</updated>
    <summary>Ein Blog mit Jekyll und GitHub Pages muss nicht auf Kommentare verzichten: So ergänze ich eine statische Website mit GitHub Discussions und Actions.</summary>
    <content type="html" xml:base="https://blackscorp.github.io/blog/dynamische-funktionen-mit-jekyll-und-github-pages/">&lt;h1 id=&quot;die-idee-ein-eigener-blog&quot;&gt;Die Idee: ein eigener Blog&lt;/h1&gt;

&lt;p&gt;Ich wollte schon immer mal einen eigenen Blog führen und meine Experimente dokumentieren.
Ein Blog zu führen erlaubt es, eigene Gedanken besser zu strukturieren und Probleme besser zu verstehen und zu verarbeiten. Er ist also nicht nur für andere Leser gedacht, sondern auch für mich selbst.&lt;/p&gt;

&lt;p&gt;Ich habe allerdings besondere Ansprüche an einen Blog und wenig Zeit gehabt, um ihn aufzusetzen.&lt;/p&gt;

&lt;p&gt;Bei „statisch“ denken viele vielleicht zuerst daran, dass es keine dynamischen Funktionen wie Kommentare geben kann. Genau das wollte ich ausprobieren: Kann ich einen Blog mit einem Static-Site-Generator betreiben und trotzdem Kommentare und automatische Abläufe integrieren?&lt;/p&gt;

&lt;p&gt;Meine Idee war: Ich öffne einen Markdown-Editor meiner Wahl und kann direkt mit dem Schreiben loslegen. Code und Syntax-Highlighting sollten auf jeden Fall drin sein. Der Text sollte versionierbar sein und einfache Diagramme sollten auch möglich sein.&lt;/p&gt;

&lt;p&gt;Außerdem will ich die Freiheit haben, das Layout komplett selbst zu gestalten, und ich möchte kein Geld fürs Hosting ausgeben.
Ich will mich auch nicht um Updates von Server und Infrastruktur kümmern.&lt;/p&gt;

&lt;p&gt;Doch wie funktioniert das im Detail?&lt;/p&gt;

&lt;h1 id=&quot;grundlegendes&quot;&gt;Grundlegendes&lt;/h1&gt;

&lt;p&gt;Auf GitHub besteht die Möglichkeit, ein Repository mit dem Namen &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt; anzulegen. Alles, was du hier veröffentlichst, ist auch unter der URL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://&amp;lt;username&amp;gt;.github.io&lt;/code&gt; erreichbar.&lt;/p&gt;

&lt;p&gt;Standardmäßig versucht GitHub, in diesem Repository den Static-Site-Generator Jekyll zu verwenden. Du könntest zum Beispiel eine Datei &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.nojekyll&lt;/code&gt; und eine &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt; mit „Hallo Welt“ anlegen und nach dem Pushen des Git-Commits das Ergebnis sehen.&lt;/p&gt;

&lt;p&gt;Ich möchte in meinem Fall aber Jekyll verwenden, da bei einem Blog automatisch RSS-Feeds, Tags und Ähnliches generiert werden können.&lt;/p&gt;

&lt;h1 id=&quot;docker-setup&quot;&gt;Docker setup&lt;/h1&gt;

&lt;p&gt;Bevor ich überhaupt loslegen kann, muss ich ja irgendwie eine Vorschau lokal haben. Ich könnte zwar ein Jekyll-Template verwenden, dieses immer wieder auf GitHub deployen und schauen, was am Ende herauskommt. Das würde aber zu lange dauern.&lt;/p&gt;

&lt;p&gt;Deshalb habe ich mir als Erstes ein Dockerfile mit Jekyll gebaut.&lt;/p&gt;

&lt;div class=&quot;language-Dockerfile highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; ruby:3.3&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;WORKDIR&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; /site&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; BUNDLE_GEMFILE=/site/jekyll/Gemfile&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;COPY&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; Gemfile Gemfile.lock ./jekyll/&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Der Container musste noch in einer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yaml&lt;/code&gt; konfiguriert werden. Das sieht dann so aus:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;blog&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jekyll&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;bundle&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;exec&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;jekyll&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;serve&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--host&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0.0.0.0&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--port&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;4000&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;--force_polling&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;127.0.0.1:4000:4000&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;..:/site&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;JEKYLL_ENV&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;production&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jetzt konnte ich die ersten Dateien ablegen und mir unter &lt;a href=&quot;http://localhost:4000&quot;&gt;http://localhost:4000&lt;/a&gt; die Vorschau anzeigen lassen. Ich musste nichts bei GitHub commiten und nicht warten.&lt;/p&gt;

&lt;p&gt;Als Nächstes war das Layout dran. Ich habe zunächst versucht, mir mit Codex ein paar Layoutvorschläge generieren zu lassen. Das hat allerdings nicht besonders gut funktioniert. Besser lief es, als die Layouts als Bilder generiert wurden. Mit Bildern konnte Codex irgendwie besser umgehen als mit HTML. Nach einigen Vorschlägen habe ich mich für das Layout entschieden, das du gerade siehst. Es sollte dunkel und schlicht sein und Orange als Highlightfarbe haben.&lt;/p&gt;

&lt;p&gt;Der Rest war nur noch, die Styles aus dem Bild zu extrahieren und im Blog zu konfigurieren. Natürlich hat das die KI für mich gemacht.&lt;/p&gt;

&lt;h1 id=&quot;beiträge-erstellen&quot;&gt;Beiträge erstellen&lt;/h1&gt;

&lt;p&gt;Nach dem Setup konnte ich dann direkt loslegen. Die Beiträge landen im Unterordner &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_articles/&amp;lt;Name&amp;gt;/index.md&lt;/code&gt;. Alle Bilder, die zum Blogbeitrag gehören, landen auch in diesem Ordner.&lt;/p&gt;

&lt;p&gt;Die &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.md&lt;/code&gt; ist in zwei Teilen aufgebaut. Ganz oben stehen die Metainformationen zum Beitrag, wie zum Beispiel die URL, wann der Artikel veröffentlicht wurde, das Layout, die Tags oder Keywords. Das ist das Front Matter.&lt;/p&gt;

&lt;p&gt;Darunter kommt ganz normal mein Inhalt. Syntax-Highlighting geschieht über CSS und Diagramme kann man mit dem Mermaid-JavaScript-Framework im Browser rendern. Mehr braucht man erst mal nicht.&lt;/p&gt;

&lt;h1 id=&quot;dynamische-kommentare&quot;&gt;Dynamische Kommentare&lt;/h1&gt;

&lt;p&gt;Jetzt gehört ja zu jedem Blog auch die Kommentarfunktion. Diese kann man auf einer statischen HTML-Seite relativ schwierig umsetzen. Viele würden ein Iframe von Disqus oder Ähnlichem einbinden. Ich entschied mich für einen anderen Weg. Auf GitHub gibt es Workflows, die man bei bestimmten Events auslösen kann. Außerdem hat GitHub eine Diskussionsplattform. Hier können GitHub-Nutzer sie wie eine Art Forum verwenden. Es gibt eine besondere Kategorie „Ankündigungen“. In dieser Kategorie kann nur ich als Betreiber einen Eintrag erstellen, und andere Nutzer dürfen nur kommentieren.&lt;/p&gt;

&lt;p&gt;Meine Idee war jetzt folgende: Wenn ich einen Beitrag veröffentliche, erstelle ich eine neue Ankündigung. Die URL der Ankündigung hinterlege ich im Front Matter meines Blogbeitrags. Anschließend erstelle ich einen Workflow auf GitHub. Dieser holt sich die neuesten Kommentare und exportiert sie als JSON in den Ordner &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_data/comments&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jekyll liest die Kommentare und zeigt sie unter dem Blogbeitrag an. Der Trigger für den Workflow ist also ein Kommentar.&lt;/p&gt;

&lt;p&gt;Der Prozess besteht also aus mehreren Schritten. Die Skriptausführung geschieht über &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;actions/github-script&lt;/code&gt;. Ich kann eine Node.js-Datei erstellen und darin alles abarbeiten.&lt;/p&gt;

&lt;p&gt;Den kompletten Workflow mit Triggern findest du in der &lt;a href=&quot;https://github.com/BlackScorp/blackscorp.github.io/blob/master/.github/workflows/publish.yml&quot;&gt;publish.yml des GitHub-Actions-Workflows&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;automatische-ankündigungen&quot;&gt;Automatische Ankündigungen&lt;/h1&gt;

&lt;p&gt;Nachdem ich den Blog und die Workflows mehrfach ausprobiert hatte, bin ich auf die Idee gekommen, dass ich auch automatisch Ankündigungen anlegen kann. Das Skript dazu habe ich in Bash geschrieben. Die Idee ist, alle Artikel herauszusuchen, die &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;published: true&lt;/code&gt; im Front Matter haben und keinen &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;comments_key&lt;/code&gt;. Wenn es den &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;comments_key&lt;/code&gt; nicht gibt, dann gibt es noch keine Ankündigung für den Beitrag. So kann man die Ankündigung automatisch erstellen, ihre ID auslesen und ins Front Matter schreiben. Der Job würde nächtlich laufen oder dann, wenn ich ihn manuell über GitHub starte.&lt;/p&gt;

&lt;h1 id=&quot;fazit&quot;&gt;Fazit&lt;/h1&gt;

&lt;p&gt;Dank GitHub, KI und Jekyll konnte ich mir nun meinen Traum erfüllen und einen eigenen Blog starten. Vielleicht wäre es auch eine Idee für dich. Wenn du einfache Seiten hast und nicht unbedingt dynamischen Content direkt benötigst, kannst du durchaus einiges über Static-Site-Generatoren und GitHub Actions lösen.&lt;/p&gt;

&lt;p&gt;Ich habe auf jeden Fall jetzt die Möglichkeit, einfach einen Text in Markdown zu schreiben und das Layout für alle Blogbeiträge direkt zu bearbeiten. Ich kann den Blog auch mal selbst hosten. Und wenn jemand einen Gastbeitrag bei mir machen möchte, kann er das über einen Pull Request im Projekt machen.&lt;/p&gt;

&lt;h2 id=&quot;weiterführende-links&quot;&gt;Weiterführende Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/pages&quot;&gt;GitHub Pages: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll&quot;&gt;GitHub Pages: Eine GitHub-Pages-Website mit Jekyll erstellen&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/&quot;&gt;Jekyll: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/github-pages/&quot;&gt;Jekyll: GitHub Pages&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/actions&quot;&gt;GitHub Actions: Dokumentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/discussions&quot;&gt;GitHub Discussions: Dokumentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <category term="github_pages"/><category term="jekyll"/><category term="docker"/><category term="github_actions"/><category term="bloggen"/>
  </entry>
  
</feed>
