English version available in README.en.md.
Der Total-Task-Tracker ist eine leistungsstarke, lokal betriebene Aufgaben- und Lernverwaltung auf Basis von React, Node.js und SQLite. Die Anwendung kombiniert klassische To-do-Funktionen mit Kalenderintegration, Markdown-Notizen, einem Pomodoro-Timer und einem integrierten Lernkarten-System mit Spaced-Repetition-Algorithmus. Ideal für Selbstorganisation, Projektplanung oder die strukturierte Prüfungsvorbereitung.
Die Daten werden dabei vollständig lokal auf dem Server gespeichert, entweder per Docker oder im klassischen Node.js-Betrieb. So behältst du volle Kontrolle über deine Inhalte.
- Voraussetzungen
- Schnellstart mit dem fertigen Docker-Image
- Automatische Updates mit Watchtower
- Docker-Compose: Image selbst bauen
- Installation für die lokale Entwicklung
- Entwicklung starten
- Manuelle Produktion ohne Docker
- Android APK erstellen
- Funktionen
- Verwendung
- Tastenkürzel
- Lernkarten-Algorithmus
- Für die lokale Entwicklung: Node.js (empfohlen Version 18) und npm
- Für den produktiven Betrieb: Docker und docker-compose
Wenn du nicht lokal bauen möchtest, kannst du das bereits bereitgestellte Docker-Image aus der GitHub Container Registry nutzen:
docker pull ghcr.io/timbornemann/total-task-tracker:latest
docker run -d --name total-task-tracker -p 3002:3002 -v total-task-tracker-data:/app/server/data ghcr.io/timbornemann/total-task-tracker:latest
Die Anwendung legt ihre SQLite-Daten standardmäßig im Volume total-task-tracker-data
ab. Dieses Volume wird beim ersten Start automatisch angelegt und bleibt auch nach einem Container-Update erhalten. Möchtest du stattdessen ein bestimmtes Verzeichnis binden, kannst du ein Volume angeben:
docker run -d --name total-task-tracker -p 3002:3002 -v ./server/data:/app/server/data ghcr.io/timbornemann/total-task-tracker:latest
Soll in den Einstellungen eine bestimmte IP angezeigt werden (etwa bei der Docker-Nutzung), kannst du die Umgebungsvariable SERVER_PUBLIC_IP
setzen. Dieser Wert wird unter "Server Info" zusätzlich ausgegeben.
Um den Container stets aktuell zu halten, kannst du Watchtower einsetzen. Damit wird regelmäßig geprüft, ob neue Images verfügbar sind.
docker run -d --name watchtower --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --interval 3600
Der Parameter --interval
gibt das Prüfintervall in Sekunden an. Im Beispiel sucht Watchtower also jede Stunde nach Updates und startet betroffene Container neu.
docker run -d --name watchtower --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower total-task-tracker-app --interval 3600
Soll Watchtower lediglich einmalig prüfen und danach beendet werden, füge --run-once
hinzu:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower total-task-tracker-app --run-once
Die Anwendung kann auch komplett über docker-compose
ausgeführt werden. Dabei wird automatisch ein Produktionsbuild erstellt.
- Repository klonen und in das Projektverzeichnis wechseln
- Container bauen und starten (setzt optional die Versionsnummer)
VERSION=$(git describe --tags --abbrev=0) docker-compose up --build
Der Dienst lauscht anschließend auf Port 3002. Im Browser unter http://localhost:3002
erreichst du das Dashboard. Die Daten werden in einem benannten Docker-Volume (total-task-tracker-data
) gespeichert. Mit docker-compose down
kann der Container gestoppt werden, ohne dass die Daten verloren gehen.
# Repository klonen
git clone <REPO_URL>
cd Total-Task-Tracker
# Abhängigkeiten installieren
npm install
Das Projekt nutzt für die Anzeige von Notizen **react-markdown**.
Im Entwicklungsmodus läuft die React-Anwendung mit Vite auf Port 8081. Für die Datenspeicherung kann gleichzeitig der Node-Server gestartet werden.
# Frontend mit automatischem Reload
npm run dev
# In zweitem Terminal: Backend starten
npm start
Rufe anschließend im Browser http://localhost:8081
auf.
Die Anwendung verwendet Vitest und die React Testing Library. Nach der Installation der Abhängigkeiten kannst du die Tests mit folgendem Befehl starten:
npm test
Möchtest du ohne Docker deployen, kannst du die Anwendung lokal bauen und den Node-Server direkt nutzen.
npm run build
npm start # startet die gebaute App auf Port 3002
Mit Capacitor kannst du den Tracker auch als Android-App bauen.
- Projekt einmalig initialisieren:
npm install npx cap init total-task-tracker com.example.total_task_tracker --web-dir=dist npx cap add android
- Produktionsbuild erstellen und Dateien kopieren:
npm run build:android
- Android-Projekt in Android Studio öffnen und ein signiertes APK erzeugen:
npm run open:android
- Aufgaben anlegen, bearbeiten und in Kategorien sortieren
- Unteraufgaben und Prioritäten
- Separate Seite für wiederkehrende Aufgaben mit eigenen Intervallen und dynamischen Titeln
- Zeitplan-Seite mit Tages-, Wochen- und Monatsansicht
- Aufgaben lassen sich mit Start- und Endzeit planen
- Tasks ohne Uhrzeit werden pro Tag als Liste angezeigt
- Eigene Notizen mit Farbe und Drag & Drop sortierbar
- Drag & Drop basiert jetzt auf dnd-kit und funktioniert in Grid-Layouts für Notizen, Tasks, Kategorien und die Startseiten-Buttons
- Notizen lassen sich anpinnen; die ersten drei angepinnten erscheinen auf der Startseite
- Tasks lassen sich ebenfalls anpinnen; die ersten drei werden auf der Startseite gezeigt
- Text kann im Markdown-Format geschrieben werden
- Eingebauter Editor bietet Icons und Tooltips für häufige Formatierungen (z. B. Listen, Links, Codeblöcke)
- Lernkarten mit Spaced-Repetition-Training und Verwaltung eigener Karten
- Decks lassen sich beim Lernen ein- oder ausblenden
- Optionaler Zufallsmodus ohne Bewertung
- Trainingsmodus direkt auf der Kartenseite mit frei einstellbarer Rundengröße
- Eingabemodus zum Tippen der Antworten; nach dem Prüfen bewertest du selbst, ob die Karte leicht, mittel oder schwer war
- Timed-Modus mit anpassbarem Countdown pro Karte; der Timer wird einmalig gestartet und kann pausiert werden. Bei Ablauf wird automatisch "schwer" gewertet
- Statistikseite für Lernkarten
- Deck-Statistiken mit Übersicht fälliger Karten
- Speicherung der Daten auf dem lokalen Server
- Kann als Progressive Web App installiert werden (Desktop & Smartphone)
- Pomodoro-Timer läuft beim Neuladen der Seite weiter
- Separate Uhr-Seite zeigt stets die aktuelle Zeit
- Kann als schwebendes Fenster (Picture-in-Picture) angezeigt werden
- Statistikseite auf der Pomodoro-Seite mit Tages-, Wochen-, Monats- und Jahresübersicht
- Auswertung nach Tageszeiten (Morgen, Mittag, Abend, Nacht)
- Zusätzliche Anzeige für den aktuellen Tag
- Minuten für Arbeit und Pause werden separat gezählt und als gestapelter Balken dargestellt. Beim Pausieren oder Zurücksetzen des Timers werden die Werte sofort aktualisiert.
- Lern- und Pausendauer frei konfigurierbar (auch direkt im Timer anpassbar)
- Daten können im Einstellungsbereich exportiert und importiert werden (inklusive Einstellungen)
- Import zeigt eine Vorschau der einzufügenden Elemente und bestätigt den Erfolg
- Zusätzlich kann die reine Datenstruktur als JSON exportiert werden
- Zentrale Synchronisation über HTTP. Ein Container kann als Sync-Server betrieben werden, alle anderen senden ihre Daten regelmäßig dorthin. Der Server listet seine IP-Adressen auf und führt ein Log über eingehende Anfragen. Fällt der Server aus, speichern Clients lokal weiter und gleichen die Daten ab, sobald der Server wieder erreichbar ist.
- Live-Updates per Server-Sent Events halten geöffnete Clients automatisch auf dem neuesten Stand.
- Gelöschte Einträge werden über ein Deletion-Log abgeglichen und tauchen nicht wieder auf.
- Standard-Priorität für neue Tasks einstellbar
- Mehrsprachige Oberfläche (Deutsch, Englisch) auswählbar
- Mehrere Theme-Voreinstellungen (light, dark, ocean, dark-red, hacker, motivation) stehen zur Auswahl. Eigene Themes können benannt, gespeichert und verwaltet werden, wobei alle Farben individuell anpassbar sind.
- Jede Theme-Voreinstellung bringt nun eine passende Farbpalette für Kategorien, Tasks und Notizen mit
- Neuer "Info"-Reiter in den Einstellungen zeigt Versionsnummer, Release Notes und README
- Im Reiter "Sprache" lässt sich Deutsch oder Englisch auswählen
- Untermenü "Server Info" in den Einstellungen listet IP-Adressen, Port und fertige URLs auf
- Nach dem Start siehst du die vorhandenen Kategorien. Mit dem Button
Kategorie
kannst du neue Kategorien erstellen. - Wähle eine Kategorie aus, um ihre Tasks zu sehen. Über
Task
legst du neue Aufgaben an. Dort kannst du Titel, Beschreibung, Priorität, Farbe und ein Fälligkeitsdatum festlegen. - Wiederkehrende Aufgaben erstellst du über die Seite Wiederkehrend. Dort legst du Vorlagen mit festen oder benutzerdefinierten Intervallen an und kannst Platzhalter wie
{date}
oder{counter}
im Titel nutzen. - Tasks lassen sich per Drag & Drop umsortieren oder in Unteraufgaben aufteilen.
- Über das Suchfeld und die Filter sortierst und findest du Aufgaben nach Priorität oder Farbe.
- Mit dem Sternsymbol kannst du eine Task anpinnen. Die ersten drei gepinnten erscheinen auf der Startseite.
- Mit
Strg+K
(oder über das Suchsymbol) öffnest du die globale Suche. Sie durchsucht Tasks, Notizen und Lernkarten und führt dich bei Auswahl direkt zum entsprechenden Eintrag. - In der Zeitplan-Ansicht wählst du einen Tag, eine Woche oder einen Monat aus. Aufgaben mit Uhrzeit erscheinen als Blöcke, solche ohne Zeit als Liste unterhalb des Plans. Die Statistiken geben einen Überblick über erledigte Tasks.
- Unter Notizen kannst du unabhängige Notizen verwalten und per Drag & Drop sortieren. Gepinnte Notizen erscheinen auf der Startseite. Deine Inhalte kannst du dabei in Markdown verfassen. Beim Anklicken einer Notiz siehst du zunächst eine Vorschau und kannst sie direkt bearbeiten. Auf dem Desktop erscheint nun während des Bearbeitens eine Live-Vorschau rechts neben dem Editor. Der Editor stellt zahlreiche Schaltflächen für gängige Formatierungen bereit.
- Unter Decks legst du Kartendecks an und kannst sie bearbeiten. In der Detailansicht eines Decks fügst du einzelne Karten hinzu.
- Der Bereich Karten zeigt dir fällige Karten zum Lernen an. Dort kannst du gezielt Decks ein- oder ausblenden, einen Zufallsmodus aktivieren und im Eingabemodus Antworten eintippen. Nach dem Vergleich der Lösung entscheidest du selbst, wie schwer dir die Karte fiel. Im Timed-Modus bestimmt ein einstellbarer Countdown die Zeit pro Karte. Der Timer startet einmalig zu Beginn der Session und kann jederzeit pausiert werden. Bei 0 wird automatisch "schwer" gewertet.
Viel Spaß beim Ausprobieren!
In den Einstellungen kannst du die wichtigsten Shortcuts per Tastendruck anpassen. Standardmäßig gelten folgende Kombinationen:
ctrl+k
– Command Palette öffnenctrl+alt+t
– Schnell eine neue Task anlegenctrl+alt+n
– Schnell eine neue Notiz anlegenctrl+alt+f
– Neue Lernkarte erstellen
Beim Bewerten einer Karte merkt sich das System, wie oft sie als leicht, mittel oder schwer eingestuft wurde. Aus diesen Zählen berechnet sich eine Erfolgsquote:
successRate = (easyCount + 0.5 * mediumCount) / (easyCount + mediumCount + hardCount)
Die nächste Wiederholungszeit wird dann wie folgt bestimmt:
- Basisfaktor je nach aktueller Bewertung (
leicht
= 1.5,mittel
= 1.2,schwer
= 0.8) - Der Faktor wird mit
1 + successRate
multipliziert - Das Intervall erhöht sich um
interval * Faktor
Dadurch fließt sowohl die bisherige Leistung als auch die aktuelle Bewertung in das nächste Fälligkeitsdatum ein.