Tobias Reithmeier

Blog

Wie CLAUDIO funktioniert

„Kein Tracking" steht in vielen App-Beschreibungen. Bei CLAUDIO ist es kein Versprechen im Marketing, sondern eine Konsequenz aus dem Code. Dieser Beitrag schaut hinter die Kulissen: wie aus einer NAS-Freigabe eine Bibliothekszeile wird, warum die App nur mit den Servern spricht, die man selbst auswählt, und wie sie einen genau dort weiterhören lässt, wo man aufgehört hat.

Vorweg: Ich entwickle CLAUDIO allein - und nutze die App selbst jeden Tag. Das hier ist keine geschönte Fallstudie, sondern ein Werkstattbericht aus der Sicht von jemandem, der Datenschutz nicht als Feature verkauft, sondern von Anfang an einbaut.

Eine Quelle wird zu einer Bibliothekszeile

CLAUDIO spielt aus sehr unterschiedlichen Quellen: lokale Dateien, iCloud Drive, NAS per SMB, Jellyfin, Navidrome/Subsonic, WebDAV, SFTP, Audiobookshelf, DLNA und Podcast-Feeds. Von außen sieht das aus wie eine einzige Bibliothek. Von innen ist jede Quelle eine eigene, gekapselte Welt.

Jede Remote-Quelle folgt demselben Dreiklang: ein Dienst für die Verbindung (Zugangsdaten liegen in der Keychain, nie im Klartext), ein Dienst, der den Verzeichnisbaum einliest, und ein Dienst, der die letzte Ansicht als Offline-Schnappschuss vorhält. Lokale Quellen laufen über einen eigenen Datei- und Lesezeichen-Dienst. Keine dieser Schichten weiß auch nur, dass es eine Bibliothek oder eine Oberfläche gibt - sie kümmert sich ausschließlich um ihren Transport.

Damit die App darüber nicht in Fallunterscheidungen ertrinkt, sitzt zwischen Quelle und Bibliothek eine schmale Adapterschicht. Sie normalisiert jede Quelle auf genau zwei Operationen: „zeig sofort den letzten Schnappschuss" (das funktioniert auch ohne Netz) und „scanne jetzt live". Die Bibliothek sieht nur diese beiden Verben, nie die konkrete Quelle dahinter. Eine neue Quelle hinzuzufügen heißt darum nicht, die halbe App umzubauen, sondern ein weiteres Modul einzustöpseln - der Rest bleibt, wie er ist.

Das Ergebnis dieser Trennung ist etwas, das man beim Öffnen der App spürt, ohne es zu benennen: Die Bibliothek ist sofort da, aus dem Schnappschuss, und aktualisiert sich dann im Hintergrund. Kein leerer Bildschirm, der auf einen langsamen Server wartet. Große Bibliotheken liest CLAUDIO inzwischen auch dann weiter ein, wenn man die App verlässt, und SMB-Freigaben bis zu zehnmal schneller als zuvor.

Datenschutz ist hier Architektur, nicht Marketing

Der einfachste Weg, keine Daten zu sammeln, ist, gar nicht erst die Werkzeuge dafür einzubauen. In CLAUDIO steckt kein Analytics-SDK, keine Telemetrie, kein Crash-Reporter, der „anonymisiert" mitschreibt. Das ist keine Einstellung, die man umlegen kann - es gibt schlicht keinen Empfänger. Bibliothek, Wiedergabeverlauf und Abos liegen auf dem Gerät.

Netzwerkverkehr entsteht nur dort, wo jemand ihn selbst angelegt hat: der eigene Jellyfin-Server, das eigene NAS, ein RSS-Feed, die Apple-Podcasts-Suche, ein verbundenes Last.fm- oder ListenBrainz-Konto, die Songtext-Suche, sobald man Songtexte einschaltet. Es gibt keinen CLAUDIO-Server in der Mitte, durch den etwas hindurchmüsste, weil es diesen Server nicht gibt. Das App-Store-Label „Keine Daten erfasst" ist damit keine mutige Behauptung, sondern die langweilige Wahrheit über eine App, die nichts nach Hause funkt.

An die eigenen Server fließt inzwischen auch etwas zurück. Favoriten gleichen sich mit Navidrome, Jellyfin und Audiobookshelf in beide Richtungen ab: Ein Herz für einen Titel, ein Album oder ein Hörbuch landet auf dem Server, und was dort markiert ist, kommt in der App an; bei Navidrome zählen Bewertungen ab vier Sternen als Favorit. Navidrome und andere Subsonic-Server zählen gespielte Musik mit, einmal je Wiedergabe, und Jellyfin erfährt, was gehört wurde. Das läuft über die Anmeldung, die man auf dem eigenen Server ohnehin hat; ein CLAUDIO-Konto braucht es dafür nicht. Der Favoriten-Abgleich setzt Ultra oder Pro+ voraus, und das Melden gespielter Titel an den Server lässt sich in den Einstellungen abschalten.

Genau da weiterhören, wo man aufgehört hat

Bei Hörbüchern und Podcasts zählt eine Sache mehr als jedes Klangdetail: dass man exakt dort weiterkommt, wo man aufgehört hat. In CLAUDIO gibt es dafür genau eine Quelle der Wahrheit für „wo bin ich gerade im Titel". Die Kapitelanzeige, der Sleep Timer, die synchronen Songtexte, das Scrubbing, die Fortschrittsspeicherung, die Anzeige im Auto - alle fragen denselben Wert ab. Das klingt selbstverständlich, ist es aber nicht: Sobald mehrere Stellen ihre eigene Vorstellung von der Position pflegen, driften sie auseinander, und man landet beim Fortsetzen ein paar Sekunden daneben.

