Live

Ein Ein-Personen-SaaS durch das Review von WordPress.org bringen

AudioLinter prüft Podcast- und Sprachaufnahmen gegen den Lautheitsstandard EBU R128 und repariert sie auf einen Klick — direkt im WordPress-Editor. Dahinter stehen acht Dienste im Produktivbetrieb und 36 ausgelieferte Versionen. Der schwierigste Teil war nicht die Audioverarbeitung, sondern das Review des offiziellen Plugin-Verzeichnisses.

Projekt ansehen
Ausgelieferte Versionen
36Quelle: CHANGELOG.md und wordpress.org, Stand 11.08.2026 (v1.0.36)
Dienste im Produktivbetrieb
8Quelle: docker-compose.prod.yml, Stand 11.08.2026
Testdateien
140Quelle: Repository, Stand 11.08.2026
Commits
705Quelle: git log, 06.03.2026 bis 10.08.2026
Quellzeilen Backend / Plugin / Website
17.952 / 12.417 / 14.592Quelle: Repository ohne Abhängigkeiten, Stand 11.08.2026

Wer Podcasts über WordPress veröffentlicht, merkt Lautheitsprobleme erst, wenn Hörer sich beschweren: eine Folge zu leise, die nächste übersteuert, dazwischen Sekunden Stille. Die Werkzeuge, die das prüfen, sind Audio-Software — man muss die Datei also aus dem Publishing-Werkzeug heraus- und wieder hineinbewegen. Genau diesen Umweg sollte es nicht mehr geben.

Ein laufender Dienst, der im offiziellen WordPress.org-Verzeichnis gelistet ist und darüber aktualisiert wird. 36 ausgelieferte Versionen, acht Dienste im Produktivbetrieb, 140 Testdateien. Das Verzeichnis-Review ist ein echtes Gate mit Prüfung auf Sicherheit, Escaping und Internationalisierung — das bestandene Review ist der belastbarste Qualitätsnachweis des Projekts.

Das Problem war der Medienbruch, nicht die Analyse

Lautheitsprüfung ist ein gelöstes Problem — es gibt seit Jahren Werkzeuge dafür. Ungelöst war der Weg dorthin: Wer eine Podcast-Folge in WordPress hochlädt, müsste die Datei erst wieder herunterladen, in eine Audio-Anwendung laden, prüfen, korrigieren, exportieren und neu hochladen. Bei wöchentlichen Folgen ist das der Punkt, an dem die Qualitätskontrolle stillschweigend entfällt.

Die Produktentscheidung war deshalb nicht „bessere Analyse bauen“, sondern „die vorhandene Analyse dorthin bringen, wo die Datei ohnehin liegt“.

Warum daraus acht Dienste wurden

Ein WordPress-Plugin kann keine Audioverarbeitung machen. Shared Hosting hat weder die Rechenzeit noch die nötigen Bibliotheken, und eine HTTP-Anfrage darf nicht minutenlang offen bleiben. Also ist das Plugin nur der Client, und die Arbeit passiert woanders:

Eine FastAPI-Schicht nimmt den Upload entgegen, prüft API-Schlüssel und Kontingent und legt die Datei in einem S3-kompatiblen Objektspeicher ab. Ein ClamAV-Dienst scannt sie, bevor sie irgendetwas anderes anfasst — es sind fremde Dateien aus fremden WordPress-Installationen. Die eigentliche Analyse und Reparatur läuft asynchron in einem Celery-Worker mit FFmpeg. Postgres hält Schlüssel, Kontingente und Sitzungsdaten, Redis ist Queue und Cache, Traefik terminiert TLS.

Das ist keine Architektur, die man sich für ein Nebenprojekt wünscht. Sie ergibt sich aus der Anforderung, und genau deshalb steht sie hier: Jeder dieser Dienste löst ein konkretes Problem, keiner ist Selbstzweck.

Das eigentliche Gate war WordPress.org

Der Teil, der am meisten über die Arbeit aussagt, ist nicht die Audio-Pipeline, sondern die Aufnahme ins offizielle Plugin-Verzeichnis. Dort prüft ein Review-Team, das man nicht kennt, den Code auf Sicherheitslücken, korrektes Escaping jeder Ausgabe, Berechtigungsprüfungen und Internationalisierung.

