<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Anleitungen — GameAP-Blog</title><link>https://blog.gameap.com/de/guides/</link><description>Neueste Beiträge aus dem GameAP-Blog</description><language>de-DE</language><generator>Hugo 0.164.0</generator><atom:link href="https://blog.gameap.com/de/guides/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sat, 08 Aug 2026 13:00:00 +0300</lastBuildDate><item><title>Wie veröffentlichen Sie Ihr Plugin?</title><link>https://blog.gameap.com/de/guides/publishing-plugins/</link><pubDate>Sat, 08 Aug 2026 13:00:00 +0300</pubDate><guid>https://blog.gameap.com/de/guides/publishing-plugins/</guid><description>GameAP-Plugins auf plugins.gameap.dev veröffentlichen: Plugin anlegen, Versionen über das Dashboard und aus CI hochladen, Moderation.</description><content:encoded>&lt;p&gt;GameAP-Plugins werden auf &lt;a href="https://plugins.gameap.dev" target="_blank" rel="noopener"&gt;plugins.gameap.dev&lt;/a&gt; veröffentlicht — von
dort installieren Nutzer sie direkt aus dem Panel. Diese Anleitung führt durch den gesamten Weg:
vom Anlegen des Plugin-Eintrags bis zum automatischen Ausliefern neuer Versionen aus CI.&lt;/p&gt;
&lt;p&gt;Vorausgesetzt wird, dass Ihr Plugin bereits geschrieben ist und zu einer &lt;code&gt;.wasm&lt;/code&gt; gebaut wird.
Außerdem brauchen Sie ein Konto auf plugins.gameap.dev: entweder eine normale Registrierung mit
E-Mail-Bestätigung oder die Anmeldung über GitHub, GitLab oder Google.&lt;/p&gt;
&lt;p&gt;Es gibt zwei Wege, eine Version hochzuladen: manuell über das Dashboard oder über die API aus CI.
Beginnen Sie mit dem Dashboard und steigen Sie auf CI um, sobald Ihr Build stabil läuft.&lt;/p&gt;
&lt;h2 id="schritt-1-ein-entwicklerkonto"&gt;Schritt 1. Ein Entwicklerkonto &lt;a class="hanchor" href="#schritt-1-ein-entwicklerkonto" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Das Veröffentlichen von Plugins erfordert ein Konto mit Entwicklerstatus. Dieser wird kostenlos
und sofort vergeben — Sie müssen lediglich die Veröffentlichungsregeln akzeptieren.&lt;/p&gt;
&lt;p&gt;Klicken Sie im Plugin-Marktplatz auf &lt;strong&gt;Publish your plugin&lt;/strong&gt; („Ihr Plugin veröffentlichen“) — die
Schaltfläche in der oberen rechten Ecke.&lt;/p&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_5159adbc8240679d.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_e87690acd34e62fd.webp 800w, https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_d5e0ccee4c05e9e0.webp 1200w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_948bf2e9ae7b63c.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_2603f5b6f5388b0d.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_1ef640ba0eb0d06.png 800w, https://blog.gameap.com/de/guides/publishing-plugins/publish-plugins.de_hu_948bf2e9ae7b63c.png 1200w" sizes="(min-width: 860px) 808px, 100vw" width="1200" height="756" alt="Die Schaltfläche „Publish your plugin“ im Plugin-Marktplatz" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Der Plugin-Marktplatz&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Die Seite mit den Veröffentlichungsregeln öffnet sich. Kurz gesagt, wozu Sie sich verpflichten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Funktionierende, hochwertige Plugins&lt;/strong&gt; — nur funktionsfähige, getestete Plugins, die das
halten, was ihre Beschreibung verspricht.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kein schädlicher Code&lt;/strong&gt; — keine Backdoors, versteckten Miner oder verschleierte Logik; jede
Erhebung von Nutzerdaten muss klar offengelegt werden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rechte und Lizenzierung&lt;/strong&gt; — Sie besitzen den Code oder dürfen ihn verbreiten, Lizenzen Dritter
werden eingehalten, und die Lizenz Ihres Plugins ist angegeben.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GameAP-Kompatibilität&lt;/strong&gt; — das Plugin funktioniert mit aktuellen Panel-Releases und erfüllt
die Anforderungen an das Plugin-Format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updates und Support&lt;/strong&gt; — kritische Fehler und Sicherheitsprobleme werden innerhalb einer
angemessenen Frist behoben, und Nutzermeldungen erhalten eine Antwort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moderation&lt;/strong&gt; — jedes Plugin und jede Version wird geprüft, und ein Plugin, das gegen die
Regeln verstößt, kann jederzeit entfernt werden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kein Spam und keine Duplikate&lt;/strong&gt; — keine irreführenden Namen, kein Keyword-Stuffing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der vollständige Text steht auf der Seite selbst — lesen Sie ihn am besten ganz.&lt;/p&gt;
&lt;!-- Screenshot: Seite mit den Veröffentlichungsregeln und der Schaltfläche "Agree" → publish-rules.de.png / publish-rules.en.png --&gt;
&lt;p&gt;Klicken Sie unten auf &lt;strong&gt;Agree&lt;/strong&gt; („Zustimmen“). Die Rolle wird sofort vergeben, ohne Prüfung und
Wartezeit: In der Seitenleiste erscheint der Bereich &lt;strong&gt;Developer&lt;/strong&gt; („Entwickler“) mit Dashboard,
My Plugins, New Plugin und Support, und eine E-Mail teilt Ihnen mit, dass Sie nun Entwickler sind.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis.&lt;/strong&gt; Die Regeln können nur mit einer bestätigten E-Mail-Adresse akzeptiert werden:
Andernfalls bleibt die Schaltfläche &lt;strong&gt;Agree&lt;/strong&gt; deaktiviert, und die Seite zeigt eine Erinnerung,
Ihre Adresse zu bestätigen. Konten, die über GitHub, GitLab oder Google erstellt wurden, gelten
sofort als bestätigt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die Schaltfläche &lt;strong&gt;Publish your plugin&lt;/strong&gt; ist für alle sichtbar, auch für Besucher, die nicht
angemeldet sind. Ohne Sitzung zeigt die Regelseite stattdessen &lt;strong&gt;Log in to agree&lt;/strong&gt; („Anmelden, um
zuzustimmen“) — nach der Anmeldung kehren Sie zu den Regeln zurück.&lt;/p&gt;
&lt;h2 id="schritt-2-das-plugin-anlegen"&gt;Schritt 2. Das Plugin anlegen &lt;a class="hanchor" href="#schritt-2-das-plugin-anlegen" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wählen Sie im linken Menü &lt;strong&gt;New Plugin&lt;/strong&gt; („Neues Plugin“) — das Erstellungsformular öffnet sich.&lt;/p&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_66c90ae02a704edc.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_ed73830ca4a7af69.webp 800w, https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_5b9135d573b083bb.webp 1200w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_ed7a4092b897f55.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_df39b9d938ca9d05.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_2ce3df4183fea9ad.png 800w, https://blog.gameap.com/de/guides/publishing-plugins/new-plugin.de_hu_ed7a4092b897f55.png 1200w" sizes="(min-width: 860px) 808px, 100vw" width="1200" height="662" alt="Das Formular zum Anlegen eines Plugins im Dashboard von plugins.gameap.dev" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Ein neues Plugin anlegen&lt;/figcaption&gt;&lt;/figure&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feld&lt;/th&gt;
					&lt;th&gt;Pflicht&lt;/th&gt;
					&lt;th&gt;Was gehört hinein&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Name&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Bis zu 255 Zeichen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Summary&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Ein einziger Satz für die Katalogkarte, bis zu 500 Zeichen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Description&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Vollständige Beschreibung in Markdown — das Feld hat eine Formatierungs-Symbolleiste&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Category&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Eine der drei unten&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Labels&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Stichwörter, über die sich das Plugin leichter finden lässt&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;License&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Freier Text: &lt;code&gt;MIT&lt;/code&gt;, &lt;code&gt;GPL-3.0&lt;/code&gt;, &lt;code&gt;Proprietary&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Source URL&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Link zu den Quellen, falls sie offen sind&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Repository URL&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Link zum Repository&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Homepage URL&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Website des Plugins oder des Autors&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Kategorien:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server Management&lt;/strong&gt; („Serververwaltung“) — die meisten Plugins. Alles, was Aktionen auf einem