Dieser eine Wert wird in einer festen Reihenfolge bestimmt: zuerst eine live gemessene Position direkt aus der Audio-Engine, dann die letzte gültige Messung, und erst als Rückfallebene die Marke, an der das aktuelle Segment gestartet ist. Gerade die mittlere Stufe sorgt dafür, dass CLAUDIO die Position auch dann kennt, wenn die Ausgabe unsanft wegbricht - etwa wenn im Auto die Zündung ausgeht, bevor das System überhaupt Bescheid gibt.

Und noch eine Design-Entscheidung, die wie ein Bug aussieht, aber keiner ist: Wenn die Ausgabe wegbricht, pausiert CLAUDIO - und startet von allein nicht wieder. Kopfhörer erneut einstecken oder CarPlay neu verbinden spielt nicht automatisch los. Unerwarteter Ton im Auto oder auf den Ohren ist schlimmer als eine stille App, die auf einen bewussten Tipp auf Play wartet.

Seit Version 14 kommen Widgets für Home- und Sperrbildschirm und Steuerelemente im Kontrollzentrum dazu (mit Pro, auf iPhone und iPad, nicht auf dem Mac). Sie laufen in einer eigenen Erweiterung, die nur liest: Die App legt bei jedem Zustandswechsel einen kleinen Schnappschuss in einer gemeinsamen App Group ab, mit dieser Position, dem Zeitpunkt der Messung und dem Tempo. Daraus rechnet das Widget die Position selbst weiter, und die App muss nur bei einem echten Wechsel neu schreiben, nicht bei jeder Sekunde Fortschritt.

Rechnen auf dem Gerät, nicht in der Cloud

Mehrere Funktionen in CLAUDIO haben eines gemeinsam: Sie rechnen auf dem Gerät, nicht auf einem fremden Server.

Der Kopfhörer-Equalizer kennt über 6.000 Modelle. Die Kurven stammen aus den offenen AutoEq-Messdaten und werden auf dem Gerät angewandt - CLAUDIO muss nicht wissen, welche Kopfhörer jemand besitzt, um sie sauber klingen zu lassen.

Auch das Geschmacksprofil, das in Home und Smart Shuffle einfließt, entsteht auf dem Gerät, ohne dafür einen Server zu fragen. Es hält Interpret, Genre und ungefähre Entstehungszeit fest statt einzelner Titel, damit Home auch Alben aus der eigenen Sammlung vorschlagen kann, die noch nie gelaufen sind. Man kann es einsehen und zurücksetzen.

Die Songtexte suchen sich ihren Weg durch eine Kette von Quellen: zuerst das, was die Datei selbst mitbringt (eingebettete Texte, eine .lrc-Datei daneben), dann der Jellyfin-Server, dann Subsonic, und erst ganz am Ende eine Online-Datenbank. Im Player haben sie eine eigene Ansicht: Synchronisierter Text läuft dort Zeile für Zeile mit, Text ohne Zeitstempel steht als Fließtext da.

Und das Mitlesen für heruntergeladene Hörbücher und Podcasts folgt derselben Linie: Die Transkription läuft in den unterstützten Sprachen mit einem lokalen Sprachmodell (Parakeet TDT v3 über CoreML) direkt auf dem iPhone. Der gesprochene Text wird zu mitlaufender Schrift - wahlweise Wort für Wort oder Satz für Satz -, ohne dass eine Datei das Gerät verlässt. Seit Version 11 ist das im App Store; fehlt der Download noch, bietet CLAUDIO ihn direkt an.

Warum die App so gebaut ist, wie sie ist

Vieles davon wäre in einem Team mit Wachstumszielen anders entschieden worden. Ein Analytics-SDK wäre „einfach mal drin", weil man ja Daten braucht. Die aufwändige Trennung zwischen Quellen und Bibliothek würde man sich vielleicht sparen, bis der erste Umbau schmerzt.

CLAUDIO ist ein Solo-Projekt, und das prägt jede dieser Entscheidungen: keine Firma, keine Investoren, kein Zwang, aus Aufmerksamkeit Umsatz zu pressen. Ich baue die App zuerst für mich selbst - ich höre täglich damit Musik, Hörbücher und Podcasts, und jedes Detail, das mich stört, wandert auf die Liste. Eine App, die funktioniert und einen in Ruhe lässt, ist keine Nische - genau darum geht es.

Quellen

  • App Store: CLAUDIO - Beschreibung, Preise und Privacy-Label
  • FluidAudio (Apache-2.0) - Swift-Anbindung für die On-Device-Transkription mit Parakeet TDT v3
  • LRCLIB - offene Songtext-Datenbank, letzte Stufe der Lyrics-Kette
  • Signalsmith Stretch - Zeitdehnung für Tempoänderung ohne Tonhöhenversatz

Weiterlesen

Drei Player, drei Philosophien? → CLAUDIO vs. Plexamp vs. VLC


CLAUDIO ist ein Solo-Projekt von Tobias Reithmeier. Fragen oder ein Bug? support@nerdwana.net - ich lese selbst mit. Was die App kann und was sie kostet? → CLAUDIO im Überblick