Das Review hat Dinge gefunden, die ich selbst nicht gesehen hatte — und die Vorbereitung darauf hat weitere zutage gefördert. Im Changelog stehen sie namentlich: eine Berechtigungsprüfung, die nur die Upload-Rechte der Website prüfte statt der Bearbeitbarkeit des konkreten Beitrags; Backend-Nachrichten, die ungeprüft in die Seite geschrieben wurden; API-Schlüssel und Webhook-Token, die als Klartext-Eingabefelder im Formular standen und damit auf jedem Screenshot und in jeder Bildschirmfreigabe mitliefen.

Diese Einträge stehen öffentlich im Changelog, weil das der Sinn eines Changelogs ist. Wer eine Sicherheitslücke still behebt, nimmt seinen Nutzern die Möglichkeit zu beurteilen, ob sie betroffen waren.

Was 36 Versionen bedeuten

Ausgeliefert wird über dasselbe Verzeichnis, über das WordPress alle Updates verteilt. Das heißt: Jede Version geht an bestehende Installationen, und eine kaputte Version bricht fremde Websites.

Genau das ist einmal passiert. In Version 1.0.27 kam bei einer Aufräumaktion ein Funktionsaufruf mit fehlendem Argument in den Code, der bei jeder Installation mit konfiguriertem Webhook das gesamte WordPress-Backend zum Absturz brachte. Gefunden wurde er erst zwei Versionen später. Der Changelog-Eintrag dazu nennt die betroffenen Versionen, den auslösenden Commit und die Empfehlung, sofort zu aktualisieren.

Nicht schön, aber der ehrliche Umgang damit ist der Punkt. Wer 36 Versionen ausliefert, produziert irgendwann eine schlechte. Was zählt, ist, ob die Nutzer erfahren, was los war.

Was hier nicht steht

Nutzerzahlen. Das Verzeichnis weist derzeit weniger als zehn aktive Installationen aus, und das ist kein Verkaufsargument — es wäre unredlich, es zu einem zu machen. Was dieses Projekt belegt, ist etwas anderes: dass ein vollständiger Dienst mit Queue, Objektspeicher, Virenscanner und Abrechnung von einer Person gebaut, durch ein fremdes Review gebracht und über Monate gepflegt werden kann.

Was prüft AudioLinter genau?
Lautheit nach EBU R128 und ITU-R BS.1770-4 — also den Standard, an dem sich Rundfunk und Streaming-Plattformen orientieren. Konkret: integrierte Lautheit in LUFS, True Peak, Loudness Range und Dead Air, also längere Stille im Programm. Auffälligkeiten lassen sich in einem Schritt korrigieren, ohne die Datei aus WordPress herauszubewegen.
Warum ist die Aufnahme ins WordPress.org-Verzeichnis erwähnenswert?
Weil es ein echtes Gate ist. Das Plugin-Team prüft unter anderem auf Sicherheitslücken, korrektes Escaping von Ausgaben, Berechtigungsprüfungen und Internationalisierung. Ein Plugin, das dort gelistet ist, wurde von jemand anderem als dem Autor angesehen — und über dasselbe Verzeichnis werden auch die Updates ausgeliefert.
Warum stehen im Changelog eigene Sicherheitsfehler?
Weil sie da hingehören. Im Verlauf sind unter anderem eine Berechtigungsprüfung, die nur auf die Rechte der Website statt auf den konkreten Beitrag schaute, ungeschützt ausgegebene Backend-Nachrichten und im Klartext angezeigte API-Schlüssel aufgefallen und behoben worden. Wer Sicherheitsfehler nur still korrigiert, nimmt seinen Nutzern die Möglichkeit einzuschätzen, ob sie betroffen waren.
Warum acht Dienste für ein Plugin?
Weil die Analyse nicht auf der Website des Kunden laufen kann. Audioverarbeitung ist rechenintensiv und dauert länger als eine HTTP-Anfrage warten sollte — also nimmt eine API die Datei entgegen, legt sie in einem Objektspeicher ab, lässt sie von einem Virenscanner prüfen und reicht die eigentliche Arbeit an einen Worker weiter. Datenbank, Queue und Reverse Proxy kommen dazu.

← Alle Referenzen