Gameserver hinzufügt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Files&lt;/strong&gt; („Dateien“) — Erweiterungen des Dateimanagers: Editoren, Viewer für bestimmte
Formate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrations&lt;/strong&gt; („Integrationen“) — Plugins, die die Möglichkeiten des Panels wesentlich
erweitern, etwa die Datenbankverwaltung.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Icon kann in diesem Schritt noch nicht hochgeladen werden — das Formular weist ausdrücklich
darauf hin; der Uploader erscheint direkt nach dem Anlegen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis.&lt;/strong&gt; Source URL und Repository URL wirken sich auf mehr als den Eintrag aus. Wenn keines
der beiden Felder ausgefüllt ist, muss &lt;strong&gt;jede&lt;/strong&gt; Version ein Quellarchiv mitbringen — die
Moderatoren brauchen etwas, gegen das sie den Build prüfen können. Füllen Sie mindestens eines
der Felder aus, wenn Ihre Quellen öffentlich sind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="schritt-3-die-plugin-id"&gt;Schritt 3. Die Plugin-ID &lt;a class="hanchor" href="#schritt-3-die-plugin-id" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nach dem Klick auf &lt;strong&gt;Create&lt;/strong&gt; („Anlegen“) landen Sie auf der Bearbeitungsseite des Plugins. Ihr
erster Block ist die &lt;strong&gt;Plugin ID&lt;/strong&gt; — ein schreibgeschütztes Feld mit einer Kopierschaltfläche.&lt;/p&gt;
&lt;!-- Screenshot: oberer Teil der Bearbeitungsseite mit dem Feld "Plugin ID" und der Kopierschaltfläche → plugin-id.de.png / plugin-id.en.png --&gt;
&lt;p&gt;Diese ID muss in den Quellcode Ihres Plugins eingetragen werden — in das &lt;code&gt;id&lt;/code&gt;-Feld der
&lt;code&gt;PluginInfo&lt;/code&gt;-Struct, die &lt;code&gt;GetInfo&lt;/code&gt; zurückgibt. So ordnet das Panel ein installiertes Plugin
seinem Marktplatz-Eintrag zu.&lt;/p&gt;
&lt;p&gt;Die ID wird einmalig beim Anlegen erzeugt und &lt;strong&gt;kann nicht geändert werden&lt;/strong&gt;. Im Kern ist sie
eine 64-Bit-Zahl (8 zufällige Bytes) in Base32-Schreibweise — 13 lateinische Buchstaben und
Ziffern, zum Beispiel &lt;code&gt;fmqnme42gg7da&lt;/code&gt;. Dieselbe ID taucht in der URL der Plugin-Seite und in der
Adresse des CI-Endpunkts auf.&lt;/p&gt;
&lt;p&gt;Wie das in bestehenden Plugins aussieht:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/gameap/plugin-mysql/blob/main/src/lib.rs" target="_blank" rel="noopener"&gt;plugin-mysql&lt;/a&gt; — die Konstante &lt;code&gt;PLUGIN_ID&lt;/code&gt; (&lt;code&gt;fmqnme42gg7da&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gameap/plugin-goldsrc-addons/blob/main/src/lib.rs" target="_blank" rel="noopener"&gt;plugin-goldsrc-addons&lt;/a&gt; — &lt;code&gt;PLUGIN_ID&lt;/code&gt; (&lt;code&gt;ezvdsxmlu6fbk&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gameap/plugin-minecraft-modrinth/blob/main/assembly/constants.ts" target="_blank" rel="noopener"&gt;plugin-minecraft-modrinth&lt;/a&gt; — &lt;code&gt;PLUGIN_ID&lt;/code&gt; (&lt;code&gt;dshdabjp2l73a&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis.&lt;/strong&gt; Tragen Sie die ID ein und bauen Sie die &lt;code&gt;.wasm&lt;/code&gt; neu, bevor Sie die erste Version
hochladen. Versionen sind unveränderlich: Sie können eine Datei nicht unter derselben Nummer
erneut hochladen — Sie müssten die Versionsnummer erhöhen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="schritt-4-icon-und-übersetzungen"&gt;Schritt 4. Icon und Übersetzungen &lt;a class="hanchor" href="#schritt-4-icon-und-%c3%bcbersetzungen" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Dieselbe Bearbeitungsseite enthält einen Icon-Uploader: JPG, PNG, WebP oder SVG, bis zu 2 MB,
empfohlen 128×128.&lt;/p&gt;
&lt;!-- Screenshot: Icon-Uploader auf der Bearbeitungsseite → icon-upload.de.png / icon-upload.en.png --&gt;
&lt;p&gt;Die Plugin-Seite hat einen Block &lt;strong&gt;Translations&lt;/strong&gt; („Übersetzungen“). Der Katalog ist zweisprachig,
und jeder Besucher sieht den Eintrag in seiner eigenen Sprache: Ohne Übersetzung bekommt ein
russischer Nutzer die englische Beschreibung und umgekehrt. Name, Kurzbeschreibung und
Beschreibung werden pro Sprache separat übersetzt — fünf Minuten Arbeit, die den Eintrag
spürbar besser lesen lassen.&lt;/p&gt;
&lt;!-- Screenshot: Block "Translations" auf der Plugin-Seite → translations.de.png / translations.en.png --&gt;
&lt;h2 id="schritt-5-eine-version-hochladen"&gt;Schritt 5. Eine Version hochladen &lt;a class="hanchor" href="#schritt-5-eine-version-hochladen" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Suchen Sie auf der Plugin-Seite die Karte &lt;strong&gt;Versions&lt;/strong&gt; („Versionen“) und klicken Sie auf
&lt;strong&gt;Upload Version&lt;/strong&gt; („Version hochladen“).&lt;/p&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_243bccfe940fb645.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_aa693942bf347d41.webp 800w, https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_1f9f52625438df09.webp 1200w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_a143f910d4449488.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_fb2b83c72ead6ea2.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_9724bcb241379e5.png 800w, https://blog.gameap.com/de/guides/publishing-plugins/upload-version.de_hu_a143f910d4449488.png 1200w" sizes="(min-width: 860px) 808px, 100vw" width="1200" height="611" alt="Das Formular zum Hochladen einer Plugin-Version" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Eine neue Version hochladen&lt;/figcaption&gt;&lt;/figure&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feld&lt;/th&gt;
					&lt;th&gt;Pflicht&lt;/th&gt;
					&lt;th&gt;Was gehört hinein&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Version&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Semantische Version: &lt;code&gt;1.0.0&lt;/code&gt;, &lt;code&gt;1.2.0-beta.1&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Plugin File&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Die kompilierte &lt;code&gt;.wasm&lt;/code&gt;, bis zu 100 MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GPG Signature&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Abgetrennte Signatur &lt;code&gt;.sig&lt;/code&gt; oder &lt;code&gt;.asc&lt;/code&gt;, bis zu 1 MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Source Code Archive&lt;/td&gt;
					&lt;td&gt;abhängig&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.zip&lt;/code&gt; oder &lt;code&gt;.tar.gz&lt;/code&gt;, bis zu 50 MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Changelog&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Was sich seit der vorherigen Version geändert hat, in Markdown&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stable Release&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
					&lt;td&gt;Ein Schalter, &lt;strong&gt;standardmäßig aktiviert&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Min GameAP Version&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Die Panel-Version, ab der Ihr Plugin funktioniert&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die &lt;strong&gt;GPG-Signatur&lt;/strong&gt; ist optional, aber willkommen: Der Server speichert sie unverändert und
verifiziert sie nie — sie existiert, damit Nutzer die Authentizität der Datei selbst prüfen
können.&lt;/p&gt;
&lt;p&gt;Das &lt;strong&gt;Quellcode-Archiv&lt;/strong&gt; ist Pflicht, wenn beim Plugin weder Source URL noch Repository URL
ausgefüllt sind — das Formular ändert die Feldbezeichnung dann selbstständig von „(Optional)“
zu „(Required)“. Das Archiv wird nur für Moderation und Build-Verifikation verwendet; es wird
nie veröffentlicht und ist über keinen öffentlichen Endpunkt erreichbar.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis.&lt;/strong&gt; Eine über das Dashboard hochgeladene Version bleibt ein &lt;strong&gt;Entwurf&lt;/strong&gt;. Bis Sie sie
zur Prüfung einreichen, sieht sie niemand.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="screenshots-der-version"&gt;Screenshots der Version &lt;a class="hanchor" href="#screenshots-der-version" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Direkt nach dem Upload öffnet sich ein zweiter Schritt — &lt;strong&gt;Add Screenshots&lt;/strong&gt; („Screenshots
hinzufügen“). Screenshots gehören zu einer bestimmten Version: JPG, PNG oder WebP, bis zu
10 Stück, jeweils 5 MB. Der Schritt kann übersprungen und später von der Versionsseite aus
nachgeholt werden.&lt;/p&gt;
&lt;h2 id="schritt-6-zur-prüfung-einreichen"&gt;Schritt 6. Zur Prüfung einreichen &lt;a class="hanchor" href="#schritt-6-zur-pr%c3%bcfung-einreichen" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Plugins durchlaufen eine Moderation — anhand genau der Veröffentlichungsregeln, die Sie in
Schritt 1 akzeptiert haben. Im Kopfbereich der Plugin-Seite gibt es die Schaltfläche
&lt;strong&gt;Submit for Review&lt;/strong&gt; („Zur Prüfung einreichen“) — sie ist nur sichtbar, solange das Plugin den
Status Draft oder Rejected hat.&lt;/p&gt;
&lt;!-- Screenshot: Kopfbereich der Plugin-Seite mit der Schaltfläche "Submit for Review" und die Versionstabelle mit Status-Badges → submit-review.de.png / submit-review.en.png --&gt;
&lt;p&gt;Ein Plugin ohne Versionen kann nicht eingereicht werden — laden Sie zuerst eine Version hoch.
Das Einreichen einer &lt;em&gt;Version&lt;/em&gt; über die Versionstabelle versetzt auch das Plugin selbst von
Draft zu Pending Review, sodass die Schaltfläche im Kopfbereich in der Regel nicht separat
gebraucht wird.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Status&lt;/th&gt;
					&lt;th&gt;Bedeutung&lt;/th&gt;
					&lt;th&gt;Was Sie tun können&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Draft&lt;/td&gt;
					&lt;td&gt;Angelegt, nirgendwo eingereicht&lt;/td&gt;
					&lt;td&gt;Bearbeiten, zur Prüfung einreichen, löschen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Pending Review&lt;/td&gt;
					&lt;td&gt;Wartet auf einen Moderator&lt;/td&gt;
					&lt;td&gt;Warten&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rejected&lt;/td&gt;
					&lt;td&gt;Ein Moderator hat es zurückgeschickt&lt;/td&gt;
					&lt;td&gt;Korrigieren und erneut einreichen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Released&lt;/td&gt;
					&lt;td&gt;Für alle im Katalog verfügbar&lt;/td&gt;
					&lt;td&gt;Neue Versionen hochladen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Approved&lt;/td&gt;
					&lt;td&gt;Ein Zwischenstatus im Datenmodell&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Deprecated&lt;/td&gt;
					&lt;td&gt;Als veraltet markiert&lt;/td&gt;
					&lt;td&gt;Weiterhin installierbar, aber gekennzeichnet&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Retracted&lt;/td&gt;
					&lt;td&gt;Von der Veröffentlichung zurückgezogen&lt;/td&gt;
					&lt;td&gt;Nicht zur Installation verfügbar&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nach der Freigabe wechseln Plugin und Version direkt zu &lt;strong&gt;Released&lt;/strong&gt;. Öffentlich sichtbar sind
nur Objekte in diesem Status: Wenn ein Plugin veröffentlicht ist, seine einzige Version aber noch
in der Prüfung, gibt es nichts zu installieren.&lt;/p&gt;
&lt;p&gt;Der Ablehnungsgrund kommt per E-Mail — die Plugin-Seite zeigt nur den Status, also prüfen Sie
Ihren Posteingang.&lt;/p&gt;
&lt;h2 id="deploy-tokens"&gt;Deploy-Tokens &lt;a class="hanchor" href="#deploy-tokens" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Um Versionen aus CI zu veröffentlichen, brauchen Sie ein Deploy-Token. Es befindet sich ganz
unten auf der Plugin-Seite, in der Karte &lt;strong&gt;Deploy Tokens&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_197cb25595fb5b5f.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_a9f5978f4b4c86b9.webp 800w, https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_1699d5db1124bb17.webp 1200w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_4faa04302751dca0.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_dbe4db4c7c810656.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_beffba6e035fdfb3.png 800w, https://blog.gameap.com/de/guides/publishing-plugins/token-deploy.de_hu_4faa04302751dca0.png 1200w" sizes="(min-width: 860px) 808px, 100vw" width="1200" height="611" alt="Die Karte „Deploy Tokens“ am Ende der Plugin-Seite" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Die Karte mit den Deploy-Tokens&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Klicken Sie auf &lt;strong&gt;Create Token&lt;/strong&gt; („Token erstellen“) und füllen Sie den Dialog aus: einen Namen
(zum Beispiel &lt;code&gt;GitHub Actions&lt;/code&gt;) und optional ein Ablaufdatum.&lt;/p&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy-create-form.de.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy-create-form.de_hu_9247ea9ef3fc28dc.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/token-deploy-create-form.de_hu_bc8c408f37c39612.webp 800w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy-create-form.de_hu_c4886a088e2fce6d.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/token-deploy-create-form.de_hu_e53a113cd49f24d.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/token-deploy-create-form.de_hu_c4886a088e2fce6d.png 800w" sizes="(min-width: 860px) 808px, 100vw" width="800" height="514" alt="Der Dialog zum Erstellen eines Deploy-Tokens mit den Feldern „Name“ und „Expires At“" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Ein Deploy-Token erstellen&lt;/figcaption&gt;&lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis.&lt;/strong&gt; Das Token wird genau einmal angezeigt, direkt nach dem Erstellen. Auf dem Server
wird nur sein Hash gespeichert, der Wert lässt sich nicht wiederherstellen — kopieren Sie es
direkt in Ihre CI-Secrets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Was Sie über Tokens wissen sollten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein Token ist an ein Plugin gebunden und kann nur dessen Versionen hochladen. Es öffnet weder
andere Plugins noch den Rest der API.&lt;/li&gt;
&lt;li&gt;Das Format ist &lt;code&gt;gapd_&lt;/code&gt; plus 43 Zeichen, insgesamt 48. Das Präfix ist für Secret-Scanner leicht
zu erkennen.&lt;/li&gt;
&lt;li&gt;Die Tabelle zeigt das Token-Präfix, das Erstellungsdatum, die letzte Verwendung und das
Ablaufdatum — praktisch, um herauszufinden, welches Token noch in Gebrauch ist.&lt;/li&gt;
&lt;li&gt;Der Widerruf wirkt sofort: Eine Pipeline mit einem widerrufenen Token schlägt beim nächsten
Lauf fehl.&lt;/li&gt;
&lt;li&gt;Ein einzelnes Plugin kann bis zu 20 Tokens haben.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aus-ci-veröffentlichen"&gt;Aus CI veröffentlichen &lt;a class="hanchor" href="#aus-ci-ver%c3%b6ffentlichen" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Der CI-Endpunkt nimmt eine neue Version ohne interaktiven Login entgegen — er authentifiziert
sich mit einem Deploy-Token.&lt;/p&gt;
&lt;h3 id="hochladen-mit-curl"&gt;Hochladen mit curl &lt;a class="hanchor" href="#hochladen-mit-curl" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl --fail-with-body -sS &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$GAMEAP_DEPLOY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -F &lt;span class="s2"&gt;&amp;#34;version=1.2.3&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -F &lt;span class="s2"&gt;&amp;#34;file=@build/plugin.wasm&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -F &lt;span class="s2"&gt;&amp;#34;signature=@build/plugin.wasm.asc&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -F &lt;span class="s2"&gt;&amp;#34;changelog=Absturz beim Serverneustart behoben&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -F &lt;span class="s2"&gt;&amp;#34;min_gameap_version=4.1.0&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -F &lt;span class="s2"&gt;&amp;#34;is_stable=true&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://plugins.gameap.dev/api/ci/plugins/&lt;/span&gt;&lt;span class="nv"&gt;$GAMEAP_PLUGIN_ID&lt;/span&gt;&lt;span class="s2"&gt;/versions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Anfrage ist ein &lt;code&gt;POST&lt;/code&gt; mit &lt;code&gt;multipart/form-data&lt;/code&gt;. Die Formularfelder:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feld&lt;/th&gt;
					&lt;th&gt;Pflicht&lt;/th&gt;
					&lt;th&gt;Beschreibung&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Semantische Version, z. B. &lt;code&gt;1.2.3&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;ja&lt;/td&gt;
					&lt;td&gt;Die kompilierte &lt;code&gt;.wasm&lt;/code&gt;, bis zu 100 MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;signature&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Abgetrennte GPG-Signatur, bis zu 1 MB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;source&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;abhängig&lt;/td&gt;
					&lt;td&gt;Quellarchiv &lt;code&gt;.zip&lt;/code&gt;/&lt;code&gt;.tar.gz&lt;/code&gt; bis 50 MB; Pflicht, wenn das Plugin weder Source URL noch Repository URL hat&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;changelog&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Release-Notes; praktisch aus einer Datei: &lt;code&gt;-F &amp;quot;changelog=&amp;lt;CHANGELOG.md&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;min_gameap_version&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Minimale GameAP-Version&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;min_plugin_api_version&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Minimale Plugin-API-Version (das Dashboard-Formular hat dieses Feld nicht)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;is_stable&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;true&lt;/code&gt; oder &lt;code&gt;1&lt;/code&gt; markiert die Version als stabil&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;submit&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;nein&lt;/td&gt;
					&lt;td&gt;Standardmäßig &lt;code&gt;true&lt;/code&gt;; &lt;code&gt;false&lt;/code&gt; belässt die Version als Entwurf&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Setzen Sie keinen Schrägstrich ans Ende der URL.&lt;/strong&gt; Der Router beantwortet &lt;code&gt;.../versions/&lt;/code&gt; mit
einem &lt;code&gt;301&lt;/code&gt;, und curl wiederholt den &lt;code&gt;POST&lt;/code&gt;-Body bei einem Redirect nicht — der Upload würde
still zu einem &lt;code&gt;GET&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Eine erfolgreiche Antwort ist ein &lt;code&gt;201&lt;/code&gt; mit einem Body wie:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;plugin_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fmqnme42gg7da&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.2.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;file_size&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1048576&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;file_hash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;9f86d081884c7d65...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;has_source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pending_review&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="github-actions"&gt;GitHub Actions &lt;a class="hanchor" href="#github-actions" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dieser Workflow wird ausgelöst, wenn ein GitHub-Release veröffentlicht wird, baut das Plugin,
signiert es — sofern ein GPG-Schlüssel in den Secrets konfiguriert ist — und lädt es zu
plugins.gameap.dev hoch. Der Release-Text wird zum Changelog, und die
Version wird nur dann als stabil markiert, wenn das Release kein Pre-Release ist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Publish plugin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;release&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;published]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Build plugin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;make wasm &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# muss build/plugin.wasm erzeugen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Sign plugin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;if&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;env.GPG_SIGNING_KEY != &amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GPG_SIGNING_KEY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.GPG_SIGNING_KEY }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GPG_PASSPHRASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.GPG_PASSPHRASE }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; printf &amp;#39;%s&amp;#39; &amp;#34;$GPG_SIGNING_KEY&amp;#34; | gpg --batch --import
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; printf &amp;#39;%s&amp;#39; &amp;#34;$GPG_PASSPHRASE&amp;#34; | gpg --batch --yes \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --pinentry-mode loopback --passphrase-fd 0 \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --detach-sign --armor \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -o build/plugin.wasm.asc build/plugin.wasm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Publish to plugins.gameap.dev&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GAMEAP_DEPLOY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.GAMEAP_DEPLOY_TOKEN }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GAMEAP_PLUGIN_ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ vars.GAMEAP_PLUGIN_ID }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ github.event.release.tag_name }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;RELEASE_BODY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ github.event.release.body }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PRERELEASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ github.event.release.prerelease }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; VERSION=&amp;#34;${TAG#v}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; printf &amp;#39;%s&amp;#39; &amp;#34;$RELEASE_BODY&amp;#34; &amp;gt; &amp;#34;$RUNNER_TEMP/changelog.md&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ARGS=(--fail-with-body -sS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -H &amp;#34;Authorization: Bearer ${GAMEAP_DEPLOY_TOKEN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -F &amp;#34;version=${VERSION}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -F &amp;#34;file=@build/plugin.wasm&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -F &amp;#34;changelog=&amp;lt;${RUNNER_TEMP}/changelog.md&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; # Signatur nur anhängen, wenn der Sign-Schritt sie erzeugt hat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if [ -f build/plugin.wasm.asc ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ARGS+=(-F &amp;#34;signature=@build/plugin.wasm.asc&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if [ &amp;#34;$PRERELEASE&amp;#34; != &amp;#34;true&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ARGS+=(-F &amp;#34;is_stable=true&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ARGS+=(-F &amp;#34;is_stable=false&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; curl &amp;#34;${ARGS[@]}&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; &amp;#34;https://plugins.gameap.dev/api/ci/plugins/${GAMEAP_PLUGIN_ID}/versions&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;VERSION=&amp;quot;${TAG#v}&amp;quot;&lt;/code&gt; entfernt das führende &lt;code&gt;v&lt;/code&gt;, sodass das Tag &lt;code&gt;v1.2.3&lt;/code&gt; als Version &lt;code&gt;1.2.3&lt;/code&gt;
veröffentlicht wird.&lt;/p&gt;
&lt;p&gt;Die produktive Variante dieses Workflows — mit Frontend-Build, Cargo-Cache und
HTTP-Statusprüfung — liegt in
&lt;a href="https://github.com/gameap/plugin-mysql/blob/main/.github/workflows/release.yml" target="_blank" rel="noopener"&gt;plugin-mysql&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="das-github-repository-konfigurieren"&gt;Das GitHub-Repository konfigurieren &lt;a class="hanchor" href="#das-github-repository-konfigurieren" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Token und Plugin-ID gehören nicht in den Code — sie gehören in die Repository-Einstellungen.
Öffnen Sie &lt;strong&gt;Settings → Secrets and variables (unter Security and quality) → Actions&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets-sidebar.en.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets-sidebar.en_hu_9541da5da7d0384f.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/github-secrets-sidebar.en_hu_d3ee64d4baa6a46f.webp 800w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets-sidebar.en_hu_9963f0bb4b582211.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets-sidebar.en_hu_a2eced0c8f3ab9c4.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/github-secrets-sidebar.en_hu_9963f0bb4b582211.png 800w" sizes="(min-width: 860px) 808px, 100vw" width="800" height="844" alt="Der Punkt „Secrets and variables → Actions“ in der Seitenleiste der GitHub-Repository-Einstellungen" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Der Einstellungsbereich des Repositorys&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Klicken Sie auf dem Tab &lt;strong&gt;Secrets&lt;/strong&gt; auf &lt;strong&gt;New repository secret&lt;/strong&gt; und fügen Sie hinzu:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Name&lt;/th&gt;
					&lt;th&gt;Wert&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GAMEAP_DEPLOY_TOKEN&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Das Deploy-Token, das Sie beim Erstellen kopiert haben (beginnt mit &lt;code&gt;gapd_&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GPG_SIGNING_KEY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Ein privater GPG-Schlüssel im ASCII-Armor-Format, falls Sie Ihre Builds signieren&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GPG_PASSPHRASE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Die Passphrase des GPG-Schlüssels, falls dieser geschützt ist&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_dff430a18e15af5b.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_531cc5e7a73438e1.webp 800w, https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_6fdea19099fffc55.webp 1200w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_58a93b3c3b3364b1.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_88a534958aec6989.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_8367254b45013968.png 800w, https://blog.gameap.com/de/guides/publishing-plugins/github-secrets.en_hu_58a93b3c3b3364b1.png 1200w" sizes="(min-width: 860px) 808px, 100vw" width="1200" height="575" alt="Der Tab Secrets mit den Secrets GAMEAP_DEPLOY_TOKEN und GPG_SIGNING_KEY" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Repository-Secrets&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Auf dem Tab &lt;strong&gt;Variables&lt;/strong&gt; klicken Sie auf &lt;strong&gt;New repository variable&lt;/strong&gt; und fügen Sie hinzu:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Name&lt;/th&gt;
					&lt;th&gt;Wert&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GAMEAP_PLUGIN_ID&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Die Plugin-ID, z. B. &lt;code&gt;fmqnme42gg7da&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure&gt;&lt;a class="zoom" href="https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en.png" target="_blank" rel="noopener"&gt;&lt;picture&gt;
 &lt;source type="image/webp" srcset="https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_f38ec3bfa362fe8b.webp 480w, https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_d954d987a2cc5fb6.webp 800w, https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_869e19eb01ccc276.webp 1200w" sizes="(min-width: 860px) 808px, 100vw"&gt;
 &lt;img src="https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_4d3d26a67a5a6e9d.png" srcset="https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_b1080eb19826b888.png 480w, https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_47d81d0f089d30fe.png 800w, https://blog.gameap.com/de/guides/publishing-plugins/github-variables.en_hu_4d3d26a67a5a6e9d.png 1200w" sizes="(min-width: 860px) 808px, 100vw" width="1200" height="524" alt="Der Tab Variables mit der Variable GAMEAP_PLUGIN_ID" loading="lazy" decoding="async"&gt;
 &lt;/picture&gt;&lt;/a&gt;&lt;figcaption&gt;Repository-Variablen&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Die Plugin-ID ist derselbe Base32-Bezeichner, den Sie in &lt;code&gt;PluginInfo&lt;/code&gt; eingetragen haben.
Kopieren Sie ihn mit der Schaltfläche neben dem Feld Plugin ID auf der Bearbeitungsseite oder
aus dem Block Details auf der Plugin-Seite.&lt;/p&gt;
&lt;p&gt;Die ID liegt absichtlich in den Variablen und nicht in den Secrets: Sie ist kein Geheimnis, und
wenn sie in den CI-Logs sichtbar ist, lassen sich Fehler deutlich leichter diagnostizieren. Das
Token hingegen ist immer ein Secret.&lt;/p&gt;
&lt;p&gt;So exportieren Sie einen privaten GPG-Schlüssel für &lt;code&gt;GPG_SIGNING_KEY&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gpg --armor --export-secret-keys IHRE_KEY_ID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Veröffentlichen Sie den öffentlichen Schlüssel dort, wo Nutzer ihn finden können — etwa im
README des Plugins —, damit die Signatur überprüfbar ist.&lt;/p&gt;
&lt;h3 id="dashboard-und-ci-unterschiedliche-vorgaben"&gt;Dashboard und CI: unterschiedliche Vorgaben &lt;a class="hanchor" href="#dashboard-und-ci-unterschiedliche-vorgaben" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Was&lt;/th&gt;
					&lt;th&gt;Dashboard&lt;/th&gt;
					&lt;th&gt;CI&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Stabiles Release&lt;/td&gt;
					&lt;td&gt;Der Schalter ist standardmäßig aktiviert&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;is_stable&lt;/code&gt; ist standardmäßig &lt;strong&gt;false&lt;/strong&gt; — explizit übergeben&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Einreichen zur Prüfung&lt;/td&gt;
					&lt;td&gt;Manuell, per Schaltfläche&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;submit&lt;/code&gt; ist standardmäßig &lt;strong&gt;true&lt;/strong&gt; — die Version geht sofort in die Prüfung&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Screenshots&lt;/td&gt;
					&lt;td&gt;Werden direkt nach dem Upload angeboten&lt;/td&gt;
					&lt;td&gt;Nicht unterstützt, fügen Sie sie über das Dashboard hinzu&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Wenn CI nur die Datei hochladen und Sie die Metadaten von Hand nachpflegen wollen, übergeben Sie
&lt;code&gt;submit=false&lt;/code&gt;, und die Version bleibt ein Entwurf.&lt;/p&gt;
&lt;h3 id="fehler"&gt;Fehler &lt;a class="hanchor" href="#fehler" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Code&lt;/th&gt;
					&lt;th&gt;Ursache&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Ungültige Plugin-ID, ein fehlerhafter Multipart-Body oder kein &lt;code&gt;file&lt;/code&gt; übergeben&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Das Token fehlt, ist ungültig oder abgelaufen; der Header hat nicht die Form &lt;code&gt;Bearer gapd_...&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Das Token ist gültig, wurde aber für ein anderes Plugin ausgestellt&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;409&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Eine Version mit dieser Nummer existiert bereits&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Die Version besteht die Semver-Prüfung nicht; das Quellarchiv fehlt, ist zu groß oder kein &lt;code&gt;.zip&lt;/code&gt;/&lt;code&gt;.tar.gz&lt;/code&gt;; die Größenlimits für Datei oder Signatur sind überschritten&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Fehler-Bodies haben eine einheitliche Form:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;version already exists&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;version already exists&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;http_code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;409&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Wiederholen Sie den Upload nach einem &lt;code&gt;5xx&lt;/code&gt;-Fehler nicht blind.&lt;/strong&gt; Das Schreiben der Version und
ihr Einreichen zur Prüfung sind keine einzelne Transaktion: Die Version kann bereits existieren,
und ein erneuter Versuch liefert &lt;code&gt;409&lt;/code&gt;. Öffnen Sie das Dashboard und prüfen Sie, was tatsächlich
passiert ist.&lt;/p&gt;
&lt;h2 id="versionen-aktualisieren-und-zurückziehen"&gt;Versionen aktualisieren und zurückziehen &lt;a class="hanchor" href="#versionen-aktualisieren-und-zur%c3%bcckziehen" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Eine neue Version wird genau wie die erste hochgeladen — über das Dashboard oder aus CI. Bereits
hochgeladene Versionen sind unveränderlich: Eine Datei unter derselben Nummer erneut hochzuladen
ist nicht möglich, der Versuch liefert &lt;code&gt;409&lt;/code&gt;. War der Build falsch, erhöhen Sie die
Patch-Version.&lt;/p&gt;
&lt;p&gt;Jede Zeile der Versionstabelle hat eigene Aktionen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Edit&lt;/strong&gt; („Bearbeiten“) — Changelog und Metadaten ändern.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Submit for Review&lt;/strong&gt; („Zur Prüfung einreichen“) — für Entwürfe und abgelehnte Versionen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deprecate&lt;/strong&gt; („Als veraltet markieren“) — für veröffentlichte Versionen. Die Version bleibt
verfügbar, wird aber als veraltet gekennzeichnet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retract&lt;/strong&gt; („Zurückziehen“) — für veröffentlichte und veraltete Versionen. Die Version wird
von der Veröffentlichung zurückgezogen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nur ein Plugin im Status Draft kann gelöscht werden. Ein veröffentlichtes Plugin lässt sich nicht
entfernen — es kann zurückgezogen werden.&lt;/p&gt;
&lt;h2 id="checkliste"&gt;Checkliste &lt;a class="hanchor" href="#checkliste" aria-label="Link zu dieser Überschrift"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Die E-Mail ist bestätigt, die Veröffentlichungsregeln sind akzeptiert, und das Konto hat
Entwicklerstatus.&lt;/li&gt;
&lt;li&gt;Das Plugin ist angelegt, und Name sowie beide Beschreibungen sind ausgefüllt.&lt;/li&gt;
&lt;li&gt;Source URL oder Repository URL ist ausgefüllt — sonst braucht jede Version ein Quellarchiv.&lt;/li&gt;
&lt;li&gt;Die Plugin-ID steht in &lt;code&gt;PluginInfo.id&lt;/code&gt;, und die &lt;code&gt;.wasm&lt;/code&gt; wurde danach neu gebaut.&lt;/li&gt;
&lt;li&gt;Das Icon ist hochgeladen, und die Übersetzungen des Eintrags sind gepflegt.&lt;/li&gt;
&lt;li&gt;Die Version ist hochgeladen, optional ergänzt um Signatur und Screenshots.&lt;/li&gt;
&lt;li&gt;Die Version ist zur Prüfung eingereicht, nicht als Entwurf liegen geblieben.&lt;/li&gt;
&lt;li&gt;Für CI: Ein Deploy-Token ist erstellt und in den Secrets hinterlegt, die Plugin-ID steht in den
Variablen.&lt;/li&gt;
&lt;li&gt;Der Workflow hat keinen Schrägstrich am Ende der URL und übergibt &lt;code&gt;is_stable&lt;/code&gt; explizit.&lt;/li&gt;
&lt;li&gt;Nach dem Release ist bestätigt, dass Plugin und Version den Status Released haben.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>