iToverDose/Software· 14 MAI 2026 · 12:05

Warum selbstgebaute Tools oft besser sind als SaaS-Abos

Kleinste Softwareprojekte wie ein Lizenzmanager lassen sich in wenigen Stunden selbst programmieren – ohne teure Abos. Dieser Leitfaden zeigt, wie ein PyQt5-Tool funktioniert und warum Eigenbau manchmal die bessere Wahl ist.

DEV Community4 min0 Kommentare

Die nächste Rechnung für ein Software-Asset-Management-Tool trifft auf deinen Schreibtisch: 200 Euro monatlich für eine Lösung, die im Kern nur aus einer Datenbank, einer Erinnerung und einer E-Mail-Benachrichtigung besteht. Das ist kein Einzelfall. Viele Unternehmen zahlen für Funktionen, die sich mit ein paar Zeilen Code selbst umsetzen lassen. Das Projekt LiMa (License Manager) beweist, wie einfach das sein kann – und warum Eigenbau in solchen Fällen oft die intelligentere Lösung ist.

LiMa ist eine PyQt5-Anwendung, die lokal auf dem Rechner läuft und die Ablaufdaten von Softwarelizenzen verwaltet. Das Besondere: Sie wurde nicht entwickelt, um SaaS generell zu ersetzen, sondern um zu zeigen, dass selbst scheinbar komplexe Anforderungen mit minimalem Aufwand umgesetzt werden können. Die Kernfunktionen – Datenbankabfrage, automatische Berechnungen, Benachrichtigungen und Berichte – sind in vier technische Bausteine unterteilt, die sich mit Standardbibliotheken und Open-Source-Tools realisieren lassen.

Grundgerüst: Eine Datenbank, die sich selbst aktualisiert

Im Zentrum steht eine einfache SQLite-Tabelle mit nur zwei Spalten: dem Softwarenamen und dem Ablaufdatum. Alles Weitere wird dynamisch berechnet. Der entscheidende Vorteil: Der verbleibende Zeitraum bis zum Ablauf wird nicht gespeichert, sondern bei jedem Seitenaufruf neu ermittelt. Dadurch bleibt die Datenbank immer aktuell, ohne dass manuelle Aktualisierungen oder zusätzliche Spalten nötig sind.

self.c.execute('''CREATE TABLE licences (nom_logiciel TEXT, date_expiration TEXT)''')

Die Berechnung des verbleibenden Zeitraums erfolgt in Echtzeit und wird direkt in die Tabelle geschrieben. Ein QTimer sorgt dafür, dass die Anzeige jede Minute aktualisiert wird – ausreichend, um Veränderungen sofort sichtbar zu machen.

jours_restants = (datetime.strptime(date_expiration_str, "%Y-%m-%d") - datetime.now()).days

Ein häufiger Fehler in frühen Versionen war die zu häufige Aktualisierung. Statt jede Sekunde die Datenbank abzufragen, reicht ein Intervall von 60 Sekunden völlig aus – das spart Ressourcen und vermeidet unnötige Last.

Benachrichtigungen, die tatsächlich nützlich sind

Während viele SaaS-Lösungen mit „intelligenten Alerts“ werben, setzt LiMa auf native Systembenachrichtigungen, die je nach Dringlichkeit gestaffelt sind. Die Logik ist simpel: Je näher das Ablaufdatum rückt, desto präziser wird die Warnung.

  • Weniger als 30 Tage: „In weniger als einem Monat abgelaufen“
  • Weniger als 14 Tage: „In weniger als zwei Wochen abgelaufen“
  • Weniger als 7 Tage: „In weniger als einer Woche abgelaufen“
  • Weniger als 3 Tage: „In weniger als 3 Tagen abgelaufen“
  • Genau 1 Tag: „Läuft morgen ab“
  • Abgelaufen: „Seit X Tagen abgelaufen“

Die Implementierung erfolgt über die Bibliothek plyer, die eine einheitliche API für Windows Action Center, macOS Notification Center und Linux-Benachrichtigungen bietet. Der Vorteil: Die Benachrichtigungen erscheinen im jeweiligen Betriebssystem-Stil und sind auch bei minimierter Anwendung sichtbar. Keine selbstgebastelten Popups, kein manuelles Nachladen – die Systemintegration übernimmt alles.

