prindeck: die Linux-Steuerzentrale für meinen Brother-Drucker
Diese Woche ist die erste Version von prindeck erschienen, ein Linux-Controlpanel für den Brother MFC-L2710DW. Ein natives Fenster bündelt Toner- und Trommelstand, Scannen, Drucken und die Warteschlange, ein Tray-Icon behält den Zustand im Blick. Drei Abende Arbeit, ausschließlich offene Protokolle, und v0.1.0 kommt als .deb und AppImage.
Was bekommt Linux von Brother?#
Brothers Desktop-Client heißt iPrint&Scan, und die Hilfeseiten dazu nennen die Plattformen gleich zu Beginn: „Applies to: Windows or Macintosh“ (Brother Support). Für Linux sieht die Lage anders aus. Die offizielle Downloadliste des MFC-L2710DW bietet mit gewähltem Linux einen Druckertreiber, einen Scannertreiber, das Scan-key-tool und einen PC-FAX-Treiber, alles als deb-Paket, dazu ein Installationswerkzeug und ein Werkzeug für Masseninstallation (Downloadliste). Alles auf der Liste ist Treiber oder Verwaltungswerkzeug. Eine Anwendung für die Person am Drucker fehlt.
Drucken und Scannen waren auf Linux nie das Problem: CUPS nimmt die Druckaufträge, SANE findet den Scanner. Das Problem war das Drumherum. Der Tonerstand steckt im Webpanel des Geräts, Scans laufen über simple-scan oder scanimage, die Warteschlange antwortet auf lp, und kein einziges Fenster stellt Status, Verbrauch, Scan, Druck und Verlauf nebeneinander dar. Das PRD, das ich vor der ersten Codezeile geschrieben habe, hält das Ziel in einem Satz fest: „an equivalent of Brother iPrint&Scan (Windows/Android/iOS), which does not officially exist for Linux“. Genau dieses Gegenstück wollte ich auf meinem Desktop.
Drei Protokolle, ein Fenster#
prindeck liest den Status über SNMP, ein gebündeltes GET pro Abfrage. Brother hält Toner, Trommel und Seitenzähler in einer kompakten OID-Tabelle, deren Werte als binäre Datensätze mit Längenpräfix ankommen; die snmp2-Crate übernimmt das Wire-Format, ein kleiner Parser macht daraus Tonerprozent, Trommelprozent, Seiten- und Duplexzähler und die verbleibenden Trommelseiten. Die Werte landen in einem lokalen SQLite-Speicher, aus dem das 90-Tage-Diagramm kommt, zusammen mit einer Toner-Seitenschätzung aus der Kartuschenreichweite, die du einträgst.
Scannen läuft über eSCL, das HTTP-Scanning-Protokoll mit öffentlicher Spezifikation, dasselbe, das auch sane-airscan spricht. prindeck schickt einen Scan-Job per POST, holt die Seiten, sobald sie ankommen, und schickt ein DELETE, wenn du abbrichst. Flachbett oder 50-Blatt-Einzug, 100 bis 600 dpi, Farbe oder Graustufen, Ausgabe als JPEG oder mehrseitiges PDF.
Der Druckteil macht die geringste Arbeit der drei. prindeck ersetzt das Systemdrucken nicht: Es übergibt die Datei an die bestehende CUPS-Warteschlange, mit Kopien und Duplex, und zeigt die Aufträge mit einem Abbrechen-Knopf je Auftrag. Die Warteschlange war bereits konfiguriert, also fasst die App sie nicht an.
Die Hülle ist Tauri 2: Rust für alles, was das Gerät berührt, TypeScript für das Fenster, WebKitGTK zum Rendern. Nur eine Instanz, ein Tray-Icon mit Statusfarbe, Abfragen im Hintergrund, Benachrichtigungen bei niedrigem Verbrauch und Ausfällen, optionaler Autostart, und das Schließen des Fensters versteckt es in den Tray.
Was der Drucker wirklich tut#
Die Spezifikation ist öffentlich, das Gerät hatte trotzdem eigene Meinungen.
- 150 dpi existiert nicht: der Scanner bietet 100, 200, 300 und 600 dpi an und liefert bei einer Anfrage nach 150 still 300. prindeck zeigt nur die Auflösungen an, die das Gerät in seinen Capabilities meldet.
- BlackAndWhite1 mit JPEG scheitert mit 409: die Kombination lässt sich in der Job-XML abbilden, das Gerät lehnt sie trotzdem ab. Die App prüft das Paar, bevor sie einen Auftrag abschickt.
- Ein ADF-Stapel ist ein Dokument: die Firmware fügt den ganzen Einzug zu einem einzigen PDF zusammen, deshalb behält ein abgebrochener Auftrag die bereits empfangenen Seiten.
- Ein Tray-Icon braucht ein Menü: unter Linux bleibt das Icon unsichtbar, bis ein Menü dabei ist. Die Tauri-Dokumentation vermerkt, dass ein leeres genügt (docs.rs).
Die drei Abende teilten sich sauber auf: einer für die Erkundung am lebenden Gerät, einer für die Anwendung, einer für Paketierung und Release.
Vorerst ein Drucker#
Version 0.1.0 unterstützt genau ein Gerät, den MFC-L2710DW, weil das der Drucker an meinem Schreibtisch ist und das Gerät, an dem jedes in diesem Artikel beschriebene Verhalten geprüft wurde. Das README sagt offen, was als Nächstes kommt: die Unterstützung weiterer Brother-MFC- und -DCP-Geräte „arrives sooner with every star“. Sterne sind das einzige Nachfragesignal, das ein Solo-Maintainer bekommt. Wächst das Interesse, wächst die Gerätetabelle. Wächst es nicht, bleibt prindeck ein sehr guter Client für einen Drucker.
Die Release Notes führen die rauen Kanten einzeln auf: Die Offline-Ansichten brauchen einen Aufräum-Durchgang, der für v0.1.x geplant ist, Fedora-Nutzer laufen bis zum .rpm in v0.1.1 mit dem AppImage, und sieben der zehn Oberflächensprachen sind Community-Entwürfe, wobei Englisch, Russisch und Ukrainisch vom Maintainer geprüft sind. Das .deb-Paket wiegt 5,0 MB, das AppImage 86,7 MB, beide werden auf Ubuntu 26.04 gebaut. Die Lizenz ist MIT, und das Projekt steht in keiner Beziehung zu Brother: Die Marken tauchen „only to indicate compatibility“ auf.
So installierst du es#
Installiere von der Release-Seite mit sudo apt install ./prindeck_0.1.0_amd64.deb, oder mache das AppImage ausführbar und starte es. Beim ersten Start fragt die App in den Einstellungen nach der Adresse des Druckers, das ist die komplette Einrichtung. Scans landen in ~/Documents/scans, die Konfiguration in ~/.config/prindeck. Das Repository enthält außerdem das PRD, die OID-Notizen und schreibgeschützte Probe-Skripte für eSCL und SNMP, mit denen du auch ohne App mit dem Gerät sprechen kannst. Die Case Study auf dieser Seite bündelt die Architektur: prindeck.
Zum zweiten Mal auf diesem Blog ist ein Projekt entstanden, dessen ganzer Punkt darin bestand, die Herstellerschicht zu überspringen und direkt das offene Protokoll zu sprechen. Das erste war searxng-mcp-server, das eine selbst gehostete Metasuche zum Such-Backend für Coding-Agenten machte. Das Muster wiederholt sich: Sprich mit dem Gerät direkt, in dem Protokoll, das es bereits spricht.