{"id":28818486,"url":"https://github.com/timbornemann/total-task-tracker","last_synced_at":"2026-01-05T15:15:24.491Z","repository":{"id":298497289,"uuid":"995656806","full_name":"timbornemann/Total-Task-Tracker","owner":"timbornemann","description":"Lokale Aufgaben- und Lernverwaltung mit React, Node.js und SQLite, inklusive Kalender, Markdown-Notizen, Spaced-Repetition und Pomodoro-Timer. ","archived":false,"fork":false,"pushed_at":"2025-06-18T12:33:48.000Z","size":1158,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-18T13:39:41.905Z","etag":null,"topics":["calendar","docker","flashcards","kanban","markdown-editor","note-taking","open-source","pomodoro-timer","productivity","project-management","react","self-hosted","spaced-repetition","study-app","study-planner","task-manager","task-tracker","time-blocking","todo-app","webapp"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timbornemann.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-03T20:22:47.000Z","updated_at":"2025-06-18T10:30:19.000Z","dependencies_parsed_at":"2025-06-11T12:38:22.934Z","dependency_job_id":"bef78cf2-3016-4796-8c2f-499cc4283ca4","html_url":"https://github.com/timbornemann/Total-Task-Tracker","commit_stats":null,"previous_names":["timbornemann/total-task-tracker"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/timbornemann/Total-Task-Tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timbornemann%2FTotal-Task-Tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timbornemann%2FTotal-Task-Tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timbornemann%2FTotal-Task-Tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timbornemann%2FTotal-Task-Tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timbornemann","download_url":"https://codeload.github.com/timbornemann/Total-Task-Tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timbornemann%2FTotal-Task-Tracker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260616554,"owners_count":23036867,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","docker","flashcards","kanban","markdown-editor","note-taking","open-source","pomodoro-timer","productivity","project-management","react","self-hosted","spaced-repetition","study-app","study-planner","task-manager","task-tracker","time-blocking","todo-app","webapp"],"created_at":"2025-06-18T19:05:39.233Z","updated_at":"2026-01-05T15:15:24.486Z","avatar_url":"https://github.com/timbornemann.png","language":"TypeScript","readme":"# Total-Task-Tracker\n\nEnglish version available in [README.en.md](README.en.md).\n\nDer 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.\nIdeal für Selbstorganisation, Projektplanung oder die strukturierte Prüfungsvorbereitung.\n\nDie 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.\n\n## Inhaltsverzeichnis\n\n- [Voraussetzungen](#voraussetzungen)\n- [Schnellstart mit dem fertigen Docker-Image](#schnellstart-mit-dem-fertigen-docker-image)\n- [Automatische Updates mit Watchtower](#automatische-updates-mit-watchtower)\n- [Docker-Compose: Image selbst bauen](#docker-compose-image-selbst-bauen)\n- [Installation für die lokale Entwicklung](#installation-für-die-lokale-entwicklung)\n- [Entwicklung starten](#entwicklung-starten)\n- [Manuelle Produktion ohne Docker](#manuelle-produktion-ohne-docker)\n- [Android APK erstellen](#android-apk-erstellen)\n- [Funktionen](#funktionen)\n- [Verwendung](#verwendung)\n- [Tastenkürzel](#tastenkürzel)\n- [Lernkarten-Algorithmus](#lernkarten-algorithmus)\n- [Entwicklerdokumentation](#entwicklerdokumentation)\n\n## Voraussetzungen\n\n- Für die lokale Entwicklung: **Node.js** (empfohlen Version 18) und **npm**\n- Für den produktiven Betrieb: **Docker** und **docker-compose**\n\n## Schnellstart mit dem fertigen Docker-Image (empfohlen)\n\nWenn du nicht lokal bauen möchtest, kannst du das bereits bereitgestellte Docker-Image aus der GitHub Container Registry nutzen:\n\n```bash\ndocker pull ghcr.io/timbornemann/total-task-tracker:latest\ndocker run -d --name total-task-tracker -p 3002:3002 -v total-task-tracker-data:/app/server/data ghcr.io/timbornemann/total-task-tracker:latest\n```\n\nDie 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:\n\n```bash\ndocker run -d --name total-task-tracker -p 3002:3002 -v ./server/data:/app/server/data ghcr.io/timbornemann/total-task-tracker:latest\n```\n\nSoll 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.\n\n## Automatische Updates mit Watchtower\n\nUm den Container stets aktuell zu halten, kannst du [Watchtower](https://containrrr.dev/watchtower/) einsetzen. Damit wird regelmäßig geprüft, ob neue Images verfügbar sind.\n\n### Alle Container überwachen\n\n```bash\ndocker run -d --name watchtower --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --interval 3600\n```\n\nDer Parameter `--interval` gibt das Prüfintervall in Sekunden an. Im Beispiel sucht Watchtower also jede Stunde nach Updates und startet betroffene Container neu.\n\n### Nur diesen Container aktualisieren\n\n```bash\ndocker run -d --name watchtower --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower total-task-tracker-app --interval 3600\n```\n\nSoll Watchtower lediglich einmalig prüfen und danach beendet werden, füge `--run-once` hinzu:\n\n```bash\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower total-task-tracker-app --run-once\n```\n\n## Docker-Compose: Image selbst bauen\n\nDie Anwendung kann auch komplett über `docker-compose` ausgeführt werden. Dabei wird automatisch ein Produktionsbuild erstellt.\n\n1. Repository klonen und in das Projektverzeichnis wechseln\n2. Container bauen und starten (setzt optional die Versionsnummer)\n\n```bash\nVERSION=$(git describe --tags --abbrev=0) docker-compose up --build\n```\n\nDer 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.\n\n## Installation für die lokale Entwicklung\n\n```bash\n# Repository klonen\ngit clone \u003cREPO_URL\u003e\ncd Total-Task-Tracker\n\n# Abhängigkeiten installieren\nnpm install\n\nDas Projekt nutzt für die Anzeige von Notizen **react-markdown**.\n```\n\n## Entwicklung starten\n\nIm Entwicklungsmodus läuft die React-Anwendung mit Vite auf Port **8081**. Für die Datenspeicherung kann gleichzeitig der Node-Server gestartet werden.\n\n```bash\n# Frontend mit automatischem Reload\nnpm run dev\n\n# In zweitem Terminal: Backend starten\nnpm run start:ts\n```\n\nRufe anschließend im Browser `http://localhost:8081` auf.\n\n## Tests ausführen\n\nDie Anwendung verwendet [Vitest](https://vitest.dev/) und die React Testing Library.\nNach der Installation der Abhängigkeiten kannst du die Tests mit folgendem Befehl starten:\n\n```bash\nnpm test\n```\n\n## Manuelle Produktion ohne Docker\n\nMöchtest du ohne Docker deployen, kannst du die Anwendung lokal bauen und den Node-Server direkt nutzen.\n\n```bash\nnpm run build\nnpm run build:server\nnpm start    # startet die gebaute App auf Port 3002\n```\n\n## Android APK erstellen\n\nMit [Capacitor](https://capacitorjs.com/) kannst du den Tracker auch als Android-App bauen.\n\n1. Projekt einmalig initialisieren:\n   ```bash\n   npm install\n   npx cap init total-task-tracker com.example.total_task_tracker --web-dir=dist\n   npx cap add android\n   ```\n2. Produktionsbuild erstellen und Dateien kopieren:\n   ```bash\n   npm run build:android\n   ```\n3. Android-Projekt in Android Studio öffnen und ein signiertes APK erzeugen:\n   ```bash\n   npm run open:android\n   ```\n\n## Funktionen\n\n- Aufgaben anlegen, bearbeiten und in Kategorien sortieren\n- Unteraufgaben und Prioritäten\n- Separate Seite für wiederkehrende Aufgaben mit eigenen Intervallen und dynamischen Titeln\n- Zeitplan-Seite mit Tages-, Wochen- und Monatsansicht\n  - Aufgaben lassen sich mit Start- und Endzeit planen\n  - Tasks ohne Uhrzeit werden pro Tag als Liste angezeigt\n- Eigene Notizen mit Farbe und Drag \u0026 Drop sortierbar\n  - Drag \u0026 Drop basiert jetzt auf dnd-kit und funktioniert in Grid-Layouts für Notizen, Tasks, Kategorien und die Startseiten-Buttons\n  - Notizen lassen sich anpinnen; die ersten drei angepinnten erscheinen auf der Startseite\n  - Tasks lassen sich ebenfalls anpinnen; die ersten drei werden auf der Startseite gezeigt\n  - Text kann im Markdown-Format geschrieben werden\n  - Eingebauter Editor bietet Icons und Tooltips für häufige Formatierungen (z. B. Listen, Links, Codeblöcke)\n- Lernkarten mit Spaced-Repetition-Training und Verwaltung eigener Karten\n  - Decks lassen sich beim Lernen ein- oder ausblenden\n  - Optionaler Zufallsmodus ohne Bewertung\n  - Trainingsmodus direkt auf der Kartenseite mit frei einstellbarer Rundengröße\n  - Eingabemodus zum Tippen der Antworten; nach dem Prüfen bewertest du selbst, ob die Karte leicht, mittel oder schwer war\n  - Timed-Modus mit anpassbarem Countdown pro Karte; der Timer wird einmalig gestartet und kann pausiert werden. Bei Ablauf wird automatisch \"schwer\" gewertet\n- Statistikseite für Lernkarten\n- Deck-Statistiken mit Übersicht fälliger Karten\n- Inventarverwaltung mit Kategorien und Tags\n- Speicherung der Daten auf dem lokalen Server\n- Kann als Progressive Web App installiert werden (Desktop \u0026 Smartphone)\n- Pomodoro-Timer läuft beim Neuladen der Seite weiter\n- Separate Uhr-Seite zeigt stets die aktuelle Zeit\n- Zeiterfassung für alle Lebensbereiche mit Kategorien, Bearbeitung, Kartenansicht und Übersichtsstatistik mit anschaulichen Diagrammen zur Zeitverteilung\n- Kann als schwebendes Fenster (Picture-in-Picture) angezeigt werden\n- Statistikseite auf der Pomodoro-Seite mit Tages-, Wochen-, Monats- und Jahresübersicht\n  - Auswertung nach Tageszeiten (Morgen, Mittag, Abend, Nacht)\n  - Zusätzliche Anzeige für den aktuellen Tag\n- Minuten für Arbeit und Pause werden separat gezählt und als gestapelter Balken\n  dargestellt. Beim Pausieren oder Zurücksetzen des Timers werden die Werte\n  sofort aktualisiert.\n- Lern- und Pausendauer frei konfigurierbar (auch direkt im Timer anpassbar)\n- Daten können im Einstellungsbereich exportiert und importiert werden\n  (inklusive Einstellungen)\n- Import zeigt eine Vorschau der einzufügenden Elemente und bestätigt den Erfolg\n- Zusätzlich kann die reine Datenstruktur als JSON exportiert werden\n- Zentrale Synchronisation über HTTP. Ein Container kann als Sync-Server\n  betrieben werden, alle anderen senden ihre Daten regelmäßig dorthin.\n  Der Server listet seine IP-Adressen auf und führt ein Log über eingehende\n  Anfragen. Fällt der Server aus, speichern Clients lokal weiter und gleichen\n  die Daten ab, sobald der Server wieder erreichbar ist.\n- Live-Updates per Server-Sent Events halten geöffnete Clients automatisch auf dem neuesten Stand.\n- Gelöschte Einträge werden über ein Deletion-Log abgeglichen und tauchen nicht wieder auf.\n- Standard-Priorität für neue Tasks einstellbar\n- Mehrsprachige Oberfläche (Deutsch, Englisch) auswählbar\n- Mehrere Theme-Voreinstellungen (light, dark, ocean, dark-red, hacker,\n  motivation) stehen zur Auswahl. Eigene Themes können benannt,\n  gespeichert und verwaltet werden, wobei alle Farben individuell\n  anpassbar sind.\n- Jede Theme-Voreinstellung bringt nun eine passende Farbpalette für Kategorien,\n  Tasks und Notizen mit\n- Neuer \"Info\"-Reiter in den Einstellungen zeigt Versionsnummer, Release Notes und README\n- Im Reiter \"Sprache\" lässt sich Deutsch oder Englisch auswählen\n- Untermenü \"Server Info\" in den Einstellungen listet IP-Adressen, Port und fertige URLs auf\n\n## Verwendung\n\n1. Nach dem Start siehst du die vorhandenen **Kategorien**. Mit dem Button `Kategorie` kannst du neue Kategorien erstellen.\n2. 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.\n3. 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.\n4. Tasks lassen sich per Drag \u0026 Drop umsortieren oder in Unteraufgaben aufteilen.\n5. Über das Suchfeld und die Filter sortierst und findest du Aufgaben nach Priorität oder Farbe.\n6. Mit dem Sternsymbol kannst du eine Task anpinnen. Die ersten drei gepinnten erscheinen auf der Startseite.\n7. 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.\n8. 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.\n   Die **Statistiken** geben einen Überblick über erledigte Tasks.\n9. Unter **Notizen** kannst du unabhängige Notizen verwalten und per Drag \u0026 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.\n10. Unter **Decks** legst du Kartendecks an und kannst sie bearbeiten. In der Detailansicht eines Decks fügst du einzelne Karten hinzu.\n11. Der Bereich **Karten** zeigt dir fällige Karten zum Lernen an. Dort kannst du\n    gezielt Decks ein- oder ausblenden, einen Zufallsmodus aktivieren und im\n    Eingabemodus Antworten eintippen. Nach dem Vergleich der Lösung entscheidest\n    du selbst, wie schwer dir die Karte fiel.\n    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.\n\nViel Spaß beim Ausprobieren!\n\n### Tastenkürzel\n\nIn den Einstellungen kannst du die wichtigsten Shortcuts per Tastendruck\nanpassen. Standardmäßig gelten folgende Kombinationen:\n\n- `ctrl+k` – Command Palette öffnen\n- `ctrl+alt+t` – Schnell eine neue Task anlegen\n- `ctrl+alt+n` – Schnell eine neue Notiz anlegen\n- `ctrl+alt+f` – Neue Lernkarte erstellen\n\n## Lernkarten-Algorithmus\n\nBeim 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:\n\n```\nsuccessRate = (easyCount + 0.5 * mediumCount) / (easyCount + mediumCount + hardCount)\n```\n\nDie nächste Wiederholungszeit wird dann wie folgt bestimmt:\n\n1. Basisfaktor je nach aktueller Bewertung (`leicht` = 1.5, `mittel` = 1.2, `schwer` = 0.8)\n2. Der Faktor wird mit `1 + successRate` multipliziert\n3. Das Intervall erhöht sich um `interval * Faktor`\n\nDadurch fließt sowohl die bisherige Leistung als auch die aktuelle Bewertung in das nächste Fälligkeitsdatum ein.\n\n## Entwicklerdokumentation\n\nEine technische Übersicht und weiterführende Informationen für Entwickler findest du im Ordner [docs](docs/README.md).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimbornemann%2Ftotal-task-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimbornemann%2Ftotal-task-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimbornemann%2Ftotal-task-tracker/lists"}