Automatisierte Berichte mit visueller Aufbereitung

Ein entscheidendes Feature von LiMa ist die automatische Generierung von Berichten, die per E-Mail versendet werden. Sobald eine Lizenz abläuft, erstellt die Anwendung ein Diagramm, das den Status aller Lizenzen visualisiert – abgelaufen versus gültig – und fügt es als PNG-Anhang bei.

def generer_graphique_pie(self):
    expirations = 0
    non_expirations = 0
    for row in range(self.tableau_licences.rowCount()):
        jours_restants = int(self.tableau_licences.item(row, 2).text())
        if jours_restants < 0:
            expirations += 1
        else:
            non_expirations += 1
    plt.pie([expirations, non_expirations], labels=["Abgelaufen", "Gültig"], colors=["red", "green"], autopct='%1.1f%%')
    plt.savefig("graphique_pie.png")

Der Versand erfolgt über smtplib und die Python-Standardbibliothek email.mime, ohne Abhängigkeiten zu externen Diensten. Das Ergebnis ist ein sauber formatierter HTML-Bericht mit integriertem Diagramm, der direkt aus dem internen SMTP-Server gesendet wird. Keine API-Schlüssel, keine Token-Verwaltung, keine zusätzlichen Kosten.

Fertige Anwendung statt Prototyp: Menü und Funktionen

LiMa ist kein Skript, das zufällig eine Tabelle anzeigt, sondern eine vollständige Desktop-Anwendung mit allen Features, die man von einem internen Tool erwartet. Dazu gehören:

  • Import und Export von CSV-Dateien
  • Druckfunktion über QPrinter
  • Sortiermöglichkeiten (A-Z, Z-A)
  • Ein- und Ausschalten von Benachrichtigungen
  • Visualisierte Statistiken mit Matplotlib
  • SMTP-Konfiguration für den E-Mail-Versand
  • Dunkel- und Hellmodus
  • Ein „Über“-Dialog

All diese Funktionen sind in einer einzigen Datei (lima.py) untergebracht. Das zeigt: Selbst anspruchsvolle Anwendungen lassen sich mit überschaubarem Aufwand umsetzen – ohne externe Abhängigkeiten oder komplexe Infrastruktur.

Dunkelmodus in PyQt5: Ein Zeilenbefehl

Ein oft unterschätztes Feature ist der Dunkelmodus. In PyQt5 lässt er sich mit wenigen CSS-ähnlichen Stilregeln aktivieren. Ein einfacher Toggle-Schalter reicht aus, um zwischen den Farbschemata zu wechseln.

def toggle_dark_mode(self):
    self.setStyleSheet("""
        QMainWindow {
            background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #323232, stop:1 #1a1a1a);
            color: #FFFFFF;
        }
        QTableWidget {
            background-color: #2a2a2a;
            color: #FFFFFF;
        }
    """)

Die gesamte Styling-Logik ist in der Anwendung enthalten – keine zusätzlichen Bibliotheken nötig. Das spart nicht nur Speicherplatz, sondern vermeidet auch potenzielle Sicherheitslücken durch externe Abhängigkeiten.

Die Entscheidung, ob man für eine Lösung wie LiMa SaaS kauft oder selbst entwickelt, hängt von vielen Faktoren ab. Doch dieser Fall zeigt: Oft reichen wenige Stunden Arbeit, um eine voll funktionsfähige Alternative zu erstellen, die nicht nur kostengünstiger ist, sondern auch genau die Anforderungen erfüllt, die man tatsächlich braucht. Und das ohne monatliche Abos, versteckte Gebühren oder unnötige Komplexität.

KI-Zusammenfassung

Yıllık binlerce dolar ödenen SaaS abonelikleri yerine kendi Python uygulamanızı geliştirin. LiMa projesiyle nasıl 100 dolarlık abonelikleri iptal ettiğimizi keşfedin.

Kommentare

00
KOMMENTAR SCHREIBEN
ID #N5RKRL

0 / 1200 ZEICHEN

Menschen-Check

2 + 3 = ?

Erscheint nach redaktioneller Prüfung

Moderation · Spam-Schutz aktiv

Noch keine Kommentare. Sei der erste.