Ein Board für die Arbeit und alles andere.
Kanban Everything hält die ganze Liste: das Release, das du ausliefern willst, und den Wasserhahn, der getauscht werden muss. Projekte verschachteln sich, Tags bleiben flach, und eine gespeicherte Ansicht verkleinert das Board auf das, worum es heute Nachmittag geht. Es läuft auf einem Server, der dir gehört – ein Container, eine SQLite-Datei.
Ein Board – nicht eines pro Projekt.
Projekte verschachteln sich. work › website › launch ist ein Pfad, keine drei Boards. Filtere auf ein Projekt, und du nimmst optional seinen ganzen Unterbaum mit. Eine Aufgabe darf in mehreren Projekten liegen: die Release Notes gehören zu website und zu launch, ohne kopiert zu werden.
Tags bleiben flach. Beliebig viele pro Aufgabe, unabhängig von Projekten, getroffen als „eines davon“ oder „alle davon“. Benenne eines um, und jede Aufgabe zieht mit.
Ansichten merken sich die Kombination. Projekte, Tags, Prioritäten, den Suchtext und welche Spalten in welcher Reihenfolge sichtbar sind – gespeichert unter einem Namen, den du wählst, umgeschaltet mit einem Klick. Eine Ansicht ändert keine Aufgabe; sie entscheidet nur, worauf du schaust.
Die Suche liest die ganze Aufgabe. Titel, Beschreibungen, Kommentare, Projekt- und Tag-Namen, Link-Labels und URLs – gefiltert, während du tippst, zusätzlich zu allem, was ohnehin schon gefiltert ist.
Eine Aufgabe, keine Zeile in einer Liste.
Öffne eine Karte, und du bekommst ein Dokument: Markdown mit lebendiger Vorschau, Checkboxen, die sich wirklich abhaken lassen, und Bilder, die zur Aufgabe gehören – beim Speichern, nie beim Einfügen, damit nichts nur deshalb liegen bleibt, weil du es zufällig kopiert hast.
Kommentare sind ebenfalls Markdown und bearbeitbar. Links, die an einem Projekt hängen, erscheinen an jeder Aufgabe darin, nach URL entdoppelt: das Runbook ist aus allem in api einen Klick entfernt, ohne in fünfzehn Karten zu kleben.
Es gibt keinen Speichern-Knopf. Schließen behält den geänderten Entwurf; das Rückgängig ist das Abbrechen. Und eine Aufgabe, die niemand anfassen soll, lässt sich sperren: jeder Schreibzugriff kommt mit Begründung zurück, bis du sie entsperrst.
Nichts passiert unprotokolliert.
Jede Änderung wird in derselben Transaktion in ein dauerhaftes Event-Log geschrieben wie die Änderung selbst. Was fehlschlägt, hinterlässt weder Daten noch eine Spur von sich, und eine Handlung von dir ist eine Operation: das Löschen einer Spalte, in der noch Arbeit lag, protokolliert die Löschung und jede verschobene Aufgabe als einen Eintrag, den du später lesen kannst.
Undo liegt auf dem Server. Seite neu laden, morgen wiederkommen, an einem anderen Rechner sitzen: der Stapel ist noch da. Sind mehrere Leute auf dem Board, machst du deine eigenen Operationen rückgängig – und eine, die inzwischen überholt wurde, wird abgelehnt statt durchgedrückt.
Du kannst eine einzelne alte Sache zurücknehmen. Wähle eine Operation von letztem Dienstag und nimm nur diese zurück, ohne alles Spätere aufzurollen. Bei einzelnen Aufgaben geht es weiter: lies eine so, wie sie zu einem beliebigen Zeitpunkt war, und stelle diesen Stand als ganz normale neue Änderung wieder her.
Löschen ist die Ausnahme – der einzige unumkehrbare Schritt. Es räumt die Aufgabe leer und schwärzt ihre Historie: ids, Zeitstempel und Feldnamen bleiben, der Inhalt nicht, an keinem Punkt der Zeitleiste. Archivieren, was du meistens willst, behält alles.
Das Board ist ein Client seiner eigenen API.
Nichts in der Oberfläche hat eine geheime Abkürzung in die Datenbank. Jede Fähigkeit ist zuerst ein HTTP-Endpunkt, versioniert unter /api/v1, dokumentiert per generiertem OpenAPI und offen für alles, was ein Token hat – ein Skript, ein Cronjob, eine Kurzbefehl-Verknüpfung auf dem Handy.
Ein GET /board liefert alles, was eine Darstellung braucht. Fehler kommen als problem+json mit stabilen Codes, ein Skript kann also auf task_locked verzweigen statt einen Satz zu parsen, und ein Schreibzugriff auf veralteter Grundlage wird abgelehnt statt stillschweigend zu gewinnen. Der Echtzeit-Kanal ist dasselbe Event-Log über einen WebSocket, fortsetzbar da, wo ein Client stehen geblieben ist.
# Aufgabe von überall anlegen, mit einem Token curl -X POST https://kanban.example.com/api/v1/tasks \ -H "Authorization: Bearer $KANBAN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"title": "Domain verlängern", "priority": "high", "due_date": "2026-08-14"}' # 201 Created – und jedes offene Board zeigt es # innerhalb der Sekunde, über den WebSocket.
Dunkel, wenn du willst. Brauchbar auf dem Handy.
Dasselbe Board, dieselben Daten, zwei Themes und jede Breite. Auf schmalen Schirmen klappen Spalten zu einer Leiste zusammen und nehmen trotzdem eine gezogene Karte an.
Selbst betreiben
Docker mit Compose v2.24 oder neuer, auf allem, was du erreichst: ein NAS, ein VPS, der Rechner unter dem Schreibtisch. Python und Node brauchst du nur, wenn du daran arbeiten willst.
Starten
Klonen, die Beispiel-Umgebung kopieren, hochfahren. Migrationen laufen von selbst. Setz den ersten Administrator in .env, bevor du das erste Mal startest – diese Variablen werden nur gelesen, solange es noch keinen Account gibt.
git clone \ https://github.com/Andreas-Menzel/kanban-everything cd kanban-everything cp .env.example .env docker compose up -d --build # http://localhost:8080
Auf eine Domain stellen
Ein Overlay hängt die App an einen Traefik, den du schon betreibst – womit TLS, Zertifikate und HSTS dort bleiben, wo sie hingehören. Die App veröffentlicht dann überhaupt keine Host-Ports und ist nur über den Proxy erreichbar.
docker compose -f compose.yaml \
-f compose.traefik.yaml up -d --build
Sichern – und wissen, dass es geklappt hat
Die Datenbank läuft im WAL-Modus: die Datei zu kopieren, während die App läuft, ist kein Backup – aktuelle Commits liegen in einer Sidecar-Datei, und eine Kopie kann eine halb geschriebene Seite erwischen. Zieh stattdessen einen Snapshot; er führt VACUUM INTO aus und prüft das Ergebnis, bevor er es dir gibt.
docker compose exec -T app \
python -m app.backup /tmp/snapshot.db
Und dann wie einen Dienst behandeln
Im Repository liegen Host-Skripte, die aus diesem Snapshot einen stündlichen, verschlüsselten restic-Job mit Aufbewahrung machen, und ein Deployment, das vorher sichert, damit eine schlechte Migration zurückgerollt werden kann. Das Betriebshandbuch deckt Deployment, Rollback, Restore, Desasterfall und einen wöchentlichen Nur-Lese-Check ab – geschrieben, um ihm um zwei Uhr nachts zu folgen.
Was es nicht ist
Eine kurze Liste, denn ein Werkzeug, das alles zu können behauptet, kann meistens nichts davon richtig:
- Kein Dienst. Es gibt nichts, wofür man sich anmeldet; wenn du es nicht betreibst, existiert es für dich nicht.
- Noch keine Importer. Trello, Jira und CSV werden nicht unterstützt. Die Synchronisation mit GitHub- und GitLab-Issues ist im Repository vollständig spezifiziert und der nächste große Arbeitsblock – gebaut ist sie nicht.
- Keine native App. Die Weboberfläche passt sich dem Handy an, und die API liegt bereit, wenn du lieber etwas baust.
- Bewusst nicht vorhanden: WIP-Limits, Swimlanes, wiederkehrende Aufgaben, Erinnerungen und Benachrichtigungen, Anhänge außer Bildern, Volltextsuche. Jedes davon ist eine aufgeschriebene Entscheidung, kein Versehen – und bleibt draußen, bis etwas es wirklich braucht.
Warum es das gibt
Ich wollte ein Board für alles, was ich zu tun habe, auf meiner eigenen Maschine, wo eine letzten Monat archivierte Aufgabe noch da ist und eine versehentliche Änderung zurückgenommen werden kann. Alles auf dieser Seite liegt heute im Repository, und das Design-Dokument dort ist ehrlich in Bezug auf die Teile, die es nicht gibt.
Es entsteht in meiner Freizeit und ist kostenlos. Wenn es am Ende deine Woche organisiert, ist ein Kaffee eine schöne Art, das zu sagen.