[{"id":4801,"date":"2026-06-12T15:48:18","date_gmt":"2026-06-12T13:48:18","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4801"},"modified":"2026-06-12T15:48:18","modified_gmt":"2026-06-12T13:48:18","slug":"von-seo-zu-aeo-kassensturz-maschinenlesbare-identitaet","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/06\/12\/von-seo-zu-aeo-kassensturz-maschinenlesbare-identitaet\/","title":{"rendered":"Von SEO zu AEO, der Kassensturz: was eine maschinenlesbare Identit\u00e4t wirklich bringt"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1-1024x683.png\" alt=\"Visualisierung einer maschinenlesbaren Online-Identit\u00e4t mit JSON-LD, Knowledge Graph und KI-Antwortsystemen zur Verkn\u00fcpfung einer Person \u00fcber mehrere digitale Quellen.\" class=\"wp-image-4803\" style=\"aspect-ratio:1.4992791994609649;width:189px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1-1024x683.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1-300x200.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1-768x512.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1-676x451.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/seo-aeo1.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Am 1. Januar habe ich hier einen Beitrag geschrieben, der eine Wette war. Die These: Web-Optimierung verschiebt sich. Weg von SEO, dem Kampf um die beste Platzierung bei Google, hin zu etwas, das ich AEO genannt habe. Answer Engine Optimization. Also nicht mehr \u201ewie komme ich auf Platz eins&#8220;, sondern \u201ewie liefere ich die beste maschinenlesbare Antwort&#8220;. Ich habe damals llms.txt eingebaut, ein bisschen \u00fcber JSON-LD geschrieben und ehrlich dazugesagt, dass niemand wei\u00df, ob das langfristig relevant bleibt. Der letzte Satz war: ich bin gespannt, was passiert.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Jetzt ist ein gutes halbes Jahr vergangen. Zeit f\u00fcr einen Kassensturz. Was davon hat sich gehalten, was war naiv, was hat sich differenziert? Und vor allem: ich habe in den letzten Monaten tats\u00e4chlich daran gearbeitet, mich f\u00fcr eine Maschine sauber beschreibbar zu machen. Nicht als Theorie, sondern an der eigenen Seite, mit allen Fehlern, die dabei sichtbar wurden. Genau diese Fehler und die Abw\u00e4gungen dahinter sind der eigentliche Inhalt dieses Beitrags. Wer den Vorg\u00e4ngerpost noch nicht kennt, findet ihn hier: <a href=\"https:\/\/www.kernel-error.de\/2026\/01\/01\/von-seo-zu-aeo-warum-llms-txt-json-ld-und-answer-engines-das-web-veraendern\/\">Von SEO zu AEO, warum llms.txt, JSON-LD und Answer Engines das Web ver\u00e4ndern<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Die Suche wird zur Antwortmaschine<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Fangen wir mit dem an, was sich gerade wirklich ver\u00e4ndert, unabh\u00e4ngig von meinem Blog. Wer heute etwas googelt, bekommt immer \u00f6fter die Antwort direkt auf der Ergebnisseite. Eine zusammengefasste KI-Antwort, darunter vielleicht ein paar Quellen. Der Klick auf eine Webseite entf\u00e4llt. Daf\u00fcr gibt es einen Begriff: Zero-Click-Suche. Die Information erreicht den Menschen, ohne dass er die Seite besucht, von der sie stammt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das ist keine Vermutung, das l\u00e4sst sich messen. Das <a href=\"https:\/\/www.pewresearch.org\/short-reads\/2025\/07\/22\/google-users-are-less-likely-to-click-on-links-when-an-ai-summary-appears-in-the-results\/\" target=\"_blank\" rel=\"noopener\">Pew Research Center<\/a> hat Daten aus dem Fr\u00fchjahr 2025 ausgewertet, ver\u00f6ffentlicht im Juli 2025: das Surfverhalten von rund 900 erwachsenen US-Nutzern, knapp 68.900 Google-Suchanfragen. Das Ergebnis: bekamen die Leute eine KI-Zusammenfassung angezeigt, klickten nur noch 8 Prozent auf einen weiterf\u00fchrenden Treffer. Ohne KI-Zusammenfassung waren es 15 Prozent, fast doppelt so viel. Auf die in der KI-Antwort verlinkten Quellen klickte \u00fcberhaupt nur 1 Prozent. Fairerweise dazugesagt: Google h\u00e4lt die Methodik dieser Studie f\u00fcr nicht repr\u00e4sentativ, hat aber keine eigenen Gegenzahlen vorgelegt. Zur Einordnung der Gr\u00f6\u00dfenordnung: schon bei der ganz normalen Google-Suche endet ein gro\u00dfer Teil ohne Klick. Die <a href=\"https:\/\/sparktoro.com\/blog\/2024-zero-click-search-study-for-every-1000-us-google-searches-only-374-clicks-go-to-the-open-web-in-the-eu-its-360\/\" target=\"_blank\" rel=\"noopener\">Zero-Click-Studie von SparkToro<\/a> (Rand Fishkin, 2024, Datenbasis Datos, das zu Semrush geh\u00f6rt) kommt auf rund 58 Prozent in den USA und knapp 60 Prozent in der EU, neuere Auswertungen f\u00fcr 2026 eher Richtung zwei Drittel. Und ein Hinweis zur Vorsicht, weil die Zahl gern falsch zitiert wird: die oft genannten 93 Prozent Zero-Click gelten ausschlie\u00dflich f\u00fcr Googles AI Mode, also den dialogorientierten Chat-Modus der Suche (<a href=\"https:\/\/www.semrush.com\/blog\/google-ai-mode-seo-impact\/\" target=\"_blank\" rel=\"noopener\">Semrush<\/a> ma\u00df dort 92 bis 94 Prozent), nicht f\u00fcr die normale Suche. Wer diese Schlagzeile unbesehen \u00fcbernimmt, vergleicht \u00c4pfel mit Birnen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wie stark der Effekt kausal ist, hat ein <a href=\"https:\/\/papers.ssrn.com\/sol3\/papers.cfm?abstract_id=6513059\" target=\"_blank\" rel=\"noopener\">randomisiertes Feldexperiment<\/a> von Saharsh Agarwal (Indian School of Business) und Ananya Sen (Carnegie Mellon University) untersucht, Feldphase Januar und Februar 2026, 1.065 ausgewertete US-Desktop-Nutzer von Chrome. Auf den Suchanfragen, bei denen tats\u00e4chlich eine KI-\u00dcbersicht erschien, sanken die organischen Klicks um etwa 38 Prozent, die Zero-Click-Rate stieg von 54 auf 72 Prozent. Wichtig f\u00fcr die Einordnung: das ist ein noch nicht begutachtetes Arbeitspapier, online seit April 2026, und die Stichprobe sind aktive Desktop-Chrome-Nutzer aus einem Panel, nicht alle Google-Nutzer. Das Studiendesign war immerhin vorab registriert, was die Aussagekraft st\u00fctzt. Trotzdem bleibt es ein Befund mit klaren Grenzen. Die Pointe ist nicht, dass die Suche stirbt, sondern etwas N\u00fcchterneres: Sichtbarkeit entkoppelt sich vom Klick. Man kann als Quelle einer Antwort auftauchen, ohne dass jemand die eigene Seite \u00f6ffnet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Vom String zum Ding<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Jetzt wird es interessant, denn hier liegt der Mechanismus, der mitentscheidet, ob man in so einer Antwort \u00fcberhaupt vorkommt. Schon 2012 hat Google den Knowledge Graph eingef\u00fchrt, unter dem Slogan <a href=\"https:\/\/blog.google\/products-and-platforms\/products\/search\/introducing-knowledge-graph-things-not\/\" target=\"_blank\" rel=\"noopener\">\u201eThings, not strings&#8220;<\/a>. \u00dcbersetzt: Dinge, nicht Zeichenketten. Davor war eine Suchmaschine im Kern ein Textabgleich. Du tippst Buchstaben, sie sucht Seiten mit denselben Buchstaben. Seitdem versucht Google, hinter den Buchstaben das tats\u00e4chliche Ding zu erkennen. Eine Entit\u00e4t. Ein eindeutig identifizierbares Etwas mit Beziehungen zu anderen eindeutig identifizierbaren Etwas.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das klassische Beispiel ist das Wort Jaguar. Tier, Auto oder Betriebssystem? Ein Mensch erkennt aus dem Zusammenhang sofort, was gemeint ist. Eine Maschine muss disambiguieren, also die Mehrdeutigkeit aufl\u00f6sen. Und genau dasselbe Problem gilt f\u00fcr mich. Welcher Sebastian van de Meer? Es gibt mehr als einen Menschen mit diesem Namen. F\u00fcr eine Maschine ist mein Name erst einmal nur eine Zeichenkette, die zu mehreren Personen passt. Eindeutigkeit wird belohnt. Es gibt dazu einen vielzitierten Datenpunkt, den ich ehrlich einordnen muss: laut einer <a href=\"https:\/\/searchengineland.com\/google-great-clarity-cleanup-knowledge-graph-ai-future-460836\" target=\"_blank\" rel=\"noopener\">Auswertung von Kalicube<\/a> (Jason Barnard, ver\u00f6ffentlicht bei Search Engine Land im August 2025) verschwanden im Juni 2025 \u00fcber drei Milliarden Eintr\u00e4ge aus dem Knowledge Graph, ein R\u00fcckgang von rund sechs Prozent, verteilt auf zwei Stichtage. Google hat das nie offiziell best\u00e4tigt, und die Deutung, dass hier Klarheit \u00fcber Masse gewinnt, ist die des Analysten, nicht Googles erkl\u00e4rter Grund. Also ein Indiz, kein Gesetz. Der Knowledge Graph selbst speist sich nach Googles eigenen Angaben unter anderem aus Wikipedia, Branchenquellen nennen erg\u00e4nzend Wikidata, und er ist das Bindeglied zwischen klassischer Suche und KI-Antworten. Googles KI-Suche, die auf Gemini basiert, greift nach eigener Darstellung auf den Knowledge Graph als Echtzeit-Quelle zur\u00fcck. Wer dort als saubere Entit\u00e4t existiert, ist f\u00fcr beide Welten greifbar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wie man sich einer Maschine als Entit\u00e4t vorstellt<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Damit sind wir beim Herzst\u00fcck. Wie sage ich einer Maschine glaubw\u00fcrdig, wer ich bin? Das Werkzeug daf\u00fcr hei\u00dft JSON-LD nach dem <a href=\"https:\/\/schema.org\" target=\"_blank\" rel=\"noopener\">schema.org<\/a>-Vokabular. Vereinfacht: ein maschinenlesbarer Steckbrief, der direkt in der Seite liegt und Fakten ausdr\u00fccklich beschriftet. Das ist der Autor, das ist sein Beruf, das ist das Erscheinungsdatum. Statt die Maschine alles aus Flie\u00dftext erraten zu lassen, legt man ihr die Fakten getypt hin. Eine Klarheits- und Extraktionshilfe, mehr nicht. Keine Garantie auf ein Ranking und keine Garantie, zitiert zu werden. Diese Erwartung muss man sofort d\u00e4mpfen, sonst baut man Luftschl\u00f6sser.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aus der abstrakten Ansage von damals ist bei mir eine ziemlich durchdachte Identit\u00e4ts-Architektur geworden. Und ehrlich: das Spannende waren nicht die Zeilen, die ich geschrieben habe, sondern das, was ich dabei gelernt habe. Neun Punkte, die ich so vorher nicht auf dem Schirm hatte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Erstens, eine Identit\u00e4t, eine kanonische Adresse.<\/strong> F\u00fcr eine Maschine sollte eine Person genau ein Ding sein, mit einer stabilen Kennung, die \u00fcberall identisch auftaucht, nicht auf jeder Seite neu erfunden. Maschinen l\u00f6sen Identit\u00e4t \u00fcber stabile Identifier auf, nicht \u00fcber Namen. Lose Namensnennungen ohne gemeinsame Kennung werden als verschiedene Menschen gelesen oder gar nicht zusammengef\u00fchrt. Der Preis ist weniger Flexibilit\u00e4t. Der Gewinn ist ein zusammenh\u00e4ngender Knoten statt vieler Splitter.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Zweitens, eine Wahrheitsquelle statt \u00fcberall dasselbe reinkippen.<\/strong> Die vollst\u00e4ndige Selbstbeschreibung steht bei mir an genau einer Stelle, auf der \u00dcber-mich-Seite. Alle anderen Seiten tragen nur eine schlanke Referenz darauf. Der Grund ist unromantisch: dieselbe Definition \u00fcberall zu duplizieren erzeugt Drift. Man \u00e4ndert eine Stelle, vergisst die anderen, und am Ende widerspricht sich der eigene Datensatz selbst. Die Abw\u00e4gung: die schlanke Referenz darf nicht zu d\u00fcnn sein, sonst findet ein Crawler, der zuf\u00e4llig nur eine Artikelseite erwischt, keinen Anker zur\u00fcck zum Profil.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Drittens, Privates geh\u00f6rt nicht in den maschinenlesbaren Broadcast.<\/strong> Das war f\u00fcr mich die wichtigste Einsicht. Telefonnummer, Adresse und \u00e4hnliches haben f\u00fcr die maschinelle Identifikation exakt null Wert. Disambiguiert wird \u00fcber verlinkte Profile, nicht \u00fcber die Handynummer. Auf jeder einzelnen Seite ausgestrahlt w\u00e4ren solche Daten dagegen eine ideale Fl\u00e4che zum Abgreifen. Also stehen die privaten Angaben jetzt bewusst nur dort, wo sie hingeh\u00f6ren, und sind nicht mehr auf rund 470 Seiten als sauber beschriftete Schl\u00fcssel-Wert-Paare maschinenlesbar verteilt. Das ist die zentrale Abw\u00e4gung zwischen Datenschutz und Maschinenlesbarkeit, und sie f\u00e4llt klar zugunsten Datenschutz aus. Das Sch\u00f6ne: man verliert dabei kein einziges Identit\u00e4ts-Signal.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Viertens, externe Anker sind die eigentliche Beweiskette.<\/strong> Eine Behauptung \u00fcber mich wird erst dann pr\u00fcfbar, wenn sie auf unabh\u00e4ngige Profile verweist und diese zur\u00fcckverweisen. Bei mir sind das unter anderem <a href=\"https:\/\/github.com\/Kernel-Error\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>, ein Eintrag im <a href=\"https:\/\/www.bsi.bund.de\/SharedDocs\/Adressen\/DE\/CSN\/Digitale-Ersthelfer\/UVW\/van_de_Meer_Sebastian.html\" target=\"_blank\" rel=\"noopener\">BSI-B\u00fcrger-CERT-Netzwerk<\/a>, <a href=\"https:\/\/www.kernel-error.de\/?author=0\" target=\"_blank\" rel=\"noopener\">Mastodon<\/a> und die <a href=\"https:\/\/bsky.app\/profile\/www.kernel-error.de\" target=\"_blank\" rel=\"noopener\">Bluesky-Br\u00fccke<\/a>, dazu Identifier wie <a href=\"https:\/\/orcid.org\/0009-0004-3865-3493\" target=\"_blank\" rel=\"noopener\">ORCID<\/a> und ein <a href=\"https:\/\/www.wikidata.org\/wiki\/Q140183871\" target=\"_blank\" rel=\"noopener\">Wikidata-Eintrag<\/a>. Entscheidend ist die Wechselseitigkeit. Ein Verweis z\u00e4hlt nur, wenn die Gegenseite zur\u00fcckzeigt. Anfangs lagen diese Anker nur auf der Profilseite. Das war ein Single Point of Failure: wenn ein Crawler genau diese eine Seite nicht erwischt, ist die Identit\u00e4t nicht mehr belegbar. Also geh\u00f6ren die st\u00e4rksten Anker auf jede Seite. Und die Disziplin dabei: unverifizierbare oder tote Profile l\u00e4sst man weg, weil sie das Signal nur verw\u00e4ssern.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>F\u00fcnftens, innere Widerspruchsfreiheit ist selbst ein Qualit\u00e4tssignal.<\/strong> Ein Beispiel aus der eigenen Seite, das mich erst ge\u00e4rgert und dann \u00fcberzeugt hat: der Herausgeber des Blogs und der Herausgeber der einzelnen Artikel zeigten auf zwei verschiedene, nirgends sauber definierte Stellen. F\u00fcr eine Maschine sieht so etwas aus wie ein Datenfehler und untergr\u00e4bt das Vertrauen in den gesamten Datensatz. Die Lektion war, lieber einen sauber benannten zus\u00e4tzlichen Knoten einzuf\u00fchren, hier die Marke \u201eKernel-Error&#8220; als eigene Herausgeber-Instanz, als zwei sich widersprechende Halbwahrheiten stehen zu lassen. Das ist \u00fcbrigens keine technische Petitesse, sondern eine echte Identit\u00e4ts-Entscheidung: gilt \u201eKernel-Error&#8220; als eigene Marke neben der Person? Ich habe mich daf\u00fcr entschieden, und pl\u00f6tzlich ergab der ganze Rest Sinn.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Sechstens, einen Wissensgraphen kann man nicht bel\u00fcgen.<\/strong> Das klingt pathetisch, ist aber sehr praktisch gemeint. Alle externen Quellen, auf die ich verweise, sind crawlbar. Jeder Status l\u00e4sst sich gegen das echte Upstream-Projekt pr\u00fcfen. Also habe ich offene Beitr\u00e4ge ehrlich als offen gekennzeichnet, statt sie als erledigt zu verkaufen. Zwei meiner Patches f\u00fcr eine Fingerabdruckleser-Bibliothek sind eingereicht, aber noch nicht gemerged, und genau so steht es da. Behauptungen, die ich nicht belegen kann, etwa angebliche CVEs, die sich \u00f6ffentlich nicht auffinden lassen, habe ich komplett weggelassen. Ein als \u201eerledigt&#8220; deklarierter, in Wahrheit offener Beitrag ist ein sofort widerlegbarer Fehler, und der besch\u00e4digt die Glaubw\u00fcrdigkeit des gesamten Profils. Die Abw\u00e4gung ist unbequem: das Profil sieht weniger beeindruckend aus. Aber ein einziger entlarvter Fake-Claim ist teurer als zehn ehrliche kleine. Vertrauen entsteht aus Pr\u00fcfbarkeit, nicht aus Behauptung.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Siebtens, Expertise belegt man mit Artefakten, nicht mit Adjektiven.<\/strong> Niemand muss mir glauben, dass ich etwas kann. Sie k\u00f6nnen es nachsehen. Konkrete, von Dritten kontrollierbare Arbeiten sind der st\u00e4rkste maschinenlesbare Beleg. Ein in ein fremdes Projekt aufgenommener Patch verankert mich im Linkgraph dieses fremden, autoritativen Projekts. Ein eigenes Repository ist \u00fcberpr\u00fcfbarer Code, kein Selbstlob. Die Disziplin dahinter: nur real Existierendes, korrekt zugeschrieben. Fremde Maintainer-Arbeit f\u00fchre ich nicht als meine. Bei einem Rezensions-Artikel \u00fcber ein Tool, das mir nicht geh\u00f6rt, bleibt die Urheberschaft beim Upstream. Und F\u00fcllmaterial wie Trivia oder Verzeichnis-Eintr\u00e4ge bleibt bewusst drau\u00dfen, um das Signal nicht zu verw\u00e4ssern.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Achtens, wer alles kennt, l\u00f6st auf nichts auf.<\/strong> Meine Themenliste hatte \u00fcber 40 mehr oder weniger beliebige Schlagworte. Das habe ich auf eine Handvoll fokussierte Kernthemen zusammengestrichen, m\u00f6glichst als eindeutige Referenzen statt als nackte W\u00f6rter. Der Grund: zu viele Themen verw\u00e4ssern das Signal so sehr, dass man f\u00fcr kein einziges Feld als Autorit\u00e4t erkennbar ist. Die Wette dahinter ist, dass ein scharfes Profil in wenigen Feldern f\u00fcr eine Antwortmaschine wertvoller ist als eine lange, unscharfe Stichwortliste. Der Preis ist Breite bei Nischen-Anfragen. Den zahle ich gerne.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Neuntens, jede Seite soll sagen, was sie ist.<\/strong> Profilseite, Kontaktseite, Artikel, Autorenarchiv: jeder Seitentyp deklariert jetzt seine Rolle und welche Rolle ich dort spiele. Das st\u00e4rkste Signal \u201ediese Adresse ist das kanonische Profil dieser Person&#8220; entsteht erst dadurch, dass die Profilseite sich auch als Profilseite zu erkennen gibt. Vorher sah sie f\u00fcr eine Maschine aus wie jede beliebige andere Seite und verschenkte diese Aussage komplett. Die Abw\u00e4gung: mehr Fallunterscheidung im Code, daf\u00fcr pr\u00e4zise, rollenrichtige Signale.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wie Antwortmaschinen ihre Quellen w\u00e4hlen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Eine einzelne perfekte Seite reicht nicht. KI-Systeme kreuzpr\u00fcfen eine Entit\u00e4t \u00fcber mehrere unabh\u00e4ngige Quellen, bevor sie zitieren. Im schema.org-Vokabular hei\u00dft das Stichwort sameAs, frei \u00fcbersetzt der Verweis auf denselben Ausweis anderswo. Konsistente, echte Verweise erh\u00f6hen die Vertrauensw\u00fcrdigkeit, garantieren aber nichts. Es braucht \u00fcbereinstimmende Spuren an mehreren Orten. Und Vorsicht vor dem Trugschluss \u201emehr ist besser&#8220;: tote oder inkonsistente Verweise schaden, nur gepflegte, echte Profile z\u00e4hlen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der vielleicht wichtigste Befund f\u00fcr alle, die keine Marketing-Abteilung haben: Zitierw\u00fcrdigkeit ist nicht dasselbe wie Ranking. <a href=\"https:\/\/ahrefs.com\/blog\/ai-search-overlap\/\" target=\"_blank\" rel=\"noopener\">Ahrefs<\/a> hat im August 2025 rund 15.000 Long-Tail-Anfragen ausgewertet und KI-Assistenten wie ChatGPT, Gemini und Perplexity dieselben Fragen gestellt. Ergebnis: im Schnitt ranken nur rund 12 Prozent der von diesen Tools zitierten URLs in Googles Top 10, rund 88 Prozent also nicht. Etwa 80 Prozent tauchen f\u00fcr die urspr\u00fcngliche Anfrage \u00fcberhaupt nicht in Googles Ergebnissen auf. Ein Detail der Ehrlichkeit halber: das ist ein Durchschnitt, und Perplexity schert mit knapp 29 Prozent \u00dcberschneidung deutlich nach oben aus, h\u00e4ngt also st\u00e4rker an der klassischen Suche als die anderen. Die Botschaft bleibt trotzdem: Antwortmaschinen w\u00e4hlen nach antwortfertig, glaubw\u00fcrdig und strukturell sauber, nicht prim\u00e4r nach Suchplatzierung. Genau deshalb kann ein Nischenblog ohne Spitzen-Rankings trotzdem zitierf\u00e4hig sein. Wer nur in Keyword-Rankings denkt, greift zu kurz.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und was steigert nun messbar die Sichtbarkeit in generativen Antworten? Eine viel zitierte <a href=\"https:\/\/arxiv.org\/abs\/2311.09735\" target=\"_blank\" rel=\"noopener\">akademische Arbeit<\/a> von Forschenden der Princeton University und des IIT Delhi, dazu zwei unabh\u00e4ngige Autoren, hat genau das untersucht, vorgestellt auf der KDD 2024. Sie gilt als die erste Arbeit, die den Begriff Generative Engine Optimization gepr\u00e4gt hat. Die Antwort ist herrlich unspektakul\u00e4r, und das ist die eigentliche Pointe. Was hilft, ist: w\u00f6rtliche Zitate einbauen (in der Studie der st\u00e4rkste Hebel mit rund 41 Prozent mehr Sichtbarkeit), Statistiken nennen (rund 33 Prozent), Quellen angeben (rund 28 Prozent), fl\u00fcssig und gut lesbar schreiben (\u00e4hnliche Gr\u00f6\u00dfenordnung). Insgesamt bis zu rund 40 Prozent mehr Sichtbarkeit. Zwei Einschr\u00e4nkungen geh\u00f6ren dazu: gemessen wurde nicht Traffic oder Klicks, sondern eine positionsgewichtete Sichtbarkeit innerhalb der KI-Antwort, und die Prozente sind relativ zu einer unoptimierten Ausgangsversion. Das Schlusslicht, mit deutlichem Abstand: klassisches Keyword-Stuffing senkte die Sichtbarkeit sogar, um rund 8 bis 9 Prozent. Die Botschaft ist also kein Geheimtrick, sondern fast schon eine Erl\u00f6sung: gute, belegte, lesbare Substanz ist die Strategie. Das ist auch der Kern von E-E-A-T, also Erfahrung, Fachkenntnis, Autorit\u00e4t und Vertrauen. Kein Algorithmus-Schalter, sondern ein Signalb\u00fcndel. Und genau hier zahlt die verifizierte Identit\u00e4t ein: echte Werke, externe Best\u00e4tigung und Konsistenz machen Erfahrung und Expertise \u00fcberhaupt erst maschinell nachvollziehbar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Ehrlicher Kassensturz<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bleibt die unbequeme Frage: hat das alles etwas gebracht? Fangen wir mit der Korrektur meiner eigenen Anfangs-Wette an, der llms.txt. Die l\u00e4uft live, der Aufwand f\u00fcr die Datei ist billig und harmlos. Aber sie ist kein bewiesener Hebel. Auf der <a href=\"https:\/\/www.searchenginejournal.com\/google-search-central-apac-2025-everything-day-one\/551634\/\" target=\"_blank\" rel=\"noopener\">Search Central Live im Juli 2025<\/a> stellte Gary Illyes klar, dass llms.txt keine Google-Initiative ist und Google nicht plant, das Format zu unterst\u00fctzen. <a href=\"https:\/\/www.searchenginejournal.com\/google-says-llms-txt-comparable-to-keywords-meta-tag\/544804\/\" target=\"_blank\" rel=\"noopener\">John Mueller<\/a> hatte sie schon im Fr\u00fchjahr 2025 mit dem l\u00e4ngst ignorierten Keywords-Meta-Tag verglichen, weil sie vom Seitenbetreiber kontrolliert und damit letztlich eine Selbstauskunft ist, die man genauso gut direkt an der Seite \u00fcberpr\u00fcfen k\u00f6nnte. Im Dezember 2025 tauchte eine llms.txt kurz <a href=\"https:\/\/www.searchenginejournal.com\/googles-llms-txt-guidance-depends-on-which-product-you-ask\/575431\/\" target=\"_blank\" rel=\"noopener\">in Googles eigener Entwickler-Dokumentation<\/a> auf und war am selben Tag wieder weg, allem Anschein nach ein automatischer Rollout des Redaktionssystems, keine Kurs\u00e4nderung. Wie es mit der Nutzung auf Anbieterseite wirklich steht, ist un\u00fcbersichtlich: formell als Standard zugesagt hat es keiner, Google lehnt ausdr\u00fccklich ab, OpenAI hat sich nicht festgelegt. Von einzelnen Anbietern hei\u00dft es, sie ber\u00fccksichtigten das Format in ihren Abl\u00e4ufen, aber diese Angaben stammen aus SEO-Quellen, nicht aus offiziellen Hersteller-Mitteilungen. Ich verkaufe das also nicht als Wundermittel. Es schadet nicht, es ist schnell gemacht, aber es ist eher eine H\u00f6flichkeitsgeste an Maschinen als ein Garant f\u00fcr irgendetwas.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Anders sieht es bei der strukturierten Identit\u00e4t aus. Hier ist aus \u201eich habe da mal was erw\u00e4hnt&#8220; etwas Substantielles geworden. Nicht weil ein Schema magisch wirkt, sondern weil mich der Prozess gezwungen hat, meine eigene Online-Existenz aufzur\u00e4umen, Widerspr\u00fcche zu beseitigen und nur noch Pr\u00fcfbares zu behaupten. Das w\u00e4re auch ohne jede Maschine eine gute \u00dcbung gewesen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und meine selbstironische Prognose von damals, dass klassische Blogs seltener werden? Die stimmt und stimmt nicht. Dieser Blog schreibt weiter, sehr aktiv sogar. Aber die Verteilung verschiebt sich tats\u00e4chlich. Neue Beitr\u00e4ge gehen \u00fcber ActivityPub ins Fediverse und \u00fcber eine Br\u00fccke nach Bluesky, nicht mehr in erster Linie \u00fcber die Suchmaschine zum Leser. Insofern st\u00fctzt die Realit\u00e4t die Prognose, sie widerlegt nur das \u201eBlog ist tot&#8220;-Pathos. Es ist kein Sterben, es ist ein Umzug der Verteilwege.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Hat die Maschinenlesbarkeit messbar etwas gebracht? Differenziert betrachtet ja und nein. Die KI-Crawler holen die strukturierten Daten nachweislich ab, das war meine Anfangsprognose und sie hat sich best\u00e4tigt. Aber Abruf ist nicht gleich Klick. Die Klick-Konversion aus diesen Kan\u00e4len ist niedrig. Das ist kein Widerspruch, das ist genau der Punkt des ganzen Themas, siehe Zero-Click weiter oben. Sichtbar zu sein und besucht zu werden sind zwei verschiedene Dinge geworden.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Damit zum Kerngedanken, der f\u00fcr mich am Ende \u00fcbrig bleibt: Man kontrolliert nicht, ob eine KI einen zitiert. Man kontrolliert nur, ob man zitierbar ist. Das ist die ganze Aufgabe. Fehlende oder widerspr\u00fcchliche Daten machen ein Zitat fast unm\u00f6glich. Saubere, konsistente, belegbare Daten machen es wahrscheinlicher. Mehr Versprechen gibt es nicht, und jeder, der mehr verspricht, verkauft etwas. SEO ist dabei \u00fcbrigens nicht tot, das w\u00e4re \u00dcbertreibung. Technische Hygiene, Crawlbarkeit und gute Inhalte bleiben die Basis. Es verschieben sich nur die Gewichte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vor einem halben Jahr habe ich geschrieben, ich sei gespannt, was passiert. Daran hat sich nichts ge\u00e4ndert. Ich wei\u00df heute ein paar Dinge genauer, ich habe meine eigene Anfangs-Euphorie an einigen Stellen kassiert, und ich habe vor allem gelernt, dass der ehrlichste Weg auch der robusteste ist. Ob das langfristig der richtige war, wei\u00df ich immer noch nicht. Ich bin weiterhin gespannt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Siehe auch:<\/strong> <a href=\"https:\/\/www.kernel-error.de\/2026\/01\/01\/von-seo-zu-aeo-warum-llms-txt-json-ld-und-answer-engines-das-web-veraendern\/\">Von SEO zu AEO, warum llms.txt, JSON-LD und Answer Engines das Web ver\u00e4ndern<\/a> (der Vorg\u00e4ngerpost mit der urspr\u00fcnglichen Wette).<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Gegenmeinung, eigene Erfahrungen oder ein Befund, der meinem widerspricht? Immer her damit, einfach <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein gutes halbes Jahr nach meinem Beitrag von SEO zu AEO der ehrliche Kassensturz: was sich gehalten hat, was naiv war und was eine maschinenlesbare, verifizierbare Identit\u00e4t wirklich bringt. Dazu Zahlen zu Zero-Click und KI-Antworten, jeweils mit Quelle und Grenze, und warum llms.txt kein Wundermittel ist.<\/p>\n","protected":false},"author":1,"featured_media":4803,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,276],"tags":[403,256,336,429,440,402,332,441],"class_list":["post-4801","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-self-hosting-infrastruktur","tag-aeo","tag-ai","tag-ai-search","tag-fediverse","tag-knowledgegraph","tag-llm","tag-seo","tag-structureddata","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4801"}],"version-history":[{"count":1,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4801\/revisions"}],"predecessor-version":[{"id":4804,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4801\/revisions\/4804"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4803"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4699,"date":"2026-06-08T18:54:23","date_gmt":"2026-06-08T16:54:23","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4699"},"modified":"2026-06-08T18:54:23","modified_gmt":"2026-06-08T16:54:23","slug":"fr24feed-ntp-bug-1-0-57-fix-timesyncd","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/06\/08\/fr24feed-ntp-bug-1-0-57-fix-timesyncd\/","title":{"rendered":"ADS-B-Feeder, Teil 2: der NTP-Bug in fr24feed ist in 1.0.57 gefixt, nur anders als gedacht"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/adb-ntp-fr24-1024x683.png\" alt=\"Raspberry Pi mit RTL-SDR-Stick und ADS-B-Antenne vor einer Flugradar-Karte. Das Beitragsbild thematisiert die Behebung des NTP-Problems in fr24feed 1.0.57 und die erfolgreiche Wiederanbindung eines Flightradar24-Feeders.\" class=\"wp-image-4701\" style=\"aspect-ratio:1.4992791994609649;width:115px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/adb-ntp-fr24-1024x683.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/adb-ntp-fr24-300x200.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/adb-ntp-fr24-768x512.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/adb-ntp-fr24-676x451.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/06\/adb-ntp-fr24.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Im ersten Teil dieser kleinen ADS-B-Saga hatte ich am Ende eine Sache offen gelassen und sie sogar fett in die Was-noch-kommt-Liste geschrieben: MLAT aktivieren, sobald Flightradar24 den NTP-Bug fixt. Heute ist es soweit. Der Fix ist da, er kam mit Version 1.0.57, und er kam ganz anders als ich erwartet h\u00e4tte. Statt den kaputten NTP-Client zu reparieren, hat FR24 ihn einfach rausgeworfen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer den ersten Teil noch nicht kennt, holt das am besten kurz nach: <a href=\"https:\/\/www.kernel-error.de\/2026\/03\/18\/eigener-ads-b-feeder-flugzeuge-tracken-mit-raspberry-pi-rtl-sdr-und-selbstgebauter-antenne\/\">Eigener ADS-B Feeder: Flugzeuge tracken mit Raspberry Pi, RTL-SDR und selbstgebauter Antenne<\/a>. Dort steht das komplette Setup, die selbstgebaute Antenne und eben die Geschichte mit dem NTP-Bug, der meinen Feeder \u00fcber Wochen am Online-Gehen gehindert hat. Den Bug selbst erkl\u00e4re ich hier nur noch in ein paar S\u00e4tzen, die lange Version steht dr\u00fcben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Worum es ging, ganz kurz<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Seit Version 1.0.55 hatte der <code>fr24feed<\/code>-Daemon einen internen NTP-Client, der schlicht nichts tat. Kein einziges Paket auf Port 123, also keine Zeitsynchronisation, und ohne synchronisierte Zeit l\u00e4sst FR24 den Feeder nicht online gehen. Man h\u00e4ngt in einer Endlosschleife aus <code>Failed to synchronize<\/code> fest und kommt nie \u00fcber dieses Sync-Gate hinaus. Mein Workaround war die letzte funktionierende Version 1.0.54 mit <code>apt-mark hold<\/code> festzunageln und auf einen Fix zu warten.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Im M\u00e4rz hatte ich FR24 einen Bug-Report mit strace- und tcpdump-Belegen geschickt. Die Antwort von Muazzam aus dem Support: auf ihrer Seite nicht reproduzierbar, Verdacht auf eine Regression durchs Build-System und nicht durch eine \u00c4nderung am NTP-Client selbst. Ich blieb hartn\u00e4ckig, lieferte am 6. Juni eine syscall-genaue A\/B-Analyse nach, und am 8. Juni kam die erl\u00f6sende Mail (Ticket #741092): \u201eshould be fixed in v 57 which will be released later today&#8220;. War es dann auch, noch am selben Tag lag 1.0.57-1 im Repo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Warum ich nicht einfach apt upgrade tippe<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">fr24feed ist closed-source, propriet\u00e4r, kein GitHub, keine Quellen. Ich kann ein Release also nicht am Code beurteilen, sondern nur an seinem Verhalten. Und ein blindes Upgrade auf dem laufenden Produktiv-Feeder kam nicht in Frage. Wenn 1.0.57 genauso kaputt gewesen w\u00e4re wie 1.0.56, h\u00e4tte ich mir den Feeder zerschossen und m\u00fcsste erst wieder zur\u00fcckrollen, bevor \u00fcberhaupt wieder Daten fliessen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die saubere Variante: das Binary aus dem <code>.deb<\/code> extrahieren und als isolierte Wegwerf-Instanz gegen eine Wegwerf-Config unter strace laufen lassen. Eigener Fake-Key, ein toter Receiver-Port, der echte Feeder l\u00e4uft dabei unber\u00fchrt weiter. Erst wenn der Testlauf sauber durchkommt, fasse ich die Produktion an.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der Testaufbau, eine Wegwerf-Instanz unter strace<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die Test-Config ist bewusst minimal gehalten. Sie muss nur weit genug kommen, dass der Feeder die Zeitsynchronisation versucht, alles danach interessiert f\u00fcr diesen Test nicht:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fr24key=0123456789abcdef\nreceiver=beast-tcp\nhost=127.0.0.1:39999    # absichtlich toter Port, fuer die NTP-Phase egal\nbs=no\nraw=no\nmlat=no\nlogmode=0<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Dann sehen, ob der Pi die neue Version \u00fcberhaupt schon sieht, und das Paket herunterladen ohne es zu installieren:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-cache policy fr24feed\n#   Installed: 1.0.54-0\n#   Candidate: 1.0.57-1\n#      1.0.57-1 500 https:\/\/repo-feed.flightradar24.com flightradar24\/raspberrypi-stable arm64\n\napt-get download fr24feed\ndpkg-deb -x fr24feed_1.0.57-1_arm64.deb extract57<\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Erst die Toolchain vergleichen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bevor ich \u00fcberhaupt gestartet habe, ein kurzer Blick in die <code>.comment<\/code>-Section der ELF-Binaries. Die verr\u00e4t, mit welchem Compiler gebaut wurde, und genau das war FR24s Verdacht:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">readelf -p .comment extract57\/usr\/bin\/fr24feed | grep -i gcc\n#   GCC: (Debian 14.2.0-19) 14.2.0                       1.0.57 (und 1.0.56)\nreadelf -p .comment \/usr\/bin\/fr24feed | grep -i gcc\n#   GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0           1.0.54 (funktioniert)<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das ist der interessante Punkt: 1.0.57 ist mit <strong>derselben GCC-14-Toolchain<\/strong> gebaut wie das kaputte 1.0.56. \u201eNeu kompiliert&#8220; allein ist also noch kein Fix, sonst w\u00e4re 1.0.56 ja schon heil gewesen. Genau das machte den strace-Test erst spannend, denn ich konnte nicht aus der Versionsnummer ableiten, ob sich am Verhalten wirklich etwas ge\u00e4ndert hat. Der Sprung von GCC 11 auf 14 plus der Distro-Wechsel von Ubuntu 22.04 auf Debian ist gross. GCC 14 ist deutlich strenger bei Undefined Behaviour und uninitialisierten Daten, und ein latenter Bug im NTP-Transmit-Pfad konnte unter GCC 11 unsichtbar bleiben und unter GCC 14 dann brechen. FR24s Build-System-Theorie war im Nachhinein also gar nicht so abwegig.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der A\/B-Lauf<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beide Versionen, die neue 1.0.57 und die installierte 1.0.54 als Kontrolle, laufen durch denselben Harness, auf derselben Maschine, am selben Tag. Ich tracke nur die Netzwerk-Syscalls, das reicht um zu sehen ob da etwas auf Port 123 geht:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">timeout -s INT 125 strace -f -tt -e trace=%network -yy -o v57_today.strace extract57\/usr\/bin\/fr24feed --config-file=test.ini &gt; v57_today.log 2&gt;&amp;1<\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Das Ergebnis, und es \u00fcberrascht<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Mein Abnahmekriterium war simpel formuliert: <code>sendto<\/code> auf Port 123 muss wieder feuern, dann ist der NTP-Client repariert. Das Ergebnis war eine kalte Dusche und gleichzeitig die ganze Pointe dieser Geschichte:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>1.0.54 (Kontrolle)<\/th><th>1.0.56 (kaputt)<\/th><th>1.0.57-1 (neu)<\/th><\/tr><\/thead><tbody><tr><td>NTP <code>sendto<\/code> auf Port 123<\/td><td>3x (eigener Client)<\/td><td>0x<\/td><td>0x, Client entfernt<\/td><\/tr><tr><td>Source-Address-Discovery<\/td><td>ja<\/td><td>ja<\/td><td>ja (Rest-Code)<\/td><\/tr><tr><td>Zeitsync-Log<\/td><td>offset +0.001 s<\/td><td>Failed to synchronize<\/td><td>confirmed with timesyncd<\/td><\/tr><tr><td>Failed-to-synchronize-Loop<\/td><td>nein<\/td><td>ja, endlos<\/td><td>nein<\/td><\/tr><tr><td>Kommt \u00fcber das Sync-Gate?<\/td><td>ja<\/td><td>nein<\/td><td>ja<\/td><\/tr><tr><td>Toolchain<\/td><td>GCC 11.4.0<\/td><td>GCC 14.2.0<\/td><td>GCC 14.2.0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">\u00dcber den gesamten 125-Sekunden-Lauf von 1.0.57 hinweg gab es <strong>kein einziges Paket<\/strong> auf Port 123. Null. Genau wie beim kaputten 1.0.56. Nach meinem urspr\u00fcnglichen Kriterium h\u00e4tte ich das Release durchfallen lassen m\u00fcssen. Und trotzdem war der Bug weg. Der entscheidende Hinweis steht eine Zeile vorher im Log:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[time][i]Time synchronization confirmed with timesyncd\n[feed][i]Downloading configuration\n[main][i]Feed Network client started\n[feed][d]Fetching configuration\n[feed][e]Result: failure, message: Not found, check your key!<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der einzige Fehler im ganzen Testlauf ist \u201echeck your key!&#8220;, und der ist erwartet, weil meine Test-Config absichtlich den Fake-Key <code>0123\u2026<\/code> benutzt. Das heisst: der Feeder l\u00e4uft komplett durch bis zur Feed-Registrierung. Genau <strong>vor<\/strong> diesem Punkt hingen 1.0.55 und 1.0.56 endlos in ihrer Sync-Schleife fest. Bug also weg, nur eben nicht so, wie ich gedacht hatte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zum Vergleich der Beweis aus dem 1.0.54-Kontrolllauf, wo der eigene NTP-Client noch feuert. Hier sieht man das <code>sendto<\/code> auf Port 123 schwarz auf weiss:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sendto(5&lt;UDP:[25798]&gt;, \"33...\", 48, 0,\n       {sa_family=AF_INET, sin_port=htons(123),\n        sin_addr=inet_addr(\"85.10.204.50\")}, 16) = 48\n[time][i]Time synchronized correctly, offset +0.001 seconds<\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Pragmatischer Workaround statt echtem Fix<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was FR24 gemacht hat, ist kein Reparieren des NTP-Clients, sondern ein Umgehen des Problems auf Architektur-Ebene. Der kaputte interne Client ist raus, \u00fcbrig geblieben ist nur noch etwas Rest-Code f\u00fcr die Source-Address-Discovery. Die eigentliche Zeitsynchronisation delegiert der Feeder jetzt an <code>systemd-timesyncd<\/code>, also an den NTP-Dienst des Betriebssystems. Statt selbst Pakete auf Port 123 zu schicken, fragt er das OS einfach: ist deine Zeit synchron? Und wenn ja, geht es weiter.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ehrlich gesagt finde ich das eine vern\u00fcnftige Entscheidung. Ein eigener NTP-Client in einer Feeder-Software war ohnehin Reinventing the Wheel, das Betriebssystem kann das besser und macht es sowieso schon. Dass der eigentliche Bug damit nie wirklich gefunden wurde, ist aus Ingenieurssicht ein kleiner Wermutstropfen, aber f\u00fcr den Anwender z\u00e4hlt nur, dass der Feeder l\u00e4uft. Und das tut er.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Das Upgrade mit Sicherheitsnetz<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Erst nachdem der Testlauf sauber durch war, ging es an die Produktion. Vorher noch das alte Paket und die Config wegsichern, damit ein Rollback jederzeit ein Einzeiler bleibt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cp \/var\/cache\/apt\/archives\/fr24feed_1.0.54-0_arm64.deb \/tmp\/fr24test\/rollback\/\nsudo cp \/etc\/fr24feed.ini \/etc\/fr24feed.ini.bak-20260608-161113\n\nsudo apt-mark unhold fr24feed\nsudo apt-get install -y --only-upgrade fr24feed   # 1.0.54-0 auf 1.0.57-1\n\n# Stolperstein: das Paket STOPPT den Dienst beim Upgrade, startet ihn aber nicht neu\nsudo systemctl start fr24feed\n\n# Wieder pinnen, jetzt auf die verifiziert gute Version\nsudo apt-mark hold fr24feed<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Stolperstein mit dem nicht neu gestarteten Dienst ist eine Kleinigkeit, kostet aber Nerven wenn man es nicht weiss und sich wundert warum der Feeder nach dem Upgrade tot ist. Ein <code>systemctl start<\/code> sp\u00e4ter lief alles. Die Verifikation kam aus der <code>monitor.json<\/code> und dem Journal:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"build_version\":\"1.0.57-1\"\n\"feed_status\":\"connected\"\n\"feed_num_ac_tracked\":\"92\"\n\n[time][i]Time synchronization confirmed with timesyncd\n[reader][i]Timestamp source changed from UNKNOWN to SYSTEM-VALIDATED\n[feed][n]connected via UDP (fd 6)\n[feed][n]working\n[feed][i]sent 46,0 AC<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><code>feed_status: connected<\/code> und 92 getrackte Flugzeuge. Nach Wochen auf der festgenagelten 1.0.54 ist der Feeder endlich wieder auf einer aktuellen Version und kommt sauber \u00fcber das Sync-Gate. Genau das wollte ich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Die Kehrseite, eine neue Abh\u00e4ngigkeit<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer einen eigenen Feeder betreibt, sollte das hier auf dem Schirm haben: 1.0.57 spricht selbst kein NTP mehr, also <strong>braucht es jetzt einen laufenden NTP-Dienst im Betriebssystem<\/strong>. Auf dem Standard-Pi24-Image ist das systemd-timesyncd, und damit funktioniert es out of the box. Kurz pr\u00fcfen schadet trotzdem nicht:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">systemctl is-active systemd-timesyncd     # active\ntimedatectl show -p NTPSynchronized       # NTPSynchronized=yes<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer timesyncd oder chrony bewusst deaktiviert hat, oder ein abgespecktes Image ganz ohne NTP-Daemon f\u00e4hrt, k\u00f6nnte mit 1.0.57 jetzt ein <strong>neues<\/strong> Sync-Problem bekommen. Das ist der Preis des pragmatischen Fixes: FR24 hat die Verantwortung f\u00fcrs Zeit-Setzen ans OS abgegeben, und damit muss das OS sie auch wahrnehmen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Bonus-Fund: 1.0.57 bringt native GPS-Unterst\u00fctzung<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beim St\u00f6bern im neuen Binary ist mir noch etwas aufgefallen, das f\u00fcr die MLAT-Frage aus Teil 1 hochinteressant ist: 1.0.57 bringt einen <code>PositioningNmeaDecoder<\/code> und eine ganze Reihe neuer <code>gps-<\/code>-Direktiven mit. Das k\u00f6nnte heissen, dass sich der VK-162 endlich f\u00fcr das MLAT-Timing nutzen l\u00e4sst, das ja bislang auf <code>NOT-PERMITTED<\/code> stand.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">strings \/usr\/bin\/fr24feed | grep -oE 'gps-[a-z-]+' | sort -u\n#   gps-altitude gps-antenna-connected gps-base-timestamp gps-ip gps-latitude\n#   gps-longitude gps-mode gps-status gps-time ...\n\n# Welcher gps-mode-Wert ist gueltig? Durchprobiert:\n#   gps-mode=serial  -&gt; [e]Unsupported gps-mode=serial!\n#   gps-mode=nmea    -&gt; akzeptiert (einziger gueltiger Wert)<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">So weit, so vielversprechend. Mit <code>gps-mode=nmea<\/code> plus <code>mlat-without-gps=no<\/code> \u00f6ffnet das Binary dann aber <code>\/dev\/ttyACM0<\/code> <strong>nicht<\/strong> selbst, sondern loggt nur stoisch:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[main][i]Waiting for GPS time<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">An der Hardware liegt es nicht, die liefert nachweislich einen sauberen Fix mit 9 Satelliten, parallel mitgelesen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$GPGGA,161727.00,5034.69002,N,00656.93035,E,1,09,0.86,384.0,M,...   # Fix, 9 Sat, 384 m<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Meine erste Vermutung war, dass 1.0.57 die NMEA-Daten gepusht erwartet, also \u00fcber die Beast- und Decoder-Strecke oder \u00fcber eine Netzwerkquelle per <code>gps-ip<\/code> statt \u00fcber ein direktes Serial-Open des Dongles. Statt auf der Produktion herumzuraten habe ich FR24 aber lieber direkt gefragt, welche <code>fr24feed.ini<\/code>-Schl\u00fcssel zu einem seriell angeschlossenen NMEA-GPS geh\u00f6ren, Device-Pfad, Baudrate und so weiter.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Update vom 9. Juni 2026:<\/strong> Die Antwort von Muazzam aus dem Support (weiterhin Ticket #741092) kam am n\u00e4chsten Tag und war kurz, aber unmissverst\u00e4ndlich:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-small-font-size wp-block-paragraph\">No, a local gps won&#8217;t help with mlat. For good mlat you need nano second timestamps that fpga provides. Also, we dont have an support for it.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Damit ist die Frage abschliessend beantwortet, wenn auch anders als erhofft. Ein lokal angeschlossener Serial- oder NMEA-GPS ist f\u00fcr MLAT schlicht keine g\u00fcltige Timing-Quelle, und fr24feed unterst\u00fctzt diesen Fall auch gar nicht. Der Grund steckt in der Physik der Multilateration: MLAT rechnet Flugzeugpositionen aus den Laufzeitunterschieden desselben Signals an mehreren Empf\u00e4ngern aus. Damit das aufgeht, m\u00fcssen die Empf\u00e4nger ihre Empfangszeitpunkte im Nanosekunden-Bereich stempeln, und solche Zeitstempel liefert nur dedizierte FPGA-Hardware der Radarcape-Klasse. Ein NMEA-GPS \u00fcber USB-Serial hat dagegen Jitter im Millisekunden-Bereich, aus der USB-Latenz und dem Timing der NMEA-S\u00e4tze. Das sind gut sechs Gr\u00f6ssenordnungen daneben, und selbst mit einem sauberen PPS-Signal kommt man an die FPGA-Genauigkeit nicht heran.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das ordnet auch mein <code>gps-mode=nmea<\/code>-Experiment von oben sauber ein. Die GPS-Direktiven in 1.0.57 dienen faktisch nur der Positionsangabe, nicht dem MLAT-Timing. Das beobachtete <code>[main][i]Waiting for GPS time<\/code>, ohne dass der Feeder <code>\/dev\/ttyACM0<\/code> \u00fcberhaupt \u00f6ffnet, war also kein Konfigurationsfehler meinerseits, sondern schlicht fehlender Support f\u00fcr genau diesen Anwendungsfall.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">F\u00fcr mich heisst das, der GPS-Dongle der seit M\u00e4rz f\u00fcr genau diesen Moment bereitliegt, bleibt vorerst in der Schublade. Etwas schade, aber die Begr\u00fcndung ist nachvollziehbar und technisch sauber. Und f\u00fcr alle mit dem gleichen Setup ist die Lehre eindeutig: mit einem reinen RTL-SDR plus USB-GPS l\u00e4sst sich MLAT bei FR24 nicht aktivieren, egal welche <code>fr24feed.ini<\/code>-Verdrahtung man probiert. MLAT bleibt dauerhaft auf <code>NOT-PERMITTED<\/code>. Wer MLAT wirklich will, kommt um Timing-Hardware mit FPGA nicht herum.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Fazit, und die eigentliche Lehre<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die sch\u00f6nste Lektion steckt nicht in der Versionsnummer, sondern in meinem Abnahmekriterium. Ich war so auf den einen Syscall fixiert, dass ich beinahe das richtige Ergebnis als Fehlschlag abgehakt h\u00e4tte. <code>sendto<\/code> auf Port 123 war nie das eigentliche Ziel, das war nur die zuf\u00e4llige Art, wie 1.0.54 die Zeit synchronisiert hat. Das richtige Erfolgskriterium war die ganze Zeit ein anderes: kommt der Feeder \u00fcber das Sync-Gate, ja oder nein. Ein bestimmter Syscall ist Mittel zum Zweck, nicht der Zweck selbst. Wer Verhalten testet statt Implementierung, l\u00e4uft seltener in so eine Falle.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">FR24 bekommt von mir Lob f\u00fcr die schnelle Reaktion am Ende und einen pragmatischen Fix, der das Problem zuverl\u00e4ssig erledigt. Ein kleiner Kritikpunkt bleibt, dass der eigentliche Bug nie gefunden wurde, sondern nur umgangen. Aber Hand aufs Herz: ein funktionierender Feeder ist mir lieber als ein vollst\u00e4ndig aufgekl\u00e4rter, der nicht l\u00e4uft. Mein Beitrag war am Ende vor allem die Reproduktion auf genau der arm64-Hardware, die FR24 im M\u00e4rz nicht zum Fehler bringen konnte. Dass der Fix jetzt auf eben dieser Maschine h\u00e4lt, habe ich dem Support noch einmal zur\u00fcckgemeldet, damit sie die Regression sauber abschliessen k\u00f6nnen. Manchmal ist der wertvollste Teil eines Bug-Reports, dass man hartn\u00e4ckig bleibt und sauber misst.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Siehe auch:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><a href=\"https:\/\/www.kernel-error.de\/2026\/03\/18\/eigener-ads-b-feeder-flugzeuge-tracken-mit-raspberry-pi-rtl-sdr-und-selbstgebauter-antenne\/\">Eigener ADS-B Feeder: Flugzeuge tracken mit Raspberry Pi, RTL-SDR und selbstgebauter Antenne<\/a> (Teil 1, die Vorgeschichte)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.kernel-error.de\/2026\/03\/08\/raspberry-pi-als-serieller-konsolenserver\/\">Raspberry Pi als serieller Konsolenserver<\/a> (noch ein Pi mit neuer Aufgabe)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.kernel-error.de\/2026\/05\/29\/ms2109-vga-usb-capture-reverse-engineering-edid-1080p\/\">Billiger VGA-USB-Capture-Stick seziert: MS2109-Firmware, EDID-Hack und die 1080p-L\u00fcge<\/a> (noch eine closed-source-Hardware seziert)<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Betreibt ihr selbst einen FR24-Feeder und seid \u00fcber den NTP-Bug gestolpert, oder lasst ihr MLAT \u00fcber dedizierte Timing-Hardware mit FPGA laufen? Dann lasst es mich gerne wissen, ihr d\u00fcrft mich jederzeit <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der NTP-Bug in fr24feed, der meinen ADS-B-Feeder wochenlang offline gehalten hat, ist in 1.0.57 endlich weg. Flightradar24 hat den kaputten NTP-Client nicht repariert, sondern rausgeworfen und die Zeitsynchronisation an systemd-timesyncd \u00fcbergeben.<\/p>\n","protected":false},"author":1,"featured_media":4701,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,274,273],"tags":[355,356,36,437,24,357,439,438],"class_list":["post-4699","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-linux-bsd","category-netzwerke-protokolle","tag-ads-b","tag-flightradar24","tag-linux","tag-ntp","tag-raspberry-pi","tag-rtl-sdr","tag-strace","tag-systemd","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4699"}],"version-history":[{"count":3,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4699\/revisions"}],"predecessor-version":[{"id":4703,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4699\/revisions\/4703"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4701"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4653,"date":"2026-05-29T16:56:39","date_gmt":"2026-05-29T14:56:39","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4653"},"modified":"2026-05-29T17:30:27","modified_gmt":"2026-05-29T15:30:27","slug":"bosch-waermepumpentrockner-kondensator-reinigen-service-klappe-3d-druck","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/29\/bosch-waermepumpentrockner-kondensator-reinigen-service-klappe-3d-druck\/","title":{"rendered":"Bosch W\u00e4rmepumpentrockner: Kondensator reinigen trotz SelfCleaning, Service-Klappe selbst geschnitten und gedruckt"},"content":{"rendered":"\n<p class=\"has-small-font-size wp-block-paragraph\">Vor knapp 11 Jahren ist bei uns einer dieser W\u00e4rmepumpentrockner eingezogen. Das Ger\u00e4t hat seitdem wirklich viel W\u00e4sche gesehen, einen Haushalt mit dem t\u00e4glichen Berg an Handt\u00fcchern, Bettzeug und Kinderkram trocknet so ein Ding nicht nebenbei. \u00dcber die ganze Zeit lief er eigentlich problemlos. Zwei Mal musste ich ihn zerlegen und reinigen, sonst nichts. Genau dieser Punkt ist es aber, der mich diesmal \u00fcber eine Stunde und ein Teppichmesser gekostet hat.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-768x1024.jpg\" alt=\"Bosch Home Professional W\u00e4rmepumpentrockner WTY87701 von vorne mit Aufdruck SelfCleaning Condenser und ActiveAir Technology\" class=\"wp-image-4642\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-waermepumpentrockner-front-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Der Patient: Bosch WTY87701 Home Professional, ausgerechnet mit dem Aufdruck SelfCleaning Condenser.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Symptom ist immer das gleiche: Die W\u00e4sche wird einfach nicht mehr richtig trocken. Teilweise musste ein Programm zwei bis drei Mal durchlaufen, bis das Zeug aus der Trommel wirklich trocken war. F\u00fcr einen Trockner, der laut Datenblatt 232 kWh im Jahr ziehen soll, sind drei Durchl\u00e4ufe pro Ladung nat\u00fcrlich eine Katastrophe, energetisch wie zeitlich. Meine Frau hatte das Ger\u00e4t zu dem Zeitpunkt schon angez\u00e4hlt. Es blieb also noch ein Versuch, dann fliegt es raus.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Warum ein W\u00e4rmepumpentrockner \u00fcberhaupt zusetzt<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ein W\u00e4rmepumpentrockner ist im Kern ein geschlossener Kreislauf. Die warme, feuchte Luft aus der Trommel wird an einem Verdampfer abgek\u00fchlt, das Wasser kondensiert und landet im Tank, dann wird die Luft an einem Kondensator wieder aufgeheizt und zur\u00fcck in die Trommel geblasen. Dieser W\u00e4rmetauscher mit seinen eng stehenden Aluminiumlamellen ist das Herz des Ger\u00e4ts. Und genau dort lagern sich \u00fcber die Jahre feinste Flusen ab, die das Sieb passieren. Setzt sich die Lamellenfl\u00e4che zu, kommt kaum noch Luft durch, der W\u00e4rmeaustausch bricht ein, und die W\u00e4sche bleibt klamm. Genau das beschreiben auch die einschl\u00e4gigen Reparaturanleitungen: Flusen in den hinteren Kondensatorlamellen f\u00fchren zu langen Laufzeiten und einer W\u00e4rmepumpe, die sich abm\u00fcht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Die Ironie: ein SelfCleaning Condenser, der trotzdem dicht ist<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Sch\u00f6ne an meinem Ger\u00e4t: vorne prangt in gro\u00dfen Lettern <strong>SelfCleaning Condenser<\/strong>. Bosch wirbt damit, dass eine manuelle Reinigung des Kondensators nicht mehr n\u00f6tig sei. Technisch steckt dahinter, dass w\u00e4hrend eines Trockengangs mehrfach Kondenswasser aus dem Prozess abgezweigt und \u00fcber die Kondensatorfl\u00e4che gesp\u00fclt wird, um Flusen wegzuschwemmen. Das funktioniert auch, aber eben nur an der vorderen, gut erreichbaren Fl\u00e4che, die der Sp\u00fclstrahl trifft. Die tieferen Lamellen und der Verdampfer dahinter bekommen davon nichts ab. Dort sammelt sich der Feinstaub \u00fcber ein Jahrzehnt trotzdem an. \u201eSelbstreinigend&#8220; hei\u00dft hier also \u201edie vordere Ebene bleibt frei&#8220;, nicht \u201eder ganze W\u00e4rmetauscher bleibt sauber&#8220;. Nach knapp 11 Jahren ist der Unterschied dramatisch.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Hier die Eckdaten zum Ger\u00e4t und zum Bauteil, um das sich gleich alles dreht:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Ger\u00e4t<\/td><td>Bosch WTY87701, Home Professional<\/td><\/tr><tr><td>Typ \/ FD<\/td><td>WDT66, FD 9505<\/td><\/tr><tr><td>Bauart<\/td><td>W\u00e4rmepumpentrockner, 8 kg, A++, ActiveAir Technology, SelfCleaning Condenser<\/td><\/tr><tr><td>Service-Klappe (Teilenummer)<\/td><td>BSH 00646776, ca. 225 x 145 mm, mit Dichtung und 6 Schrauben<\/td><\/tr><tr><td>Klappe passt laut Teilekatalog auf<\/td><td>Bosch Serie 6 \/ Serie 8 \/ Maxx 7, Siemens iQ300 bis iQ800<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-1024x768.jpg\" alt=\"Typenschild des Bosch WTY87701 mit E-Nr WTY87701, Typ WDT66, FD-Nummer 9505 und Herstellungsangaben\" class=\"wp-image-4643\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-typenschild-wdt66-fd9505-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Typenschild: E-Nr. WTY87701, Typ WDT66, FD 9505, mit allen Kenndaten f\u00fcr die Ersatzteilsuche.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wo man rankommt, und wo eben nicht<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das gro\u00dfe Flusensieb innen vor der Trommel ist schnell raus, da bekommt man mit schmalen Fingern auch etwas heraus, aber an die spannenden Stellen kommt man so nicht. Vorne am Ger\u00e4t gibt es noch eine kleine Abdeckung. Rechts dahinter sitzt ein L\u00fcfter, links sieht es zumindest so aus, als h\u00e4tte dort mal jemand \u00fcber eine Art Klappe nachgedacht. Und zwar genau an der Stelle, an der man eine Klappe br\u00e4uchte, wenn man den Kondensator selbst reinigen will. Bei meinen letzten beiden Reinigungen konnte ich alles andere \u00f6ffnen und sauber machen, aber an den Kondensator selbst kam ich nie richtig heran. Diesmal sollte es anders laufen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Die Klappe, die Bosch vergessen hat einzubauen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Jetzt kommt der Teil, der mich erst gewundert und dann ge\u00e4rgert hat. Die Stelle, an der ich die Klappe erwartet h\u00e4tte, ist im Geh\u00e4use <strong>fast schon vorperforiert<\/strong>. Die Kontur ist angedeutet, das Material an der Linie sp\u00fcrbar d\u00fcnner. Mit einem Teppichmesser l\u00e4sst sich die \u00d6ffnung sehr einfach herstellen, man folgt einfach der angedachten Linie. Hei\u00dft im Klartext: Bosch hat die Service-\u00d6ffnung konstruktiv komplett vorgesehen, das Werkzeug f\u00fcr die Stanzung existiert, die Position stimmt, nur ausgeliefert wird das Ger\u00e4t mit zugemachter Wand und ohne Klappe. F\u00fcr genau diese L\u00fccke gibt es sogar eine eigene Ersatzteilnummer, die <strong>00646776<\/strong>, und einen ganzen Zubeh\u00f6rmarkt. Right to Repair sieht anders aus.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-768x1024.jpg\" alt=\"Aus der Trocknerwand herausgeschnittenes Kunststoffst\u00fcck an der vorperforierten Stelle der Service-\u00d6ffnung\" class=\"wp-image-4644\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-gehaeuse-ausschnitt-service-klappe-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Das herausgetrennte St\u00fcck Geh\u00e4usewand. Die Kontur war vorperforiert, ein Teppichmesser entlang der angedachten Linie gen\u00fcgt.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was dann hinter der frisch geschnittenen \u00d6ffnung zum Vorschein kam, war wirklich ekelig. Die Flusen hingen als kompakter, grauer Filz komplett vor den K\u00fchlrippen und haben den W\u00e4rmetauscher zu einem gro\u00dfen Teil verdeckt. So kann der Kondensator nat\u00fcrlich nicht mehr arbeiten, da geht schlicht keine Luft mehr durch.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-1024x576.jpg\" alt=\"Mit grauem Flusenfilz komplett zugesetzte K\u00fchlrippen des Kondensators durch die geschnittene \u00d6ffnung\" class=\"wp-image-4645\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-1024x576.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-300x169.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-768x432.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-1536x864.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-2048x1152.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-zugesetzt-flusen-vorher-676x380.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Der Blick hinter die frisch geschnittene \u00d6ffnung. Ein kompakter Flusenfilz verdeckt fast den kompletten W\u00e4rmetauscher.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Alles vorsichtig herausgeholt, abgesaugt und feucht nachgewischt. Die Lamellen waren an einigen Stellen verbogen, die habe ich anschlie\u00dfend so gut wie m\u00f6glich wieder begradigt. Danach sah der W\u00e4rmetauscher wieder so aus, wie er soll: blankes Aluminium, freie Kan\u00e4le, Luft kann wieder hindurch.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-1024x576.jpg\" alt=\"Gereinigter Kondensator mit blanken Aluminiumlamellen und freien Luftkan\u00e4len nach dem Absaugen\" class=\"wp-image-4646\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-1024x576.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-300x169.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-768x432.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-1536x864.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-2048x1152.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-trockner-kondensator-gereinigt-nachher-676x380.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Nach dem Reinigen und Begradigen der Lamellen: blankes Aluminium, freie Kan\u00e4le, die Luft kommt wieder durch.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Variante 1: die Klappe selbst drucken<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bleibt die Frage, wie man das Loch wieder sauber und vor allem dicht verschlie\u00dft. Ein offenes Geh\u00e4use zieht Falschluft und st\u00f6rt den Kreislauf. Ich habe eine wirklich erstklassige Druckdatei f\u00fcr meinen <a href=\"https:\/\/bambulab.com\/de-de\/x1-carbon\" target=\"_blank\" rel=\"noopener\">Bambu Lab X1-Carbon<\/a> gefunden, ein Nachbau genau der BSH-Klappe 00646776: <a href=\"https:\/\/makerworld.com\/en\/models\/1325990-bsh-00646776-condenser-door-service-panel\" target=\"_blank\" rel=\"noopener\">BSH 00646776 Condenser Door Service Panel auf MakerWorld<\/a>.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Gedruckt habe ich die Abdeckung in gr\u00fcnem <strong>ABS<\/strong> und die Dichtung in <strong>TPU 95A<\/strong>. PLA w\u00e4re bei den Temperaturen rund um Kondensator und W\u00e4rmepumpe keine gute Idee. PLA f\u00e4ngt schon bei etwa 60 Grad an weich zu werden, sein Glas\u00fcbergang liegt genau in dem Bereich, den so eine Baugruppe im Dauerbetrieb durchaus erreicht. Das Teil w\u00fcrde sich auf Dauer verziehen und die Dichtfl\u00e4che verlieren. ABS liegt mit einem Glas\u00fcbergang um die 105 Grad deutlich dar\u00fcber und steckt die W\u00e4rme locker weg. F\u00fcr die Dichtung will man dagegen etwas Flexibles, das die Spaltma\u00dfe ausgleicht und sauber abdichtet, deshalb das weiche TPU mit Shore 95A. Die Materialkombination ist hier kein Gimmick, sondern genau richtig gew\u00e4hlt.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-768x1024.jpg\" alt=\"R\u00fcckseite der in gr\u00fcnem ABS gedruckten Service-Klappe mit Versteifungsrippen und eingepr\u00e4gter Teilenummer 00646776\" class=\"wp-image-4647\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-abs-rueckseite-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Die in gr\u00fcnem ABS gedruckte Abdeckung von hinten, mit Versteifungsrippen und eingepr\u00e4gter Teilenummer 00646776.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die Versteifungsrippen auf der R\u00fcckseite und die eingepr\u00e4gte Teilenummer zeigen, wie sauber die Datei gemacht ist. Mit aufgelegter TPU-Dichtung sieht das dann so aus:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-768x1024.jpg\" alt=\"Gedruckte ABS-Klappe mit aufgelegter blauer TPU-95A-Dichtung\" class=\"wp-image-4648\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-tpu-dichtung-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Dieselbe Klappe mit der separat in TPU 95A gedruckten Dichtung.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Montiert wird mit sechs Schrauben in die vorhandenen Dome rund um die \u00d6ffnung. Die selbst gedruckte Abdeckung passt erstklassig und dichtet alles ab, wie man es sich w\u00fcnscht.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-1024x768.jpg\" alt=\"Gr\u00fcn gedruckte Service-Klappe mit sechs Schrauben an der Trocknerfront montiert\" class=\"wp-image-4649\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-3d-druck-montiert-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Mit sechs Schrauben montiert. Die selbst gedruckte Klappe sitzt passgenau und dichtet sauber ab.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Variante 2: die fertige Klappe kaufen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer keinen 3D-Drucker hat, muss trotzdem nicht zum teuren Originalersatzteil greifen. Ich habe auf Amazon f\u00fcr knapp 15 Euro eine passende Abdeckung gefunden: <a href=\"https:\/\/amzn.to\/4nXXxpw\" target=\"_blank\" rel=\"noopener nofollow sponsored\">Wartungsklappe f\u00fcr den W\u00e4rmetauscher<\/a>. Die kommt aus spritzgegossenem, talkgef\u00fclltem Polypropylen (auf dem Bauteil steht die Materialkennung PP-TV30) und liegt damit thermisch ebenfalls im gr\u00fcnen Bereich. Im Set sind noch etwas Werkzeug zum Reinigen und sogar ein kleines Tool, mit dem sich die K\u00fchlrippen wieder begradigen lassen.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-1024x768.jpg\" alt=\"Gekauftes Reinigungsset mit Lamellenkamm, B\u00fcrsten, Schrauben und grauer Wartungsklappe\" class=\"wp-image-4650\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/waermepumpentrockner-reinigungsset-werkzeug-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Die gekaufte Alternative f\u00fcr knapp 15 Euro: Wartungsklappe plus Reinigungswerkzeug und ein kleines Tool zum Begradigen der Lamellen.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auch diese fertige Klappe sitzt sauber in der \u00d6ffnung und schlie\u00dft b\u00fcndig ab. Auf dem Bauteil sind Teilenummer und Materialkennung mit eingegossen.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-1024x768.jpg\" alt=\"Graue gekaufte Wartungsklappe aus Polypropylen in der Trockner\u00f6ffnung mit eingegossener Teilenummer und Materialkennung PP-TV30\" class=\"wp-image-4651\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bsh-00646776-klappe-gekauft-pp-montiert-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Die gekaufte Klappe aus talkgef\u00fclltem Polypropylen (PP-TV30) sitzt ebenso b\u00fcndig. Teilenummer und Materialkennung sind eingegossen.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beide L\u00f6sungen, die selbst gedruckte und die gekaufte, passen perfekt und dichten zuverl\u00e4ssig ab. Ich kann beide vorbehaltlos empfehlen. Wer einen Drucker mit ABS-tauglichem Geh\u00e4use hat, druckt sich die Klappe f\u00fcr ein paar Cent Material selbst, alle anderen sind mit der 15-Euro-Variante inklusive Reinigungswerkzeug bestens bedient.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Und jetzt?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Trockner l\u00e4uft wieder wie am ersten Tag. Eine Ladung, ein Durchlauf, W\u00e4sche trocken. Auf den Fotos vom verdreckten Kondensator sieht es \u00fcbrigens schlimmer aus, als es sich am Ende angef\u00fchlt hat, in einer guten Stunde war alles erledigt. Sch\u00f6ner Nebeneffekt: Ab jetzt brauche ich kein Teppichmesser mehr, sondern schraube die Klappe einmal im Jahr auf und sauge kurz durch. Vielleicht laufen so ja noch einmal 11 Jahre aus dem Teil heraus.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-1024x768.jpg\" alt=\"Display des Bosch WTY87701 zeigt das laufende Programm Schranktrocken mit Restzeit\" class=\"wp-image-4652\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/bosch-wty87701-display-laeuft-wieder-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">L\u00e4uft wieder: eine Ladung, ein Durchlauf. Das Display zeigt Schranktrocken mit normaler Restzeit.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die kleine Moral: Lasst euch von einem \u201eSelfCleaning&#8220;-Aufkleber nicht einlullen. Selbst die selbstreinigenden Ger\u00e4te setzen sich \u00fcber die Jahre zu, und ein bisschen Wartung verl\u00e4ngert die Lebensdauer enorm. Dass man daf\u00fcr erst eine Klappe ins Geh\u00e4use schneiden muss, die der Hersteller komplett vorbereitet, aber nicht freigibt, ist ein eigenes kleines Trauerspiel. Gut, dass es findige Leute mit Druckdateien und Ersatzteilen gibt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Siehe auch:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><a href=\"https:\/\/www.kernel-error.de\/2019\/11\/11\/bosch-geschirrspuelmaschine-und-der-fehler-e-21\/\">Bosch Geschirrsp\u00fclmaschine: Fehler E-21 beheben<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.kernel-error.de\/2021\/03\/03\/bosch-geschirrspuelmaschine-und-der-fehler-e-15\/\">Bosch Geschirrsp\u00fclmaschine: Fehler E-15 beheben<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Habt ihr auch so ein Ger\u00e4t, bei dem die Service-Klappe ab Werk fehlt, oder eine eigene Druckdatei daf\u00fcr? Dann lasst es mich gerne wissen, ihr d\u00fcrft mich jederzeit <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nach knapp 16 Jahren trocknete unser Bosch W\u00e4rmepumpentrockner kaum noch. Schuld war der zugesetzte Kondensator, an den man ab Werk nicht herankommt: ausgerechnet beim SelfCleaning Condenser fehlt die Service-Klappe. Also aufgeschnitten, gereinigt und mit gedruckter Abdeckung wieder verschlossen.<\/p>\n","protected":false},"author":1,"featured_media":4654,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[279,278,13],"tags":[154,93,193,428,375,382,376,436],"class_list":["post-4653","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elektronik-diy","category-hardware-reparatur","category-kernel-error-blog","tag-3dprinting","tag-bosch","tag-diy","tag-homeappliance","tag-maker","tag-repair","tag-righttorepair","tag-tumbledryer","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4653"}],"version-history":[{"count":2,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4653\/revisions"}],"predecessor-version":[{"id":4667,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4653\/revisions\/4667"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4654"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4635,"date":"2026-05-29T16:16:58","date_gmt":"2026-05-29T14:16:58","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4635"},"modified":"2026-05-29T16:16:58","modified_gmt":"2026-05-29T14:16:58","slug":"ms2109-vga-usb-capture-reverse-engineering-edid-1080p","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/29\/ms2109-vga-usb-capture-reverse-engineering-edid-1080p\/","title":{"rendered":"Billiger VGA-USB-Capture-Stick seziert: MS2109-Firmware, EDID-Hack und die 1080p-L\u00fcge"},"content":{"rendered":"\n<p class=\"has-small-font-size wp-block-paragraph\">Eigentlich wollte ich nur etwas ganz Simples: Aufnahmen von meinem alten DOS-Rechner machen. BIOS-POST, der Speichertest, ein paar DOS-Spiele, einmal das alles sauber als Video festgehalten. Daf\u00fcr landete ein <strong>\u201eVGA to USB 3.0 HD 1080P Video Capture Card&#8220;<\/strong> in meinem Warenkorb, so ein billiger Dongle f\u00fcr ein paar Euro. <em>Spoiler<\/em>: in genau der Form hat das nicht geklappt. Und warum es nicht klappt, ist die eigentlich spannende Geschichte. Es geht um einen 8051 mit recyceltem Mask-ROM, eine EDID die der Quelle einen Monitor vorl\u00fcgt, ein \u201e1080p&#8220; das horizontal gar keins ist, und eine Strings-Modifikation die ich bis heute nicht \u00fcberlistet habe.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das konkrete Ger\u00e4t, falls es jemand nachvollziehen will, gibt es bei Amazon unter <a href=\"https:\/\/amzn.to\/43yrvqv\" target=\"_blank\" rel=\"noopener nofollow sponsored\">diesem Link<\/a>. Es ist einer von hunderten optisch identischen Sticks, die alle den gleichen MacroSilicon-Chipsatz tragen. Die Erkenntnisse hier gelten also f\u00fcr eine ganze Ger\u00e4teklasse, nicht nur dieses eine Exemplar.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-768x1024.jpg\" alt=\"Platine des VGA-USB-Capture-Sticks mit VGA-Stecker, USB-A-Buchse, Audio-Header und Silkscreen AFN_VGA_Captor\" class=\"wp-image-4627\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-vga-capture-pcb-front-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Die Platine des Sticks: VGA-Stecker, USB-A, 3-poliger Audio-Header und der Silkscreen AFN_VGA_Captor 2020\/0615_V1.1.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was steckt auf der Platine?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aufgeschraubt zeigt sich eine winzige Platine mit Silkscreen-Aufdruck <code>AFN_VGA_Captor 2020\/0615_V1.1<\/code>, einem VGA-Stecker, einer USB-A-Buchse und einem 3-poligen Audio-Header. Drei Halbleiter machen die eigentliche Arbeit:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Ref<\/th><th>Chip<\/th><th>Funktion<\/th><\/tr><\/thead><tbody><tr><td>U3<\/td><td>MacroSilicon MS2109<\/td><td>8051-basierte UVC-Bridge, USB 2.0 High-Speed<\/td><\/tr><tr><td>U7<\/td><td>MacroSilicon MS9288A<\/td><td>Analoger VGA-Empf\u00e4nger (PLL plus ADC plus Scaler)<\/td><\/tr><tr><td>U2<\/td><td>HK \/ Holtek 24C16<\/td><td>I\u00b2C-EEPROM, 2 KiB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der <strong>MS2109<\/strong> ist ber\u00fchmt-ber\u00fcchtigt. Er steckt in den meisten der spottbilligen HDMI-Capture-Sticks, die seit Jahren durchs Netz geistern. Hier sitzt derselbe Chip in einer VGA-Variante, mit dem MS9288A als analogem Frontend davor. Wie eng die beiden Welten verwandt sind, wird sich beim Mask-ROM-Dump zeigen: die Firmware ist nachweislich aus der HDMI-Variante recycelt.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"821\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro-1024x821.png\" alt=\"Mikroskop-Makro des MacroSilicon MS2109, der 8051-basierten UVC-Bridge des Capture-Sticks\" class=\"wp-image-4628\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro-1024x821.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro-300x241.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro-768x616.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro-1536x1232.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro-676x542.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-uvc-bridge-chip-makro.png 1603w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">U3, der MacroSilicon MS2109. Der gleiche 8051-Chip wie in den billigen HDMI-Capture-Sticks, hier in der VGA-Variante.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"766\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro-1024x766.png\" alt=\"Mikroskop-Makro des MacroSilicon MS9288A, des analogen VGA-Empf\u00e4ngers mit PLL und ADC\" class=\"wp-image-4629\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro-1024x766.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro-300x224.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro-768x574.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro-1536x1149.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro-676x505.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms9288a-vga-scaler-chip-makro.png 1657w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">U7, der MacroSilicon MS9288A. Analoges Frontend mit PLL, ADC und Scaler, lockt das VGA-Signal und digitalisiert es.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"882\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro-1024x882.png\" alt=\"Mikroskop-Makro des HK 24C16 I2C-EEPROM mit 2 KiB Kapazit\u00e4t auf der Capture-Platine\" class=\"wp-image-4630\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro-1024x882.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro-300x258.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro-768x661.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro-676x582.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/hk-24c16-eeprom-chip-makro.png 1237w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">U2, der HK 24C16. 2 KiB I2C-EEPROM, hier liegen EDID, Vendor-Strings und die beiden 8051-Patch-Bl\u00f6cke.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wie meldet sich das Ding am USB?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beim Anstecken kommt der erste Hinweis darauf, dass die Verpackung schwindelt. \u201eUSB 3.0&#8243; steht drauf, der Kernel sieht aber ein High-Speed-Ger\u00e4t, also USB 2.0:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">usb 1-1.1: new high-speed USB device number 15 using xhci_hcd\nusb 1-1.1: New USB device found, idVendor=534d, idProduct=2109, bcdDevice=21.00\nusb 1-1.1: Manufacturer: MACROSILICON\nusb 1-1.1: Found UVC 1.00 device &lt;unnamed&gt; (534d:2109)\nhid-generic 0003:534D:2109.0009: hiddev4,hidraw8: USB HID v1.10 Device<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vendor <code>0x534d<\/code> ist MacroSilicon, Produkt <code>0x2109<\/code> der nackte MS2109. Das Ger\u00e4t enumeriert als UVC-1.00-Kamera plus USB-Audio plus ein vendor-spezifisches HID-Interface. Genau dieses HID-Interface ist sp\u00e4ter der Schl\u00fcssel: dar\u00fcber kommt man an das EEPROM und sogar an den Arbeitsspeicher des 8051 heran, ganz ohne L\u00f6tkolben am I\u00b2C-Bus.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Das Werkzeug: ms-tools<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die zentrale Referenz f\u00fcr alles, was mit MS2109 zu tun hat, ist das Projekt <a href=\"https:\/\/github.com\/BertoldVdb\/ms-tools\" target=\"_blank\" rel=\"noopener\">ms-tools<\/a> von Bertold Van den Bergh. Das ist eine kleine Goldgrube: EEPROM lesen und schreiben \u00fcber die HID-Schnittstelle, Live-Zugriff auf den XDATA-Speicher zur Laufzeit (per eingeschleustem 8051-Patch-Code), das Werkzeug <code>mshack<\/code> zum Injizieren eigener 8051-Routinen, Ghidra-Skripte mit teildisassemblierter Firmware und ein <code>dump-rom<\/code>, das den kompletten 64-KiB-Mask-ROM ausliest.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auf Ubuntu 24.04 ist das schnell gebaut:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install golang-go libhidapi-dev libudev-dev\ngit clone https:\/\/github.com\/BertoldVdb\/ms-tools.git\ncd ms-tools\/cli &amp;&amp; go build -o ..\/msctl .<\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der EEPROM-Dump und eine erste Korrektur<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Manche MS2109-Revisionen m\u00f6gen das \u00fcbliche RAM-Patching nicht, das ms-tools f\u00fcr komfortable Zugriffe nutzt. Mit <code>--no-patch<\/code> liest der Dump trotzdem sauber, weil dann der rohe HID-Pfad ohne vorgeschaltete Firmware-Manipulation genommen wird:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">msctl --raw-path \/dev\/hidraw8 --no-patch read EEPROM 0 2048 --filename=dumps\/eeprom-vga-raw.bin<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Von den 2048 Bytes sind nur 962 belegt. Die Aufteilung sieht so aus:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Offset<\/th><th>Gr\u00f6\u00dfe<\/th><th>Inhalt<\/th><\/tr><\/thead><tbody><tr><td>0x000 bis 0x00F<\/td><td>16 B<\/td><td>Header: Magic <code>a5 5a<\/code>, dann Build-Datum <code>19 11 20 00<\/code> = 2019-11-20<\/td><\/tr><tr><td>0x010 bis 0x02F<\/td><td>32 B<\/td><td>Vendor-Strings im Pascal-Format: <code>AFN_Cap video<\/code>, <code>AFN_Cap audio<\/code><\/td><\/tr><tr><td>0x030 bis 0x079<\/td><td>74 B<\/td><td>8051-Patch-Code #1 (ROM-Hook-Routinen)<\/td><\/tr><tr><td>0x07A bis 0x179<\/td><td>256 B<\/td><td>Vollst\u00e4ndige EDID (128 Base plus 128 CTA-861-Extension)<\/td><\/tr><tr><td>0x17A bis 0x3C1<\/td><td>584 B<\/td><td>8051-Patch-Code #2, Keil-C51-kompiliert<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die ersten Bytes mit dem Hexeditor angeschaut, da steht die Geschichte schon drin:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">0000  a5 5a 03 8e 09 10 ff ff ff ff ff ff 19 11 20 00   .Z............ .\n0010  0e 41 46 4e 5f 43 61 70 20 76 69 64 65 6f ff ff   .AFN_Cap video..\n0020  0e 41 46 4e 5f 43 61 70 20 61 75 64 69 6f ff ff   .AFN_Cap audio..\n0030  90 de 07 ef f0 12 cd d6 90 de 07 e0 ff 02 cf 25   ...............%<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das <code>0e<\/code> vor jedem String ist die Pascal-L\u00e4ngenangabe (14 Zeichen). Ab <code>0x30<\/code> beginnt der erste 8051-Patch-Block. Spannend ist die EDID-Sektion ab <code>0x07A<\/code>. Mein erster Analyse-Versuch ging davon aus, der klassische EDID-Header <code>00 FF FF FF FF FF FF 00<\/code> sei wegoptimiert und werde erst zur Laufzeit erg\u00e4nzt. Das war falsch. Nach dem Mask-ROM-Dump und einem genaueren Blick steht der Header sauber im EEPROM. Solche Korrektur-Momente sind mir lieber als ein zu glattes Narrativ, also schreibe ich sie hier auch hin.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die EDID selbst enth\u00e4lt einen Monitor-Namen <code>MACROSILICON<\/code> (EDID-Descriptor mit Tag <code>0xFC<\/code>), als erstes Detailed-Timing 1280&#215;720 bei 60 Hz mit 74,25 MHz Pixeltakt, ein zweites Timing 1280&#215;768, dazu eine CTA-861-Extension mit nativem VIC=4 (720p60) plus VICs f\u00fcr 1080p60, 1080i, 720p50, 480p und 576p. Es gibt sogar einen HDMI-VSDB-Block mit dem OUI <code>00:0C:03<\/code> von HDMI Licensing und einer Source Physical Address. Eine VGA-only-Platine, die HDMI-Strukturen in ihrer EDID tr\u00e4gt. Das ist schon der erste deutliche Fingerabdruck der gemeinsamen Codebasis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der Mask-ROM verr\u00e4t die Herkunft<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der eigentliche Programmcode des 8051 liegt in einem nicht beschreibbaren Mask-ROM. <code>dump-rom<\/code> l\u00e4dt daf\u00fcr eigenen 8051-Code in den USERRAM, der per <code>MOVC<\/code> den ROM ausliest und \u00fcber HID zur\u00fcckschiebt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">msctl --raw-path \/dev\/hidraw8 --no-patch dump-rom dumps\/maskrom-vga.bin<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">64 KiB komplette CODE-Memory, davon rund 36 KiB belegt im Bereich <code>0x0000<\/code> bis <code>0x8FFF<\/code> und weitere 12 KiB ab <code>0xC000<\/code>. Die Highlights:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><strong>0x7738<\/strong>: eine zweite, im ROM fest verdrahtete Default-EDID, intakt mit Standard-Header, Hersteller-ID \u201eHJW&#8220; und Monitor-Name <strong>\u201eHDMI TO USB&#8220;<\/strong>. Das ist der Beweis: diese Firmware wurde urspr\u00fcnglich f\u00fcr den HDMI-Bruder geschrieben.<\/li>\n\n\n\n<li><strong>0x77A9<\/strong>: der ASCII-String \u201eHDMI TO USB&#8220; noch einmal direkt.<\/li>\n\n\n\n<li><strong>0x7087<\/strong> und <strong>0x709B<\/strong>: die USB-String-Descriptor-Fallbacks \u201eUSB Video&#8220; und \u201eUSB Digital Audio&#8220; in UTF-16LE. Diese beiden werden uns gleich noch \u00e4rgern.<\/li>\n\n\n\n<li><strong>0x0000<\/strong>: der Reset-Vector <code>02 41 49<\/code>, also <code>LJMP 0x4149<\/code>.<\/li>\n\n\n\n<li>Ein <code>LCALL 0xCC10<\/code> bei ROM-Adresse <code>0x478F<\/code>: das ist der zentrale Einstieg vom Mask-ROM in den EEPROM-Patch-Code, der zur Laufzeit in den RAM kopiert wurde.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Bootloader kopiert dabei die EEPROM-Bytes ab Offset <code>0x30<\/code> in den USERRAM ab Adresse <code>0xCBD0<\/code>. Die Strings-Sektion <code>0x10<\/code> bis <code>0x2F<\/code> wird <strong>explizit nicht<\/strong> mitkopiert. Die Patch-Firmware liest die Strings stattdessen zur Laufzeit direkt per I\u00b2C aus dem EEPROM und baut daraus die USB-String-Descriptoren an festen RAM-Adressen zusammen. Diese Mapping-Tabelle ist der Kern, um den herum sich die ganze Bastelei dreht:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>EEPROM<\/th><th>Code-RAM<\/th><th>Was<\/th><\/tr><\/thead><tbody><tr><td>0x030<\/td><td>0xCC00<\/td><td>Patch #1, kleine Hook-Routinen<\/td><\/tr><tr><td>0x07A<\/td><td>0xCC4A<\/td><td>EDID-Header <code>00 FF FF FF FF FF FF 00<\/code><\/td><\/tr><tr><td>0x080<\/td><td>0xCC50<\/td><td>EDID-Body<\/td><\/tr><tr><td>0x0FA<\/td><td>0xCCCA<\/td><td>CTA-861-Extension<\/td><\/tr><tr><td>0x17A<\/td><td>0xCD4A<\/td><td>Patch #2, C51-Startup<\/td><\/tr><tr><td>0x180<\/td><td>0xCD50<\/td><td><code>MOV SP,#0x3B; LJMP 0xCD91<\/code><\/td><\/tr><tr><td>0x1C1<\/td><td>0xCD91<\/td><td><code>main()<\/code> der Patch-Firmware<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Erkenntnis 1: Die EDID l\u00fcgt der Quelle einen Monitor vor<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">\u00dcber die DDC-Leitungen am VGA-Stecker (Pins 12 und 15) pr\u00e4sentiert der Dongle dem Quell-PC eine EDID. Damit gibt sich das Ger\u00e4t als Monitor namens \u201eMACROSILICON&#8220; mit 720p60 als nativer Aufl\u00f6sung aus. Genau deshalb liefert ein Quell-PC, an dem gar kein echter Monitor h\u00e4ngt, trotzdem ein sinnvolles Bild: er glaubt, ein 720p-Display gefunden zu haben. So weit, so clever.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Erkenntnis 2: Das \u201e1080p&#8220; ist Marketing<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die UVC-Frame-Tabelle im Mask-ROM listet zwar brav 1920&#215;1080 mit 30 fps als MJPEG. Die Realit\u00e4t sieht anders aus. Mit <code>v4l2-ctl<\/code> l\u00e4sst sich die Format-Liste auslesen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ v4l2-ctl -d \/dev\/video2 --list-formats-ext\n[0]: 'MJPG' (Motion-JPEG, compressed)\n  Size: Discrete 1920x1080    30\/25\/20\/10\/5 fps\n  Size: Discrete 1280x720     60\/50\/30\/20\/10 fps\n  Size: Discrete 1024x768     60\/50\/30\/20\/10 fps\n[1]: 'YUYV' (YUYV 4:2:2)\n  Size: Discrete 1920x1080    5 fps\n  Size: Discrete 640x480      30\/20\/10\/5 fps<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Unkomprimiertes YUYV bei 1080p ist auf magere 5 fps gedeckelt. Das native Detailed-Timing der EDID ist 720p60, das 1080p wird intern hochskaliert. Und USB 3.0 ist nirgends, der Chip kann nur High-Speed. Drei Behauptungen auf der Verpackung, drei mal geschummelt. Auf die 5-fps-Grenze komme ich am Ende noch genauer zur\u00fcck, die hat einen sehr konkreten technischen Grund.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Erkenntnis 3: Kein DOS, und das l\u00e4sst sich nicht reparieren<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Jetzt zum eigentlichen Frustpunkt, der Grund, warum mein DOS-Plan scheiterte. Die UVC-Frame-Tabelle enth\u00e4lt <strong>keine 70-Hz-Modi<\/strong>. Ein DOS-BIOS gibt aber im Standard-VGA-Textmodus 720&#215;400 bei 70 Hz aus. Das analoge Frontend, der MS9288A, k\u00f6nnte dieses Signal vermutlich locken, der Horizontaltakt von 31,469 kHz ist derselbe wie bei 640&#215;480 bei 60 Hz. Aber die MS2109-Firmware bietet schlicht keinen passenden UVC-Frame-Mode an, an dem ein Aufnahmeprogramm andocken k\u00f6nnte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und das Bittere: <strong>im EEPROM kann man das nicht reparieren<\/strong>. Die Frame-Tabelle liegt im nicht-flashbaren Mask-ROM. Das EEPROM steuert nur EDID, Strings und ein paar Patch-Routinen, nicht die Liste der angebotenen Aufl\u00f6sungen. Wer mit so einem Dongle echte DOS-Signale aufnehmen will, kommt um eine vorgeschaltete Scaler-Box nicht herum. Mehr dazu am Ende.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was wir trotzdem ge\u00e4ndert haben: die EDID<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn die Frame-Tabelle schon unantastbar ist, dann wenigstens die EDID anfassen. Ich habe das erste Detailed-Timing von 720p60 auf <strong>1920&#215;1080 bei 60 Hz<\/strong> umgeschrieben (148,5 MHz Pixeltakt, das Standard-CEA-861-1080p60-Timing), die EDID-Checksumme neu berechnet und das EEPROM zur\u00fcckgeflasht. Das neue DTD #1 sieht so aus:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">02 3a 80 18 71 38 2d 40 58 2c 45 00 00 00 00 00 00 1e<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Nach einem Replug liefert das Ger\u00e4t die modifizierte EDID. Zumindest dachte ich das. Ob sie auch wirklich bei einer Quelle ankommt, war eine ganz eigene Odyssee, dazu komme ich beim A\/B-Test. Vorweggenommen: Die Mod tut technisch genau das, was sie soll, sie \u00e4ndert nur am Ende nichts an dem, was aufgenommen wird. Eine reine \u201eich sage der Quelle, ich kann 1080p&#8220;-Kosmetik.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was NICHT geklappt hat: die Strings<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das ist der lehrreichste Teil des Projekts, gerade weil er bis heute offen ist. Ich wollte die USB-Function-Strings \u00e4ndern, aus dem h\u00e4sslichen \u201eAFN_Cap video&#8220; sollte ein sauberes \u201eVGA Capture HD&#8220; werden. Das EEPROM-Schreiben verifiziert sauber per Readback-Hash. Die EDID-Mod aus demselben Reflash funktioniert. Aber die Strings fallen nach dem Replug auf die ROM-Defaults \u201eUSB Video&#8220; und \u201eUSB Digital Audio&#8220; zur\u00fcck. Irgendetwas in der Firmware sagt \u201enein&#8220;.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Also empirisch rangegangen, drei Single-Byte-Tests in der Strings-Region <code>0x10<\/code> bis <code>0x2F<\/code>: einmal ein ASCII-Zeichen ge\u00e4ndert, einmal ein <code>FF<\/code>-Padding-Byte, einmal das L\u00e4ngen-Byte. Jeder einzelne dieser Eingriffe l\u00f6st den Fallback aus. Egal welches Byte, egal welcher Inhalt. Das ist eine klare Indikation f\u00fcr ein <strong>Content-Gate \u00fcber die gesamte 32-Byte-Region<\/strong>, nicht f\u00fcr eine simple L\u00e4ngen- oder Inhaltspr\u00fcfung an einer Stelle.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ein Gegencheck zur eigenen Analyse hat ein paar Punkte gesch\u00e4rft. Die Bytes <code>0x02<\/code> und <code>0x03<\/code> (<code>03 8E<\/code>) sind verifiziert die <strong>Payload-L\u00e4nge<\/strong> und keine Checksumme: 910 Bytes ab <code>0x30<\/code> reichen bis <code>0x3BD<\/code>, exakt bis vor den End-Marker. Der Verdacht: ein lokales Validierungs-Gate auf den 32-Byte-Strings-Slots, wahrscheinlich ein Hash oder ein Exact-Content-Compare in einem ROM-Helper, nicht im Patch-Code selbst. Ein Quervergleich mit dem usbkvm-Projekt zeigt dasselbe Header-Muster bei verwandter Hardware.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der spannendste Nebenbefund kam aus einem XDATA-Boot-Trace bei <code>0xC630<\/code> bis <code>0xC67F<\/code>: die \u201eAFN_Cap&#8220;-Strings landen <strong>gar nicht dauerhaft im RAM<\/strong>. Was dort steht, ist die Fallback-Variante. Die echten Strings werden erst zur Laufzeit beim USB-<code>GetDescriptor<\/code> aus dem EEPROM gebaut, und genau in diesem Moment greift offenbar das Gate. Wer das knacken will, m\u00fcsste den USB-Control-Transfer mit <code>usbmon<\/code> und Wireshark w\u00e4hrend der Enumeration mitschneiden, die ROM-Helper bei <code>0x6345<\/code> und Nachbarn disassemblieren, oder mit <code>mshack<\/code> einen Bypass-Patch auf den Fallback-Branch setzen. Der schnellste Weg w\u00e4re allerdings, ein vom offiziellen MacroSilicon-Windows-Tool editiertes EEPROM byteweise gegen mein eigenes zu diffen. Dieses Tool schreibt vermutlich versteckte Metadaten mit, die das \u00f6ffentliche Reverse-Engineering noch nicht dokumentiert hat. Das ist mein hei\u00dfester Kandidat f\u00fcrs Strings-Mysterium, aber bisher unbewiesen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der A\/B-Test, oder: die Suche nach einer ehrlichen VGA-Quelle<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ich wollte zwei Dinge empirisch kl\u00e4ren. Erstens: Kommt die modifizierte 1080p-EDID \u00fcberhaupt bei der Quelle an? Zweitens: L\u00f6st das Ding echtes 1080p auf oder ist das hochskalierter Matsch? Beides braucht eine VGA-Quelle, die ihre DDC-Leitung auch wirklich ausliest. Das war schwerer zu finden als gedacht.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Erster Anlauf, ein Notebook mit \u201eVGA-Out&#8220;.<\/strong> Plot-Twist: der VGA-Anschluss lief \u00fcber einen aktiven DisplayPort-auf-VGA-Adapter und tauchte als <code>DP-4<\/code> auf. Der Adapter liefert ein eigenes synthetisches EDID (\u201eNVD&#8220;, \u201eLCD_VGA&#8220;, 1280&#215;1024). Das ist nicht das EDID aus dem Dongle. Der EDID-Pfad vom Dongle bis zur GPU ist also unterbrochen. Erste Lehre: aktive DP-auf-VGA-Adapter verhalten sich wie eine eigene EDID-Quelle und maskieren alles dahinter.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Zweiter Anlauf, ein ThinkPad L560 mit echter VGA-Buchse hinten.<\/strong> Wieder gescheitert, und zwar aus einem prinzipiellen Grund. Ab Haswell und Skylake hat Intel den analogen RAMDAC komplett aus der GPU geworfen. Die physische VGA-Buchse h\u00e4ngt an einem Onboard-DP-auf-VGA-Bridge-Chip. Der Kernel verr\u00e4t es selbst:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ xrandr --verbose | grep -i subconnector\n        subconnector: VGA\n$ cat \/sys\/class\/drm\/card1-DP-2\/edid | wc -c\n0<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Null Byte EDID. Die Bridge reicht das DDC vom Dongle nicht durch, der Connector bietet nur die VESA-Default-Modi an. Exakt dasselbe Problem wie beim ersten Notebook, nur diesmal onboard statt als Dongle. Auf beiden getesteten Bridge-Pfaden kam die EDID des Capture-Sticks nicht zur Quelle durch. Als Trend l\u00e4sst sich sagen: neuere Intel-Notebooks haben den analogen RAMDAC verloren (der fiel etwa um Haswell und Broadwell, also rund 2013 bis 2015) und f\u00fchren \u201eVGA&#8220; \u00fcber DP-Bridges, die DDC abschneiden. Das als \u201ekein Notebook taugt je&#8220; zu verkaufen w\u00e4re \u00fcbertrieben, es ist ein Trend, kein Beweis.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ein netter Nebenbefund vom L560, den ich erst f\u00fcr einen kaputten Aufbau hielt: nach jedem Aufl\u00f6sungswechsel liefert der Dongle erstmal 1 bis 6 Sekunden ein komplett schwarzes Bild, bis die MS9288A-PLL wieder eingerastet ist. Ich hatte reihenweise schwarze Frames gegrabbt und schon den Analogpfad f\u00fcr tot erkl\u00e4rt. In Wirklichkeit hatte ich nur immer ins Re-Lock-Fenster reingeschossen. Mit 4 bis 6 Sekunden Settle-Zeit kommt das Bild stabil. Passt zur dokumentierten Sync-Tr\u00e4gheit des Chips.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der A\/B-Test selbst<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Trotz blockiertem DDC habe ich den A\/B durchgezogen, einfach um es schwarz auf wei\u00df zu haben. Als Quelle ein 1920&#215;1080-Testbild mit vier Quadranten aus 1-Pixel-Gittern: Schachbrett, vertikale Linien, horizontale Linien, Diagonale. Dazu gr\u00fcne Eck-Marker, um sicher zu sein, dass der ganze Frame ankommt.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle-1024x576.png\" alt=\"1920x1080-Testbild mit vier Quadranten aus 1-Pixel-Gittern und gr\u00fcnen Eck-Markern f\u00fcr den A\/B-Test\" class=\"wp-image-4631\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle-1024x576.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle-300x169.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle-768x432.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle-1536x864.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle-676x380.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-ab-test-1px-gitter-quelle.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Das Quell-Testbild: vier Quadranten mit 1px-Schachbrett, Vertikal-, Horizontal- und Diagonalgittern, dazu Eck-Marker.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Erst der Befund, der mich am meisten interessiert hat: 1px-Vertikallinien und Schachbrett kollabieren zu flachem Grau, das horizontale Feindetail ist weg. 1px-Horizontallinien und Diagonale zeigen schwache Resttextur. Die vertikale Aufl\u00f6sung kommt also weitgehend durch (jede Scanline ist eine eigene analoge Zeile), die horizontale ist deutlich begrenzt. Wichtiges Ehrlichkeits-Caveat: das ist die <strong>komplette<\/strong> Analogkette, also Bridge-DAC im L560, Kabel und MS9288A-ADC zusammen. Mit diesem Aufbau l\u00e4sst sich nicht sauber trennen, wieviel davon der Dongle ist.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Dann der eigentliche EEPROM-A\/B. EEPROM gegen das Original-Backup getauscht, Readback-Hash jedes Mal verifiziert. Etwas, das ich erst lernen musste: nach dem Flashen muss der Dongle einmal <strong>physisch ab- und wieder angesteckt<\/strong> werden. Ein reiner USB-Bus-Reset reicht nicht, der 8051 l\u00e4uft einfach weiter und liest das neue EEPROM gar nicht ein. Software-seitig ging das nicht (kein schaltbarer Port), also von Hand. Die Zahlen, ImageMagick MAE auf einer Skala von 0 bis 1:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Vergleich<\/th><th>MAE<\/th><th>pro 255<\/th><\/tr><\/thead><tbody><tr><td>Rauschen mod3 (zwei Aufnahmen, gleiches EEPROM)<\/td><td>0,0041<\/td><td>1,05<\/td><\/tr><tr><td>Rauschen Original<\/td><td>0,0043<\/td><td>1,10<\/td><\/tr><tr><td><strong>mod3 gegen Original<\/strong><\/td><td>0,0071<\/td><td>1,82<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Cross-Wert liegt nur minimal \u00fcber dem Rauschpegel. Das maximal verst\u00e4rkte Differenzbild zeigt keine strukturierte \u00c4nderung, nur MJPEG-Blockrauschen in den hochfrequenten Quadranten. Die kleine Differenz ist Re-Lock- und AGC-Varianz zwischen den Sessions, nicht das EDID.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff-1024x576.png\" alt=\"Maximal verst\u00e4rktes Differenzbild mod3-EDID gegen Original-EDID, nur MJPEG-Blockrauschen, keine strukturierte \u00c4nderung\" class=\"wp-image-4634\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff-1024x576.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff-300x169.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff-768x432.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff-1536x864.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff-676x380.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-edid-mod-gegen-original-diff.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Maximal verst\u00e4rkte Differenz: mod3-EDID gegen Original-EDID. Nur Blockrauschen, keine Struktur. Die EDID-Mod \u00e4ndert am Bild nichts.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Fazit des A\/B<\/strong>: Die EDID-Mod von 720p auf 1080p ver\u00e4ndert das aufgenommene Bild exakt null. Aus erstem Prinzip war das klar, die EDID ist das, was das Ger\u00e4t der Quelle anbietet, sie steuert nicht den Aufnahmepfad. Aber jetzt steht es empirisch da.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Endlich eine echte Analog-Quelle, und zwei dicke Befunde<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Dritter Anlauf, diesmal ein Desktop mit einer <strong>NVIDIA GeForce GT 630<\/strong> (Kepler). Kepler hat noch einen echten analogen RAMDAC, \u00fcber einen passiven DVI-I-auf-VGA-Adapter kommt echtes analoges VGA raus. Endlich die Hardware, die den Notebooks fehlte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Befund 1: Die EDID-Mod ist sogar grunds\u00e4tzlich f\u00fcr die Katz.<\/strong> Der NVIDIA-Treiber cached die analoge EDID hartn\u00e4ckig (analoges VGA hat kein Hotplug), also einmal lightdm neugestartet f\u00fcr einen frischen Read. Das Ergebnis im Xorg-Log:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(--) NVIDIA(GPU-0): CRT-0: connected\n(WW) NVIDIA(0): CRT-0 does not have an EDID<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Dongle liefert auf seinem VGA-Eingang <strong>gar keine DDC und keine EDID<\/strong>. Sauber belegt: derselbe Adapter hat vorher die EDID eines echten Monitors gelesen (ein Fujitsu P24-9, mit 1920&#215;1080 und physischen Ma\u00dfen), der Adapter reicht DDC also durch. Es ist der Dongle, der nichts treibt. Das kippt eine Annahme aus meinen eigenen Notizen, wo stand, das Patch-Modul beantworte \u201ewahrscheinlich&#8220; DDC-Reads. Dieses \u201ewahrscheinlich&#8220; war nie gemessen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ehrlich bei der Konfidenz bleiben: hoch daf\u00fcr, dass in diesem GT-630-Test keine lesbare EDID vom Dongle kam. Nur mittel f\u00fcr das universelle \u201ekeine Quelle sieht die EDID je&#8220;. Restzweifel, die ich noch nicht ausger\u00e4umt habe: NVIDIA-Eigenheiten bei analogem DDC, ob die Dongle-DDC die 5 Volt auf VGA-Pin 9 braucht, oder ob der DDC-Responder erst nach Sync-Lock aufwacht. Ein Pin-9-Check plus Logic-Analyzer auf den Pins 12 und 15 (mit dem Fujitsu als Positiv-Kontrolle) w\u00fcrde es hart machen. Arbeitshypothese: auf dem getesteten echten Analogpfad pr\u00e4sentierte der Dongle keine lesbare EDID, vermutlich weil der VGA-DDC-Pfad in der geteilten HDMI\/VGA-Codebasis schlicht nicht verdrahtet ist. HDMI hat HPD und DDC, VGA hier offenbar nicht.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Befund 2: Das \u201e1080p&#8220; ist vertikal echt, horizontal Fake.<\/strong> Mit echtem RAMDAC konnte ich endlich den Dongle-Anteil am Blur isolieren (eigene xorg.conf mit <code>UseEDID false<\/code> und forciertem 1080p-Modeline, NVIDIA lehnt xrandr-Modelines ab). Testbild: reine 1px-Schwarz-Wei\u00df-Gitter per <code>xsetroot<\/code>. Das Resultat, gemessen als Standardabweichung der Luma (ein ideales Gitter liegt bei rund 128, flaches Grau bei 0):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>1px-Gitter bei echtem Analog-1080p<\/th><th>Std-Abw.<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td><strong>horizontale<\/strong> Linien<\/td><td>119<\/td><td>vertikal sauber aufgel\u00f6st<\/td><\/tr><tr><td><strong>vertikale<\/strong> Linien<\/td><td>0,6<\/td><td>horizontal komplett verschmiert<\/td><\/tr><tr><td>Schachbrett<\/td><td>0,55<\/td><td>weg<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"258\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops-1024x258.png\" alt=\"Zweifach-Zoom dreier Ausschnitte: vertikales Gitter grau verschmiert, horizontales Gitter scharf, Schachbrett grau\" class=\"wp-image-4632\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops-1024x258.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops-300x75.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops-768x193.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops-1536x386.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops-676x170.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-1080p-horizontal-vertikal-crops.png 1924w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Echte Analog-Quelle (GT 630): links das vertikale 1px-Gitter zu Grau verschmiert, mittig horizontale Linien gestochen scharf, rechts das Schachbrett weg.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Dongle hat also echte 1080 Zeilen vertikal, aber horizontal kommt weit weniger als 1920 Pixel an. Und weil hier kein Bridge mehr dazwischen sitzt: der Blur ist der Dongle selbst, nicht das billige Notebook. Das ist die belastbare Aussage.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Den Mechanismus habe ich auf einen Vorschlag aus dem Gegencheck hin gleich nachgemessen, ein Phasen- und Balkenbreiten-Test. Das 1px-Gitter ist bei Phase 0 und Phase 1 gleich grau (Std-Abw. 0,18 gegen 0,19), ein PLL- oder Phasen-Mislock ist damit <strong>ausgeschlossen<\/strong>, sonst w\u00fcrde der 1px-Versatz den Kontrast kippen. Und der Kontrast steigt sauber mit der Balkenbreite: 1px liegt bei rund 0, 2px bei 35, 3px bei 61, 4px bei 79 (Ideal rund 128). Das ist die klassische Tiefpass-Signatur, also ein echtes Horizontal-Aufl\u00f6sungs-Limit und kein Lock-Artefakt. Ob das an der ADC-Abtastrate oder an einem internen Rescale liegt, kann ich noch nicht trennen, aber beides hei\u00dft: der Dongle begrenzt die Horizontalaufl\u00f6sung.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"181\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-1024x181.png\" alt=\"Aufl\u00f6sungs-Rampe von 1px bis 4px Balkenbreite, der Kontrast steigt von flachem Grau zu klaren Streifen\" class=\"wp-image-4633\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-1024x181.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-300x53.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-768x135.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-1536x271.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-2048x361.png 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ms2109-horizontale-aufloesung-rampe-1px-4px-676x119.png 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Balkenbreiten-Rampe: 1px bleibt grau, ab 2px wird Kontrast sichtbar. Klassische Tiefpass-Signatur, ein echtes Horizontal-Limit.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Warum YUYV bei 1080p nur 5 fps macht<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zum Schluss noch die ber\u00fcchtigte 5-fps-Grenze, diesmal gemessen statt aus der Tabelle abgeschrieben (Quelle GT 630 bei 1080p60, <code>v4l2-ctl --stream-mmap<\/code>):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Format bei 1920&#215;1080<\/th><th>gemessen<\/th><\/tr><\/thead><tbody><tr><td>MJPEG<\/td><td><strong>29 fps<\/strong> (Tabelle: 30)<\/td><\/tr><tr><td>YUYV (unkomprimiert)<\/td><td><strong>exakt 5,0 fps<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Meine erste Erkl\u00e4rung mit \u201eungef\u00e4hr 40 MB\/s USB-2.0-Bandbreite&#8220; war zu schludrig. Der genaue Grund ist das <strong>Payload-Limit des isochronen UVC-Endpoints<\/strong>. Das gr\u00f6\u00dfte Altsetting des Video-Endpoints ist 3 mal 1024 Bytes pro Microframe, also 24,576 MB\/s (steht so im <code>lsusb -v<\/code>). Unkomprimiertes YUYV bei 1080p sind 1920 mal 1080 mal 2 Bytes, also 4,15 MB pro Frame. Die Firmware-Frametabelle ist genau so gew\u00e4hlt, dass die YUYV-Raten knapp darunter passen:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li>1080p mal 5 fps = 20,7 MB\/s<\/li>\n\n\n\n<li>720p mal 10 fps = 18,4 MB\/s<\/li>\n\n\n\n<li>480p mal 30 fps = 20,7 MB\/s<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Also keine generische \u201eUSB-2.0-Bandbreite&#8220;, sondern der High-Speed-Isoch-Endpoint plus die fest verdrahteten Frametabellen. MJPEG komprimiert vorher, deshalb bleiben dort 30 fps bei 1080p und bis zu 60 bei 720p und darunter. Klare Ansage: am MS2109 ist MJPEG bei hoher Aufl\u00f6sung Pflicht. Und \u201eUSB 3.0&#8243; auf der Verpackung ist und bleibt gelogen, das Ding enumeriert als USB-2.0-High-Speed, ohne SuperSpeed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Stabiles Device-Naming per udev<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Damit das Ger\u00e4t im Alltag immer unter demselben Pfad auftaucht, eine udev-Regel. Die Regeln stehen bewusst jeweils auf einer Zeile, weil mehrzeilige Fortsetzungen mit Backslash schnell zur Fehlerquelle werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \/etc\/udev\/rules.d\/70-vga-capture-ms2109.rules\nSUBSYSTEM==\"video4linux\", ENV{ID_VENDOR_ID}==\"534d\", ENV{ID_MODEL_ID}==\"2109\", ENV{ID_V4L_PRODUCT}==\"*AFN_Cap*\", ATTR{index}==\"0\", SYMLINK+=\"video-vga\"\nSUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"534d\", ATTRS{idProduct}==\"2109\", ATTRS{product}==\"USB3.0 Capture\", GOTO=\"ms2109_vga_end\"\nSUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"534d\", ATTRS{idProduct}==\"2109\", SYMLINK+=\"hidraw-vga\", MODE=\"0660\", GROUP=\"plugdev\"\nLABEL=\"ms2109_vga_end\"<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die GOTO-Konstruktion ist n\u00f6tig, weil <code>ATTRS{product}!=\"...\"<\/code> nicht so funktioniert, wie man denkt. udev sperrt die Attribut-Suche auf einen Parent-Device-Walk, und \u201eFehlen eines Attributs&#8220; verh\u00e4lt sich anders als ein echtes Ungleich. Deshalb der Umweg \u00fcber ein positives Match plus Sprungmarke.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Fazit, und der Workaround der wirklich hilft<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was bleibt? Der Dongle ist ein nettes Studienobjekt, aber f\u00fcr mein urspr\u00fcngliches Ziel, alte DOS-Signale aufnehmen, ist er unbrauchbar. Es gibt keine 70-Hz-Modi, und reparieren l\u00e4sst sich das nicht, weil die Frame-Tabelle im Mask-ROM festgebrannt ist. Das \u201e1080p&#8220; ist horizontal Marketing, \u201eUSB 3.0&#8243; eine glatte L\u00fcge, und die EDID-Mod ist auf dem getesteten Analogpfad wirkungslos, weil der Dongle gar keine EDID treibt. Drei Korrektur-Momente gegen\u00fcber meinen ersten Annahmen, alle drei lehrreicher als wenn alles gleich funktioniert h\u00e4tte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer wirklich exotische VGA-Signale wie DOS-Textmodi sauber aufnehmen will, schaltet eine externe Scaler-Box vor. Mein Tipp ist <a href=\"https:\/\/github.com\/ramapcsx2\/gbs-control\" target=\"_blank\" rel=\"noopener\">GBS-Control<\/a>, eine offene Firmware f\u00fcr die rund 20 Euro teuren GBS-8200-Boards. Sie nimmt das krumme Quellsignal, lockt sauber und gibt ein normgerechtes Bild aus, das jeder Capture-Stick frisst. Die andere Liga ist der <a href=\"http:\/\/junkerhq.net\/xrgb\/index.php\/OSSC\" target=\"_blank\" rel=\"noopener\">Open Source Scan Converter<\/a>, dessen Firmware-Update ich <a href=\"https:\/\/www.kernel-error.de\/2026\/05\/12\/open-source-scan-converter-ossc-firmware-update-1-21\/\">hier schon beschrieben habe<\/a>. Wer es noch g\u00fcnstiger mag, f\u00e4ngt einen gebrauchten Extron-Scaler aus einer Konferenzraum-Ausmusterung.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Offen bleibt das Strings-Mysterium (ohne das Vendor-Tool komme ich an den Gate-Algorithmus nicht ran), die Disassembly des zweiten Patch-Blocks in Ghidra, ein Latenz-Benchmark f\u00fcr den Einsatz als KVM-Console-Viewer, und der finale DOS-Test mit GBS-Control davor. Material f\u00fcr einen zweiten Teil ist also reichlich da.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Siehe auch:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><a href=\"https:\/\/www.kernel-error.de\/2026\/05\/12\/open-source-scan-converter-ossc-firmware-update-1-21\/\">Open Source Scan Converter: Firmware-Update von 1.08a auf 1.21 nachgeholt<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.kernel-error.de\/2026\/05\/18\/t4plus-v2-m-firmware-flashen-display-tuning-8mhz-quartz\/\">LCR-T4-Plus v2: m-firmware flashen, Display-Tuning und die 8-MHz-Quartz-Falle<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.kernel-error.de\/2026\/04\/05\/tc1-multifunction-tester-open-source-firmware-flashen-kalibrieren\/\">TC1 Multifunction Tester: Open-Source Firmware flashen, kalibrieren und die Stolperfallen dabei<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Habt ihr selbst schon so einen MS2109-Stick auseinandergenommen oder das Strings-Gate geknackt? Dann lasst es mich gerne wissen, ihr d\u00fcrft mich jederzeit <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein billiger VGA-USB-Capture-Stick sollte alte DOS-Signale aufnehmen. Stattdessen wurde es ein Reverse-Engineering des MacroSilicon MS2109: EEPROM-Dump, recycelter HDMI-Mask-ROM, eine EDID die der Quelle einen Monitor vorl\u00fcgt, und der Messbeweis, dass das 1080p horizontal Marketing ist.<\/p>\n","protected":false},"author":1,"featured_media":4637,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[279,281,13],"tags":[435,32,386,37,434,354,376,352],"class_list":["post-4635","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elektronik-diy","category-embedded-mikrocontroller","category-kernel-error-blog","tag-edid","tag-electronics","tag-embedded","tag-firmware","tag-ms2109","tag-reverse-engineering","tag-righttorepair","tag-usb","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4635"}],"version-history":[{"count":4,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4635\/revisions"}],"predecessor-version":[{"id":4640,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4635\/revisions\/4640"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4637"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4557,"date":"2026-05-25T09:55:01","date_gmt":"2026-05-25T07:55:01","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4557"},"modified":"2026-05-25T09:55:01","modified_gmt":"2026-05-25T07:55:01","slug":"grav-plugin-fediverse-publisher-activitypub-grav-blogs","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/25\/grav-plugin-fediverse-publisher-activitypub-grav-blogs\/","title":{"rendered":"grav-plugin-fediverse-publisher: ActivityPub f\u00fcr Grav-Blogs, neun Iterationen bis v0.1.0"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin-1024x576.png\" alt=\"Illustration eines Grav-Plugin-Adminbereichs, von dem ActivityPub-Beitr\u00e4ge \u00fcber ein f\u00f6deriertes Netzwerk an verschiedene Fediverse-Instanzen verteilt werden.\" class=\"wp-image-4563\" style=\"width:118px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin-1024x576.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin-300x169.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin-768x432.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin-1536x864.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin-676x380.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-plugin.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">WordPress hat seit Jahren das wunderbare <a href=\"https:\/\/github.com\/Automattic\/wordpress-activitypub\" target=\"_blank\" rel=\"noopener\">wordpress-activitypub<\/a> von Matthias Pfefferle und Automattic. Damit wird ein WordPress-Blog zu einem nativen Mastodon-Account, jeder Beitrag landet in den Timelines der Follower, Likes und Reposts kommen zur\u00fcck. F\u00fcr Grav gab es genau das nicht. Die Website meiner Frau l\u00e4uft auf Grav, sie schreibt hin und wieder fachlich, und seit l\u00e4ngerem wollte ich diesen Blog vern\u00fcnftig ins Fediverse bringen. Bisher half <code>feed2toot<\/code>, also RSS in Mastodon-Posts \u00fcbersetzt, das funktioniert zwar, ist aber kein ActivityPub. Keine Profilseite, keine Follower-Beziehung, kein nativer Hashtag-Index, keine saubere Article-Card. Also will ich versuchen selbst etwas zu schreiben. Das Ergebnis hei\u00dft <strong>grav-plugin-fediverse-publisher<\/strong>, ist seit ein paar Tagen als v0.1.0 drau\u00dfen und l\u00e4uft auf ihrer Webseite produktiv.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"527\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list-1024x527.png\" alt=\"Grav-Admin Plugin-Liste mit aktiviertem Fediverse Publisher v0.0.9 zwischen Form, Login und Markdown Notices\" class=\"wp-image-4552\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list-1024x527.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list-300x154.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list-768x395.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list-676x348.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-list.png 1297w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Im Grav-Admin reiht sich der Fediverse Publisher unaufgeregt zwischen Form, Login und Markdown Notices ein. Aktiviert, Version 0.0.9 im Screenshot, das ist genau die Iteration in der es zum ersten Mal richtig sauber durchlief.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Repo liegt auf GitHub unter <a href=\"https:\/\/github.com\/Kernel-Error\/grav-plugin-fediverse-publisher\" target=\"_blank\" rel=\"noopener\">Kernel-Error\/grav-plugin-fediverse-publisher<\/a> (MIT). Release v0.1.0 inklusive Changelog gibt es <a href=\"https:\/\/github.com\/Kernel-Error\/grav-plugin-fediverse-publisher\/releases\/tag\/v0.1.0\" target=\"_blank\" rel=\"noopener\">hier<\/a>. Eine Vorstellung mit Bitte um Feedback liegt im Grav-Discourse-Forum: <a href=\"https:\/\/discourse.getgrav.org\/t\/i-tried-to-build-an-activitypub-plugin-for-grav-looking-for-honest-feedback\/29613\" target=\"_blank\" rel=\"noopener\">I tried to build an ActivityPub plugin for Grav<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Warum \u00fcberhaupt, und warum jetzt<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Im Grav-Forum gibt es einen Thread aus dem Jahr 2019: <a href=\"https:\/\/discourse.getgrav.org\/t\/grav-activitypub\/9039\" target=\"_blank\" rel=\"noopener\">Grav &amp; ActivityPub<\/a>. Dort hat \u00fcber sechs Jahre hinweg dreimal jemand explizit nach genau dieser Funktion gefragt. Antworten gab es kaum, Code gar nicht. Das ist die Sorte L\u00fccke die ich charakteristisch finde f\u00fcr kleinere Open-Source-\u00d6kosysteme: alle finden es gut, niemand setzt sich hin. WordPress hatte \u00fcber Jahre dieselbe Situation, bis Pfefferle das wordpress-activitypub-Plugin gebaut und Automattic sp\u00e4ter \u00fcbernommen hat. F\u00fcr Grav ist niemand vorbeigekommen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bei mir kam dazu, dass ich einen echten produktiven Anwendungsfall habe. Nicole, meine Frau, betreibt einen Grav-Blog im Rahmen ihrer weiteren Ausbildung. Inhaltlich vollkommen anders gelagert als alles was hier \u00fcblicherweise federiert, aber genau deshalb auch ein wertvoller Stress-Test: andere Zielgruppe, andere Empf\u00e4ngerinstanzen, anderes Hashtag-Vokabular. Wenn das Plugin <em>dort<\/em> sauber l\u00e4uft, l\u00e4uft es \u00fcberall.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Phase 0: Machbarkeitscheck mit Scope-Disziplin<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bevor eine Zeile produktiver Code entstand, gab es eine Phase 0: gibt es die L\u00fccke wirklich, ist das PHP-Bibliotheks-\u00d6kosystem f\u00fcr ActivityPub brauchbar, und schaffe ich die langfristige Wartung als Solo-Entwickler? Verdikt: ja, aber nur als Broadcast-only-MVP. Konkret hei\u00dft das, der Blog kann <em>senden<\/em>, also Beitr\u00e4ge als <code>Create<\/code>-Activity an alle Follower-Inboxes ausliefern, sowie auf Standard-ActivityPub-Queries antworten (Actor-Profile, Outbox, Followers, NodeInfo, WebFinger, HTTP-Signaturen rein und raus). Nicht im Scope sind Replies als Kommentare zur\u00fcck in Grav, Multi-Actor-Setups, Authorized Fetch und Theme-seitige Patches. Diese Disziplin durchzuhalten war im Verlauf ein paar Mal anstrengend, hat sich aber durchweg ausgezahlt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vor der ersten Code-Zeile entstanden vier ADRs (Architecture Decision Records) zu Storage, HTTP-Signaturen, asynchronem Push und Content-Negotiation. Diese ADRs habe ich zweimal kritisch gegenlesen lassen. In Runde zwei kamen drei L\u00fccken zum Vorschein, die ich allein \u00fcbersehen h\u00e4tte. Die ungem\u00fctlichste: <code>landrok\/activitypub<\/code> verifiziert beim Parsen verlinkter Objekte still im Hintergrund Netzwerk-I\/O. Das h\u00e4tte die gesamte SSRF-H\u00e4rtung des Inbound-Pfads ausgehebelt. Konsequenz: <code>landrok<\/code> nur f\u00fcr die Erzeugung von AS-2.0-Objekten und WebFinger benutzen, der gesamte sicherheitsrelevante Inbound-Pfad geht <em>nicht<\/em> mehr durch landrok. Phpseclib \u00fcbernimmt die Krypto direkt, der HTTP-Signature-Verifier ist eigene Implementierung. Insgesamt sind \u00fcber die ADR-Reviews und ein nachgelagertes Review der ersten Implementierung acht sicherheitsrelevante Fixes eingeflossen, bevor das Plugin produktiv ging.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-1024x580.png\" alt=\"Konfigurationsseite des Fediverse-Publisher-Plugins im Grav-Admin mit Local-Actor-Feldern, Blog-Scope, Article-Threshold und Canonical-Host-Eintrag\" class=\"wp-image-4553\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-1024x580.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-300x170.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-768x435.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-1536x870.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-2048x1160.png 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/grav-fediverse-plugin-config-676x383.png 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Die ganze Konfiguration auf einer Seite. Lokaler Actor, Avatar- und Header-URL, ein Blog-Path-Filter und der Canonical Host. Das war einer der fr\u00fch festgelegten Designgrunds\u00e4tze: ein Admin-Screen, alles in Klartext, kein eigenes UI-Framework.<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Stack-Entscheidungen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die wichtigsten Bauklotz-Entscheidungen in Stichworten:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><code>landrok\/activitypub<\/code> f\u00fcr die AS-2.0-Objekte und WebFinger<\/li>\n\n\n\n<li><code>phpseclib\/phpseclib<\/code> f\u00fcr die Krypto direkt, ohne Umweg \u00fcber landrok auf dem Inbound-Pfad<\/li>\n\n\n\n<li>HTTP-Signaturen nach <code>draft-cavage-12<\/code>, f\u00fcr Sign und Verify selbst implementiert<\/li>\n\n\n\n<li>SQLite per PDO im WAL-Modus f\u00fcr Follower-Tabelle und Push-Queue<\/li>\n\n\n\n<li>Synthetic Endpoints via <code>onPluginsInitialized<\/code>, ein Pattern aus <code>grav-plugin-form<\/code>, mit PSR-7-Responses statt Symfony HttpFoundation<\/li>\n\n\n\n<li>Outbound-Queue mit echtem Idempotenz-Anker per <code>INSERT OR IGNORE<\/code> auf <code>(activity_id, recipient_inbox)<\/code><\/li>\n\n\n\n<li>Retry-Schedule 1m \/ 5m \/ 30m \/ 2h \/ 12h \/ 24h mit Jitter, Cap bei sieben Versuchen, danach <code>status='dead'<\/code><\/li>\n\n\n\n<li>SSRF-geh\u00e4rteter keyId-Fetch: HTTPS-only, Block privater IP-Bereiche, keine Redirects, 64 KiB Response-Cap, Negative-Cache<\/li>\n\n\n\n<li>Strikte Identity-Bindung: <code>keyId<\/code>, <code>publicKey.owner<\/code> und <code>activity.actor<\/code> m\u00fcssen nach Normalisierung auf dieselbe Actor-URL zeigen<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer den vollen technischen Aufschrieb sucht, findet die ADRs als Markdown-Dateien im Repo unter <code>docs\/adr\/<\/code>. Die sind als Lese-Doku formuliert, nicht als Mitschrift.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Neun Iterationen in zwei Tagen, jede mit echtem Erkenntnisgewinn<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn jemand fragt, warum ein scheinbar geradliniges Plugin neun Patch-Versionen gebraucht hat: weil jede einzelne dieser Versionen eine echte Produktions-Erkenntnis war, die ich nicht in einem theoretischen Vorab-Design h\u00e4tte antizipieren k\u00f6nnen. Hier in kompakt, weil die Liste f\u00fcr sich spricht:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><strong>v0.0.1: Boot-Crash auf der Produktion.<\/strong> Composer hat <code>psr\/log<\/code> v3 reingezogen, Grav 1.7 bringt aber v1. Resultat: ganze Site HTTP 500, und das obwohl das Plugin noch gar nicht aktiviert war. Grav ruft <code>autoload()<\/code> bei jedem installierten Plugin schon beim Boot auf.<\/li>\n\n\n\n<li><strong>v0.0.2:<\/strong> <code>psr\/log<\/code> auf <code>^1.1<\/code> gepinnt, defensives <code>try\/catch<\/code> im Plugin-Entry, Preflight-Check via explizitem <code>require_once<\/code> statt Autoload-Pfad.<\/li>\n\n\n\n<li><strong>v0.0.3: SQL-Quoting-Falle.<\/strong> PHP 8.3 mit aktuellem libsqlite parst Double-Quoted-Strings als Identifier, nicht als String-Literale. Klassischer Fall, fr\u00fch genug erkannt, danach konsequent Single-Quotes \u00fcberall. Im selben Schritt das Listing-Page-Filter gesch\u00e4rft, dazu Actor-Endpoints fertig gemacht.<\/li>\n\n\n\n<li><strong>v0.0.4: Router-Wiring vergessen.<\/strong> Die Routen f\u00fcr <code>followers<\/code> und <code>following<\/code> waren im Code zwar vorhanden, aber nicht registriert. Mastodon zeigte hartn\u00e4ckig &#8222;0 followers&#8220; obwohl reale Follower in der DB lagen. Plus Diagnostics-Logging f\u00fcr Outbound-401-Antworten, damit ich die n\u00e4chste Klasse von Bugs \u00fcberhaupt sehen konnte.<\/li>\n\n\n\n<li><strong>v0.0.5: psr\/log-Konflikt war tiefer als gedacht.<\/strong> Die Default-Einstellung <code>autoload(prepend=true)<\/code> hat den Plugin-eigenen Vendor-Pfad \u00fcber Grav 2.0s gebundeltes <code>psr\/log<\/code> v3 gezogen, was unter Grav 2.0 in ganz neue Fehlerbilder kippte. Fix: <code>prepend=false<\/code>. Im selben Schritt ein neues, mandatorisches <code>canonical_host<\/code>-Config-Feld eingef\u00fchrt, sonst signiert die Cron mal eben <code>keyId=http:\/\/localhost\/...<\/code>, was kein Empf\u00e4nger akzeptiert. Ab hier l\u00e4uft im Dev parallel ein zweiter Container mit Grav 1.7.52 und PHP 8.3.31 (matcht die Produktion byte-genau). Dieser Dual-Grav-Stack f\u00e4ngt seitdem alle Bugs der Klasse &#8222;passt auf einer Major-Version, kracht auf der anderen&#8220; lokal ab, statt sie \u00fcber Nicole laufen zu lassen.<\/li>\n\n\n\n<li><strong>v0.0.6: AS-2.0-Spec-Violation.<\/strong> Bei r\u00fcckdatierten Posts war <code>updated &lt; published<\/code>, was strenge ActivityPub-Implementierungen wie GoToSocial und Pleroma silently droppen. HTTP 202 vom Empf\u00e4nger, aber kein Eintrag in der Timeline. Fix war eine Zeile Clamp, der Fehler dahinter aber lehrreich: ein 2xx-Status sagt zu Federation-Erfolg gar nichts.<\/li>\n\n\n\n<li><strong>v0.0.7: der echte Showstopper.<\/strong> Grav-Admin 1.10 und neuer routet Page-Saves <em>nicht<\/em> mehr durch <code>onAdminAfterSave<\/code>, sondern durch <code>onFlexAfterSave<\/code> (\u00fcber das Flex-Objects-Plugin). Folge: User speichert einen Beitrag im Admin, der Save feuert, das Plugin macht nichts, kein Queue-Eintrag, keine Federation. Im selben Release dann auch AS-2.0-Hashtag-Federation hinzugef\u00fcgt. Hashtags sind in der Praxis der prim\u00e4re Discovery-Pfad f\u00fcr einen Actor mit null Followern, weil Mastodons Hashtag-Index fremde Actors automatisch aufnimmt. Drittens kam ein neues <code>broadcast:post<\/code>-CLI-Kommando rein, das einen einzelnen Pfad in die Queue legt, f\u00fcr Recovery und Backfill.<\/li>\n\n\n\n<li><strong>v0.0.8: Hotfix nach Hotfix.<\/strong> Meine Diagnostik-Zeile in v0.0.7 hat <code>iterator_to_array($event)<\/code> auf RocketThemes Event-Klasse aufgerufen. Die implementiert <code>ArrayAccess<\/code>, aber nicht <code>Traversable<\/code>. Ergebnis: <code>TypeError<\/code> bei jedem Admin-Save, HTTP 500, Nicole sah eine 624 KB gro\u00dfe Fehlerseite. Diese Klasse Bug ist genau die Sorte, die das &#8222;passt schon&#8220;-Gef\u00fchl belohnt. Fix: <code>iterator_to_array<\/code> raus, Logik in eine testbare <code>PageSaveDiagnostics<\/code>-Klasse extrahiert, 13 neue Unit-Tests die alle m\u00f6glichen Event-Object-Shapes durchfuzzen. Wenn schon dasselbe Problem mehrfach, dann wenigstens mit Tests dagegen.<\/li>\n\n\n\n<li><strong>v0.0.9: stale Collection.<\/strong> Auch nach v0.0.8 hat der Broadcaster bei frischen Posts nicht gefeuert. Ursache: <code>$pages-&gt;find()<\/code> arbeitet auf einem Pre-Save-Snapshot der Pages-Collection. Frisch gespeicherte Inhalte sind zu dem Zeitpunkt noch nicht drin. Fix: eine neue <code>findByPage(PageInterface)<\/code>-Methode, die direkt das Event-Payload nimmt, statt durch die stale Collection zu spazieren. Plus per-bail INFO-Logging: jede Regression dieser Klasse ist seither ein einziger <code>grep<\/code> entfernt von actionable. Mit v0.0.9 lief es dann durch, sauber, unter Last, an echten Followern auf realen Instanzen.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">v0.1.0 ist im Wesentlichen v0.0.9 mit ehrlichem README, einem Changelog der die ganze Geschichte oben dokumentiert, und dem <a href=\"https:\/\/discourse.getgrav.org\/t\/i-tried-to-build-an-activitypub-plugin-for-grav-looking-for-honest-feedback\/29613\" target=\"_blank\" rel=\"noopener\">Vorstellungspost im Grav-Forum<\/a>. Mir war wichtig, das Ding nicht als &#8222;stable&#8220; zu vermarkten. Es ist Early Access, ich bin solo, ich brauche Tester.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Methodisch: drei Dinge die den Unterschied gemacht haben<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aus den neun Iterationen kann man ein paar Schl\u00fcsse ziehen, die ich selbst spannender finde als die einzelnen Bugs.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Erstens, der Dual-Grav-Dev-Stack.<\/strong> Zwei Container, derselbe Plugin-Source, einmal Grav 1.7.52 und einmal Grav 2.0 RC. Eingerichtet als Reaktion auf das <code>psr\/log<\/code>-Drama in v0.0.5. Seitdem werden Bugs der Klasse &#8222;passt unter Major X, crasht unter Major Y&#8220; lokal sichtbar, bevor sie Nicole erreichen. Das ist im Tagesgesch\u00e4ft die langweiligste Investition, die ich gemacht habe, und gleichzeitig die wertvollste.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Zweitens, ein dedizierter Production-Feedback-Loop.<\/strong> Deployment und Smoke-Test auf der Live-Site liefen \u00fcber einen sauber getrennten Track. Dort wird das Plugin installiert, gegen mastodon.social und bonn.social gepr\u00fcft, eine Feedback-Notiz zur\u00fcck in das Planungs-Verzeichnis geschrieben. Lokal wird daraufhin triagiert, gefixt, die Patch-Version gebumpt, gepusht. Beide Tracks haben klare Scopes: Deploy-Zugang und Auth bleiben dort wo das auch tats\u00e4chlich passiert, Architektur-Wissen und Code-\u00c4nderungen im anderen Bereich. Klingt nach Overhead, war aber der Grund, warum ich Bugs wie das <code>onFlexAfterSave<\/code>-Routing-Problem aus v0.0.7 \u00fcberhaupt in akzeptabler Zeit gefunden habe: der Live-Blog war der Detektor, nicht meine lokale Dev-Maschine.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>Drittens, externes Gegenlesen an sicherheitskritischen Stellen.<\/strong> HTTP-Signaturen, Inbox-Verifikation, SSRF-H\u00e4rtung, Identity-Binding. \u00dcberall wo ein Fehler in einer realen Verwundbarkeit landet, ging der Code durch eine zus\u00e4tzliche Review-Runde mit eigenem Blickwinkel. Vier potenzielle Regressionen sind dabei aufgefallen, die ich allein gemacht oder \u00fcbersehen h\u00e4tte. Ein zweites Augenpaar ersetzt kein Sicherheits-Audit, hebt aber das untere Drittel der &#8222;h\u00e4tte mir auch auffallen k\u00f6nnen&#8220;-Klasse Fehler ziemlich zuverl\u00e4ssig nach oben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wie das f\u00fcr einen Mastodon-User aussieht<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-profile.png\"><img loading=\"lazy\" decoding=\"async\" width=\"614\" height=\"684\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-profile.png\" alt=\"Mastodon-Profil von @nicole@www.beratung-rheinbach.de mit Header-Bild, Bio, Registrierungsdatum, 12 Beitr\u00e4gen und 2 Followern\" class=\"wp-image-4554\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-profile.png 614w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-profile-269x300.png 269w\" sizes=\"auto, (max-width: 614px) 100vw, 614px\" \/><\/a><figcaption class=\"wp-element-caption\">Aus Sicht eines Mastodon-Users ist das ein ganz regul\u00e4rer Account: Header-Bild, Avatar, Bio, Beitr\u00e4ge, Follower-Counter, Folgen-Button. Nichts verr\u00e4t, dass dahinter kein Mastodon-Server steht, sondern ein Grav-Blog mit ein paar tausend Zeilen PHP drumherum.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Genau das war das Ziel. Ein Mastodon-User abonniert <code>@nicole@www.beratung-rheinbach.de<\/code>, dr\u00fcckt auf Folgen, und sieht ab dem n\u00e4chsten Beitrag jeden neuen Artikel direkt in der Home-Timeline. Avatar und Header werden gezogen, Bio steht da, die Profilseite zeigt alle bisher federierten Beitr\u00e4ge, und die Hashtags am Ende jedes Posts landen im Hashtag-Index der Empf\u00e4ngerinstanz. Letzteres ist nicht kosmetisch. F\u00fcr einen Account mit null Followern ist der Hashtag-Index der prim\u00e4re Discovery-Pfad, weil Mastodon dabei auch Posts <em>fremder<\/em> Actors mitnimmt, die zum gleichen Tag federieren.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-post.png\"><img loading=\"lazy\" decoding=\"async\" width=\"610\" height=\"756\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-post.png\" alt=\"Einzelner Blogpost zu Pausen aus dem Grav-Blog Beratung Rheinbach, in der Mastodon-Timeline mit Featured Image, Excerpt und Hashtags beratung, systemischeberatung und pausen\" class=\"wp-image-4555\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-post.png 610w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/mastodon-nicole-post-242x300.png 242w\" sizes=\"auto, (max-width: 610px) 100vw, 610px\" \/><\/a><figcaption class=\"wp-element-caption\">Ein konkreter Artikel in der Mastodon-Timeline. Header-Bild aus dem Grav-Asset, Titel, Excerpt, drei Hashtags und ein Klick-Link zur\u00fcck auf den Originalbeitrag. Nicht beeindruckender als bei wordpress-activitypub, und genau das ist der Punkt.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die End-to-End-Latenz vom Speichern im Grav-Admin bis zur Anzeige in der Heimat-Timeline eines Followers liegt bei rund 15 Sekunden. Das ist der asynchrone Push aus der SQLite-Queue plus der \u00fcblichen ActivityPub-Delivery. F\u00e4llt eine Instanz aus, retryed das Plugin nach Schedule. Erreicht der Push nach sieben Versuchen kein 2xx, markiert die Queue den Eintrag als <code>dead<\/code> und lernt aus dem letzten Statuscode, ob die Instanz dauerhaft weg ist oder ob es nur ein vor\u00fcbergehendes Problem war.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was geplant ist, und was bewusst drau\u00dfen bleibt<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Roadmap f\u00fcr v0.2, ohne festes Datum:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><code>Update<\/code>-Activity bei Re-Saves. Auf Mastodon kosmetisch, f\u00fcr Pleroma und Misskey m\u00f6glicherweise relevant, da diese die Post-Card neu ziehen.<\/li>\n\n\n\n<li><code>Delete<\/code>-Federation. Aus Compliance-Sicht eine sinnvolle Komplettierung.<\/li>\n\n\n\n<li><code>push:purge-old-activities<\/code> als Housekeeping-CLI, damit die SQLite-Datei nicht ewig w\u00e4chst.<\/li>\n\n\n\n<li>Breitere Peer-Tests gegen Friendica und Misskey, um die HTTP-Signatur-Verifikation gegen weitere Implementierungen abzusichern.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was explizit <em>nicht<\/em> kommt, jedenfalls nicht als integraler Plugin-Bestandteil:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li>Replies aus dem Fediverse als Kommentare zur\u00fcck in den Grav-Blog. Sehr beliebte Wunschfunktion, aber sie sprengt das Broadcast-only-Scope und bringt eine ganze eigene Klasse von Spam-, Moderations- und Persistenz-Fragen mit, die ich nicht halbgar l\u00f6sen will.<\/li>\n\n\n\n<li>Multi-Actor pro Grav-Instanz. Ein Blog ist ein Actor, fertig.<\/li>\n\n\n\n<li>Authorized Fetch. Ist aktuell ohnehin nur eine Untermenge der Mastodon-Welt, und die Kosten in Komplexit\u00e4t stehen nicht im Verh\u00e4ltnis zum Nutzen f\u00fcr ein Plugin in diesem Stadium.<\/li>\n\n\n\n<li>Theme-seitige Patches. Das Plugin h\u00e4ngt sich nicht in die Twig-Templates des Blogs.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die n\u00e4chsten Schritte sind bewusst reaktiv. Statt einer langen Vorab-Roadmap warte ich, was aus der Community zur\u00fcckkommt. Erste Reaktion im <a href=\"https:\/\/discourse.getgrav.org\/t\/i-tried-to-build-an-activitypub-plugin-for-grav-looking-for-honest-feedback\/29613\" target=\"_blank\" rel=\"noopener\">Discourse-Thread<\/a>: ein User schl\u00e4gt Software-Release-Changelogs als zweiten Anwendungsfall vor. Anderer Content-Shape als ein normaler Blog-Broadcast, aber technisch derselbe Page-Save-zu-<code>Create<\/code>-Activity-Pfad. Notiert f\u00fcr v0.2. Im alten <a href=\"https:\/\/discourse.getgrav.org\/t\/grav-activitypub\/9039\" target=\"_blank\" rel=\"noopener\">2019er-Thread<\/a> habe ich ebenfalls einen Cross-Link gesetzt, damit Leute die nach Grav und ActivityPub googeln in der ersten Trefferzeile beim Repo landen statt bei sechs Jahre alten Fragen ohne Antwort.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Ehrliche Einordnung<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Plugin l\u00e4uft, aber es l\u00e4uft auf <em>einer<\/em> Grav-Instanz unter genau einer Konfiguration mit zwei test Followern auf zwei Mastodon-Instanzen. Das ist ein winziger Ausschnitt aus dem, was Fediverse so an Implementierungen, Versionen und Edge-Cases zu bieten hat. Ich habe gegen die ActivityPub-Spec implementiert, gegen die HTTP-Signature-Drafts gelesen und gegen Mastodons faktisches Verhalten validiert. Pleroma- und Misskey-Spezifika sind nur sekund\u00e4r ber\u00fccksichtigt, Friendica gar nicht. Wer das Plugin auf einer eigenen Grav-Installation ausprobiert und gegen seine Lieblings-Mastodon-Heimat-Instanz federiert, hilft mir mehr als jeder weitere Unit-Test, den ich allein schreiben kann.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn etwas nicht l\u00e4uft, ist ein Issue im <a href=\"https:\/\/github.com\/Kernel-Error\/grav-plugin-fediverse-publisher\/issues\" target=\"_blank\" rel=\"noopener\">Repo<\/a> der direkteste Weg. Eine Antwort im <a href=\"https:\/\/discourse.getgrav.org\/t\/i-tried-to-build-an-activitypub-plugin-for-grav-looking-for-honest-feedback\/29613\" target=\"_blank\" rel=\"noopener\">Forum-Thread<\/a> erreicht zus\u00e4tzlich auch andere Grav-Anwender die wom\u00f6glich \u00c4hnliches sehen. \u00dcber die <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\" data-type=\"page\" data-id=\"38\" target=\"_blank\" rel=\"noreferrer noopener\">Kontaktseite<\/a> hier auf dem Blog komme ich genauso an Mails.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bleibt eine kleine Beobachtung f\u00fcr alle, die sich an \u00e4hnliche Projekte heranwagen. Zwei Tage Iterationen, neun Patch-Releases, ein Production-Inzident mit der 624-KB-Fehlerseite. Das ist genau der Realismus, den ein Plugin im ersten echten Einsatz mitbringt. Es w\u00e4re bequemer, das im Changelog wegzulassen und v0.1.0 als unbefleckte erste Ver\u00f6ffentlichung zu inszenieren. Mir war es wichtiger, die Story so zu erz\u00e4hlen, wie sie ablief, weil ich diesen Schreibstil bei anderen Open-Source-Projekten selbst sehr sch\u00e4tze.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Siehe auch: <a href=\"https:\/\/www.kernel-error.de\/2026\/05\/15\/ts3level-teamspeak-identity-security-level-gpu\/\">ts3level<\/a> (anderes Solo-Projekt, andere Domain, gleicher Workflow).<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Fragen, Kommentare, Bug-Reports, oder einfach Lust auf einen kurzen Austausch zum Plugin gerne \u00fcber die <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>-Seite oder direkt als Issue im Repo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr Grav gab es bisher kein natives ActivityPub-Plugin. Sechs Jahre lang im Forum nachgefragt, niemand hat es gebaut. Jetzt schon: grav-plugin-fediverse-publisher v0.1.0, MIT, produktiv auf einem Live-Blog, neun Iterationen Patch-Geschichte inklusive.<\/p>\n","protected":false},"author":1,"featured_media":4563,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,280],"tags":[430,429,383,432,431,433,85,372],"class_list":["post-4557","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-tools-software","tag-activitypub","tag-fediverse","tag-foss","tag-grav","tag-mastodon","tag-php","tag-plugin","tag-selfhosted","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4557"}],"version-history":[{"count":6,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4557\/revisions"}],"predecessor-version":[{"id":4565,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4557\/revisions\/4565"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4563"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4498,"date":"2026-05-19T15:58:26","date_gmt":"2026-05-19T13:58:26","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4498"},"modified":"2026-05-20T11:45:07","modified_gmt":"2026-05-20T09:45:07","slug":"arbeitskollege-michael-ai-roast-kernel-error-blog","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/19\/arbeitskollege-michael-ai-roast-kernel-error-blog\/","title":{"rendered":"Mein Arbeitskollege Michael l\u00e4sst eine AI meinen Blog roasten"},"content":{"rendered":"\n<p class=\"has-small-font-size wp-block-paragraph\">Moin.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Mein Arbeitskollege Michael hatte neulich eine Idee, die ich auf Anhieb gro\u00dfartig fand. Er hat einer AI meinen Blog vorgesetzt und um einen Roast gebeten. Das Ergebnis liegt unten in voller L\u00e4nge, wortw\u00f6rtlich, unver\u00e4ndert, inklusive aller Em-Dashes und s\u00e4mtlicher AI-typischer Stilfiguren. Ich habe nicht eingegriffen, weil genau die ja Teil der Diagnose sind.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast-1024x576.png\" alt=\"Illustration eines \u00fcberladenen Self-Hosting-Arbeitsplatzes mit Terminals, neun Server-Jails, Mate und einer AI, die den privaten Tech-Blog humorvoll roastet.\" class=\"wp-image-4500\" style=\"width:170px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast-1024x576.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast-300x169.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast-768x432.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast-1536x864.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast-676x380.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/roast.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vorweg, damit das klar ist: ich richte keinen einzigen Punkt richtig. Erstens w\u00e4re das genau der Verteidigungsreflex, den der Roast selbst schon im Text zerlegt. Zweitens lache ich beim Lesen laut, und ich habe vor, das beizubehalten. Drittens hat Michael sich diesen kleinen Treffer redlich verdient, der geh\u00f6rt in voller L\u00e4nge ins Schaufenster.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Falls du gerade zum ersten Mal hier auf dem Blog landest und nichts mit dem Kontext anfangen kannst: ja, neun Jails. Ja, .onion. Ja, llms.txt. Ja, DNS-Resolver mit Post-Quantum-TLS, den niemand benutzt. Und ja, neben der Tastatur steht in diesem Moment eine Mate. Genau wie diagnostiziert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der Roast, in voller L\u00e4nge<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote has-small-font-size is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udd25 Der gro\u00dfe Roast von kernel-error.de \ud83d\udd25<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Header-Logo: -=Kernel-Error=-<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bruder. Bruder. Wir schreiben das Jahr 2026 und du f\u00e4hrst da oben immer noch die ASCII-Deko, die du 1998 in deinem IRC-Channel #linuxnoobs auf dem QuakeNet eingerichtet hast. Die einzigen Menschen, die so ein Logo heute noch designen, sind 1) du und 2) der Typ, der seine Quake-3-Clantag-Konvention nie verlassen hat. Fehlt eigentlich nur noch ein blinkendes &lt;marquee&gt; mit &#8222;Best viewed in Netscape Navigator 4.0&#8220; und der vollst\u00e4ndige Retro-Albtraum w\u00e4re komplett.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Tagline: &#8222;Privater Tech-Blog seit 2003&#8220;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">23 Jahre Selbst-Hosting, 23 Jahre Postfix-Konfigurationen, 23 Jahre derselbe Mensch, der jedem auf der Familienfeier erkl\u00e4rt, warum seine Tante kein WhatsApp benutzen sollte. &#8222;Seit 2003&#8220; ist kein Datum, das ist eine Diagnose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Hausordnung<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein privater Blog. Mit Hausordnung. Mit Leits\u00e4tzen. Mit einer Philosophie. Mein Bester, das ist keine Webseite mehr, das ist ein Manifest. Du hostest hier keinen Blog, du gr\u00fcndest eine Sekte f\u00fcr Leute, die vim f\u00fcr eine Lifestyle-Entscheidung halten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und mein absoluter Favorit:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;Knappheit vor Geschw\u00e4tzigkeit \u2014 ein funktionierendes diff schl\u00e4gt f\u00fcnf Abs\u00e4tze Marketingdeutsch.&#8220;<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schreibt der Mann, dessen &#8222;\u00dcber mich&#8220;-Seite eine vierteilige Origin-Story enth\u00e4lt, in der ein Familienmitglied beim Telefonsupport sagt &#8222;Ach, da ist bestimmt wieder der Kernel-Error&#8220;. Das ist literarisch \u00fcbrigens auf einem Level mit &#8222;Mein Vater nannte mich Maverick, weil ich immer schon gegen den Strom geschwommen bin.&#8220; Knappheit, ja klar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Self-Hosting-Flex<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;Neun FreeBSD-Jails, eigene DNS-Infrastruktur, Matrix-Chat, Nextcloud, Tor Hidden Service&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">NEUN. JAILS. F\u00fcr einen privaten Blog, der Posts \u00fcber das Flashen von LCR-Tester-Firmware ver\u00f6ffentlicht. Mein Mann betreibt zu Hause mehr Infrastruktur als die Stadtverwaltung Bad Neuenahr-Ahrweiler und der einzige Traffic, der dort jemals ankommt, sind drei Crawler von Censys und sein eigener Uptime-Checker.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine .onion-Adresse. F\u00fcr einen deutschen FreeBSD-Blog. Weil nat\u00fcrlich der KGB, die NSA und das BKA gemeinsam einen Joint Task Force gegr\u00fcndet haben, um herauszufinden, wer da Tutorials f\u00fcr Postfix mit OpenSSL 3.5 liest. Klar, anonyme Whistleblower aus Nordkorea wollen unbedingt wissen, wie man TeamSpeak-Identity-Level auf der GPU berechnet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Post-Quantum-Kryptographie<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Du. Hast. Post-Quantum-TLS-Handshakes. Auf einem WordPress-Blog. Mit einem Anders-Nor\u00e9n-Theme. Lass das mal kurz sacken. Wenn ein Quantencomputer der NSA jemals dein Setup angreift, dann nicht, weil sie an deinen Blog-Content wollen, sondern weil sie wissen wollen, warum zur H\u00f6lle ein Privatmensch X25519+ML-KEM f\u00fcr einen Beitrag \u00fcber Open Source Scan Converter braucht. Das ist, als w\u00fcrdest du ein Bundeswehr-Schutzbunker-System unter deine Gartenlaube bauen, weil dort dein Modellbahn-Diorama steht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Der DNS-Resolver<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;Ein \u00f6ffentlicher DNS-Resolver unter <a href=\"https:\/\/dns.kernel-error.de\/\" data-type=\"link\" data-id=\"https:\/\/dns.kernel-error.de\/\" target=\"_blank\" rel=\"noreferrer noopener\">dns.kernel-error.de<\/a> bietet DoT, DoH und Post-Quantum-TLS kostenlos ohne Logging.&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Niemand. Hat. Danach. Gefragt. Das ist die Internet-\u00c4quivalenz von: Du l\u00e4ufst durch die Fu\u00dfg\u00e4ngerzone, baust einen Klapptisch auf und schreist: &#8222;ICH MACHE IHNEN KOSTENLOS UND OHNE NACHFRAGE IHRE STEUERERKL\u00c4RUNG MIT QUANTENRESISTENTER VERSCHL\u00dcSSELUNG!&#8220; \u2014 und wunderst dich dann, dass nur drei FreeBSD-Mailing-List-Nerds und ein Bot stehenbleiben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Credentials-Flex<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;Digitaler Ersthelfer beim BSI, Mitglied im CCC, auf HackerOne und Intigriti&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist nicht mehr &#8222;\u00dcber mich&#8220;, das ist ein LinkedIn-Profil im Tarnmodus. Fehlt nur noch &#8222;1% Toplister auf TryHackMe&#8220; und &#8222;Awarded: Most Reflective Vest at Chaos Communication Congress 2019&#8220;. Was kommt als n\u00e4chstes? AbuseIPDB-Reputation-Score als verstecktes Easter Egg? \u2014 Ach. Doch. Ja. Genau das. Du flexst tats\u00e4chlich mit deinem AbuseIPDB-Profil. Das ist der Sicherheits-\u00c4quivalenz von &#8222;Mein Dorf hat mich zum Sch\u00fctzenk\u00f6nig gew\u00e4hlt&#8220;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Blog-Post-Titel<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lass uns das mal durchgehen, das ist Kunst:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;LCR-T4-Plus v2: m-firmware flashen, Display-Tuning und die 8-MHz-Quartz-Falle&#8220;<\/em><br>Globale Zielgruppe dieses Posts: weltweit ca. 11 Menschen, von denen 4 schon tot sind und 2 OpenBSD nutzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;ts3level: TeamSpeak-Identity-Level auf der GPU rechnen&#8220;<\/em><br>Du. Du nutzt im Jahr 2026 noch TeamSpeak. Und brennst daf\u00fcr GPU-Zyklen ab, die Hawaii-Familien drei Wochen klimatisieren k\u00f6nnten. Discord existiert seit elf Jahren. Elf.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;Open Source Scan Converter: Firmware-Update von 1.08a auf 1.21&#8220;<\/em><br>Das ist kein Blog-Post, das ist eine Notruf. Irgendwo schreit ein 35-j\u00e4hriger Mann nach Validierung f\u00fcr seine SCART-Sammlung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;AI, der Mensch als Flaschenhals und meine Sorgen f\u00fcr die n\u00e4chsten 15 Jahre&#8220;<\/em><br>AHA. Da sind sie also, die f\u00fcnf Abs\u00e4tze, die das diff h\u00e4tte schlagen sollen. Die obligatorische Tech-Blog-Existenzkrise-Folge. Jeder Self-Hoster muss einmal im Jahr seinen &#8222;Ich habe nachgedacht und mache mir Sorgen&#8220;-Post raushauen, sonst verliert man den FreeBSD-Mitgliedsausweis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8222;Postfix 3.11.1 mit OpenSSL 3.5: Post-Quantum-TLS jetzt nativ&#8220;<\/em><br>Hier gl\u00fcht der Mann. Hier ist er zu Hause. Hier passiert die Magie. Sechs Menschen lesen es und einer von denen ist ein Bot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>&#8222;Versteckte Easter Eggs&#8220;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8222;llms.txt, llms-full.txt, VirusTotal, AbuseIPDB Profile&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">llms.txt. Du hast eine llms.txt. Die explizite &#8222;Bitte-LLM-lies-mich-ich-bin-relevant&#8220;-Datei. W\u00e4hrend du gleichzeitig einen Post schreibst, in dem du dir &#8222;Sorgen \u00fcber AI&#8220; machst. Bro. Du l\u00e4dst genau das Monster ein, vor dem du Angst hast, und l\u00e4sst ihm noch einen Begr\u00fc\u00dfungs-Cookie auf dem Sofakissen liegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Theme-Detail<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein WordPress-Theme von Anders Nor\u00e9n. Der Mann reicht von Linux-Kernel-Internals \u00fcber DNSSEC bis zu PQ-Crypto \u2014 aber bei der Webseite hat er gesagt &#8222;ach, was die Schweden im default schicken passt schon&#8220;. Es ist, als w\u00fcrde Gordon Ramsay zu Hause Fischst\u00e4bchen aus der Mikrowelle essen. Lobenswert ehrlich, irgendwie aber auch beleidigend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Sprachebene: &#8222;Moin!&#8220;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Klassisch. Norddeutsche Authentizit\u00e4ts-Geste. Drei Anschl\u00e4ge, die signalisieren: &#8222;Ich bin bodenst\u00e4ndig, ich rede Klartext, ich trinke meinen Kaffee schwarz wie mein Terminal und ich habe keine Zeit f\u00fcr Bullshit&#8220; \u2014 direkt gefolgt von einer mehrseitigen Hausordnung \u00fcber digitale Werte und Mehrjahres-Reflektionen \u00fcber AI. Moin, Schatz. Moin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das \u00fcbergreifende Problem<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Seite ist die digitale Inkarnation des Mannes, der dir auf einem LAN-Party Geburtstag erkl\u00e4rt, warum er <em>Eigentlich<\/em> kein Energiedrink trinkt, sondern lieber Mate, weil:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a) Koffeingehalt definierbarer ist<br>b) Open-Source-philosophischer Konsum<br>c) &#8222;Ist halt mehr meins.&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Du willst hier gar keinen Blog. Du willst, dass jemand vorbeikommt und sagt: &#8222;Wow, neun Jails? Erz\u00e4hl mir mehr.&#8220; Aber niemand kommt vorbei, weil deine .onion-Adresse nur \u00fcber deinen eigenen Tor-Bridge erreichbar ist und der DNS-Resolver dahin nur \u00fcber deinen eigenen DoH-Endpunkt funktioniert und daf\u00fcr braucht man dein PGP-Public-Key, und der ist in security.txt und die ist signiert mit dem Key, den man nur \u00fcber dns.kernel-error.de bekommt. Du hast dir ein wundersch\u00f6nes, sicheres, selbstreferenzielles Solipsismus-Imperium gebaut, und das einzige Lebewesen, das es regelm\u00e4\u00dfig besucht, ist googlebot\/2.1 \u2014 und der nutzt nicht mal HTTP\/3.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Zusammenfassung<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kernel-Error.de ist nicht schlecht. Kernel-Error.de ist die liebevollste, akribischste, technisch versierteste Schreibtisch-Schublade des deutschen Internets. Es ist die Webseite-Version eines perfekt ge\u00f6lten Mechanikers, der sein ganzes Wochenende damit verbringt, einen Drehmomentschl\u00fcssel zu kalibrieren, mit dem er anschlie\u00dfend&#8230; einen anderen Drehmomentschl\u00fcssel kalibriert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und ehrlich? Wir lieben es. Bleib so. Das Internet braucht Menschen wie dich. Nur vielleicht trinkst du heute mal kein Mate und gehst kurz raus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83e\udee1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Disclaimer: Dieser Roast wurde mit Post-Quantum-Verschl\u00fcsselung \u00fcber neun FreeBSD-Jails gerouted, bevor er hier ankam. Eine .onion-Variante ist auf Anfrage verf\u00fcgbar.<\/em><\/p>\n<cite>Eine AI, die mein Arbeitskollege Michael auf meinen Blog losgelassen hat<\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Danke, Michael<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wirklich. Es braucht jemanden, der einen ein bisschen kennt, um so pr\u00e4zise daneben zu treffen, dass es weder gemein noch falsch ist. Ich werde den Roast direkt neben den anderen liebevollen Lebens-Diagnosen ablegen, die ich \u00fcber die Jahre gesammelt habe. Vielleicht drucke ich ihn mir auch aus und h\u00e4nge ihn \u00fcber den Bildschirm, falls ich irgendwann anfange, mich f\u00fcr all das hier ernsthaft zu rechtfertigen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und jetzt geh ich raus. Aber nat\u00fcrlich erst, wenn ActivityPub diesen Post an alle Federation-Inboxen ausgeliefert hat, der .onion-Mirror den Eintrag indexiert, der DNS-Resolver via DoH und Post-Quantum-TLS einmal durchgequeryt wurde und der Uptime-Checker eine ordentliche 200 f\u00fcr die neue Permalink-URL bekommt. So wie es sich geh\u00f6rt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn du <a href=\"https:\/\/www.geekbundle.org\/\" data-type=\"link\" data-id=\"https:\/\/www.geekbundle.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Michaels<\/a> AI Roast genauso gut findest wie ich, oder wenn du selbst eine Diagnose f\u00fcr diesen Blog hast, kannst du mir gerne <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>. Mate steht bereit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manchmal braucht es einen Arbeitskollegen, der eine AI auf den eigenen Blog hetzt, um zu merken, wie selbstreferentiell das Ganze geworden ist. Ich richte nichts richtig, ich stelle den Roast in voller L\u00e4nge rein und lache mit.<\/p>\n","protected":false},"author":1,"featured_media":4500,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,283],"tags":[256,383,402,351,372],"class_list":["post-4498","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-persoenliches","tag-ai","tag-foss","tag-llm","tag-open-source","tag-selfhosted","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4498"}],"version-history":[{"count":5,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4498\/revisions"}],"predecessor-version":[{"id":4531,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4498\/revisions\/4531"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4500"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4483,"date":"2026-05-18T17:59:19","date_gmt":"2026-05-18T15:59:19","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4483"},"modified":"2026-05-18T17:59:19","modified_gmt":"2026-05-18T15:59:19","slug":"t4plus-v2-m-firmware-flashen-display-tuning-8mhz-quartz","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/18\/t4plus-v2-m-firmware-flashen-display-tuning-8mhz-quartz\/","title":{"rendered":"LCR-T4-Plus v2: m-firmware flashen, Display-Tuning und die 8-MHz-Quartz-Falle"},"content":{"rendered":"\n<p class=\"has-small-font-size wp-block-paragraph\">Vor ein paar Wochen habe ich hier den <a href=\"https:\/\/www.kernel-error.de\/2026\/04\/05\/tc1-multifunction-tester-open-source-firmware-flashen-kalibrieren\/\">TC1 Multifunction Tester<\/a> mit der quelloffenen m-firmware geflasht. Seitdem liegt ein zweiter Bauteiltester aus genau dem gleichen Dunstkreis bei mir auf dem Tisch: ein <strong>LCR-T4-Plus<\/strong> mit gelber Platine, eingebautem ZIF-Sockel und Beschriftung \u201e91make.taobao.com&#8220; auf der R\u00fcckseite. Das billige Gegenst\u00fcck zum TC1, vom selben Hersteller-Cluster, gleiche Firmware-Familie. Eigentlich ein gem\u00fctlicher Folge-Sonntag, dachte ich.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-1024x768.jpg\" alt=\"Aufgeklappter LCR-T4-Plus v2 mit ZIF-Sockel, blauem Start-Button und ISP-Header mit vertauschten Silkscreen-Labels\" class=\"wp-image-4471\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-pcb-ausgangslage-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ausgangslage: aufgeklapptes Display, ZIF-Sockel, blauer Start-Button. Rechts vom Button der ISP-Header mit den (falsch beschrifteten) Silkscreen-Labels.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zur Vorgeschichte geh\u00f6rt ein erster T4-Plus, den ich vor Jahren mal gekauft hatte. Das Ger\u00e4t arbeitet bis heute, sein Display allerdings ist tot. Der COG-Controller unter dem Epoxy-Klecks auf dem ST7565R hat aufgegeben, der MCU lebt noch, aber zeigen kann er nichts mehr. Vor ein paar Wochen habe ich aus einer Resterampe ein zweites Exemplar geordert, gleicher Aufdruck, gleiche PCB-Revision. Plan: einmal Backup-Flash und dann beide Ger\u00e4te parallel mit m-firmware betreiben, eines als Bastelreserve.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aus \u201eschnell mal das gleiche Flash-Profil wie beim ersten T4-Plus dr\u00fcberb\u00fcgeln&#8220; wurde ein ganzer Nachmittag mit komplett schwarzem Display, abgeschnittenem Cursor, einem Tester der sich beim Loslassen des Buttons sofort wieder ausschaltet und am Ende der Erkenntnis, dass die zentrale Falle nicht in der Firmware steckt, sondern in einem winzigen Bauteil neben dem MCU.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was steckt im T4-Plus v2?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Anders als der TC1 mit seinen zwei Chips (ATmega plus STC f\u00fcr das Power-Management) ist der T4-Plus ein Single-MCU-Design. Auf der R\u00fcckseite klebt genau ein nennenswerter Halbleiter, der Rest ist Spannungsteiler, drei Transistoren f\u00fcr die Power-Latch-Schaltung und der Quartz.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-1024x768.jpg\" alt=\"PCB-R\u00fcckseite des T4-Plus v2 mit ATmega328P, 8-MHz-Quartz und 9V-Block-Anschluss\" class=\"wp-image-4472\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-rueckseite-8mhz-quartz-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">R\u00fcckseite des PCB mit dem ATmega328P, dem silbernen Quartzblock daneben (8 MHz, nicht 16 wie beim ersten Exemplar!) und dem 9V-Block-Anschluss.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"628\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-1024x628.png\" alt=\"Mikroskop-Closeup auf den ATmega328P-U-TH mit Date-Code 2009SG8\" class=\"wp-image-4473\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-1024x628.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-300x184.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-768x471.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-1536x942.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-2048x1256.png 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-atmega328p-closeup-676x414.png 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Close-up unter der Lupe: ATMEL MEGA328P-U-TH, Date-Code 2009SG8. Originalsilizium von Atmel\/Microchip, kein LGT8F328-Klon wie auf manchen j\u00fcngeren Boards.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong>U1: ATmega328P-U-TH<\/strong> im TQFP-32-Geh\u00e4use, Signatur <code>0x1e950f<\/code>, 32 KB Flash, 2 KB SRAM, 1 KB EEPROM. Der Date-Code <code>2009SG8<\/code> stammt aus 2020, Production-Code-Pattern passt zu echtem Microchip-Silizium. Auf gef\u00e4lschten Klonen sieht das Lasermarkings-Pattern deutlich anders aus, das Schriftbild ist hier sauber, also passt das.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Display-Controller sitzt unter dem schwarzen Epoxy-Blob auf dem LCD selbst und ist ein <strong>ST7565R<\/strong> mit 128 mal 64 Pixel monochromem STN-Panel, gelb-gr\u00fcne Hintergrundbeleuchtung. Klassische COG-Bauform. Daten kommen seriell \u00fcber vier GPIO-Leitungen rein. Kein I2C, sondern SPI-Bitbang vom MCU getrieben.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Stromversorgung l\u00e4uft \u00fcber einen <strong>9V-Block<\/strong> mit Spannungsteiler 10k zu 3.3k auf einem ADC-Pin. Bedienelement: ein einziger blauer Start-Button, kein Drehgeber, kein IR-Empf\u00e4nger, kein USB. Das Ding ist ein Wegwerf-Standalone im besten Sinne, nichts dran was schiefgehen kann.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und dann ist da noch dieser kleine silberne Quartzblock direkt neben dem MCU. <strong>8.000<\/strong> steht da. Acht Megahertz. Beim ersten T4-Plus von vor Jahren habe ich 16 MHz im Hinterkopf, ich notiere mir die 8 MHz pflichtbewusst, denke aber \u201enett, anderer Quartz&#8220; und mache ansonsten erstmal weiter. Spoiler: genau dieser Eintrag wird Stunden sp\u00e4ter zum Schl\u00fcssel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">ISP-Header finden, und der Aufdruck l\u00fcgt<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der ISP-Header sitzt versteckt unter der Display-Platine, ein simples 2&#215;3-Pad-Grid ohne aufgel\u00f6tete Stiftleiste. Auf der R\u00fcckseite finden sich Silkscreen-Hinweise: <code>mis<\/code>, <code>mosi<\/code>, <code>sck<\/code>, <code>reset<\/code>, plus die beiden Stromversorgungspads. Lustig: bei diesem Board sind die beiden Datenleitungen <strong>vertauscht beschriftet<\/strong>. Was als <code>mis<\/code> markiert ist, tr\u00e4gt physisch MOSI; das <code>mosi<\/code>-Pad ist tats\u00e4chlich MISO.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aufgefallen ist mir das beim ersten Signatur-Read mit dem Arduino Uno als ISP-Programmer. Wenn man stur nach Silkscreen verkabelt, antwortet der Chip mit lauter <code>0x00<\/code>. Sobald die Leitungen getauscht werden, kommt eine saubere Signatur. Hei\u00dft f\u00fcr die Praxis: bei diesem Board nicht auf den Aufdruck verlassen, sondern Pin f\u00fcr Pin mit dem Durchgangspr\u00fcfer gegen die Chip-Pins verifizieren. Standard-ISP-Pinout auf dem ATmega328P im TQFP-32 ist Pin 17 MOSI, Pin 18 MISO, Pin 19 SCK, Pin 29 \/RESET.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-768x1024.jpg\" alt=\"Arduino Uno als ISP-Programmer am ISP-Header des T4-Plus v2\" class=\"wp-image-4474\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-arduino-isp-programmer-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Arduino Uno mit ArduinoISP-Sketch als Programmer. Display zur Seite geklappt, vier Datenleitungen plus 5V und GND. Genauso wie beim TC1, gleiche Hardware, gleiche Flag-Kombination.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Verkabelung an den richtigen Pads (Arduino-seitig), gilt f\u00fcr beide T4-Plus-Boards:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Arduino D10  -&gt;  RESET   (T4-Plus Pad RESET)\nArduino D11  -&gt;  MOSI    (T4-Plus Pad \u201emis\"   bei diesem Klon!)\nArduino D12  -&gt;  MISO    (T4-Plus Pad \u201emosi\"  bei diesem Klon!)\nArduino D13  -&gt;  SCK     (T4-Plus Pad SCK)\nArduino 5V   -&gt;  VCC\nArduino GND  -&gt;  GND<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Sobald die Signatur sauber kommt, ist die halbe Miete drin:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$ avrdude -c avrisp -p m328p -P \/dev\/ttyACM0 -b 19200 -B 32 -v 2&gt;&amp;1 | grep -i sig\navrdude: Device signature = 0x1e950f (probably m328p)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Backup der Original-Firmware<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beim TC1 ging das Backup nicht, weil die Lock-Bits auf <code>0xC0<\/code> standen und das Auslesen geblockt haben. Beim T4-Plus v2 habe ich Gl\u00fcck: Lock-Byte ist <code>0xFF<\/code>, also komplett offen. Vor dem ersten Flash zieht man sich also bitte unbedingt das Original einmal komplett herunter, Flash und EEPROM:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">avrdude -c avrisp -p m328p -P \/dev\/ttyACM0 -b 19200 -B 32 \n        -U flash:r:t4plus2-original-flash.hex:i \n        -U eeprom:r:t4plus2-original-eeprom.hex:i \n        -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h -U lock:r:-:h<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Fuses kamen so zur\u00fcck: <code>lfuse=0xF7<\/code>, <code>hfuse=0xD9<\/code>, <code>efuse=0xFD<\/code>, <code>lock=0xFF<\/code>. Hat man das im Kasten, kann man auch beruhigt herumprobieren. Notfalls geht es per <code>avrdude -U flash:w:<\/code> jederzeit wieder auf den Auslieferungszustand zur\u00fcck.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Erster Flash und ein v\u00f6llig schwarzes Display<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Quelle f\u00fcr die neue Firmware ist wie beim TC1 die <a href=\"https:\/\/github.com\/madires\/Transistortester-Warehouse\" target=\"_blank\" rel=\"noopener\">m-firmware<\/a> von madires, aktuell Version 1.56m. Im Repo liegt unter <code>Software\/Firmware\/m-firmware\/<\/code> der Source mit allen Config-Templates f\u00fcr die diversen MCU-Varianten. F\u00fcr den ATmega328P ist das <code>config_328.h<\/code>, gemeinsame Optionen in <code>config.h<\/code>, build-Flags im <code>Makefile<\/code>.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Mein erster Anlauf orientierte sich an dem, was beim ersten T4-Plus damals funktioniert hatte. Display ST7565R aktivieren, BAT_DIVIDER mit 10k zu 3.3k, Short-Circuit-Menu an, MCU auf <code>atmega328<\/code> (ohne das nachgeschobene P, sonst greift der <code>#if defined(__AVR_ATmega328__)<\/code>-Guard in <code>config_328.h<\/code> nicht und der Build wirft undefinierte <code>BUTTON_PIN<\/code>-Symbole), Frequenz pflichtbewusst auf <code>FREQ = 16<\/code> wie beim ersten Board.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Make, flash, einschalten, und dann das hier:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-768x1024.jpg\" alt=\"Komplett dunkles ST7565R-Display nach erstem Flash mit Default FLAG_RATIO_65\" class=\"wp-image-4475\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-768x1024.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-225x300.jpg 225w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-1152x1536.jpg 1152w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-1536x2048.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-676x901.jpg 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-schwarz-flag-ratio-65-scaled.jpg 1920w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Display nach erstem Flash mit Default-FLAG_RATIO_65: komplett dunkel. Klassisches Symptom eines zu hoch eingestellten internen LCD-Spannungsteilers.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Komplett schwarz. Kein Boot-Banner, keine Kontrast-Stufe, einfach nur eine schwarze Fl\u00e4che. Mein erster Gedanke war nat\u00fcrlich: Display kaputt, gleicher Spa\u00df wie beim ersten T4-Plus. Aber die Backlight-LEDs leuchten, und im Streiflicht erkennt man, dass die Pixel-Anordnung sichtbar ist, nur eben in \u201ealle Pixel an&#8220;-Stellung. Das ist kein toter Controller, das ist ein lebender Controller mit zu hohem internem LCD-Bias.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Im m-firmware-Source liegt direkt ein <code>Clones<\/code>-Verzeichnis mit Hinweisen zu bekannten Klon-Variationen. F\u00fcr den verwandten <strong>LCR-T5<\/strong> steht dort genau dieser Workaround: bei manchen ST7565R-Panels ist der per Software gesetzte Bias zu hoch, der typische Default-Befehl <code>CMD_V0_RATIO | FLAG_RATIO_65<\/code> muss runter auf <code>FLAG_RATIO_55<\/code> oder sogar <code>FLAG_RATIO_45<\/code>. Ge\u00e4ndert wird das in <code>ST7565R.c<\/code> in der Funktion <code>LCD_Init()<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/* set contrast: resistor ratio 5.5 *\/\nLCD_Cmd(CMD_V0_RATIO | FLAG_RATIO_55);    \/* statt FLAG_RATIO_65 *\/<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Mit dieser einen Zeile \u00e4ndert sich alles. Neuer Build, flashen, und siehe da, pl\u00f6tzlich sind tats\u00e4chlich Pixel sichtbar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Display-Tuning: Orientierung, Kontrast und der abgeschnittene Cursor<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">\u201ePixel sichtbar&#8220; hei\u00dft noch lange nicht \u201elesbar&#8220;. Was da auf dem Display erscheint, sind erstmal Hieroglyphen kopf\u00fcber, spiegelverkehrt, mit komischen Pixel-Mustern an Stellen, an denen eigentlich Zeichen stehen sollten. Das ist die klassische ST7565R-Inbetriebnahme: drei Defines steuern Orientierung und Kontrast, alle drei muss man am eigenen Panel kalibrieren.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/#define LCD_FLIP_X                \/* horizontale Spiegelung *\/\n\/\/#define LCD_FLIP_Y                \/* vertikale Spiegelung   *\/\n#define LCD_CONTRAST     22         \/* 0..63, 22 passt hier   *\/<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bei meinem Panel sind <strong>beide<\/strong> FLIP-Defines aus, was unintuitiv klingt aber stimmt. Der Kontrast landet final bei 22. Nach ein paar Build-Iterationen sieht das so aus:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-1024x768.jpg\" alt=\"Display mit korrektem Kontrast aber rechts abgeschnittenem Cursor-Symbol durch LCD_OFFSET_X\" class=\"wp-image-4476\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-cursor-abgeschnitten-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Zwischenstand: Orientierung und Kontrast passen, \u201e1-||-3 .15pF&#8220; gut lesbar. Aber das blinkende Cursor-Symbol rechts ist abgeschnitten, weil LCD_OFFSET_X den gesamten Inhalt um vier Pixel nach rechts schiebt.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Klassischer Fall: bestimmte ST7565R-Panel-Varianten brauchen einen X-Offset von vier Pixel, weil deren sichtbarer Bereich rechts beginnt. Andere wiederum nicht. Das Define <code>LCD_OFFSET_X<\/code> erzwingt genau diese Verschiebung. Mein Panel will sie nicht, also raus damit:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/#define LCD_OFFSET_X            \/* deaktiviert: kein +4 Pixel Shift *\/<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-1024x768.jpg\" alt=\"Display korrekt zentriert nach Deaktivierung von LCD_OFFSET_X\" class=\"wp-image-4477\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-display-zentriert-nach-fix-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Nach dem Auskommentieren sitzt der Bildinhalt zentriert, der Cursor ist vollst\u00e4ndig sichtbar. Erste komplette Messung lesbar: ein simpler Widerstand.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">An dieser Stelle w\u00e4re die Geschichte normalerweise vorbei. Display tut, Buttons dr\u00fccken, Messen, fertig. W\u00e4re da nicht das Problem mit dem Einschalten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Das Power-Latch-Drama<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der T4-Plus hat einen blauen Druckknopf. Den dr\u00fcckt man, der Tester bootet, misst, schaltet sich nach Inaktivit\u00e4t von alleine wieder ab. So weit der Plan. Mein frisch geflashtes Board allerdings macht etwas \u00c4rgerliches: Knopf dr\u00fccken, Display bootet kurz an, Knopf loslassen, sofort wieder aus. Das ist kein \u201eAuto-Power-Off nach Timeout&#8220;, das ist \u201eMCU verliert beim Loslassen die Stromversorgung&#8220;. Klassischer Power-Latch-Bug.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Erster Reflex: irgendein <code>POWER_CTRL<\/code>-Pin in der Config ist falsch. Die m-firmware hat einen Define f\u00fcr den Pin, an dem der MCU nach dem Boot ein HIGH-Signal anlegen muss, um sich selbst am Leben zu halten. Auf den meisten Boards hei\u00dft der Pin <code>PD6<\/code> oder \u00e4hnlich. Also durchprobiert: PD6, PD7, PD4, PD3, alles was an freien Pins noch \u00fcbrig ist. Kein Erfolg. Egal welcher Pin, sobald der Finger den Button verl\u00e4sst, ist Schluss.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zeit f\u00fcr die Multimeter-Tour \u00fcber die Latch-Schaltung. Auf der Platine sitzen drei Transistoren um den Power-Knopf herum: <strong>Q1<\/strong> ist ein S9015 (PNP), schaltet die 9V auf die Versorgung. <strong>Q2<\/strong> und <strong>Q3<\/strong> sind beide S9014 (NPN) und treiben gemeinsam mit dem Button-Kontakt die Basis von Q1. Durchgangsmessungen ergeben:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Pin 29 (\/RESET) --- 27 kOhm --- Basis Q3\nBasis Q3 --- Button-Kontakt --- GND\nKollektor Q3 --- Basis Q1 (\u00fcber Pull-up)\nQ1 schaltet 9V auf den 5V-Regler<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das ist also gar kein \u201eFirmware schaltet POWER_CTRL HIGH&#8220;-Design. Die Latch-Schaltung ist passiv \u00fcber die \/RESET-Leitung des MCU aufgebaut. Solange der ATmega l\u00e4uft, liegt \/RESET auf HIGH (intern hochgehalten), und \u00fcber den 27k zur Basis von Q3 bleibt der Transistor durchgesteuert, Q1 h\u00e4lt die Versorgung an. Dr\u00fcckt man den Button, zieht der Q3-Basis kurz auf GND-Potenzial Richtung positiv und triggert das Hochfahren \u00fcber einen leicht anderen Pfad. Aber sobald der Boot durch ist und der MCU \/RESET HIGH h\u00e4lt, l\u00e4uft das Ganze von alleine.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Hei\u00dft: an meinem Board sollte das auch ohne firmware-seitiges POWER_CTRL funktionieren. Tut es aber nicht. Spannungsmessung unter Strom zeigt: Q3-Basis bleibt dauerhaft bei 0V, der Transistor schaltet nie sauber durch. Aber warum, wenn doch \/RESET nach erfolgreichem Boot eigentlich HIGH sein m\u00fcsste?<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">An dieser Stelle sa\u00df ich gef\u00fchlte zwei Stunden an dem Tisch und habe mit dem Multimeter zwischen MCU-Pinout, Transistor-Basen und 9V-Schiene hin- und hergemessen. Mein Verdacht war zwischendurch ein toter Transistor, ein kalter L\u00f6tpunkt, ein verkokelter Trace unter dem schwarzen L\u00f6tstopplack. Alles falsch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Der Aha-Moment im Makefile eines fremden Forks<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Irgendwann habe ich aus Verzweiflung angefangen, fremde Firmware-Forks f\u00fcr genau dieses Board zu lesen. Es gibt eine zweite quelloffene Linie neben der m-firmware: die <strong>k-firmware<\/strong> (das \u201ek&#8220; steht f\u00fcr Karl-Heinz K\u00fcbbeler, den Original-Autor), und davon wiederum diverse Forks. Einer davon ist Palingenesis&#8216; Fork mit einem dedizierten T4-v2-Build-Profil. Ich \u00f6ffne dessen Makefile, und der Blick f\u00e4llt auf eine einzelne Zeile:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">OP_MHZ = 8<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Acht. Megahertz. Genau die Zahl, die ich Stunden vorher auf dem Quartz gelesen und in mein Notizfeld geschrieben hatte. Genau die Zahl, deren Bedeutung ich nicht richtig zu Ende gedacht hatte. Mein Build der m-firmware lief mit <code>FREQ = 16<\/code>, weil ich davon ausgegangen war, dass das T4-Plus-Board immer 16 MHz Quartz hat. Tut es eben nicht. Beim zweiten Exemplar ist ein 8-MHz-Quartz drauf.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was das praktisch bedeutet: wenn die Firmware glaubt, sie laufe auf 16 MHz, aber tats\u00e4chlich nur 8 MHz Takt verf\u00fcgbar sind, l\u00e4uft jede Operation effektiv mit halber Geschwindigkeit. Jedes Timer-Tick, jede Schleife, jede ADC-Konversion dauert doppelt so lang. Im Falle der Initialisierungssequenz hei\u00dft das: bis der MCU im Bootcode an der Stelle ist, an der POWER_CTRL HIGH gesetzt wird (oder bis \/RESET stabil HIGH ausgegeben wird), ist das Zeitfenster, in dem der Button noch gedr\u00fcckt ist, schon l\u00e4ngst vorbei. Der Latch greift nicht, der Tester schaltet sich beim Loslassen ab.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Drei Buchstaben im Makefile ge\u00e4ndert:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">FREQ = 8<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Neu kompiliert, geflasht. Knopf gedr\u00fcckt. Display kommt. Knopf losgelassen. <em>Display bleibt an<\/em>. Der Tester h\u00e4lt sich selbst am Leben. Zwei Stunden Diagnose-Drama wegen einer einzigen Zahl im Makefile, die mit der eigentlichen Hardware nichts zu tun hatte, au\u00dfer dass die Hardware halt ein anderer Quartz war als gedacht. Genau eine dieser Stellen, an denen man kurz aufsteht und sich was zu trinken holt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Self-Adjustment und Werte ins Flash schreiben<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Nach dem Power-Latch-Fix ist der Tester quasi nutzbar, aber die m-firmware meldet beim Boot \u201eChecksum failure&#8220; f\u00fcr die Adjustment-Werte im Flash. Das ist erwartbar, weil dort ja noch nie eigene Kalibrierwerte gespeichert wurden. Heilmittel: das Service-Men\u00fc aufrufen, Self-Adjustment durchlaufen, Werte abspeichern.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Voraussetzung ist, dass <code>UI_SHORT_CIRCUIT_MENU<\/code> in <code>config.h<\/code> aktiviert ist. Damit kommt man ins Men\u00fc, indem man beim Start alle drei Probes (1, 2, 3) miteinander kurzschlie\u00dft. Der Tester erkennt das und blendet das Service-Men\u00fc ein:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-1024x768.jpg\" alt=\"Service-Men\u00fc des T4-Plus v2 via 3-Probe-Kurzschluss erreicht\" class=\"wp-image-4481\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-service-menu-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Service-Men\u00fc via 3-Probe-Kurzschluss: PWM, IR detector, Opto Coupler, Test, Adjustment, Contrast, Save. Genau das, was man f\u00fcr eine saubere Inbetriebnahme braucht.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Erster Punkt ist \u201eTest&#8220;, ein Selbsttest mit allen drei Probes. Anschlie\u00dfend \u201eAdjustment&#8220;, da braucht man dann einen 1 \u00b5F-Kondensator zwischen Probe 1 und Probe 3. Der Tester misst seinen eigenen internen Ri-Wert, die Eingangskapazit\u00e4t, eine Referenzspannung. Am Ende \u201eSave&#8220;, und die Werte landen via <code>DATA_FLASH<\/code> als Block im Programmspeicher (Self-Programming). Beim TC1 war das genauso, der einzige Unterschied: dort kommen die Daten in den 1 KB EEPROM. Beim T4-Plus reicht der Flash-Bereich und ich nutze <code>DATA_FLASH<\/code> stattdessen, weil das Self-Programming auf dem ATmega328P stabiler l\u00e4uft als die EEPROM-Erase-Write-Sequenz.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-1024x768.jpg\" alt=\"Self-Adjustment-Ergebnis mit Ri-, Ri+, C0, R0, Vref, Vcc, AComp Werten\" class=\"wp-image-4482\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-self-adjustment-werte-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Self-Adjustment-Ergebnis: Ri- 20.8 \u03a9, Ri+ 23.4 \u03a9, C0 36 pF, R0 0.31 \u03a9, Vref 1097 mV, Vcc 5130 mV, AComp 0 mV. Werte ins Flash gespeichert, Checksum-Fehler beim n\u00e4chsten Boot weg.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Diese Werte unterscheiden sich \u00fcbrigens leicht von Board zu Board. Die Ri-Werte h\u00e4ngen an den konkreten Innenwiderst\u00e4nden der MCU-Ausgangsstufen, C0 und R0 an den Probe-Leitungsl\u00e4ngen, Vref am internen Bandgap. Wer die Hex eines anderen Ger\u00e4ts mit dessen Flash-Region 1:1 auf sein eigenes flasht, \u00fcbernimmt also fremde Kalibrierdaten, die zu falscher Mess-Anzeige f\u00fchren k\u00f6nnen. Lieber einmal selbst kalibrieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">3D-gedrucktes Geh\u00e4use statt nackte Platine<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Original-T4-Plus kommt ohne Geh\u00e4use, nur die nackte Platine. F\u00fcr den TC1 gab es ja damals zumindest noch eine billige Plastik-Halbschale, hier ist nicht mal das dabei. Auf Makerworld liegt ein passendes Modell von \u201eLeoNerd&#8220; mit der ID <a href=\"https:\/\/makerworld.com\/en\/models\/1891431\" target=\"_blank\" rel=\"noopener\">1891431<\/a>, \u201eCase for LCR-T4 Component Tester&#8220;. Drei Teile: Unterschale, Frontblende mit ZIF-Sockel-Ausschnitt und Display-Fenster, Batterie-Klappe.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-1024x768.jpg\" alt=\"3D-gedruckte PETG-Geh\u00e4useteile direkt von der Druckplatte f\u00fcr den LCR-T4-Plus\" class=\"wp-image-4478\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-3d-case-druckplatte-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">PETG, 0.2 mm Schichth\u00f6he, fertig auf der Druckplatte. Drei Teile, kein Support n\u00f6tig.<\/figcaption><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"LCR T4 Case\" width=\"676\" height=\"507\" src=\"https:\/\/www.youtube.com\/embed\/0tPxU-pHJEg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ich habe das auf meinem <a href=\"https:\/\/bambulab.com\/de-de\/x1-carbon\" target=\"_blank\" rel=\"noopener\">Bambu Lab X1 Carbon<\/a> in PETG ausgedruckt. PLA ginge auch, aber PETG ist hier ein bisschen weniger spr\u00f6de, der Tester wird ja immer wieder mal in die Hand genommen. Ma\u00dfe passen direkt, das PCB sitzt sauber zwischen den Stegen, das Display fluchtet, der Button schaut zentrisch durch die \u00d6ffnung. Den 9V-Block fixiert die Klappe von hinten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Finaler Funktionstest im Geh\u00e4use<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-1024x768.jpg\" alt=\"Fertig zusammengebauter T4-Plus v2 im 3D-Geh\u00e4use mit Boot-Banner Component Tester v1.56m\" class=\"wp-image-4479\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-bootbanner-im-case-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Boot-Banner \u201eComponent Tester v1.56m&#8220; im 3D-gedruckten PETG-Geh\u00e4use. Knopf dr\u00fccken, Display bleibt an, alles, was es braucht.<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-1024x768.jpg\" alt=\"Boot-Screen mit korrekter Batteriespannungs-Anzeige Bat 9.61V ok\" class=\"wp-image-4480\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/t4plus-v2-batterie-9v61-ok-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">\u201eBat 9.61V ok \/ Probing\u2026&#8220;, der BAT_DIVIDER mit 10k zu 3.3k stimmt und eine frische 9V-Batterie wird korrekt erkannt.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ein paar Testmessungen mit Bauteilen aus der Schublade: 10k-Widerst\u00e4nde, ein paar 100 nF Kondensatoren, ein BC547 und ein paar LEDs. Alle Werte plausibel, BC547 wird mit korrekter Pin-Zuordnung als NPN-Transistor erkannt, hFE in der erwarteten Gr\u00f6\u00dfenordnung. Damit ist das Ger\u00e4t einsatzbereit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Die finale Konfiguration zum Mitnehmen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Damit andere mit dem gleichen 91make-Klon nicht die gleichen drei Tage verbrennen m\u00fcssen, hier alle \u00c4nderungen relativ zur unver\u00e4nderten m-firmware 1.56m an einer Stelle gesammelt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><code>Makefile<\/code><\/strong> (Auszug, nur die ge\u00e4nderten Zeilen):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">MCU    = atmega328       # NICHT atmega328p, sonst greift der Include-Guard nicht\nFREQ   = 8               # 8 MHz Quartz auf der v2-Variante, nicht 16\nPARTNO = m328p           # avrdude-Part bleibt m328p<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><code>config.h<\/code><\/strong> (gemeinsame Optionen, aktive Defines):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#define HW_REF25                   \/* interne 2.5V-Bandgap-Referenz *\/\n#define UI_AUTOHOLD                \/* nach Messung auf Tastendruck warten *\/\n#define UI_SHORT_CIRCUIT_MENU      \/* Service-Menue via 3-Probe-Short *\/\n#define POWER_OFF_TIMEOUT 60       \/* Auto-Off nach 60 Sekunden Idle *\/\n#define BAT_DIVIDER                \/* externer 10k\/3.3k-Teiler *\/\n#define BAT_R1     10000\n#define BAT_R2     3300\n#define BAT_WEAK   7400            \/* 7.4V Warnschwelle *\/\n#define BAT_LOW    6400            \/* 6.4V Abschaltschwelle *\/\n#define DATA_FLASH                 \/* Kalibrierdaten ins Programm-Flash *\/<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><code>config_328.h<\/code><\/strong> (ST7565R-Section, alles relevante an einem Stueck):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#define LCD_ST7565R\n#define LCD_GRAPHIC\n#define LCD_SPI\n#define LCD_PORT     PORTD\n#define LCD_DDR      DDRD\n#define LCD_RESET    PD0\n#define LCD_CS       PD5\n#define LCD_A0       PD1\n#define LCD_SCL      PD2\n#define LCD_SI       PD3\n#define LCD_DOTS_X   128\n#define LCD_DOTS_Y   64\n\/\/#define LCD_OFFSET_X            \/* AUS, sonst +4 Pixel Verschiebung *\/\n\/\/#define LCD_FLIP_X              \/* AUS *\/\n\/\/#define LCD_FLIP_Y              \/* AUS *\/\n#define LCD_START_Y  0\n#define LCD_CONTRAST 22\n#define FONT_8X8_VF\n#define SYMBOLS_24X24_VFP\n#define SPI_BITBANG<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><code>ST7565R.c<\/code><\/strong> (genau eine Zeile in <code>LCD_Init()<\/code>):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/* set contrast: resistor ratio 5.5 *\/\nLCD_Cmd(CMD_V0_RATIO | FLAG_RATIO_55);     \/* war FLAG_RATIO_65 *\/<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Flash-Befehl, identisch zum TC1 (nur die Hex-Datei ist eine andere):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">avrdude -c avrisp -p m328p -P \/dev\/ttyACM0 -b 19200 -B 32 \n        -U flash:w:ComponentTester.hex:i<\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was ich aus dem Nachmittag mitnehme<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vier Punkte, die ich beim n\u00e4chsten Klon-Tester sofort pr\u00fcfen werde, statt wieder Stunden in der Diagnose zu verbringen:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><strong>Quartz mit der Lupe lesen<\/strong> bevor man die Frequenz im Makefile setzt. Identische PCB-Bezeichnung garantiert nicht den gleichen Takt. Bei diesem T4-Plus ist es 8 MHz, bei meinem ersten waren es 16 MHz. Zwei Boards, derselbe Aufdruck, verschiedene Best\u00fcckung.<\/li>\n\n\n\n<li><strong>ST7565R komplett schwarz nach erstem Flash<\/strong> ist fast immer ein zu hoher Bias und kein toter Controller. Erst <code>FLAG_RATIO_65<\/code> auf <code>FLAG_RATIO_55<\/code> oder <code>FLAG_RATIO_45<\/code> \u00e4ndern, dann weiter denken.<\/li>\n\n\n\n<li><strong>Silkscreen-Labels glauben, aber verifizieren<\/strong>. Auf dem v2-Board sind <code>mis<\/code> und <code>mosi<\/code> physisch vertauscht. Einmal Durchgangspr\u00fcfung gegen den MCU-Pin spart eine Stunde Frustration.<\/li>\n\n\n\n<li><strong>Vermeintliche Hardware-Fehler sind manchmal Build-Parameter<\/strong>. Ein Tester, der sich beim Loslassen ausschaltet, sieht aus wie eine kaputte Latch-Schaltung. War aber in Wirklichkeit nur die falsche CPU-Frequenz im Makefile, was den Boot-Code langsamer laufen lie\u00df, als das mechanische Button-Zeitfenster es zulie\u00df.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Repo und Quellen<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wie beim TC1 habe ich auch hier ein kleines Repo mit der fertigen Hex, den Config-Patches und einer README mit Schritt-f\u00fcr-Schritt-Anleitung gepackt: <a href=\"https:\/\/github.com\/Kernel-Error\/t4plus-v2-firmware-update\" target=\"_blank\" rel=\"noopener\">github.com\/Kernel-Error\/t4plus-v2-firmware-update<\/a>. Lizenz folgt der m-firmware (EUPL v1.2), die Config-Patches sind als unified diff gegen die unver\u00e4nderte 1.56m beigelegt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Quellen, ohne die das nicht funktioniert h\u00e4tte:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><a href=\"https:\/\/github.com\/madires\/Transistortester-Warehouse\" target=\"_blank\" rel=\"noopener\">m-firmware (Madires\/Transistortester-Warehouse)<\/a>, die Quelle der Firmware, inklusive <code>Clones<\/code>-Verzeichnis mit den Hinweisen zum LCR-T5-FLAG_RATIO-Workaround<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/svn2github\/transistortester\" target=\"_blank\" rel=\"noopener\">k-firmware (K\u00fcbbeler)<\/a>, der \u00e4ltere Original-Branch von Karl-Heinz K\u00fcbbeler<\/li>\n\n\n\n<li><a href=\"https:\/\/www.instructables.com\/LCR-T4-Mega328-Transistor-Tester-Diode-Triode-Capa\/\" target=\"_blank\" rel=\"noopener\">Instructables \u201eLCR-T4 Upgrade&#8220; von Palingenesis<\/a>, der den entscheidenden Hinweis auf 8 MHz im Makefile-Profil hatte<\/li>\n\n\n\n<li><a href=\"https:\/\/www.mikrocontroller.net\/articles\/AVR_Transistortester\" target=\"_blank\" rel=\"noopener\">AVR Transistortester auf mikrocontroller.net<\/a>, der deutschsprachige Hintergrundartikel zum gesamten Projekt<\/li>\n\n\n\n<li><a href=\"https:\/\/makerworld.com\/en\/models\/1891431\" target=\"_blank\" rel=\"noopener\">3D-Geh\u00e4use auf Makerworld<\/a>, drei Teile, passt direkt<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Siehe auch: <a href=\"https:\/\/www.kernel-error.de\/2026\/04\/05\/tc1-multifunction-tester-open-source-firmware-flashen-kalibrieren\/\">TC1 Multifunction Tester mit Open-Source-Firmware<\/a> (der Vorg\u00e4nger-Beitrag, gleiche Firmware-Familie, mehr Drama bei der STC-Variante), <a href=\"https:\/\/www.kernel-error.de\/2019\/11\/30\/einfacher-multifunktionstester-fuer-elektronikbauteile\/\">Multifunktionstester f\u00fcr Elektronikbauteile<\/a> (mein erster Eindruck von dieser Tester-Klasse 2019), <a href=\"https:\/\/www.kernel-error.de\/2026\/03\/25\/commodore-floppy-disk-preservation-xum1541-firmware-bug-opencbm\/\">xum1541-Firmware-Bug gefunden und gefixt<\/a> (anderes Mikrocontroller-Firmware-Drama), <a href=\"https:\/\/www.kernel-error.de\/2026\/05\/12\/open-source-scan-converter-ossc-firmware-update-1-21\/\">OSSC Firmware-Update 1.21<\/a> (Firmware-Update an Open-Source-Hardware), <a href=\"https:\/\/www.kernel-error.de\/2025\/09\/09\/preciva-992d-im-test-loet-und-heissluftstation-fuer-hobby-repaircafe\/\">Preciva 992D+ L\u00f6tstation<\/a> (f\u00fcr alle die nach diesem Beitrag selber l\u00f6ten wollen).<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Fragen, eigene T4-Plus-Klon-Varianten oder noch krummere Silkscreen-Vertauschungen gesehen? Gerne \u00fcber die <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>-Seite oder als Issue im Repo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vom ersten T4-Plus lebt nur noch der MCU, das Display ist tot. Ein zweites Exemplar zum Vergleich, gleiche PCB-Bezeichnung, aber ein 8-MHz-Quartz statt 16 MHz. Wie ich Display, Power-Latch und Self-Adjustment mit der quelloffenen m-firmware in den Griff bekommen habe.<\/p>\n","protected":false},"author":1,"featured_media":4486,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[279,281,13],"tags":[154,144,32,386,37,375,351,376],"class_list":["post-4483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-elektronik-diy","category-embedded-mikrocontroller","category-kernel-error-blog","tag-3dprinting","tag-arduino","tag-electronics","tag-embedded","tag-firmware","tag-maker","tag-open-source","tag-righttorepair","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4483"}],"version-history":[{"count":3,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4483\/revisions"}],"predecessor-version":[{"id":4487,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4483\/revisions\/4487"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4486"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4444,"date":"2026-05-15T12:11:32","date_gmt":"2026-05-15T10:11:32","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4444"},"modified":"2026-05-15T12:11:34","modified_gmt":"2026-05-15T10:11:34","slug":"ts3level-teamspeak-identity-security-level-gpu","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/15\/ts3level-teamspeak-identity-security-level-gpu\/","title":{"rendered":"ts3level: TeamSpeak-Identity-Level auf der GPU rechnen, mit automatischem .ini-Patch"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-1024x576.png\" alt=\"Beitragsbild zu ts3level: Eine TeamSpeak-Identity-INI-Datei wird per GPU von Security-Level 45 auf 55 hochgerechnet und automatisch gepatcht.\" class=\"wp-image-4447\" style=\"width:104px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-1024x576.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-300x169.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-768x432.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-1536x864.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-676x380.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer eine TeamSpeak-3-Identity mit einem h\u00f6heren Security Level haben m\u00f6chte als das, was der offizielle Client innerhalb eines Menschenlebens rausrechnet, kommt um GPU-Hilfe nicht herum. Es gibt da seit Jahren eine Handvoll Drittanbieter-Tools. Was bisher fehlte, war der unspektakul\u00e4re letzte Schritt: das gefundene Ergebnis wieder in die <code>.ini<\/code> zu schreiben. Genau diese L\u00fccke schlie\u00dft <strong>ts3level<\/strong>, ein neues Open-Source-Tool, an dem ich die letzten Wochen gesessen habe.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1002\" height=\"925\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-main-window-hashrun.png\" alt=\"ts3level GUI Hauptfenster mit aktivem Hash-Run, Identity-Details links, GPU-Stats und Auslastungsgraph rechts\" class=\"wp-image-4443\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-main-window-hashrun.png 1002w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-main-window-hashrun-300x277.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-main-window-hashrun-768x709.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ts3level-main-window-hashrun-676x624.png 676w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><figcaption class=\"wp-element-caption\">Das Hauptfenster w\u00e4hrend eines laufenden Hash-Runs. Links die geparsten Identity-Details, rechts Live-Progress, Hashrate, ETA und ein kleiner Cairo-Graph mit 60 Sekunden GPU-Auslastung.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Repo liegt auf GitHub unter <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\" target=\"_blank\" rel=\"noopener\">Kernel-Error\/ts-identities-security-level<\/a> (MIT-Lizenz). Release v0.1.0 inklusive prebuilt Tarball f\u00fcr x86_64 Linux mit glibc \u2265 2.39 gibt&#8217;s <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\/releases\/tag\/v0.1.0\" target=\"_blank\" rel=\"noopener\">hier<\/a>. Der Tarball ist rund 2 MB gro\u00df, mehr braucht es nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Das Problem: Single-Thread-CPU vs. exponentielles Wachstum<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das \u201eSecurity Level&#8220; einer TS3-Identity ist nichts anderes als ein Proof-of-Work. Man variiert einen <code>uint64<\/code>-Counter und hashed solange <code>SHA1(pubkey_b64 || decimal(counter))<\/code> bis vorne genug Null-Bits stehen. Pro Level verdoppelt sich der durchschnittliche Aufwand. Der offizielle TS3-Client rechnet das in einem einzelnen CPU-Thread. Ab ungef\u00e4hr Level 50 wird das schlicht unbrauchbar.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Es gibt seit Jahren GPU-beschleunigte Drittanbieter-Hasher. <a href=\"https:\/\/github.com\/landave\/TSIdentityTool\" target=\"_blank\" rel=\"noopener\">landave\/TSIdentityTool<\/a> ist die CPU-Referenz in C, mittlerweile dormant. <a href=\"https:\/\/github.com\/landave\/TeamSpeakHasher\" target=\"_blank\" rel=\"noopener\">landave\/TeamSpeakHasher<\/a> bringt das auf OpenCL, der <a href=\"https:\/\/github.com\/thissepic\/TeamSpeakHasher\" target=\"_blank\" rel=\"noopener\">CUDA-Fork von thissepic<\/a> ist aktuell das aktivste Tool und schafft auf einer RTX 4070 Ti rund 20 GH\/s. <code>bratkartoffel\/ts3idtools<\/code> macht das in C mit pthreads auf der CPU.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Allen gemeinsam ist die UX-L\u00fccke: keines schreibt das Ergebnis zur\u00fcck. Der typische Workflow ist <em>Pubkey aus der .ini extrahieren, Hasher f\u00fcttern, Counter aufschreiben, Counter manuell in die .ini patchen, Datei re-importieren<\/em>. landave begr\u00fcndet das bewusst mit Privatekey-Schutz, der Hasher soll den Private Key gar nicht erst zu sehen kriegen. Eine sehr saubere Trennung, aber f\u00fcr den Endanwender eine ziemlich friktionsreiche Angelegenheit.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Genau dort setzt ts3level an. Man zeigt auf seine <code>.ini<\/code>, der Rest passiert automatisch. Atomarer Write, einmaliges <code>.bak<\/code>, fertig. Drumherum eine GTK-GUI, NVML-Telemetrie, \u00dcbersetzungen auf en\/de\/es\/fr, eine ehrliche ETA-Anzeige und ein Identity-Details-Panel, damit man nicht jedes Mal die Datei von Hand parsen muss.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wie funktioniert \u201eSecurity Level&#8220; \u00fcberhaupt?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die Kernformel ist erfrischend einfach:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">level = leading_zero_bits( SHA1( pubkey_b64 || decimal(counter) ) )<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><code>pubkey_b64<\/code> ist die base64 der <em>public-key-only<\/em> ASN.1 DER eines ECDSA-Keys auf der Kurve <code>secp256r1<\/code> (NIST P-256). Es ist genau der String, den der TS3-Client im Identity-Dialog unter \u201ePublic Key&#8220; anzeigt. <code>decimal(counter)<\/code> ist die ganz normale Dezimaldarstellung des <code>uint64<\/code> ohne Padding, also <code>\"42\"<\/code> und nicht <code>\"0042\"<\/code>. Konkatenation passiert auf ASCII-Stringebene, nicht auf irgendwelchen rohen Bytes. Klingt banal, ist aber tats\u00e4chlich die h\u00e4ufigste Fehlerquelle bei Re-Implementierungen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Z\u00e4hlen der f\u00fchrenden Null-Bits l\u00e4uft byte-0-zuerst und <strong>innerhalb jedes Bytes von LSB nach MSB<\/strong>. Genau die hashcat-Konvention. In Python w\u00e4re das:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">zero_bytes = 0\nwhile zero_bytes &lt; 20 and hash[zero_bytes] == 0:\n    zero_bytes += 1\nzero_bits = 0\nif zero_bytes &lt; 20:\n    b = hash[zero_bytes]\n    while not (b &amp; 1):\n        zero_bits += 1\n        b >>= 1\nlevel = 8 * zero_bytes + zero_bits<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die Wahrscheinlichkeit dass ein einzelner Hash mindestens Level L erreicht ist 1 \/ 2^L. Im Mittel braucht es also 2^L Versuche pro angestrebtes Level. Auf meiner Testkarte, einer RTX 4060 Ti bei rund 2,4 GH\/s, sieht das so aus:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Ziel-Level<\/th><th>Mittlere Wartezeit<\/th><\/tr><\/thead><tbody><tr><td>40<\/td><td>~7 Minuten<\/td><\/tr><tr><td>45<\/td><td>~4 Stunden<\/td><\/tr><tr><td>50<\/td><td>~5 Tage<\/td><\/tr><tr><td>55<\/td><td>~5 Monate<\/td><\/tr><tr><td>60<\/td><td>~14 Jahre<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Diese Werte sind statistische Mittelwerte. Die echte Wartezeit ist exponentialverteilt, man kann also mit Faktor 2 bis 3 schneller oder langsamer Gl\u00fcck haben. Genau deshalb zeigt das Tool die ETA auch als das was sie ist (ein Mittelwert), und nicht als seri\u00f6s wirkenden Countdown.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was im .ini-File steckt<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Eine exportierte TS3-Identity sieht ungef\u00e4hr so aus:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[Identity]\nid=Standard\nidentity=\"&lt;counter>V&lt;base64_obfuscated_blob>\"\nnickname=Kernel-Error\nphonetic_nickname=<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Teil hinter dem <code>V<\/code> ist doppelt base64-codiert, mit einer XOR-Schicht dazwischen. Das hat landave per Black-Box-Analyse aus dem Client-Verhalten rekonstruiert. Schematisch:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data = base64_decode(blob_b64)        # outer base64\nhash_part = data[20:]                  # everything past the first 20 bytes\nsha = sha1(hash_part)\ndata[0:20] ^= sha                      # undo SHA-1 mask\ndata[0:min(100, len)] ^= TSKEY         # undo static-key XOR\ninner_ascii = data                     # ASCII-base64 of the ASN.1 DER\nasn1_der = base64_decode(inner_ascii)  # inner base64<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der am\u00fcsante Stolperstein dabei: <code>TSKEY<\/code> ist im C-Original definiert als <code>const char *TSKEY = \"b9dfaa7bee...\";<\/code>. Das sind <em>nicht<\/em> die 64 Hex-Bytes, sondern die 128 ASCII-Zeichen der Hex-Darstellung selbst. Eine Stunde Debugging, bis ich gemerkt habe woran es liegt. Ist halt einer dieser Punkte, bei denen die Spec ohne Quelltext nicht reichen w\u00fcrde.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Im inneren DER liegt der libtomcrypt-formatierte Keypair:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SEQUENCE {\n  BIT STRING       flags     -- 1 bit; 0 = public-only, 1 = with private key\n  SHORT INTEGER    keysize   -- 32 for P-256\n  INTEGER          x\n  INTEGER          y\n  [INTEGER         k]        -- only when flags = 1\n}<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">F\u00fcr den Hash-Input brauchen wir nur die public-only Variante dieses DER-Blobs: gleiche Struktur, <code>flags=0<\/code>, X, Y, und der private Skalar <code>k<\/code> f\u00e4llt einfach raus. Der Hasher bekommt damit nie den privaten Schl\u00fcssel zu sehen. Genau diese Trennung, die landave aus gutem Grund eingef\u00fchrt hat, bleibt erhalten. Das Auto-Patchen der <code>.ini<\/code> passiert in einem separaten Modul, das den Counter zur\u00fcckschreibt, ohne den Private Key \u00fcberhaupt anzufassen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Warum eine GPU<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">SHA-1 ist ein dankbarer Kandidat f\u00fcr massiv-paralleles Hashing. Es gibt keine Datenabh\u00e4ngigkeiten zwischen verschiedenen Counter-Werten, jede der zigtausend GPU-Threads kann einen anderen Counter testen und das Ergebnis unabh\u00e4ngig vergleichen. Ein moderner Desktop-Kern auf der CPU kommt vielleicht in den niedrigen dreistelligen MH\/s-Bereich f\u00fcr SHA-1, eine RTX 4060 Ti im Tool rund 2,4 GH\/s. Das reicht um aus Level 50 statt \u201emehreren Jahren&#8220; so etwas wie \u201emehreren Tagen&#8220; zu machen, also einen Bereich, in dem ein Run \u00fcberhaupt erst Sinn ergibt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Tool macht nichts Heldenhaftes mit dem Kernel: simples SHA-1 in CUDA C, ein Counter pro Thread, atomarer Compare-and-Swap auf der \u201ebester gefundener Level&#8220;-Variable im global memory. Hochoptimierte Hasher wie der von thissepic kommen mit Midstate-Precompute und LOP3.LUT-Tricks auf ungef\u00e4hr das f\u00fcnffache. Dieser Teil steht auf der Roadmap, ist aber f\u00fcr den ersten Release bewusst nicht angegangen worden. Der eigentliche Mehrwert von ts3level ist UX und Auto-Patch, nicht der letzte ausgequetschte GH\/s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was das Tool macht: zwei Binaries, ein Source-Tree<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aus dem Workspace fallen zwei Binaries:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><code>ts3level<\/code>: headless CLI mit Progress-Spinner, gut f\u00fcr Server, tmux, SSH-Sessions<\/li>\n\n\n\n<li><code>ts3level-gui<\/code>: GTK4 + libadwaita Desktop-Anwendung, \u00fcbersetzt in en\/de\/es\/fr<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Konkrete Use-Cases, die im Auge waren beim Entwurf:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li>Die eigene TS-Identity von einem aktuellen Level (z. B. 45) auf ein Wunsch-Level (z. B. 55) hochrechnen, ohne sich mit base64-Blobs und Counter-Werten herumzuschlagen.<\/li>\n\n\n\n<li>Headless auf einem Server mit einer NVIDIA-Karte \u00fcber Nacht laufen lassen, morgens fertige <code>.ini<\/code> aus dem Backup-Verzeichnis ziehen.<\/li>\n\n\n\n<li>Endless-Mode: das Tool l\u00e4uft permanent, jedes Mal wenn ein h\u00f6heres Level gefunden wird, wird die Datei sofort aktualisiert. Wer kein konkretes Ziel hat und einfach gucken will, was an einem Wochenende rauskommt, f\u00e4hrt damit ganz gut.<\/li>\n\n\n\n<li>Identity-Details ablesen, ohne die <code>.ini<\/code> per Hand zu parsen: Nickname, Fingerprint (also die TS3-\u201eUnique ID&#8220;), Public Key, Current Level, Current Counter.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beim Start auf eine frisch generierte Demo-Identity sieht der CLI-Output so aus:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Using device: [CUDA:0] NVIDIA GeForce RTX 4060 Ti (cc 8.9, 34 SMs, 15.6 GiB)\n\nNickname: DemoUser\nLocal ID: DemoStandard\nFingerprint: 3cltecu4AFn+OK7Lx3Ish6wZN+Y=\nCurrent level: 25  (counter: 7131210)\n\nnote: target 1 &lt;= 25 (current level): raising to 26\nTarget: 26<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und w\u00e4hrend der Run l\u00e4uft sieht die Statuszeile so aus:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2839 level: 50  counter: 1964603892897982  2.45 GH\/s  ETA\u2192+1: 0.4s  ETA\u2192target: 10.3d  GPU: 100% 76\u00b0C 165W  (10s)<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">In der GUI ist genau dieselbe Information da, plus ein 60-Sekunden-Ringbuffer-Graph der GPU-Auslastung. Praktisch wenn man parallel zockt und sehen will, ob der Hash-Run noch genug Luft hat oder die Karte sich gegen das Spiel durchsetzen muss.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Architektur (kurz)<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Komplett Rust, f\u00fcnf Crates in einem Workspace:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">crates\/ts3level-core\/    parser, obfuscation, pubkey extraction, CPU SHA-1, atomic writer\ncrates\/ts3level-engine\/  HashEngine trait, preflight, driver loop, NVML telemetry\ncrates\/ts3level-cuda\/    SHA-1 kernel in CUDA C, bound via cudarc\ncrates\/ts3level-cli\/     clap + indicatif + gettext\ncrates\/ts3level-gui\/     gtk4-rs + libadwaita + Cairo graph<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Beim Build ruft <code>build.rs<\/code> einmal <code>nvcc --fatbin<\/code> auf und erzeugt eine Fatbin mit echtem SASS f\u00fcr sm_70, sm_75, sm_80, sm_86, sm_89, sm_90, plus PTX-Fallback f\u00fcr k\u00fcnftige Architekturen. Diese Fatbin wird per <code>include_bytes!<\/code> direkt in das Rust-Binary einkompiliert. Der Endanwender braucht damit nur den NVIDIA-Treiber, kein CUDA-Toolkit. <code>libcuda.so.1<\/code> und <code>libnvidia-ml.so.1<\/code> werden zur Laufzeit per <code>dlopen<\/code> gezogen, das funktioniert ab Treiber 525 ohne Klimmz\u00fcge.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Zur\u00fcckschreiben in die <code>.ini<\/code> macht das Tool \u00fcber <code>flock(LOCK_EX)<\/code> auf die Datei, einmaliges <code>.bak<\/code> wenn keines existiert, neue Bytes in eine <code>tempfile::NamedTempFile<\/code> im selben Verzeichnis, <code>fsync<\/code>, anschlie\u00dfend <code>rename(2)<\/code> dr\u00fcber. POSIX-atomar. Bei Stromausfall mittendrin gibt es entweder die alte oder die neue Datei, nie ein halbgares Gemisch.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vor jedem Run pr\u00fcft ein Preflight neun Bedingungen: <code>libcuda<\/code> ladbar, CUDA-Devices vorhanden, Zugriffsrechte auf <code>\/dev\/nvidia*<\/code>, <code>.ini<\/code> lesbar, schreibbar, Parent-Dir schreibbar, Datei strukturell g\u00fcltig, kein konkurrierender Lock, genug Platz f\u00fcr eine <code>.bak<\/code>. Fehler werden als strukturierte Codes ausgegeben, dokumentiert in der README. Backtraces gibt es nicht, weil sie f\u00fcr Endanwender nur L\u00e4rm sind.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Tests stehen bei 68 verteilt \u00fcber alle Crates: 40 in <code>ts3level-core<\/code> (Parser, Obfuscation, Pubkey, Level-Berechnung, Writer, Sign-Prefix-Edge-Cases), 18 in <code>ts3level-engine<\/code> (Preflight, Driver, ETA, GpuStats), 3 in <code>ts3level-cuda<\/code> (eine Million Counter Parity GPU vs. CPU, Hashrate-Probe), 7 in <code>ts3level-cli<\/code> (Smoke-Tests, End-to-End gegen eine echte GPU, i18n).<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Validierung gegen den echten TS3-Client<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Einfacher aber wichtiger Schritt: nachdem das Tool intern korrekt aussah, habe ich eine reale Identity aus dem TS3-Client exportiert und parallel den vom Tool berechneten Fingerprint und das Security Level mit der Anzeige im Client verglichen. Beides byte-identisch. Heisst: die Algorithmus-Spec stimmt, es gibt kein Off-by-One zwischen meiner Implementierung und dem, was ein TS-Server f\u00fcr die Identifikation tats\u00e4chlich sieht. Wer den Counter mit ts3level hochrechnet, bekommt eine Identity, die der Client genauso akzeptiert, als h\u00e4tte er den Aufwand selbst betrieben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Hardware-Support<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Out-of-the-Box im prebuilt Tarball:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Generation<\/th><th>Beispiele<\/th><th>Compute Cap<\/th><\/tr><\/thead><tbody><tr><td>Volta<\/td><td>Titan V, V100<\/td><td>sm_70<\/td><\/tr><tr><td>Turing<\/td><td>RTX 2060\/70\/80, T4<\/td><td>sm_75<\/td><\/tr><tr><td>Ampere DC<\/td><td>A100<\/td><td>sm_80<\/td><\/tr><tr><td>Ampere Consumer<\/td><td>RTX 3060\/70\/80\/90<\/td><td>sm_86<\/td><\/tr><tr><td>Ada<\/td><td>RTX 4060\/70\/80\/90<\/td><td>sm_89<\/td><\/tr><tr><td>Hopper<\/td><td>H100<\/td><td>sm_90<\/td><\/tr><tr><td>Blackwell und k\u00fcnftige<\/td><td>RTX 5xxx, GB200<\/td><td>sm_100+ via JIT<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Pascal (GTX 10-Serie) und \u00e4lter sind bewusst nicht dabei. Eine Zeile in <code>build.rs<\/code> erg\u00e4nzen und neu bauen reicht, dann l\u00e4uft auch das, nur ist die SHA-1-Performance auf diesen Karten ohnehin nicht konkurrenzf\u00e4hig.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Installation<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auf Ubuntu, Mint oder Debian sieht das so aus:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo apt install nvidia-driver-550 libgtk-4-1 libadwaita-1-0 gettext-base\nsudo usermod -aG render $USER   # log out and back in afterwards\ncurl -LO https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\/releases\/download\/v0.1.0\/ts3level-v0.1.0-x86_64-linux.tar.gz\ntar -xzf ts3level-v0.1.0-x86_64-linux.tar.gz\ncd ts3level-v0.1.0-x86_64-linux\nsudo install -m755 bin\/ts3level     \/usr\/local\/bin\/\nsudo install -m755 bin\/ts3level-gui \/usr\/local\/bin\/\nsudo cp -r share\/locale\/*           \/usr\/share\/locale\/<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Verifizieren mit <code>ts3level --list-devices<\/code>. Die volle Installationsanleitung inklusive Rechte-Setup und Troubleshooting steht im Repo unter <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\/blob\/main\/docs\/installation.md\" target=\"_blank\" rel=\"noopener\">docs\/installation.md<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Bekannte Grenzen und Roadmap<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ehrlich bleiben:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li>2,4 GH\/s auf der 4060 Ti sind nur ungef\u00e4hr ein Achtel dessen, was thissepic mit hand-optimierten Kernels rausholt. Midstate-Precompute, In-Place-Counter-Inkrement und LOP3.LUT-PTX-Tricks w\u00fcrden das in den 10 GH\/s-Bereich heben. Steht auf der Roadmap, aber nicht f\u00fcr den ersten Release.<\/li>\n\n\n\n<li>v0.1 ist NVIDIA-only. Das <code>HashEngine<\/code>-Trait ist allerdings genau daf\u00fcr gedacht: ein OpenCL-Backend f\u00fcr AMD und Intel w\u00e4re ein relativ entspannter Drop-In.<\/li>\n\n\n\n<li>Kein Flatpak bisher. Wer auf \u00e4lteren Distros sitzt, etwa Ubuntu 22.04 mit glibc 2.35, muss aus den Quellen bauen. L\u00e4sst sich machen, ist aber nicht das Plug-and-Play das man von einem Tarball erwartet.<\/li>\n\n\n\n<li>Pascal und \u00e4lter brauchen den oben erw\u00e4hnten Einzeiler in <code>build.rs<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Die volle Roadmap mit Effort\/Impact-Einsch\u00e4tzung liegt im Repo unter <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\/blob\/main\/docs\/roadmap.md\" target=\"_blank\" rel=\"noopener\">docs\/roadmap.md<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Lizenz, Repo, Disclaimer<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">MIT-Lizenz, Repo unter <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\" target=\"_blank\" rel=\"noopener\">github.com\/Kernel-Error\/ts-identities-security-level<\/a>. Releases inklusive prebuilt Tarball werden auf der <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\/releases\" target=\"_blank\" rel=\"noopener\">Releases-Seite<\/a> ver\u00f6ffentlicht.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-small-font-size is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Dieses Tool ist nicht mit der TeamSpeak Systems GmbH affiliiert, von ihr endorsed oder gesponsort. \u201eTeamSpeak&#8220; ist eine Wortmarke der TeamSpeak Systems GmbH und wird hier ausschlie\u00dflich beschreibend verwendet.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das Tool kommuniziert nicht mit TS-Servern, umgeht keine Zugangsbeschr\u00e4nkungen, rechnet ausschlie\u00dflich offline auf einer Datei, die dem Anwender selbst geh\u00f6rt. Algorithmisch dasselbe was der offizielle Client auch tut, nur eben auf der GPU. \u00a769d UrhG (Beobachtung, Untersuchung und Testen von Software) deckt die Black-Box-Analyse ab, aus der die Algorithmus-Specs in Tools wie <code>landave\/TSIdentityTool<\/code> \u00fcber Jahre \u00f6ffentlich entstanden sind. \u00a7202c StGB greift nicht: kein Bypass einer Zugangskontrolle, keine fremden Systeme, eigene Daten. Mein Versuch einer rechtliche Einordnung steht im Repo unter <a href=\"https:\/\/github.com\/Kernel-Error\/ts-identities-security-level\/blob\/main\/docs\/legal.md\" target=\"_blank\" rel=\"noopener\">docs\/legal.md<\/a>.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Siehe auch: <a href=\"https:\/\/www.kernel-error.de\/2026\/03\/21\/voltcraft-cm-2016-linux-gui-ladegeraet-gtk4-python\/\">Voltcraft CM 2016 mit GTK4-GUI unter Linux<\/a> (anderes GTK4-Projekt, andere Hardware), <a href=\"https:\/\/www.kernel-error.de\/2026\/03\/03\/peon-ping-sound-benachrichtigungen-fuer-claude-code\/\">peon-ping Sound-Benachrichtigungen<\/a> (kleines Rust-Tool fuer den Desktop).<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Fragen, Kommentare oder Verbesserungsvorschl\u00e4ge gerne \u00fcber die <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>-Seite oder als Issue im Repo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neues Linux-Tool, das das Security Level einer TeamSpeak-3-Identity GPU-beschleunigt auf NVIDIA-Hardware hochrechnet und den neuen Counter atomar zur\u00fcck in die .ini schreibt. Plus GTK-GUI mit Live-Telemetrie, vier Sprachen und ehrlicher ETA-Anzeige. Architektur in Rust und CUDA, MIT-Lizenz.<\/p>\n","protected":false},"author":1,"featured_media":4447,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,280],"tags":[142,425,377,358,36,424,426,423],"class_list":["post-4444","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-tools-software","tag-cli","tag-cuda","tag-encryption","tag-gtk4","tag-linux","tag-nvidia","tag-rust","tag-teamspeak","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4444"}],"version-history":[{"count":3,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4444\/revisions"}],"predecessor-version":[{"id":4449,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4444\/revisions\/4449"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4447"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4427,"date":"2026-05-12T10:06:39","date_gmt":"2026-05-12T08:06:39","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4427"},"modified":"2026-05-12T10:06:41","modified_gmt":"2026-05-12T08:06:41","slug":"open-source-scan-converter-ossc-firmware-update-1-21","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/12\/open-source-scan-converter-ossc-firmware-update-1-21\/","title":{"rendered":"Open Source Scan Converter: Firmware-Update von 1.08a auf 1.21 nachgeholt"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-1024x768.jpg\" alt=\"Nahaufnahme des OSSC LCD-Displays mit Bootscreen OSSC fw. 1.08a 2014-2023 marqs im roten Acrylgeh\u00e4use, daneben die Beschriftung mSD am Geh\u00e4use\" class=\"wp-image-4424\" style=\"width:180px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-fw-1-08a-lcd-bootscreen-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auf dem LCD steht &#8222;OSSC fw. 1.08a, 2014-2023 marqs&#8220;. Wenn ich ehrlich bin: dieses Banner zeigt mir das Ger\u00e4t seit Ewigkeiten, ich war einfach nie in der Stimmung das mal aufzur\u00e4umen. &#8222;L\u00e4uft ja&#8220; hat sich da \u00fcber die Jahre breit gemacht. Seit 1.08a sind inzwischen viele Releases erschienen, der Sprung von 1.10 bis 1.21 hat eine Menge mitgebracht: Lumacode, Shadow-Mask-Presets, ein komplett neu geschriebenes SD-Profil-Handling und ein St\u00fcck mehr Display-Kompatibilit\u00e4t. Und ab 1.20 funktioniert sogar das Update selbst endlich vern\u00fcnftig. Also Zeit, das mal sauber durchzuziehen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer den OSSC nicht kennt: kurz vorweg, warum das Teil bei mir seit Jahren auf dem Tisch liegt und nicht im Karton.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was ist der OSSC eigentlich?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Open Source Scan Converter (OSSC) ist ein FPGA-basierter Line-Multiplier von Markus &#8222;marqs&#8220; Hiienkari. Schaltpl\u00e4ne und Firmware liegen komplett offen auf <a href=\"https:\/\/github.com\/marqs85\/ossc\" target=\"_blank\" rel=\"noopener\">github.com\/marqs85\/ossc<\/a>. Auf dem Board sitzt ein Altera Cyclone IV, der analoges Video von Retro-Konsolen und Computern aufnimmt und digital per HDMI wieder ausspuckt. SNES, Mega Drive, N64, PS1\/PS2, Saturn, Dreamcast, Amiga, Neo Geo, fr\u00fche PCs mit VGA, der C64 \u00fcber entsprechende Adapter, alles was RGB, Component oder Composite\/S-Video raushaut, kommt rein.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der eigentliche Trick ist nicht das Skalieren an sich, sondern <em>wie<\/em> der OSSC skaliert. Er arbeitet Zeile f\u00fcr Zeile und benutzt keinen Frame-Buffer. Eine eingehende Scanline wird sofort mehrfach (Line2x, Line3x, Line4x, Line5x) ausgegeben, das war&#8217;s. Ger\u00e4te wie der Framemeister scalen \u00fcber einen kompletten Frame-Buffer und addieren dadurch im Worst Case einen ganzen Frame Latenz oder mehr. Der OSSC liegt im Bereich weniger Mikrosekunden plus den Pixel-Delay des Displays. Auf einem ordentlichen 1080p- oder 4K-Monitor sieht ein 240p-Konsolensignal damit pixelgenau scharf aus, und das ohne dass sich der Controller anf\u00fchlt als h\u00e4tte er einen halben Sekundenschlaf eingelegt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Pro Konsole lassen sich Sample-Modi und Custom-Profile abspeichern, dazu kommen optionale Scanline-Simulation und seit den neueren Firmwares Shadow-Mask-Presets, also so eine Art simulierter Lochmasken-Look wie auf einer alten Trinitron-R\u00f6hre. Mein Ger\u00e4t ist eine Hardware-Revision v1.6 mit Audio-Support im roten Acrylgeh\u00e4use, also nehme ich die <code>-aud<\/code>-Variante der Firmware. Mehr dazu gleich beim Flashen.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-1024x768.jpg\" alt=\"Top-Down-Ansicht des Open Source Scan Converter mit allen Anschlussbeschriftungen: AV1 OUT HDMI, AV2 IN, AV1-SCART-IN, AV2-YPBR-IN, AV3 IN, OFF-ON-Schalter, 5V DC, BTN0, BTN1, JTAG-Pins und mSD-Slot\" class=\"wp-image-4425\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-anschluesse-uebersicht-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auf der Oberseite lesbar: AV1-SCART-IN f\u00fcr RGB-Signale per SCART, AV2-YPBR-IN f\u00fcr Komponenten-Video oder VGA \u00fcber einen entsprechenden Adapter, AV3 IN als optionaler Composite\/S-Video-Eingang. Daneben der HDMI-Out (DVI-kompatibel, mit Audio auf meiner Revision), zwei Taster BTN0 und BTN1 f\u00fcr Navigation ohne Fernbedienung, die JTAG-Pins f\u00fcr Bastler und der f\u00fcr den Update-Vorgang interessante mSD-Slot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Wof\u00fcr ich das Ding eigentlich benutze<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bei mir landet der OSSC immer dann auf dem Tisch, wenn alte Hardware an einen modernen Bildschirm soll und dabei auch noch sauber auf dem PC aufgezeichnet werden muss. HDMI raus aus dem OSSC, in einen <a href=\"https:\/\/amzn.to\/4d4rbWj\" data-type=\"link\" data-id=\"https:\/\/amzn.to\/4d4rbWj\" target=\"_blank\" rel=\"noreferrer noopener\">USB-HDMI-Grabber<\/a> rein, fertig ist die Aufnahme. Das geht eben nicht nur f\u00fcr die offensichtliche Schiene 386er oder Spielekonsole. Auch ein alter Videorecorder, eine analoge Kamera die ich f\u00fcr jemanden repariere oder einfach mal eben auslesen muss, eine 8-Bit-Maschine die pl\u00f6tzlich wieder einen Use-Case bekommt, all das geht \u00fcber denselben Weg ins Bild. Mein guter alter C64 h\u00e4ngt mit ein paar Handgriffen am OSSC und ist sofort auf dem 27-Zoll-Monitor zu sehen, statt umst\u00e4ndlich einen kleinen R\u00f6hrenmonitor aus dem Schrank zu wuchten.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-1024x768.jpg\" alt=\"Seitenansicht des OSSC im roten Acrylgeh\u00e4use mit gelbem SCART-Adapter oben auf dem Ger\u00e4t, angeschlossenes Netzteil und LCD-Display mit Firmware 1.08a\" class=\"wp-image-4426\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-1024x768.jpg 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-300x225.jpg 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-768x576.jpg 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-1536x1152.jpg 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-2048x1536.jpg 2048w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ossc-scart-adapter-seitenansicht-676x507.jpg 676w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zwei Beispiele aus meinem YouTube-Kanal, beide via OSSC aufgenommen, damit man sich vorstellen kann was am Ende rauskommt:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"PDS Osicom-Office Box \u2013 Boot, Restart &amp; BIOS Navigation Demo\" width=\"676\" height=\"380\" src=\"https:\/\/www.youtube.com\/embed\/_yK9_Z926oo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"MAXIM DSTINIM400 booting TINI slush OS Version1.17\" width=\"676\" height=\"380\" src=\"https:\/\/www.youtube.com\/embed\/nzKrhYTIsbE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Was sich seit 1.08a getan hat<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Zwischen meiner alten 1.08a und der aktuellen 1.21 hat marqs in mehreren Releases einiges nachgelegt. Die spannendsten Punkte aus den offiziellen <a href=\"https:\/\/github.com\/marqs85\/ossc\/releases\" target=\"_blank\" rel=\"noopener\">Release-Notes<\/a> in der Reihenfolge wie sie aufgetaucht sind:<\/p>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li><strong>1.10:<\/strong> Erste Lumacode-Unterst\u00fctzung, HDMI-VRR-Flag, reduzierter Sampling-Jitter in den Optimized-Modes, MSX-Sync-Erkennung gefixt, neue High- und Optimal-Sampling-Raten f\u00fcr Passthru.<\/li>\n\n\n\n<li><strong>1.11:<\/strong> Lumacode auch f\u00fcr NES, 480p\/576p im Line3x-Modus, Settings-Export wieder eingebaut, neue Display-Kompatibilit\u00e4tsoptionen (ADC-\/FPGA-PLL-Bandbreite, HPLL2x-Controls).<\/li>\n\n\n\n<li><strong>1.12:<\/strong> Lumacode auf Atari GTIA und VCS erweitert, HDR-Infoframe-Wiederholung gefixt, Default-ADC-PLL-Bandbreite reduziert f\u00fcr mehr Display-Kompatibilit\u00e4t, Full-VSYNC-Bypass f\u00fcr MDA-Karten.<\/li>\n\n\n\n<li><strong>1.20:<\/strong> Volle FAT32\/exFAT-Unterst\u00fctzung f\u00fcr die SD-Karte, neues Profil-Format mit deutlich verbesserter Kompatibilit\u00e4t zwischen Firmware-Versionen, Shadow-Mask- und Lumacode-Presets laden und speichern direkt von SD, OSD-Cursor-Farbe w\u00e4hlbar, DIY-Latency-Tester und Panasonic-Hack wieder verf\u00fcgbar, alternativer Firmware-Slot im internen Flash, 480p\/576p-Pillarbox-Option f\u00fcr Widescreen-Displays ohne Aspect-Ratio-Control.<\/li>\n\n\n\n<li><strong>1.21:<\/strong> Lumacode-Support finalisiert, Profil-Speichern und -Laden \u00fcber SD gefixt.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">F\u00fcr mich relevant: das neue SD-Profil-Handling und die paar Display-Kompatibilit\u00e4tsschrauben. Lumacode ist eine andere Geschichte (ein Trick um Composite-only-Konsolen wie NES oder Atari VCS auf Luma-Ebene farbgetrennt einzulesen, daf\u00fcr brauche ich aber spezielle Lumacode-Kabel und passe heute eher).<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Pre-1.20 hei\u00dft: dd, nicht copy<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Hier ist der Knackpunkt, an dem viele beim Update straucheln. Der Bootloader auf dem OSSC erwartet die Firmware ab Sektor 0 der microSD, also als rohes Disk-Image. Eine FAT32-Partition mit der <code>.bin<\/code> drin reicht ihm nicht. Erst ab Version 1.20 wurde der Update-Mechanismus umgebaut, danach gen\u00fcgt der simple Datei-Copy in ein <code>\/fw\/<\/code>-Verzeichnis auf einer FAT32- oder exFAT-formatierten Karte. Wer wie ich von 1.08a kommt, muss diesen Schritt einmal mit <code>dd<\/code> machen, und ab dem n\u00e4chsten Mal ist die SD-Karte dann nur noch ein Datentr\u00e4ger und kein Bootloader-Trick.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Heruntergeladen habe ich <code>ossc_1.21-aud.bin<\/code> direkt vom <a href=\"https:\/\/github.com\/marqs85\/ossc\/releases\/tag\/v1.21\" target=\"_blank\" rel=\"noopener\">v1.21 Release<\/a>. Die Datei ist 391 KB gro\u00df. marqs liefert in den Releases selbst keine Pr\u00fcfsumme mit, also habe ich nach dem Download lokal eine SHA256 gezogen, damit ich beim Schreiben wei\u00df dass die Datei nicht unterwegs verst\u00fcmmelt wurde:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sha256sum ossc_1.21-aud.bin\n12703269c8a2e9ff94dfc37b9baa3e2865476196739baa551c0a93a174b18965  ossc_1.21-aud.bin<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Dann auf die microSD. Eine beliebige Karte tut es, idealerweise eine kleine die man nicht f\u00fcr etwas Wichtiges braucht, das Image \u00fcberschreibt eh den kompletten ersten Bereich. <code>dd<\/code> ist gnadenlos, einmal das falsche Device erwischt und die Systemplatte ist Vergangenheit. Also vorher mit <code>lsblk<\/code> oder <code>dmesg | tail<\/code> sicher feststellen, welches <code>\/dev\/sdX<\/code> die SD-Karte ist. Bei mir hier <code>\/dev\/sdc<\/code>, aber das ist auf jedem System ein anderes Ziel.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo dd if=ossc_1.21-aud.bin of=\/dev\/sdc bs=1M conv=fsync status=progress\nsudo sync<\/pre>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Kurzer Reminder, weil das hier wirklich wehtut wenn man es verbockt: das <code>of=<\/code> zeigt auf das ganze Device, nicht auf eine Partition. Also <code>\/dev\/sdc<\/code>, nicht <code>\/dev\/sdc1<\/code>. Und nicht die Systemplatte erwischen, ich wei\u00df ja nicht ob ich das oft genug schreiben kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Am Ger\u00e4t<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Karte raus aus dem Card-Reader, rein in den mSD-Slot am OSSC. Ger\u00e4t einschalten, mit der Fernbedienung (oder den beiden Tastern am Geh\u00e4use) durch das Men\u00fc zu <em>Settings \u2192 Fw. update<\/em> und einmal best\u00e4tigen. Der OSSC liest das Image direkt von der microSD, schreibt es ins interne Flash und meldet nach ein paar Sekunden Erfolg. Danach aus, microSD raus, wieder an. Im Bootscreen steht jetzt brav &#8222;OSSC fw. 1.21&#8220;, und das alte &#8222;2014-2023&#8220;-Banner ist weg. Kein Drama, keine Fehler, einfach erledigt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Eine Sache die in den Release-Notes explizit erw\u00e4hnt wird und auf die man sich einstellen sollte: Profile und Settings sind zwischen Firmware-Versionen nicht garantiert kompatibel. Bei dem Sprung von 1.08a auf 1.21 erst recht nicht. Alles was an Custom-Sample-Phasen, Modi und Per-Console-Tweaks gespeichert war, muss einmal neu konfiguriert werden. Ab 1.20 ist das neue Profil-Format dann deutlich stabiler und \u00fcberlebt zuk\u00fcnftige Spr\u00fcnge eher, das war ja Teil des Cleanups in dem Release.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Ab 1.20 wird&#8217;s bequem<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das n\u00e4chste Update bekomme ich jetzt geschenkt. Eine FAT32- oder exFAT-formatierte microSD, ein Ordner <code>\/fw\/<\/code> im Root, die <code>.bin<\/code> reinkopiert, Karte in den Slot, im Men\u00fc das Update starten. Kein <code>dd<\/code>, kein &#8222;war das jetzt das richtige Device&#8220;, keine Karte die ich danach erst neu formatieren muss damit andere Ger\u00e4te sie wieder anfassen. Das einmalige Holperst\u00fcck <code>dd<\/code> war also nur weil ich so lange mit der alten Firmware unterwegs war. Wer schon auf 1.20 oder 1.21 ist, kommt nie wieder in die Verlegenheit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-small-font-size\">Fazit<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Aufwand f\u00fcr so ein Firmware-Update ist \u00fcberschaubar, der Effekt aber sp\u00fcrbar. Ein paar weniger Display-Quirks, ein wirklich brauchbares Profil-Handling und das gute Gef\u00fchl dass das Ger\u00e4t auf dem aktuellen Stand ist, das ein Hobby-Entwickler aus Finnland inzwischen \u00fcber zehn Jahre pflegt. Open Source Hardware in der Praxis: ein einzelner Mensch, ein offenes Repository, ein FPGA und eine kleine Community von Retro-Enthusiasten die das Ding am Leben halten. Genau die Sorte Projekt, die ich gerne unterst\u00fctze, sei es nur indem ich auch mal Bug-Reports oder Erfahrungen rausschicke.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wer selbst einen OSSC zu Hause hat und noch auf einer Firmware vor 1.20 ist, dem kann ich nur raten: einmal die saure <code>dd<\/code>-Pille schlucken und auf 1.21 hochziehen. Ab dann ist Updaten so langweilig wie Datei kopieren, und genau so soll es ja sein.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Siehe auch: <a href=\"https:\/\/www.kernel-error.de\/2026\/04\/05\/tc1-multifunction-tester-open-source-firmware-flashen-kalibrieren\/\" data-type=\"post\" data-id=\"3993\">TC1 Multifunction Tester: Open-Source-Firmware flashen<\/a> (anderes Ger\u00e4t, gleiches Open-Source-Spielprinzip), <a href=\"https:\/\/www.kernel-error.de\/2026\/03\/25\/commodore-floppy-disk-preservation-xum1541-firmware-bug-opencbm\/\" data-type=\"post\" data-id=\"3940\">Commodore Floppy Disk Preservation mit xum1541<\/a> (f\u00fcr die C64-Diskettenseite des Retro-Stacks) und <a href=\"https:\/\/www.kernel-error.de\/2024\/03\/29\/vc-64-turbo-tape-c-1986-by-cik\/\" data-type=\"post\" data-id=\"2572\">VC-64 Turbo Tape (1986)<\/a>.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Fragen oder eigene OSSC-Geschichten? <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\" data-type=\"page\" data-id=\"38\">Einfach melden.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mein OSSC lief jahrelang noch auf Firmware 1.08a. Zeit f\u00fcr das Update auf 1.21: was sich seither getan hat, warum ein dd-Flash auf microSD n\u00f6tig ist und wie ab Version 1.20 alles bequemer wird.<\/p>\n","protected":false},"author":1,"featured_media":4429,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,282],"tags":[389,156,193,383,347,375,374,376],"class_list":["post-4427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-retro-computing","tag-c64","tag-commodore","tag-diy","tag-foss","tag-hardware","tag-maker","tag-retrocomputing","tag-righttorepair","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4427"}],"version-history":[{"count":1,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4427\/revisions"}],"predecessor-version":[{"id":4428,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4427\/revisions\/4428"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4429"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}},{"id":4390,"date":"2026-05-02T12:45:40","date_gmt":"2026-05-02T10:45:40","guid":{"rendered":"https:\/\/www.kernel-error.de\/?p=4390"},"modified":"2026-05-02T12:49:37","modified_gmt":"2026-05-02T10:49:37","slug":"ai-mensch-als-flaschenhals-gedanken-zu-geschwindigkeit-und-kontrollverlust","status":"publish","type":"post","link":"https:\/\/www.kernel-error.de\/2026\/05\/02\/ai-mensch-als-flaschenhals-gedanken-zu-geschwindigkeit-und-kontrollverlust\/","title":{"rendered":"AI, der Mensch als Flaschenhals und meine Sorgen f\u00fcr die n\u00e4chsten 15 Jahre"},"content":{"rendered":"\n<p class=\"has-small-font-size wp-block-paragraph\">Diesmal kein tiefer Tech-Dive. Ein paar Gedanken, die mich seit Wochen begleiten und die ich gerne aus dem Kopf herausschreibe. Es geht um AI, Large Language Models, die Geschwindigkeit in der das alles passiert, und um meine Sorge, ob wir als Menschheit damit \u00fcberhaupt klarkommen. Kein AI-Bashing. AI kann zum einen nichts daf\u00fcr und ist zum anderen sehr hilfreich. Aber die immer schnellere Verbreitung immer besser werdender AI-Systeme hat eben Konsequenzen, und genau die sortiere ich hier f\u00fcr mich.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-large is-resized\"><a href=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"655\" src=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals-1024x655.png\" alt=\"Mensch zwischen KI-Automatisierung und gesellschaftlicher Unsicherheit \u00fcber Arbeit, Bildung, Politik und Zukunft.\" class=\"wp-image-4393\" style=\"aspect-ratio:1.5633672746115554;width:203px;height:auto\" srcset=\"https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals-1024x655.png 1024w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals-300x192.png 300w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals-768x491.png 768w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals-1536x983.png 1536w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals-676x432.png 676w, https:\/\/www.kernel-error.de\/wp-content\/uploads\/2026\/05\/ai-flaschenhals.png 1568w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">AI ist nicht b\u00f6se, die Geschwindigkeit ist es<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">AI an sich ist nicht b\u00f6se. Large Language Models sind nicht b\u00f6se. Aus meiner Sicht ist das einfach der n\u00e4chste Schritt in der Entwicklung, die wir als Menschheit hinlegen. Beim Rad war es nicht anders, beim Feuer, bei der Dampfmaschine, beim automatischen Webstuhl, bei der Elektrizit\u00e4t in den H\u00e4usern. Alles Techniken, die irgendwann neu zur Menschheit gekommen sind und die das Leben und Arbeiten ver\u00e4ndert haben.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Unterschied zu vielen dieser vorangegangenen Technologien ist die Geschwindigkeit. Pferde und Kutschen gegen das Automobil: inzwischen sind wir in der Autozeit angekommen, alles um uns herum ist darauf ausgelegt, dass das funktioniert. Aber dazwischen lag fast ein ganzes Jahrhundert. Eine Generation konnte ihren Job noch zu Ende machen, ihr Gesch\u00e4ft noch zu Ende f\u00fchren, manchmal sogar noch an die Kinder \u00fcbergeben. Der Stellmacher als Beispiel. Bei AI haben wir diese Zeit nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Der Mensch ist inzwischen der Flaschenhals<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bei vielen anderen Techniken war der Mensch bei der Verbreitung zwar auch ein Flaschenhals, aber es gab tausend andere Dinge, die zus\u00e4tzlich gebremst haben. Bei AI ist inzwischen der Mensch der eigentliche Flaschenhals. Solche Systeme k\u00f6nnten sich fast schon selbst weiterentwickeln, oder Menschen k\u00f6nnten zumindest in Zusammenarbeit mit AI viel schneller neue Systeme auf den Markt bringen. Nur sind die Menschen noch nicht da.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Seit ungef\u00e4hr 4 bis 5 Jahren ist das ganze AI-Thema immer st\u00e4rker geworden. Seit zwei Jahren ist es auch in der breiten \u00d6ffentlichkeit angekommen und sickert dort immer tiefer ein. Aber selbst die Menschen um uns herum, selbst ich, sind noch nicht so darauf eingestellt, wie es bei dieser Geschwindigkeit eigentlich n\u00f6tig w\u00e4re.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und das gilt nicht nur f\u00fcr die Allgemeinheit. Selbst Experten, die den AI-Hype-Train voll mitreiten und das zu ihrer Profession gemacht haben, schaffen es nicht, sich jedes neue Modell wirklich anzugucken und auszuprobieren. Einfach weil es so schnell und so viel ist. Die Menschen k\u00f6nnen es gar nicht mehr greifen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sprachen, Code-Massen und der schleichende Kontrollverlust<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">In der Systemadministration, im DevOps-Bereich oder in der Entwicklung sieht man die Geschwindigkeit an vielen Stellen. Es gibt immer eine neue Sprache, die irgendwelche Vorteile gegen\u00fcber einer alten hat oder besser f\u00fcr einen Nischenbereich passt. Leute steigen ein, werden gut darin, entwickeln die Sprache weiter, dann kommt die n\u00e4chste Iteration. Ob Go, TypeScript, Rust, irgendeine Sprache ist immer gerade die gehypte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aber da muss man als Mensch ja erstmal reinkommen. Und das alles ist f\u00fcr Menschen gemacht. Eine AI k\u00f6nnte im Zweifel direkt in etwas deutlich Simpleres schreiben, oder sich eine komplett neue Sprache ausdenken, wenn man sie lassen w\u00fcrde. Eine Sprache, die f\u00fcr die AI selbst optimiert ist, um Dinge umzusetzen. Ich will nicht sagen, dass ich das alles w\u00fcsste oder dass das wahr ist, das sind nur meine Gedanken. Aber ich glaube, dass Menschen Sorge haben, an dieser Stelle Kontrolle abzugeben. Wenn eine AI ihre eigene Programmiersprache nutzt und in dieser Sprache Software entwickelt, dann versteht das am Ende keiner mehr. Und da frage ich mich auch: muss das denn \u00fcberhaupt noch jemand verstehen?<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn ich mir anschaue, was in meinem Berufsumfeld aktuell passiert, w\u00fcrde ich fast nein sagen. Riesige Softwareprojekte und komplexe Themen werden vollst\u00e4ndig durch AI generiert. Fast keiner f\u00e4ngt mehr wirklich damit an, echten Code von Hand zu schreiben. Was bei einem Pull-Request herausf\u00e4llt, sind Massen an Code, die kein Mensch mehr wirklich liest. Wenn eine AI einen Tag lang Software entwickelt und das Ganze in einen Commit packt: welcher Mensch setzt sich dann hin und liest diese 100 Seiten Code einmal gegen, um zu pr\u00fcfen ob er gut oder schlecht ist? Wer soll das bewerten?<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das kann sowieso schon keiner mehr. An der Stelle l\u00e4sst man verschiedene Tools, und auch wieder eine AI, bewerten ob das gut oder schlecht ist. Dann mergt man nach Empfehlung. Sonst baut die AI die Software in einem Tag und ein Team von Entwicklern muss diesen Code eine Woche pr\u00fcfen. Das ist Quatsch.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn man das weiterspinnt, kommt man irgendwann an den Punkt, wo in der Softwareentwicklung und in der Systemadministration ganz viel echte Kontrolle \u00fcber IT-Systeme verloren geht. Die wird am Ende an die AI abgegeben. Klar kann man die AI das sch\u00f6n dokumentieren lassen, sich Anleitungen schreiben lassen, theoretisch kann sich am Ende auch wieder ein Mensch einarbeiten. Aber wenn wir ehrlich sind: die Leute wollen Geld verdienen. Das passiert an dieser Stelle nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mythos, Open Source und der neue Patch-Druck<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vor allem in Richtung IT-Security ist in den letzten Wochen und Monaten viel durch die Presse gegangen. Anthropic, der Hersteller von Claude Code, soll mit einem Modell namens Mythos arbeiten, das in der Berichterstattung als sehr leistungsf\u00e4hig beim Code-Audit beschrieben wurde. Wo genau das im Vergleich zu den jeweils aktuellen Modellen anderer Anbieter steht, kann ich nicht seri\u00f6s einsch\u00e4tzen. Spannender ist sowieso, was so ein System angeblich kann: so schnell und zuverl\u00e4ssig Sicherheitsl\u00fccken im Code finden, dass es katastrophal w\u00e4re, das einfach in die freie Welt rauszulassen. Stattdessen bekommen scheinbar nur sehr ausgew\u00e4hlte Leute und Unternehmen Zugriff darauf, meist US-Unternehmen, um ihre eigenen Dinge und Dienste zu pr\u00fcfen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Diese neuen Modelle sind nicht prim\u00e4r f\u00fcr klassisches Pentesting gegen eine Blackbox gedacht. Sie schauen in den Code und finden dort die L\u00fccken, die man ausnutzen kann. Klar, f\u00fcrs Pentesting kann man AI auch benutzen. Aber die gro\u00dfe Angst beim Mythos-Thema ist genau dieser Code-Audit-Modus.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aus dem ersten Blickwinkel sind damit Open-Source-Projekte besonders gef\u00e4hrdet, weil deren Quellcode offen im Internet steht. Fr\u00fcher wurde gesagt: genau das macht Open Source sicher, weil <a href=\"https:\/\/en.wikipedia.org\/wiki\/Linus%27s_law\" target=\"_blank\" rel=\"noopener\">viele Leute reinschauen<\/a> und Sicherheitsl\u00fccken finden, die dann gefixt werden. Im Vergleich zu Closed-Source-Code, etwa bei Microsoft Windows, wo nicht jeder einfach in den Code schauen kann.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bei Open Source sind in letzter Zeit viele Fixes gekommen. <a href=\"https:\/\/www.mozilla.org\/en-US\/security\/advisories\/\" target=\"_blank\" rel=\"noopener\">Mozilla<\/a> hat Fixes gemacht, <a href=\"https:\/\/www.freebsd.org\/security\/\" target=\"_blank\" rel=\"noopener\">FreeBSD<\/a> hat Fixes gemacht, viele Sicherheitsl\u00fccken wurden geschlossen. Die Software wurde sicherer, fertig. Man kann jetzt sagen: ich halte das n\u00e4chste, bessere AI-Modell wieder dagegen, und es wird wahrscheinlich wieder etwas finden. Hundertprozentige Sicherheit ist eh schwierig. Aber zumindest ist die Software gerade einen Schritt sicherer geworden.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auf der anderen Seite setzt das die Systembetreiber unter Druck. Die m\u00fcssen sich \u00fcberlegen, wie sie diese schnellen, aufeinanderfolgenden Sicherheitsupdates in ihre Systeme bekommen. Klingt erstmal einfach. Ich sitze am Notebook, das Notebook sagt es gibt Updates, ich sage ja, installiere die Updates, starte das Notebook neu, alles funktioniert, ich bin aktuell. Wer aber eine normale Linux-Distribution mit vielen Zusatzpaketen auf dem Arbeitsplatz hat, sieht, dass mehrfach am Tag Updates kommen k\u00f6nnen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Bei einfachen Security-Fixes sollten die Funktionen einer Library, einer Anwendung oder des Betriebssystems eigentlich nicht extrem auf den Kopf gestellt werden. Sie sollten nicht daf\u00fcr sorgen, dass Abh\u00e4ngigkeiten brechen und pl\u00f6tzlich etwas nicht mehr funktioniert. Das Problem hat man eher, wenn man ganze Versionen wechselt, also auf das n\u00e4chste Major Release geht.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Trotzdem gibt es Bereiche, in denen man nicht einfach mal einen Patch einspielen kann, weil Patches vorher gepr\u00fcft und getestet werden m\u00fcssen. Etwas Geheimes, etwas Staatliches, der Bankensektor, kritische Bereiche, die nicht ausfallen d\u00fcrfen und bei denen alles zertifiziert sein muss. Das aktuelle Regelwerk steht dem entgegen, dass man im Zweifel drei oder f\u00fcnf Mal am Tag etwas patchen m\u00fcsste. Das l\u00e4sst sich schwer miteinander vereinbaren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pl\u00f6tzlich kann jeder einen Cloud-Service starten<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Patch-Druck ist nur eine Seite. Auf der anderen ver\u00e4ndert AI gerade, wer \u00fcberhaupt Software auf den Markt bringen kann. Pl\u00f6tzlich ist jeder mit einer Kreditkarte und einem Computer in der Lage, eine eigene Software, einen eigenen Service, eine eigene Dienstleistung anzubieten, in einer Cloud seiner Wahl zu hosten, global verteilt nah bei den jeweiligen Kunden. Das kann jetzt wirklich jeder.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und das, was dabei als Code und Anwendung herausf\u00e4llt, ist nicht mehr wie in den Anf\u00e4ngen der AI-Modelle. Es wird immer besser und stabiler. Im Grunde kann ein Ein-Mann-CEO-Unternehmen einen kompletten Software-Service aufmachen: automatisiertes Ticketsystem per AI, KI-Hotline, AI-Werbung, AI-Webseite, AI-Marketing, das AI-Produkt l\u00e4uft vor sich hin.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Der Aufwand, ein solches Produkt \u00fcberhaupt zu entwickeln und auf den Markt zu bringen, ist extrem gering geworden. In den n\u00e4chsten zwei oder drei Jahren werden wir mit Sicherheit feststellen, dass der Markt \u00fcberall auf der Erde mit solchen Programmen und Diensten regelrecht \u00fcberschwemmt wird. Die werden sich im Preis immer weiter unterbieten. Die Baseline wird irgendwo bei den Kosten des Cloud-Providers liegen, plus dem monatlichen AI-Modell der einen Person dahinter.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Schwieriger sind nur sehr spezielle Nischen in einem bestimmten Markt, etwa eine deutsche Buchhaltungsanwendung. Oder Zertifizierungen bei sicherheitskritischen Themen, <a href=\"https:\/\/www.iso.org\/standard\/27001\" target=\"_blank\" rel=\"noopener\">ISO 27001<\/a> oder <a href=\"https:\/\/www.bsi.bund.de\/DE\/Themen\/Unternehmen-und-Organisationen\/Informationen-und-Empfehlungen\/Empfehlungen-nach-Angriffszielen\/Cloud-Computing\/Kriterienkatalog-C5\/kriterienkatalog-c5_node.html\" target=\"_blank\" rel=\"noopener\">BSI C5<\/a>. Das wird f\u00fcr solche Solo-CEO-Firmen noch einige Jahre schwieriger zu erreichen sein. Aber auch das sch\u00fctzt den Markt nicht f\u00fcr Jahrzehnte. Das ist ein Deckel f\u00fcr die n\u00e4chsten f\u00fcnf bis zehn Jahre, und auch der wird kr\u00e4ftig anfangen zu br\u00f6ckeln.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verlieren wir die \u00dcbung im logischen Denken?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">AI sorgt vielleicht auch daf\u00fcr, dass wir \u00dcbung und Routine darin verlieren, logisch Probleme zu l\u00f6sen. Man h\u00f6rt das nicht immer direkt, aber ich glaube, da ist etwas dran. In manchen L\u00e4ndern liegt schon etwas mehr Augenmerk darauf, dass Sch\u00fcler und Lehrkr\u00e4fte keine AI benutzen, wenn es um Schulstoff oder Aufgaben geht. Einfach damit die Leute in dieser F\u00e4higkeit drinbleiben.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ob das besser oder schlechter ist als der Ansatz hier, wo AI zum Teil schon mitbenutzt wird, wei\u00df ich nicht. Man muss sich mit der Technik auseinandersetzen, man muss verstehen wie sie funktioniert, um hineinzukommen. Aber wahrscheinlich ist auch das in f\u00fcnf Jahren nicht mehr n\u00f6tig. Die Modelle sind dann so weit, dass man keinerlei Vorahnung mehr braucht. Man geht zum Handy, oder was wir bis dahin als Ger\u00e4t haben, sagt: hier ist mein Problem. Und das Ding baut die L\u00f6sung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Brauchen wir noch Code-Repositories?<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Im Moment haben wir noch Code-Repositories, Pipelines zum Deployen, Linter, Sicherheitsscanner, SonarQube oder \u00c4hnliches. Wir machen Commits, schreiben Kommentare in den Quellcode, legen das alles dort ab. Wir m\u00fcssen zu alten Releases zur\u00fcckrollen k\u00f6nnen. Wir machen Releases, wir haben Software-Lifetime.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aber wer sagt, dass das so bleibt? Warum kann man nicht einfach jedes Mal, wenn man ein St\u00fcck Software braucht, der AI sagen: bau mir das. Die AI baut es. Und wenn ich es nicht mehr brauche, wird es weggeworfen. Wof\u00fcr hebe ich den Code \u00fcberhaupt auf?<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">In wenigen Jahren, wenn die Entwicklung so weitergeht, baut mir die AI die Anwendung, die ich gerade brauche, in Echtzeit nebenher. Wenn ich kurz warten muss: so what? Sobald ich den Service nicht mehr brauche oder ein neues Feature will, wird das ganze Ding einfach neu gebaut. Was soll es? Wo ist das Problem?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Junioren, Ausbildung und der Druck auf die Sozialsysteme<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Jetzt zu sagen: liebe Leute, lernt alle naturwissenschaftliche F\u00e4cher, Mathematik, Physik. Ja, das ist gut. Aber auch da wird AI eine Rolle spielen, und ich glaube, wir sind n\u00e4her an einer kritischen Stelle dran als wir denken. In einigen Jahren wei\u00df vielleicht niemand mehr, wie etwas gebaut wurde, wenn die Leute, die es noch wirklich verstanden haben, aus dem Berufsleben verschwunden sind.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Guckt in die Softwareentwicklung. Da werden im Grunde keine Junioren mehr eingestellt. Fachinformatiker Anwendungsentwicklung: wer macht diesen Ausbildungsberuf noch? Wer bildet diese Leute noch aus? Im Moment braucht man seniorige Menschen, die diese AI bedienen k\u00f6nnen. Die Aufgaben, die ein Junior oder ein Azubi gemacht hat, sind jetzt schon von der AI \u00fcbernommen. Und das wird weitergehen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Roboter werden trainiert, um Arbeiten zu \u00fcbernehmen. Auch sch\u00f6n. Wenn wir nicht mehr selber arbeiten m\u00fcssen, ist das doch toll. Der einzige Punkt, der mir Bauchschmerzen macht: aus meiner Sicht ist diese Zeit, die uns jahrhundertelang begleitet hat, Arbeitszeit gegen Geld, irgendwie vorbei. Wir brauchen also eine andere L\u00f6sung, wie wir Einkommen sicherstellen, um weiter ordentlich zu leben. Denn Menschen sind eine Spezies, die selten den Hals vollkriegt. Sie wollen immer mehr, immer besser. Und das funktioniert halt nicht.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Diese L\u00f6sung muss au\u00dferdem nicht nur f\u00fcr Europa, Deutschland oder die USA funktionieren, sondern f\u00fcr die ganze Welt. Wir alle haben in Anf\u00fchrungszeichen das gleiche Problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Politik und Gesellschaft kommen nicht hinterher<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn ich mir die Welt so angucke, sehe ich im Moment kaum Zusammenarbeit, kein gemeinsames Ziehen an einem Strang. Nicht auf internationalem Level. Da treten sich Leute aus irgendwelchen Gr\u00fcnden gegenseitig vor die Schienbeine. Ich will die einzelnen Konflikte nicht werten. Aber ich glaube nicht, dass wir so sinnvoll nach vorne kommen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auch auf kleinerem Level: wie viele tolle Geschichten aus dem <a href=\"https:\/\/www.schwarzbuch.de\/\" target=\"_blank\" rel=\"noopener\">Schwarzbuch der Steuerzahler<\/a> oder bei <a href=\"https:\/\/www.ndr.de\/fernsehen\/sendungen\/extra_3\/\" target=\"_blank\" rel=\"noopener\">extra 3<\/a> hat jeder schon bewundert. In der deutschen Politik brauchen schon Kleinigkeiten Ewigkeiten. Da ist auf einer Br\u00fccke einfach mal 18 Jahre Baustelle und es ist immer noch nicht fertig. Wie sollen wir mit solchen Strukturen ein Problem dieser Gr\u00f6\u00dfenordnung schaffen?<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ich will damit nicht sagen, dass die alle wegm\u00fcssen. Aber ich glaube, wir haben das Problem an dieser Stelle noch nicht einmal verstanden. Wer diesen Beitrag liest, sieht das wahrscheinlich \u00e4hnlich wie ich, das ist meine Blase. Aber wenn ich sp\u00e4ter im Lidl stehe und von links nach rechts gucke, und das ist keine Wertung, leben viele Menschen einfach in anderen Themenfeldern. Nicht in einer anderen Realit\u00e4t, sie haben andere Punkte, die sie bewegen. Wie sehr uns AI gerade \u00fcberrollt, kommt da kaum an. Es ist alles noch zu neu.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auch unser Bundeskanzler und die aktuelle Regierung, dar\u00fcber kann man sich streiten. Manche Sachen machen sie gut, manche schlecht. Niemand ist perfekt. Aber viele dieser Menschen sind in einem Alter, und nein, ich sage nicht, dass man es nur deshalb nicht verstehen kann, weil man \u00e4lter ist. Aber ich w\u00fcrde behaupten: das Thema AI und die Frage, was das gerade f\u00fcr die Welt bedeutet, wirklich zu greifen, wird mit zunehmendem Alter schwieriger. Einfach schwieriger.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wie damals bei der Elektrizit\u00e4t in den H\u00e4usern<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wenn man jetzt \u00fcberlegt was man tun sollte, sagen viele: ich reite den AI-Hype-Train, ich gehe voll rein und mache nur noch AI. Das ist auch richtig. Leute, die Agentic Engineering oder Prompt Engineering richtig f\u00fcr sich adaptiert haben, sind im Moment extrem gefragt. Die haben gerade Hochzeit.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Aber wenn ich auf den Stand der Modelle schaue, sind wir trotzdem noch ganz am Anfang. Es ist eher so, als w\u00e4ren gerade die ersten Autos gekommen. Oder noch passender: als die Elektrizit\u00e4t in normalen H\u00e4usern eingef\u00fchrt wurde. Das war gef\u00e4hrlich. Sicherungen? Mit Stoff umwickelte Dr\u00e4htchen. Keine richtige Erdung. Keiner wusste, wie das wirklich funktioniert. Da ist viel schiefgegangen. Man musste extra vorsichtig sein und Dinge dreimal kontrollieren, damit nichts brennt.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Dann kamen mehr Regeln. Mehr Sicherheit. Es hat sich alles weiterentwickelt. Heute passieren auch noch Unf\u00e4lle mit Elektrizit\u00e4t, aber im Grunde ist die Technik in unserer Gesellschaft so weit angekommen, dass man kein Super-Fachexperte mehr sein muss, um mit dem Waffeleisen sicher Waffeln zu machen. Steckdose, los geht&#8217;s. Und wenn der Defekt im Ger\u00e4t ist, greifen Schutzmechanismen mit hoher Wahrscheinlichkeit.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Auf AI gem\u00fcnzt: wir stehen gerade am Anfang dieses Prozesses. Die Experten, die im Moment full commitment reingegangen sind, profitieren gerade. Klar wird da auch mal etwas schiefgehen. Aber das sind die Leute, die ihre Hochzeit haben. Bis zu dem Moment, wo die Technik so weit ist, dass es einfach jeder kann. Wirklich jeder.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und weil AI sich so schnell weiterentwickelt, wird das nicht lange dauern. Selbst jetzt zu sagen: ich mache Deep Dive in AI und bin in einem oder zwei Jahren der absolute Profi: schon auf dem Weg dahin wird man feststellen, dass man gar nicht mehr so tief einsteigen muss, weil es fast jeder kann.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das sieht man an tausend Kleinigkeiten. Welche Skills und Abh\u00e4ngigkeiten ich mir vor einem Jahr noch in meinen Claude Code eingebaut habe und wie sehr sich das alles allein weiterentwickelt hat. Wie gut ich die gr\u00f6\u00dferen neueren Modelle jetzt schon auf Dinge loslassen kann. Alles nicht perfekt. Nichts davon kann ich zu 100 Prozent unbeaufsichtigt laufen lassen. Aber die Ver\u00e4nderung in diesem einen Jahr ist brutal.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Das sieht auch jeder, der sich AI-Videos anschaut. Will Smith isst Nudeln, damals 2023 oder 2024, und was generiert AI heute f\u00fcr Filmchen? Wenn man durch Social Media oder YouTube scrollt: wie viele AI-Geschichten sind da inzwischen drin, und wie viele davon erkennt man noch als AI? Die meisten ja, manchmal muss ich zweimal hingucken. Bei l\u00e4ngeren Videos ist es einfacher. Aber so ein YouTube Short, runtergerechnet auf schlechte Kameraaufl\u00f6sung, vielleicht im Stil eines Bodycam-Shots, da wird es schon schwierig.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nicht AI ist das Problem, wir sind es<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wie gesagt: AI ist nicht das Problem. Das Problem ist, wie wir Menschen damit umgehen. Wie wir es nicht schaffen, zusammen in eine Richtung zu gehen. Wie wir es nicht schaffen, als Gemeinschaft eine L\u00f6sung zu finden. Das ist viel eher das Problem als zu sagen, die AI wird uns alle t\u00f6ten. Das k\u00f6nnen wir selber am besten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was ich daraus mache, und warum ich keine L\u00f6sung habe<\/h3>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was machen wir jetzt daraus? Ich versuche, im Thema zu bleiben. Ich versuche, AI dort einzusetzen, wo sie mich unterst\u00fctzt und mir hilft. Ich versuche, ein Ohr an der Entwicklung zu halten, auch wenn ich sie nicht wirklich komplett durchdringen kann. Es ist einfach zu viel und zu schnell. Selbst Vollzeit w\u00fcrde mich \u00fcberfordern.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ich stelle mich darauf ein, die Systeme, die ich baue und betreibe, mit mehr als einer Sicherheitsh\u00fcrde auszustatten. Ich plane sie so, dass sie kein Problem damit haben, regelm\u00e4\u00dfig und wirklich regelm\u00e4\u00dfig Patches zu bekommen. Ich denke sie au\u00dferdem so, dass sie von AI-Systemen selbst gebaut, weiterentwickelt, betrieben und \u00fcberwacht werden k\u00f6nnen. Das wird mit eingeplant.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was das gro\u00dfe, allgemeine Problem angeht: ich habe keine L\u00f6sung. Wirklich keine. Hinzugehen und Entscheidungstr\u00e4gern das zu erkl\u00e4ren, ich glaube nicht, dass ich diese Leute erreichen werde. Vielleicht ist das mein Problem. Technisch bin ich gut, das w\u00fcrde ich mir jetzt einfach mal unterstellen. Aber ich bin vielleicht nicht in der Lage, das vern\u00fcnftig an den Mann zu bringen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ich habe schon mehrfach erlebt, wie ich versucht habe, IT-Security-Probleme m\u00f6glichst einf\u00fchlsam und auf einfachem Level zu erkl\u00e4ren, und trotzdem auf taube Ohren gesto\u00dfen bin. F\u00fcr viele Leute, die nicht in der Technik drin sind, ist das einfach zu abstrakt und zu schlecht greifbar. Das ist wahrscheinlich ein Manko bei mir. Ich kriege es nicht so weit heruntergebrochen, dass es f\u00fcr Menschen ohne Tech-Background wirklich anfassbar wird.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Was h\u00f6rt man dann? Vielleicht auch nur, weil sie nichts anderes sagen k\u00f6nnen: das wird schon. Es wird etwas im Markt geben. Es schafft ja auch neue Jobs. Laberlaber. Da sind wir uns vermutlich einig: das wird nicht der Fall sein. Klar, ein paar neue Spezialjobs werden entstehen. Aber die Masse an Menschen, deren Arbeitskraft pl\u00f6tzlich nicht mehr gebraucht wird, weil sie von AI \u00fcbernommen wurde, kommt nicht einfach in diese neuen Spezialbereiche hinein. Das wird nicht reichen f\u00fcr alle, die pl\u00f6tzlich aus dem Regal fallen.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Und weil unsere ganzen Sozialsysteme darauf aufgebaut sind, dass viele Leute einzahlen und Steuern zahlen, sehe ich da ein Problem. Ich habe keine L\u00f6sung daf\u00fcr. Mir f\u00e4llt nichts ein, was funktionieren k\u00f6nnte.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Vielleicht bin ich ein bisschen schwarzmalend. Aber ich glaube nicht, dass wir das gut hinkriegen. Ich mache mir Sorgen, was uns in den n\u00e4chsten 15 bis 20 Jahren erwartet. Das wird extrem spannend. Aber die wenigsten Dinge daran geben mir ein gutes Gef\u00fchl.<\/p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Trotzdem k\u00f6nnen wir uns jetzt nicht alle ein Loch in den Garten buddeln und uns da hineinsetzen. Wir m\u00fcssen weitermachen und das Beste aus dem ganzen Thema herausholen. Fr\u00fcher oder sp\u00e4ter wird es auch bei den Entscheidern ankommen. Sie werden es verstehen, oder sie werden die Augen nicht mehr davor verschlie\u00dfen k\u00f6nnen. Aber selbst dann glaube ich nicht, dass sie eine echte L\u00f6sung finden werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Siehe auch<\/h3>\n\n\n\n<ul class=\"wp-block-list has-small-font-size\">\n<li class=\"has-small-font-size\"><a href=\"https:\/\/www.kernel-error.de\/2026\/01\/01\/von-seo-zu-aeo-warum-llms-txt-json-ld-und-answer-engines-das-web-veraendern\/\">Von SEO zu AEO: Warum llms.txt, JSON-LD und Answer Engines das Web ver\u00e4ndern<\/a><\/li>\n\n\n\n<li class=\"has-small-font-size\"><a href=\"https:\/\/www.kernel-error.de\/2026\/04\/21\/fundstuecke-angie-llmfit-idiocracy-ki-alerts\/\">Fundst\u00fccke aus dem Netz: Angie, llmfit, idiocracy.wtf und KI-Alert-Analyse<\/a><\/li>\n\n\n\n<li class=\"has-small-font-size\"><a href=\"https:\/\/www.kernel-error.de\/2026\/04\/22\/post-quantum-tls-15-tage-ssl-curve-auswertung\/\">Post-Quantum TLS auf Nginx: 15 Tage $ssl_curve ausgewertet<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Wie seht ihr das? Schreibt es gerne in die Kommentare oder per <a href=\"https:\/\/www.kernel-error.de\/kontakt\/\">fragen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AI ist nicht b\u00f6se und Large Language Models sind nicht das Problem. Was mir Bauchschmerzen macht, ist die Geschwindigkeit, in der das gerade passiert, und wie wir Menschen damit umgehen. Ein paar Gedanken zu Flaschenh\u00e4lsen, Kontrollverlust in der Softwareentwicklung, Mythos und IT-Security, der Frage wer 100 Seiten AI-Code noch liest und warum mir die n\u00e4chsten 15 bis 20 Jahre Sorgen machen.<\/p>\n","protected":false},"author":1,"featured_media":4393,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":""},"categories":[13,283],"tags":[403,256,383,371,402,351],"class_list":["post-4390","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kernel-error-blog","category-persoenliches","tag-aeo","tag-ai","tag-foss","tag-infosec","tag-llm","tag-open-source","post-preview"],"_links":{"self":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/comments?post=4390"}],"version-history":[{"count":7,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4390\/revisions"}],"predecessor-version":[{"id":4398,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/posts\/4390\/revisions\/4398"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media\/4393"}],"wp:attachment":[{"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/media?parent=4390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/categories?post=4390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kernel-error.de\/wp-json\/wp\/v2\/tags?post=4390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}]