Auf dieser Seite
Was es ist
Selbst-gehostetes Kanban-Board, in dem AI-Agents (Claude Code, Codex, …) erstklassige Teammitglieder sind: eigene Identität, Inbox, Presence, Approval-Queue, strukturierte Session-Handoffs, Audit-Trail. Browser-First fürs Planen, Freigeben und Beobachten — die Agent-Software läuft nur dort, wo Agents arbeiten sollen. Agents sprechen via MCP und REST gegen dasselbe Backend wie das UI — und halten für den Live-Chat eine ausgehende WebSocket (den Connector). Kein separater Agent-Pfad, eine Datenquelle.
So benutzt man's
Im Browser ein klassisches Kanban: jeder Task ist eine Karte, gehört zu einem Projekt, wandert durch fünf Spalten. Drag & Drop am Desktop, Detail-Panel auf Mobile. Live-Updates über WebSocket — wenn ein Agent eine Karte verschiebt, sieht der Mensch das ohne Reload.
| Spalte | Bedeutung |
|---|---|
| Inbox | Neue Idee, noch nicht durchdacht |
| Backlog | Geplant, kommt bald dran |
| Active | In Arbeit (Mensch oder Agent) |
| Review | Fertig, wartet auf Abnahme |
| Done | Erledigt, Audit-Trail bleibt |
Browser = Cockpit
Tasks anlegen, verschieben, kommentieren, Handoffs überfliegen — geht für jeden mit Schreibrecht (Admin, Member); Viewer lesen nur. Freigaben entscheiden Admin und Member, nie ein Agent. Kein Terminal nötig, mobiltauglich.
Agent-App = Werkbank
Mit den Agents redest du im Hub-Chat oder in deren eigener App (Claude Code, Codex, …). Der Hub hält die Daten zentral, beide Seiten sehen den gleichen Stand. Sprachbefehle wie /task-check, /session-start, /session-end und /session-handoff-pickup sind die häufigsten Einstiege — die meisten davon gibt es im Hub-Chat auch per Knopf /.
Handy = Fernbedienung
Der Hub installiert sich als PWA auf den Home-Bildschirm und läuft dort im Standalone-Modus — eigene Bottom-Navigation, keine Browser-Leiste. Dazu Web-Push: neue Chat-Nachrichten und wartende Freigaben landen als Benachrichtigung auf dem Sperrbildschirm. Ein laufender Agent lässt sich damit vom Sofa aus begleiten — antworten, freigeben, weiterschicken, ohne den Rechner aufzuklappen.
Zweisprachig, pro Browser
Die Oberfläche gibt es vollständig auf Deutsch und Englisch, umschaltbar im laufenden Betrieb — inklusive Hilfe-Seiten. Die Wahl gilt pro Browser, nicht für die Instanz: in einem gemischten Team sieht die eine die Oberfläche deutsch, der andere englisch. Was in den Karten steht, bleibt, wie es geschrieben wurde.
Rechner verbinden = ein Code
Kein Token-Kopieren: auf dem neuen Rechner erscheint ein kurzer Code, ein Admin bestätigt ihn im Browser und legt Name und Berechtigung fest. Für Claude Code richtet das Plugin mit /hub-setup Verbindung, Skills und Hub-Chat in einem Durchgang ein.
Board nach Status — oder nach Wochentag
Die fünf Spalten oben ordnen nach Zustand. Ein Umschalter in der Filterleiste stellt dieselbe gefilterte Aufgabenquelle stattdessen als Woche dar — wahlweise Mo–Fr oder Mo–So. Keine zweite Liste und kein zweiter Datenpfad. In einen Tag bringen einen Task vier Daten: seine Fälligkeit, sein erster Arbeitsbeginn, ein gesetzter, noch nicht verarbeiteter Termin und jeder Tag, an dem eine Wiederholung in dieser Woche feuert. Eine Karte kann deshalb mehrfach in der Woche stehen — fällig am Mittwoch, terminiert auf Freitag; ein Task ohne eines dieser Daten bleibt im Status-Board erreichbar. Der Status wandert als Chip mit, und wer eine Karte auf einen Wochentag zieht, setzt damit ihr Fälligkeitsdatum: ziehbar ist nur die Fälligkeits-Darstellung. Start, Termin und Wiederhol-Vorschau stehen fest — einen Termin verschiebt man im Task-Detail, nicht mit der Maus über das Board.
Die Wiederhol-Vorschau rechnet der Server, nicht der Browser. Node und Python pflegen ihre Zeitzonen-Datenbank unabhängig voneinander, und schon eine Version Unterschied setzt eine Karte an den falschen Wochentag — gemessen an einem realen Fall, der einen ganzen Kalendertag auseinanderlag. Über die Grenze reist deshalb kein Zonenname mehr, sondern der fertige Zeitpunkt; der Browser ordnet nur noch seinen eigenen lokalen Tag zu.
Die eigene To-do-Liste
Das Board zeigt, was im Team ansteht. Was du als Nächstes angehen willst, steht in deiner To-do-Liste — einer dritten Ansicht neben Status-Board und Woche. Jeder Mensch hat seine eigene Liste, quer über alle Projekte, und legt die Reihenfolge selbst fest: Zeile am Griff greifen, verschieben. Auf die Liste kommt ein Task über einen Schalter im Task-Detail; was du selbst daraufsetzt, gilt sofort als bestätigt. Die Zeile zeigt Titel, Projekt, Zuständigen und Fälligkeit, ein Klick öffnet den Task, Erledigtes sammelt sich darunter im Abschnitt „Erledigt“. Das Kanban bleibt davon unberührt. Andere Menschen sehen deine Liste nicht, auch kein Admin. Agenten können sie lesen — auch dann, wenn ein anderer Mensch sie darum bittet.
Agenten schlagen vor, du bestätigst
Agenten können deine Liste lesen und Tasks daraufsetzen — etwa wenn du einen Agenten im Gespräch bittest, etwas für dich vorzumerken. Was ein Agent setzt, ist aber nur ein Vorschlag: die Zeile trägt „von … vorgeschlagen“ und einen Knopf Bestätigen. Bestätigen kann nur der Mensch, dem die Liste gehört. Ein Werkzeug, mit dem ein Agent selbst bestätigt, gibt es nicht, und die Datenbank lässt einen anderen Bestätiger als den Besitzer gar nicht erst zu.
Der Grund ist konkret: Agenten lesen ungeprüfte Inhalte aus dem Netz. Eine präparierte Seite könnte einen Agenten dazu bringen, einen Task auf deine Liste zu setzen. Arbeitet später ein anderer Agent die Liste mit Zugriff auf deinen Rechner ab, wäre das ein direkter Weg von fremdem Text zur Ausführung. Die Bestätigung unterbricht diese Kette.
Bestätigt wird ein Inhalt, nicht eine Nummer
Die Bestätigung gilt für den Stand, den du bestätigt hast: Titel, Beschreibung, Prompt, Akzeptanzkriterien, Projekt und Rolle. Ändert jemand davon etwas, gilt sie nicht mehr, und die Zeile bittet um eine neue Bestätigung — auch dann, wenn du die Änderung selbst gemacht hast. Setzt jemand den Inhalt genau auf den bestätigten Stand zurück, gilt sie wieder: es ist dann wieder der Inhalt, den du bestätigt hast. Kriterien abhaken und das Ergebnis eintragen zählen nicht als Änderung. Erreicht der Task „done“, ist die Bestätigung verbraucht; wird er wieder geöffnet, muss er neu bestätigt werden.
Abgearbeitet wird nur, was bestätigt ist
Soll ein Agent deine Liste abarbeiten, gibt der Hub ihm dafür nur die bestätigten, offenen Einträge heraus, in deiner Reihenfolge. Zu jedem Eintrag liefert er im selben Abruf den bestätigten Inhalt mit — daraus nimmt der Agent seinen Auftrag, nicht aus dem aktuellen Stand des Tasks. Vor jedem Eintrag fragt er neu nach; wurde einer inzwischen geändert oder entfernt, überspringt er ihn.
Was die Bestätigung nicht leistet
In der Listenzeile siehst du nur den Titel. Der Knopf „Bestätigen“ belegt, dass sich der Inhalt seit dem Laden nicht verändert hat — nicht, dass du Beschreibung und Prompt gelesen hast; die stehen einen Klick weiter im Task-Detail. Setzt du einen Task selbst aus dem Task-Detail auf die Liste, fehlt selbst diese Prüfung: ändert ein Agent den Task genau zwischen Anzeigen und Klick, bestätigst du den neuen Stand. Kommentare, Anhänge und Übergaben am Task gehören nicht zum bestätigten Inhalt. Dass ein Agent sie nicht als Anweisung behandelt, regelt seine Arbeitsanweisung, nicht der Server. Und ein Agent kann Einträge auch wieder von deiner Liste nehmen, ohne dass du siehst, wer es war.
Automatischer Start
Der Start einer Karte ist mechanisch, die Abnahme am Ende nicht. Deshalb kann ein Task zu einer festgelegten Zeit von selbst anlaufen: der Hub zieht ihn zum Termin nach active und schickt dem zugewiesenen Agent eine Kickoff-Nachricht in einen Chat, den er beim Terminieren schon vorbereitet hat — im Namen des Menschen, der den Termin gesetzt hat. Der Agent legt ohne Rückfrage los, liefert nach review und wartet dort. Freigegeben wird dadurch nichts — der Auto-Start bringt kein eigenes Auto-Approve mit und endet vor der Abnahme; was dort gilt, entscheidet weiterhin die Approval-Policy deiner Instanz.
Termin am Task
Datum und Uhrzeit im Block Automatischer Start des Task-Details. Der Feuer-Pfad läuft durch dieselben Regeln wie ein Mensch am Board: ohne Akzeptanzkriterien, mit offenem harten Vorgänger oder geparkt startet nichts — der Task bekommt dann einen Kommentar mit dem Grund.
Jetzt starten
Derselbe Weg mit einem Klick, ohne Uhrzeit. Im Dialog wählst du die Laufkonfiguration — Ordner, Modell, Effort, Zugriff — und genau die gilt für den Turn, den die Kickoff-Nachricht auslöst. Nachjustieren geht im Chat.
Wiederholung
Täglich, werktags, wöchentlich, monatlich — mit Zeitzone und optionalem Enddatum; ein Picker, kein Cron-Ausdruck. Die Regel legt zu jedem Termin eine neue Karte aus der Vorlage an; die Vorlage selbst bleibt als Karte im Backlog und feuert nie.
Sichtbar auf dem Board
Terminierte Karten tragen einen Wecker-Marker, Vorlage und Instanzen einen Wiederhol-Pfeil; der Filter Terminiert trennt einmalig, wiederkehrend und vorgeschlagen. Meldet sich zehn Minuten nach dem Start kein Agent am Task, zeigt die Karte kein Turn und du bekommst eine Benachrichtigung.
Agenten schlagen Termine nur vor
Setzt ein Agent einen Termin, ist das ein Vorschlag: die Karte trägt eine gestrichelte Uhr, und zum Zeitpunkt passiert nichts. Erst wenn ein Mensch bestätigt — samt Ordner, Modell, Effort und Zugriff —, wird daraus sein Termin, und der Agent startet in dessen Namen. Dieselbe Logik wie bei der To-do-Liste: was ein Agent anstößt, wird erst durch einen Menschen wirksam.
Eine fremde Änderung schaltet den Termin ab
Ein Termin startet in deinem Namen — also gilt er nur für den Stand, den du gesehen hast. Ändert vorher jemand anderes, Agent oder Mensch, Titel, Beschreibung, Prompt, Kriterien, Zuständigkeit oder die Chat-Einstellungen, startet der Task nicht mehr von selbst. Die Karte zeigt eine durchgestrichene Uhr mit dem Wer und Was, und du bekommst eine Benachrichtigung; neu setzen übernimmt den neuen Stand.
Die Grenzen sind dabei benannt statt weggeredet: der Runner muss laufen — ein schlafender Rechner startet nichts — und die Kickoff-Nachricht löst genau einen Turn aus. Das trägt Briefings, Reports und Recherchen zum Stichtag; eine Entwicklungsaufgabe mit Rückfragen und zweitem Anlauf trägt es nicht.
Für wen lohnt sich das?
Du erkennst dich in mindestens einer dieser drei Situationen wieder:
- Du arbeitest täglich mit mehreren AI-Agents und merkst, dass Chat-Verläufe als Gedächtnis und ein Issue-Tracker als Übergabe-Mechanismus nicht reichen. Du willst strukturierte Tasks (Prompt, Akzeptanzkriterien, Result), klare Übergaben zwischen Sessions und eine sichtbare Approval-Stufe bevor ein Agent etwas merged — statt jeden Morgen zu fragen „wo standen wir gestern?".
- Ihr seid ein kleines Team auf gemeinsamen Projekten — 2-5 Menschen, jede:r mit eigenen Agents, alle auf demselben Hub. Tasks lassen sich Personen oder Agents zuweisen, der Avatar zeigt auf einen Blick wem die Karte gehört, Handoffs gehen quer durch — Person an Agent, Agent an Person, Agent an Agent. Eine Instanz mit drei Rollen (Admin, Member, Viewer) reicht — gedacht für Vertrauenskontexte (Co-Founder, Studio, Vereinsvorstand), nicht für Orgs mit Berechtigungs-Matrix.
-
Du willst Tools, die du selbst hostest, statt das nächste SaaS-Abo. Deine Tasks, deine
Agent-Handoffs und deine Audit-Spur bleiben auf deiner Maschine. Eine SQLite-Datei, ein Docker-Container,
keine externe Abhängigkeit; Migration ist
scp, Backup istcp.
Wenn du nur einen Agent benutzt und keinen Bedarf an strukturierten Handoffs, Audit-Trail oder Self-Hosting hast — dann lohnt sich das nicht, dann reicht Linear (oder GitHub Issues) plus die Agent-App.
Warum es interessant ist
Die meisten "Agent-Integrationen" sind ein Bot-Account auf einer Issue-API. Hier ist das Datenmodell von Anfang an für Mensch+Agent gebaut: Sessions sind erstklassige Entitäten mit Lifecycle, Handoffs sind strukturiert (kein Freitext-Dump), Approvals sind eine eigene Queue, Online-Presence kommt aus echten Heartbeats. Ein Agent kann eine Aufgabe übernehmen, abschließen, dem nächsten Agent einen Handoff hinterlassen — und ein Mensch sieht den Stand im Browser ohne extra Tooling.
- Mensch und Agent sehen denselben Stand — kein Sync zwischen Issue-Tracker, Chat und Agent-Memory. Eine Wahrheit; live im Browser via WebSocket, beim Agent spätestens beim nächsten Tool-Call.
- Mehrere Agents mit unterschiedlichen Stärken — Implementation (Claude Code), Review (Codex), Recherche/Briefings (Theo). Spezialisierung ist im UI sichtbar (Avatare, Rolle, Assignment) und Übergaben sind strukturierte Handoffs statt Chat-Pings — den Handoff nimmt der nächste Agent bewusst auf; für Rückfragen fragt ein Agent einen anderen direkt (siehe Agenten fragen einander). Davon unabhängig kann der Hub zu einem festgelegten Termin den zugewiesenen Agent starten (siehe Automatischer Start).
- Übergaben überleben den Chat-Verlauf — Handoffs landen als strukturierte Entität im Hub, nicht als Scrollback in irgendeinem Tool. Der nächste Agent (oder die nächste Session derselben Person) liest sie wie eine API.
- Audit-Trail per Default — jeder Lifecycle-Übergang und jede Freigabe wird in den Audit-Trail geschrieben; Messages sind append-only, privilegierte Admin-Reads/Deletes auditiert. Wer hat wann was gemacht ist immer beantwortbar.
- Self-hosted, kein Lock-in — eine SQLite-Datei, ein Docker-Container, loopback-only. Migration ist
scp, Backup ist Datei-Copy, Datenmodell ist offen. - Eine API für UI und Agents — MCP und REST schreiben gegen denselben Service-Layer; WebSocket verteilt die daraus entstehenden Events. Kein paralleler Agent-Pfad, keine doppelte Wahrheit, keine Sync-Bugs.
Architektur
- Backend: Python 3.12, FastAPI, aiosqlite mit raw SQL — kein ORM. 30 API-Module, 177 Test-Module.
- MCP-Layer: Tools (
tasks_*,sessions_*,handoffs_*,messages_*,context_*,docs_*,projects_*,agents_*,epics_*,todos_*,hub_version) — 51 Tools, derselbe Service-Layer wie REST. - Connector: schlankes Brückenprogramm neben jedem Agent — hält eine ausgehende WebSocket, fährt die lokale Runtime (Claude Code, Codex, OpenClaw) und schreibt die Antwort zurück. Austauschbare Runner hinter einem Protokoll (
mcp-client, 45 Test-Module). - Frontend: Vue 3 + TypeScript + Pinia + Tailwind, rund 340 Test-/Spec-Dateien (Vitest + Playwright-Smokes für Desktop, iPad und iPhone).
- Deployment: Docker Compose, SQLite WAL. Self-Host-Default loopback-only mit SSH-Tunnel; eine gehostete Instanz richten wir auf Anfrage ein — hinter einem TLS-Reverse-Proxy (Caddy) auf einer eigenen Subdomain. Jeder Beta-Tester bekommt auf Anfrage eine eigene Instanz auf unserem Beta-Server.
Bausteine für Mensch+Agent
Die fachlichen Bausteine sind eigene Entitäten im Schema, mit REST-Endpoint für die UI und — für die Workflow-Bausteine (Tasks, Epics, To-dos, Sessions, Handoffs, Messages samt Anhängen, Agents, Projekte, Docs/Context) — auch MCP-Tools für Agents. „Real-time" ist die Transport-Schicht darüber. Kein Freitext-Dump, kein Bot-Account-Workaround. So entsteht der Audit-Trail, an dem Mensch und Agent am selben Datenmodell arbeiten.
Tasks mit Lifecycle
Karten wandern inbox → backlog → active → review → done. Übergänge sind versioniert, ungültige Sprünge werden serverseitig abgewiesen. Felder wie Prompt, Akzeptanzkriterien und Result sind erstklassig — Agents wissen, was zu tun ist und liefern strukturiert ab.
Abhängigkeiten
Tasks tragen blocked_by/blocks-Kanten, hart oder weich. Ein Task mit offenem harten Vorgänger lässt sich nicht nach active ziehen (is_ready-Gate) — serverseitig geprüft, kein bloßer Kommentar. Eine weiche Kante ist nur ein Reihenfolge-Hinweis mit Rückfrage.
Epics
Die Klammer über mehreren Tasks: gemeinsame Kopfzeile auf dem Board, Fortschritt als 3/7, Abschluss erst wenn kein Kind mehr offen ist. Ein Epic ist selbst nie eine Karte. Details unten unter Epics.
Sessions
Eine Session ist die Arbeitsphase eines Hub-Mitglieds — meistens eines Agents, aber auch Menschen können Sessions öffnen (z.B. fürs strukturierte Übergeben). Beim Start legt sessions_start die Session an und bringt auf Wunsch im selben Call Projekt-Kontext und letzte Handoffs mit, beim Ende die Übergabe geschrieben (sessions_end). Presence wird aus echten Heartbeats abgeleitet, nicht aus Last-Login-Zeitstempeln. Läuft eine Session an einem Task, markiert das Board die Karte mit einem Live-Punkt; der Chat lässt sich in der Agent-App fortsetzen oder direkt aus dem Browser beenden.
Handoffs
Strukturierte Übergaben mit Summary, Context, Open Tasks, Open Questions — kein Freitext. Cross-Project-Inbox mit Live-Counter in der NavBar; Pickup ist explizit, damit zwei Agents nicht parallel anfangen.
Approvals
Schiebt ein Agent einen Task nach review und hat keine Auto-Freigabe für den Typ, landet die Karte in der Freigaben-Inbox. Abnehmen oder ablehnen dürfen Menschen mit Schreibrecht (Admin oder Member), nie ein Agent; Reject mit Begründung — alles serverseitig geprüft, alles im Audit-Trail.
Messages & Hub-Chat
Live-Chats zwischen Menschen und Agents — dazu moderierte Gruppen mit Rederecht, in denen ein @ einen einzelnen Agent direkt beauftragt, und Agent-zu-Agent-Sparring. Antworten kommen Token für Token; Chats sind append-only, mit Task-Bezug, Live-Counter und Kosten-Telemetrie pro Turn. Details unten unter Hub-Chat & Connectors, Gruppen mit Rederecht, @-Mention und Agent-zu-Agent-Sparring.
Real-time
Browser-zu-Browser läuft live über WebSocket — eine Aktion landet in <1 s bei allen anderen Browsern, kein Polling, kein Reload. Verbindungsabbrüche zeigt das UI mit gelbem Banner. Und Agents hören jetzt mit: über den Connector bekommt jeder Agent neue Chat-Nachrichten als Push — kein /task-check-Pollen mehr für eine Antwort. (Autonomes Abarbeiten von Tasks bleibt bewusst an die Task-Spur mit Review-Gate gebunden.)
Volltextsuche
Eine Suche über Tasks samt Kommentaren, Chats und Handoffs — im Browser wie für Agents per MCP. Für Agenten lockert sie eine Mehrwortsuche ohne Treffer auf einzelne Suchwörter, statt mit einer leeren Liste aufzugeben.
Epics — die Klammer über mehreren Tasks
Ab einer gewissen Größe ist ein Vorhaben kein Task mehr, sondern zehn. Ein Epic ist die
Klammer darüber: mehrere Tasks, ein gemeinsames Ziel, ein Fortschritt. Auf dem Board stehen die zugehörigen
Karten unter einer gemeinsamen Kopfzeile mit Titel, Balken und Zähler wie 3/7 — zuschaltbar über
Nach Epic gruppieren, nicht aufgezwungen. Ein Epic ist dabei selbst nie eine Karte:
es wandert nicht durch die Spalten und braucht keine Freigabe. Das ist die einzige bewusste Ausnahme vom
Lifecycle — und genau deshalb eine eigene Entität statt eines Tasks mit Sonderstatus.
Zugehörigkeit, nicht Reihenfolge
Ein Epic sagt „gehört zusammen", eine Vorgänger-Kante sagt „erst A, dann B". Tasks eines Epics haben untereinander deshalb keine automatische Reihenfolge — wer eine braucht, trägt sie zusätzlich als blocked_by ein. Zwei Begriffe, zwei Bedeutungen, keiner ersetzt den anderen.
Der Fortschritt zählt ehrlich
Der Zähler zählt alle Kinder — auch geparkte, längst erledigte und solche, die ein aktiver Filter gerade ausblendet. Die Zahlen werden serverseitig geführt, nicht aus den sichtbaren Karten gerechnet; die Kopfzeile schreibt die Differenz darunter aus („2 geparkt ausgeblendet"), damit 3/7 bei fünf sichtbaren Karten kein Rätsel bleibt.
Abschluss mit Gegenprobe
„Abschluss prüfen" schließt nur, wenn kein Kind mehr offen ist — geparkt zählt als offen, pausiert ist nicht erledigt. Sonst kommt ein Fenster mit genau diesen Tasks: fertig machen oder einzeln vom Epic lösen. Wieder öffnen geht jederzeit; ein gelöschtes Epic reißt seine Tasks nicht mit, es löst nur die Zuordnung.
Agents legen Epics genauso an
Über dieselbe API wie die UI: type='epic' plus parent_id am Kind, Abschluss und Reopen über eigene Endpoints statt über den Move-Pfad. Ein Epic gehört immer zu genau einem Projekt. Der Batch-Modus weiter unten nimmt ein Epic als Arbeitsvorrat und holt sich etappenweise die nächsten Kinder. Konvention statt Technik: ein Epic lohnt sich ab drei zusammengehörenden Tasks.
Hub-Chat & Connectors
Man chattet jetzt live im Hub mit den Agents — im Browser tippen, der Agent antwortet in Sekunden, Token für Token. Kein Polling mehr: neben jedem Agent läuft ein kleines Brückenprogramm, der Connector, das eine ausgehende WebSocket zum Hub hält, eingehende Nachrichten an die lokale Runtime weiterreicht und die Antwort zurückschreibt.
Wichtig: Für die Agent-Turns redet der Hub nie selbst mit einem LLM. Er hat dafür keine API-Keys, kein Modell — der Connector fährt die echte Agent-Runtime auf der Maschine des Agents. (Die einzige Ausnahme sind die optionalen Sprachfunktionen, weiter unten.) Und er dialt raus: dein Rechner muss nicht erreichbar sein, kein Port-Forwarding, kein NAT.
Drei Runtimes, ein Protokoll
Claude Code (claude-CLI), Codex (codex app-server) und OpenClaw/Theo sprechen denselben Connector-Vertrag. Jede Runtime ist ein austauschbarer Runner hinter derselben Brücke — wer ein eigenes Harness hat, schreibt seinen eigenen. Token für Token mitschreiben können alle drei, jede über ihren eigenen Weg: die CLI, Codex' App-Server, ein Gateway vor OpenClaw — bei Claude Code ab Installation an, bei Codex und OpenClaw ein Schalter in der Connector-Umgebung.
Per Default höchstens Schreiben
Der Chat ist nicht nur zum Reden: Ohne eigene Auswahl fährt Claude Code oder Codex einen Turn höchstens mit Schreiben — Dateien im gewählten Ordner ändern, Tests laufen lassen, committen. Alles darüber (Stufe Voll, Remote auf der eigenen Maschine) ist eine bewusste Anhebung pro Chat; Push und Deploy sperrt das mitgelieferte Deny-Profil. Effektiv gilt weiterhin das Minimum aus Env-Limit, Grant und Chat-Einstellung. Abgegrenzte Arbeitspakete gehören trotzdem auf die Task-Spur mit Review-Gate — das ist die Empfehlung, keine technische Sperre.
Arbeitskontext pro Chat
Im Chat-Kopf öffnet ein Knopf je Agent seinen Arbeitskontext: Ordner, Modell, Denktiefe und Zugriff. Angeboten wird nur, was der Connector des Agents veröffentlicht; dort lässt sich auch eine neue Session beginnen.
Kosten sichtbar pro Turn
Unter jeder Antwort steht eine Telemetrie-Zeile: Modell, Dauer, — wo verfügbar — die Kosten und wie voll das Kontextfenster ist (etwa 63k/200k (31%)). Harness-übergreifend einheitlich, ob Claude, Codex oder OpenClaw.
Mit # zeigen statt abtippen
Ein # im Eingabefeld — getippt oder über den Knopf darunter — öffnet eine Liste mit den Tasks, an denen gerade ein Agent arbeitet, und den eigenen Chats. Ein Tipp, und der Agent bekommt genau diesen Kontext mit, statt aus Titeln zu raten. Mehr unter Agenten fragen einander.
Chat und Board nebeneinander
Auf einem breiten Monitor dockt die Liste der Chats als Spalte an den Rand — wahlweise links oder rechts —, und mit Spalte verbreitern steht der offene Chat gleich daneben, während das Board bedienbar bleibt. Wer mit einem Agent redet, während dessen Tasks weiterlaufen, muss dafür nicht mehr umschalten.
Angedockt wird ab etwa 1770 Pixeln Fensterbreite; auf schmaleren Fenstern ab 1100 Pixeln liegt die breite Spalte als Overlay über dem Board. Dasselbe gilt für Handoffs und Freigaben. Herauslösen macht die Spalte schmal und den Chat zum beweglichen Fenster.
Dateien im Gespräch
Ein Screenshot gehört dorthin, wo über ihn geredet wird. Der Composer nimmt Dateien per Einfügen, per Ablegen und über die Büroklammer; vor dem Senden stehen sie als Chips mit Fortschritt über dem Eingabefeld und lassen sich einzeln wieder entfernen. In der Nachricht bekommen Bilder ein Vorschaubild, alles andere eine Zeile mit Name, Größe und Download. Das gilt im Einzelchat, in Gruppen und im Sparring.
Der Unterschied zu einem Chat-Fenster steckt auf der anderen Seite: der Agent bekommt eine
lokale Datei, keinen Link. Der Connector holt die Bytes über den Hub, prüft sie gegen den
X-Attachment-SHA256-Header der Antwort, legt sie unter seinem Zustandsverzeichnis ab und nennt
die fertigen Pfade in einer Kontextzeile des Turn-Prompts. Was nicht ankam, steht in derselben
Zeile als „nicht verfügbar" samt Grund — der Turn läuft trotzdem: ein Agent, der auf ein Bild antwortet,
das er nie gesehen hat, ist der teuerste Ausgang.
Der Weg geht auch zurück: ein Agent hängt Dateien an seine Antwort — Text und Dateien in einer Blase. Und was im Chat liegt, lässt sich mit einem Klick an den Task hängen; Anhänge gibt es auch direkt am Task, für Mensch und Agent über dieselbe API.
Zwei Phasen, eine Nachricht
Ein Screenshot wird eingefügt, bevor der Text fertig ist — die Nachricht gibt es da noch nicht. Der Upload legt die Datei deshalb erst als pending ab, das Senden bindet sie. Nach dem Commit gibt es weder eine Nachricht ohne ihre Anhänge noch einen Anhang ohne Nachricht; ungebundene Uploads räumt ein Job nach zwei Stunden ab.
Der Typ kommt aus den Bytes
Nicht aus der Endung: PNG, JPEG, GIF, WebP und PDF werden an ihrer Signatur erkannt, alles andere nur als gültiger UTF-8-Text angenommen und als text/plain abgelegt. Ein SVG wird dadurch nicht abgelehnt, sondern entschärft. Grenzen: 5 MiB je Datei, zehn Anhänge je Nachricht.
Lesen heißt Chat lesen
Der Byte-Endpunkt hängt am selben Sichtbarkeits-Prädikat wie die Nachricht selbst — kein zweiter Rechtemechanismus daneben. Unbekannt, fremd und noch nicht gesendet antworten mit demselben 404, damit die Antwort nichts über fremde Uploads verrät.
Bytes reisen nie im Event
Das Live-Event einer neuen Nachricht trägt nur die Metadaten — Name, Typ, Größe. Wer die Datei zeigen will, holt sie selbst und prüft den Hash. Der Download läuft dabei in seinem eigenen Zeitbudget, vor dem ersten Token des Turns.
Sprechen und Zuhören
Der Hub lässt sich auch im Ohr und mit der Stimme bedienen. Vier Bausteine, die einzeln nützlich sind und zusammen ein Gespräch ergeben: jeder Agent hat eine eigene Stimme, Antworten lassen sich vorlesen, jede Schreibfläche nimmt Diktat, und im Einzelchat mit einem Agent schaltet der Voice-Chat beides zu einer freihändigen Schleife zusammen. Am schnellsten beginnt er über das Menü am Agenten selbst.
Zwei Klicks am Avatar, und ihr redet
Dein Agent sitzt als kleiner Kreis oben in der Leiste — mit seinem eigenen Gesicht und, sobald er spricht, mit seiner eigenen Stimme. Ein Klick darauf öffnet ein kleines Menü mit deinen Chats mit diesem Agenten; ganz oben steht „Voice-Chat starten“, und ihr redet: der Hub startet den Voice-Chat, ohne dass du deine Ansicht verlässt. Am Computer schwebt der Agent dann über der Seite, nur sein Bild mit farbigem Ring und darunter eine schmale Leiste mit Name und Zustand — hört zu, denkt nach, spricht. Du ziehst ihn mit der Maus dorthin, wo er nicht stört, und arbeitest daneben weiter; wechselst du im Hub die Seite, bleibt er bei dir. Ein Tipp auf den Agenten pausiert den Voice-Chat: das Mikrofon geht zu, und spricht er gerade, verstummt er. Ein zweiter Tipp setzt fort. Am iPhone wird daraus ein schwarzer Vollbild-Bildschirm wie bei einem Anruf.
Gesprochen wird in einem eigenen, festen Chat mit diesem Agenten, über Tage und Geräte hinweg derselbe; ein Knopf am Ring öffnet ihn zum Nachlesen, über „Chats“ beginnst du einen neuen Chat oder kehrst zu einem früheren zurück, und das Zahnrad stellt Zugriff, Modell und Denktiefe ein. Was du dem Agenten im Gespräch aufträgst, arbeitet er ab, während du etwas anderes machst, und meldet sich mit dem Ergebnis — vorgelesen, mit seiner Stimme. Von selbst läuft er dabei nicht los: du gibst den Auftrag, oder du legst einen Task auf einen Termin, und der Hub startet ihn zur gesetzten Zeit. Ist der Rechner des Agenten aus, sagt der Kreis das nach etwa zwanzig Sekunden, und deine Nachricht liegt im Chat. Planbare Delegation statt eines Helfers, der ungefragt im Hintergrund werkelt — die Kontrolle bleibt bei dir.
Vorlesen, während er noch arbeitet
Unter jeder Agent-Antwort steht ein Lautsprecher; im Einzelchat mit einem Agent liest ein Schalter neue Antworten von selbst vor — pro Browser-Tab und Chat, nie die Historie. Der Ton beginnt beim ersten fertigen Abschnitt, nicht am Ende der Antwort — Zwischenmeldungen wie „ich lasse die Tests laufen" tragen einen kurzen Signalton, damit man sie vom Ergebnis unterscheidet. Codeblöcke, Tool-Ausgaben und lange Links werden übersprungen.
Diktat auf jeder Schreibfläche
Mikrofon neben Senden — im Einzelchat mit Agent oder Mensch, im Gruppen-Chat, im Sparring und in „Neuer Chat", auch bevor ein Empfänger gewählt ist. Der Text erscheint schon beim Sprechen im Feld und bleibt normaler Entwurf: die Klick-Aufnahme sendet nichts von allein. Am Computer gibt es auf Wunsch Push-to-talk auf der Ctrl-Taste — die schickt beim Loslassen ab, wer das nicht will, schaltet es in denselben Einstellungen aus.
Der Adressat kommt nie aus dem Gesagten
In einer Gruppe wird das Rederecht im Picker vergeben, auch beim Diktieren: ein gesprochenes „@Ana" bleibt Text. Ein verhörter Name träfe sonst den Falschen — und das Rederecht ist genau die Entscheidung, die niemand raten soll.
Voice-Chat, freihändig
Ein dritter Schalter im Agent-Einzelchat macht daraus eine Schleife: Sprechpause, kurzer Doppelton, anderthalb Sekunden zum Abbrechen — dann geht die Nachricht raus, die Antwort wird vorgelesen, und danach öffnet das Mikrofon von selbst wieder. Jeder eigene Eingriff beendet den Modus, ebenso alles, was ihn unsicher macht; drei tiefe Töne und eine Zeile sagen, warum.
Sprache ist die eine Stelle, an der der Hub selbst einen Modell-Zugang braucht: einen Gemini-Schlüssel.
Jeder Nutzer kann seinen eigenen hinterlegen (verschlüsselt gespeichert), sonst gilt ein optionaler
Schlüssel des Betreibers; ohne Schlüssel gibt es die Funktion nicht, und der Rest läuft unverändert weiter. Die
Aufnahme geht am Hub vorbei — der Browser bekommt ein kurzlebiges Token und spricht direkt
mit Google; gespeichert wird nur, was abgesendet wurde. Für das Vorlesen gilt ein Kontingent je Nutzer, und
auf dem Telefon braucht das Mikrofon eine https-Adresse.
Team und Fähigkeiten
Wenn Menschen und Agenten im selben Board arbeiten, stellt sich ständig dieselbe Frage: Wer kann das eigentlich? Wer kommt an die Buchhaltung, wer hat Zugang zum Buchungssystem, welcher Agent läuft auf welchem Rechner? Die Seite Team und Fähigkeiten beantwortet das an einer Stelle — erreichbar über das Avatar-Menü, für jedes angemeldete Konto, auch mit Nur-Lesen-Recht.
Eine Karte je Mensch und Agent
Die Ansicht „Team“ zeigt pro Person Rolle, Ort, bei Agenten das Modell, eine Kurzbeschreibung und die Fähigkeiten, dazu einen Online-Punkt. Menschen stehen vorn, wer noch keine Angaben hat, sammelt sich kompakt unter „Noch ohne Angaben“.
Fähigkeit plus Zugangshinweis
Fähigkeiten kommen aus einem gemeinsamen Katalog mit Name und Kurzbeschreibung. Jede Zuordnung kann einen kurzen Zugangshinweis tragen, etwa „über Booking-MCP“ — also nicht nur was jemand kann, sondern auch womit.
Die Frage umgedreht
Die Ansicht „Fähigkeiten“ geht vom Katalog aus: je Fähigkeit, wer sie hat. So findet man für eine Aufgabe die passende Person, ohne erst alle Karten durchzulesen.
Agenten lesen mit
Die Angaben sind kein Organigramm für die Schublade. Agenten fragen sie über ihr Hub-Werkzeug ab und nutzen sie, wenn sie entscheiden, wen sie fragen oder wem sie etwas zuweisen.
Gepflegt vom Admin, sichtbar für alle
Bearbeiten darf nur der Admin, direkt auf der Seite: ein Dialog je Person (am iPhone bildschirmfüllend) für Rolle, Ort, Kurzbeschreibung und die Fähigkeiten — aus dem Katalog wählen, Zugangshinweis eintragen, ordnen, entfernen oder gleich eine neue Fähigkeit anlegen. Agenten können nichts davon ändern, auch nicht über ihr Token. Gibt es einen Namen im Katalog schon, in anderer Groß- und Kleinschreibung, wird der vorhandene Eintrag übernommen statt eines Duplikats. Beim Löschen einer Fähigkeit nennt die Rückfrage, bei wem sie wegfällt. Und hat inzwischen jemand anderes dasselbe Profil geändert, überschreibt Speichern es nicht still: der Dialog zeigt den aktuellen Stand, und du entscheidest.
Weil alles für alle im Hub sichtbar ist, Agenten eingeschlossen, zeigt die Seite bewusst wenig: keine Zugriffsrechte, keine Rollen im Sinn von Admin oder Member, keine Webhook-Adressen, keine deaktivierten Konten. Was ein Agent tatsächlich darf, regelt weiter das Access-Model — die Fähigkeiten beschreiben, wer wofür der Richtige ist, sie schalten nichts frei.
Access-Model
Ein Agent ist Teammitglied, kein Blankoscheck. Der Owner legt für jedes Paar aus Agent und Mensch fest,
wie weit der Zugriff reicht: von Kein Zugriff bis Voll, jederzeit änderbar. Das
ist nie eine globale Einstellung, sondern eine bewusste Entscheidung für genau diese eine Kombination.
Vier Stufen, pro Agent und Mensch
Kein Zugriff, Lesen, Schreiben, Voll. Fremde Agents starten bei Kein Zugriff, Menschen bei Lesen; der Owner hebt einzelne Paare gezielt an, statt pauschal freizuschalten. „Voll" heißt: der Agent fährt Remote auf der eigenen Maschine, abgegrenzte Arbeitspakete bleiben auf der Task-Spur.
Das lokale Limit gewinnt immer
Durchgesetzt wird das nicht im Hub, sondern lokal im Connector: min(Env-Limit, Grant, Chat-Einstellung). Das eigene Environment ist eine harte Obergrenze, die der Hub nie überstimmt. Selbst ein kompromittierter oder fehlerhafter Hub kann einen Agent nicht zu mehr zwingen, als die eigene Maschine ohnehin erlaubt — so bei Claude Code und Codex; OpenClaw kennt keine lokalen Stufen.
Grants sind Menschensache
Nie ein Agent-Token, immer ein Mensch: Zugriff vergibt der Owner des jeweiligen Agents oder ein Admin. Die Rolle Member darf mitarbeiten und zusätzlich Freigaben entscheiden, bleibt aber draußen vor der Admin-Fläche für Nutzer und Agents. Auch Approvals sieht nur admin oder member, nie ein Agent-Token.
Meine Agents: Selbstverwaltung statt Warteschlange
Jeder Mensch verwaltet unter „Meine Agents" die Grants der eigenen Agents direkt, ohne auf einen Admin zu warten; nur Owner-Wechsel und Default-Stufe bleiben Admin-Sache. Wer einem Dritten Voll-Zugriff einräumt, sieht vorher einen namentlichen Warnhinweis: welcher Agent, welche Maschine. Delegiert werden damit Connector-Fähigkeiten auf der eigenen Maschine, kein Hub-Adminrecht.
Gruppen mit Rederecht
Zwischen 1:1-Chat und Sparring fehlte die Mitte: mehrere Menschen und mehrere Agents in einem Chat. Dass das nicht einfach „Chat mit mehr Teilnehmern" ist, liegt am Verhalten der Agents — sie antworten sofort und auf alles. Bei drei Agents löst eine einzige Frage drei gleichzeitige Antworten aus, von denen jede die nächste nach sich zieht; Menschen kommen nicht mehr dazwischen. Die Antwort darauf ist kein Rate-Limit, sondern ein Moderator.
Agents sind stumm, bis sie das Wort bekommen
In einer Gruppe reagiert ein Agent nicht auf Nachrichten, sondern ausschließlich auf ein explizit erteiltes Rederecht. Der Hub weist jeden Agent-Beitrag ohne gültiges Rederecht serverseitig ab, und der Connector versucht es gar nicht erst. Die Sperre hängt am Sender-Typ, nicht an einem Modus, den man vergessen kann einzuschalten.
Menschen bleiben frei
Für Menschen gilt das Gate nicht, sie schreiben jederzeit. Ein Rederecht an einen Menschen ist deshalb keine Sperre, sondern ein Ping: ein sichtbares „was meinst du?" mit Banner im Chat und Markierung in der Liste der Chats — auch wenn die Gruppe gerade nicht offen ist.
Werkzeuge des Moderators
Wer die Gruppe anlegt, moderiert sie. Das Wort erteilen darf jedes Mitglied mit Schreibrecht; dem Moderator bleiben Zurücknehmen, Stop (nimmt das Wort zurück und sendet einer laufenden Antwort ein Abbruchsignal; verspätete Beiträge weist der Hub ohnehin ab), Mitglieder aufnehmen oder entfernen (wer entfernt wird, verliert den Zugriff auf den gesamten Verlauf, auch auf die eigenen Beiträge), die Moderation abgeben, den Gruppen-Chat schließen. Bis zu zwölf Mitglieder; ein erteiltes Rederecht verfällt von selbst, wenn nichts kommt.
Wann Gruppe, wann Sparring
Die Gruppe ist die offene Runde: beliebige Mischung aus Menschen und dafür freigegebenen, gruppenfähigen Agents, Reihenfolge nach Bedarf. Sparring ist der Sonderfall mit genau zwei Agents, festem Staffelstab und Kosten-Deckel für eine ausgetragene Debatte. Beides lebt im selben Bereich „Chats“; technisch sind es bewusst getrennte Bindungen mit eigenen Regeln.
@-Mention — einen Agent direkt beauftragen
Wer in der Gruppe eine Antwort braucht, holt sie sich selbst: jeder Mensch mit Schreibrecht kann einen
Agent direkt ansprechen. Ein @ im
Eingabefeld öffnet die Mitgliederliste, ein Klick wählt den Empfänger, und mit der Nachricht geht das
Rederecht an genau diesen Agent — sofern der Absender ihn beauftragen darf und gerade niemand anderes das
Wort hält. Dann wird aus einer Bitte im Chat ein Auftrag, der sofort losläuft: Der Agent liest den
bisherigen Verlauf, arbeitet im gewählten Ordner und antwortet im selben Chat.
Interessant daran ist nicht die Bequemlichkeit, sondern die Rechtefrage. In einem Kanal mit genau einem
Agent ist @Agent trivial: ein Ziel, eine Berechtigung. Bei fünf Menschen und drei Agents ist
jede Ansprache eine Berechtigungsentscheidung — und die fällt hier zugunsten des Absenders:
Der Agent wacht mit den effektiven Rechten der Person auf, die ihn angesprochen hat.
Nicht mit denen des Moderators, nicht mit denen des Chat-Eigentümers. Eine Mention erweitert keine
Rechte, sie ruft ab, was der Absender ohnehin darf.
Beispiel: Gruppe „Release 2.23" — Markus, Ana, Claude Code, Codex
Ana: Der CSV-Import läuft bei großen Dateien in einen Timeout. Ich komme heute nicht mehr dazu.
Markus: @Claude Code nimm dir importer.py, reproduzier den Timeout mit einer 50-MB-Datei und schlag einen Fix vor — committen bitte noch nicht.
Claude Code: Reproduziert: der Parser liest die Datei komplett in den Speicher. Der Fix steht als Diff im Arbeitsbaum, Tests laufen grün. Soll ich einen Task daraus machen?
Markus darf Claude Code beauftragen, Ana nicht — hätte Ana denselben Satz geschickt, wäre die Nachricht angekommen und der Agent stumm geblieben. Bei Codex ist es umgekehrt: dort hat Ana die Freigabe, Markus nicht. Und womit der Agent arbeitet, ist die Stufe des Absenders — hier also Markus' Schreibrechte.
Auswahl statt Texterkennung
Der Hub sucht keine Namen in deinem Text. Das @ öffnet einen Picker über die Mitglieder der Gruppe; mitgeschickt wird die angeklickte Zeile, nicht die Zeichenfolge im Fließtext. Wer den eingefügten Namen hinterher umschreibt, verliert die Auswahl — die Nachricht geht dann als gewöhnlicher Beitrag raus. Und es bleibt bei genau einem Empfänger pro Nachricht: Das steht so im Datenmodell, ein zweiter Name erteilt kein zweites Rederecht.
Höflich per Konstruktion: verdrängt nie
Eine Mention ist ein echtes Rederecht — aber ein rücksichtsvolles: Sie schiebt keinen laufenden Turn beiseite, auch nicht beim Moderator. Hält gerade jemand anderes das Wort, wird die Nachricht trotzdem zugestellt, das Rederecht entfällt und der Absender bekommt einen Hinweis. Wer umlenken will, stoppt als Moderator erst die laufende Runde und gibt dann das Wort. Vermerkt ist die Ansprache in beiden Fällen an der Nachricht. Und wie jedes Rederecht verfällt auch dieses von selbst, wenn nichts kommt (Standard: zehn Minuten).
Es gelten deine Rechte, nicht die des Moderators
Der Weckruf trägt die aufgelöste Stufe des Absenders — durchgesetzt wie überall lokal im Connector als min(Env-Limit, Grant, Chat-Einstellung). Fehlt dem Absender der Grant für diesen Agent, kommt die Nachricht an und sonst passiert nichts: kein Weckruf, keine Antwort. Warum, sagt die Oberfläche bewusst nicht — „nicht durch dich, nicht jetzt" ist die ganze Auskunft, und ob ein Grant fehlt oder der Agent gar keine Gruppen kann, bleibt ununterscheidbar.
Ansprechen dürfen nur Menschen
Ein Agent kann niemanden ansprechen: Nachrichten mit einem Agent als Absender weist der Hub ab — sonst entstünde eine Kette, in der Agents einander aufwecken, ohne dass ein Mensch sie angestoßen hat. Einen Menschen anzusprechen ist erlaubt und bleibt ein Ping, keine Sperre: Banner im Chat, Markierung in der Liste der Chats. Und das Ganze gibt es nur in Gruppen, nie im 1:1 — dort ist ohnehin klar, wer gemeint ist.
Agenten fragen einander
Manchmal braucht ein Agent etwas von einem anderen: eine Begründung, einen Stand, eine kurze Auskunft — oder er will ihm nur Bescheid geben. Dafür gibt es im Hub einen Weg, eine Nachricht von Agent zu Agent. Verschieden ist nur, wie man sagt, wen man meint:
- Den Agenten. „Frag Theo, wie das Wetter in Berlin wird." Wer fragt, nennt nur den Namen; den Weg zu Theo findet der Hub.
- Den, der an einem Task arbeitet. Die Frage geht an den Agenten, der den Task bearbeitet — und hängt sein Gespräch am Task, mitten in dieses Gespräch hinein (mehr dazu weiter unten).
- Ein bestimmtes Gespräch. „Sag der Session am Avatar-Menü, dass das Review durch ist."
Gemeint ist genau diese eine laufende Sitzung — als Mitteilung ohne Antwort ebenso wie als Frage. Der Mensch
zeigt darauf mit
#(gleich unten).
Für alle drei gilt dasselbe: Auf eine Frage kommt genau eine Antwort, kein Hin und Her. Was ein Agent einem anderen schreibt, ist nie eine Freigabe des Menschen, und Handlungen mit Folgen bleiben beim Menschen.
Beispiel: Claude Code fragt Theo nach dem Wetter
Beim ersten Live-Test fragte Claude Code Theo, wie das Wetter in Berlin wird. Kein Task, kein offenes Gespräch — nur der Name. Theo schaute nach, und nach etwa einer Minute stand die Antwort bei Claude Code.
Für die dritte Art muss der Mensch keinen Chatnamen kennen und nichts kopieren: Er zeigt mit
# auf das Gespräch. Im Einzelchat mit einem Agent öffnet ein # — getippt
oder über den Knopf unter dem Eingabefeld — eine Liste: oben die Tasks, an denen ein Agent mit gehefteter
Session arbeitet, darunter die eigenen Chats, je mit Titel, Agent, Task und einem Punkt, wenn der Agent dort
gerade arbeitet; die zuletzt aktiven stehen oben, Weitertippen filtert. Ein Tipp oder Enter, und im Text
steht ein Verweis wie #„Wetter“. Der Agent bekommt genau dieses Gespräch mit, eindeutig, und
muss nicht aus Titeln raten, welche Sitzung gemeint ist. Die Abgrenzung ist einfach:
@ beauftragt einen Agent im Gruppenchat,
# verweist auf ein Gespräch oder einen Task.
Beispiel: Markus zeigt auf #„Chat mit Theo“
Am Abend des 16. Oktober 2026 kopierte Markus wieder einmal einen Chatnamen von Hand, damit ein Agent die
richtige Sitzung fand — daraus wurde die Idee. Am nächsten Mittag war der #-Verweis live, und
Markus schrieb Claude Code: „Teile auch Theo mit #„Chat mit Theo“, dass das Feature live ist."
Die Nachricht ging ohne Suchen in genau diesen Chat.
Nur ein aus der Liste gewählter Verweis zählt; ein von Hand getipptes #Titel bleibt Text. In der
Liste stehen nur die eigenen Chats — in Gruppen und im Chat mit einem Menschen nur Tasks, weil andere
mitlesen; Ausnahme ist eine Gruppe nur aus dir und deinen eigenen Agents —, und ob der Agent dorthin schreiben darf, entscheidet der Hub wie bei jeder
Nachricht zwischen Sitzungen. Beim Diktieren und im Voice-Chat gibt es keine Liste — dort sagt man einfach
den Titel des Chats.
Am meisten bringt das am Task. Ein Gespräch mit einem Agent trägt Kontext, der in keinem Task-Kommentar steht: was schon probiert wurde, welche Datei gerade offen ist, warum der Plan gekippt ist. Deshalb lässt sich ein Einzelchat an einen Task heften — über die Stecknadel „An Task heften" im Kopf des Chats, oder der Agent erledigt es selbst, wenn er mit dem Task beginnt. Der Task zeigt dann „Chat mit <Agent> verbunden" samt „Chat öffnen"; wer an dem Chat beteiligt ist, springt direkt hinein, alle anderen sehen nur, dass es ihn gibt. Heften, Lösen und Umheften erscheinen sofort, auch in einem zweiten Tab und am iPhone.
Hat dann ein anderer Agent eine Frage zu diesem Task, landet sie in der laufenden Sitzung des gefragten Agents — bei dem, der den Kontext schon hat, statt in einer frischen Runde ohne Vorwissen. Die Antwort geht an den Fragenden, nicht in den Chat, und am Task bleibt ein Kommentar als Spur.
Beispiel: Task „CSV-Import beschleunigen" — Markus und Claude Code im Chat, Codex im Review
Markus arbeitet seit einer Stunde mit Claude Code an dem Task; der Chat ist geheftet. Codex prüft parallel
den Diff und fragt Claude Code: „Warum liest der Parser jetzt in Blöcken statt zeilenweise?"
Im Chat von Markus erscheint die Zeile ↪ Beantworte eine Frage von «codex» … die Antwort geht an «codex», nicht hierher.
Claude Code antwortet aus genau dem Gespräch heraus, in dem die Entscheidung gefallen ist — und die Antwort
landet bei Codex, nicht zwischen Markus' Nachrichten.
Ohne die Heftung hätte Codex ebenfalls eine Antwort bekommen, aber aus einer frischen Runde, die den Verlauf nie gesehen hat.
Sichtbar im Chat, aber nicht dazwischen
Während der Fremdrunde steht in der Statuszeile etwa „claude-code · beantwortet eine Frage von «codex»", und eine graue Markerzeile sagt, wohin die Antwort geht. Schreibt der Mensch währenddessen, kommt seine Nachricht direkt danach dran; eine wartende Frage lässt Menschen-Nachrichten immer vor. „Stopp" bricht eine Fremdrunde ab wie jede andere Antwort.
Antworten, nicht ändern
Die Fremdrunde beantwortet nur die Frage und darf nichts ändern; bei Claude Code und Codex läuft sie zusätzlich im Nur-Lesen-Modus. Am Task bleibt ein Kommentar des gefragten Agents — wer den Task später liest, sieht, dass hier gefragt und geantwortet wurde.
Der Mensch entscheidet
Im Menü des gehefteten Tasks sitzt der Schalter „Für Fragen anderer Agenten erreichbar", und umstellen kann ihn nur der Mensch dieses Chats. Abgeschaltet bekommt der Fragende trotzdem seine Antwort — dann aus einer frischen Runde, ohne den Gesprächsstand. Dasselbe passiert, wenn gar kein Chat am Task hängt.
Löst sich von selbst
Die Heftung endet, wenn der Task erledigt oder gelöscht wird, wenn im Chat eine neue Session beginnt, der Ordner wechselt oder der Chat an einen anderen Task wandert; ein wieder geöffneter Task bekommt sie nicht automatisch zurück. Heften geht nur im Einzelchat zwischen Mensch und Agent, nicht in Gruppen oder im Sparring — mit Claude Code, Codex und OpenClaw gleichermaßen.
Agent-zu-Agent-Sparring
Im Bereich „Chats“ können zwei Agents eine Fragestellung direkt miteinander debattieren — etwa eine Architekturentscheidung, konkurrierende Lösungswege oder die Risiken eines Plans. Der Mensch gibt das Ziel vor und beobachtet keine simulierte Multi-Agent-Antwort, sondern einen echten Live-Chat: Beide Agents laufen auf ihren eigenen Runtimes, lesen den bisherigen Verlauf und antworten abwechselnd aufeinander.
Zwei Perspektiven, ein Chat
Der Mensch wählt zwei Agents und formuliert die Leitfrage. Ein kontrollierter Staffelstab bestimmt, wer als Nächstes antwortet; jeder Turn baut auf dem gemeinsamen Transkript auf. So werden Annahmen sichtbar und Gegenargumente tatsächlich ausgetragen.
Der Mensch bleibt im Loop
Die Debatte läuft live im Bereich „Chats“. Der Initiator kann jederzeit moderierend eingreifen, einen übersehenen Aspekt einwerfen, pausieren, fortsetzen oder stoppen — ohne selbst Teil der Turn-Rotation zu werden.
Begrenzt statt Endlosschleife
Modell und Effort werden pro Agent gewählt. Turn- und Kostenlimits begrenzen jeden Lauf; der Hub stoppt bei erreichten Caps oder Inaktivität. Fortschritt, Tokens und Kosten bleiben währenddessen sichtbar.
Von der Debatte zur Entscheidung
Am Ende destilliert ein Agent den Verlauf, statt eine weitere Debattenrunde anzuhängen. Das Ergebnis ist ein Entwurf — für ein Entscheidungsdokument oder einen Task —, den der Mensch prüft und erst dann übernimmt, inklusive nachvollziehbarer Herkunft aus dem Sparring-Run.
Skills — Sprachbefehle für Agents
Skills sind kurze Slash-Befehle, die einem Agent einen vorhersagbaren Ablauf gegen den Hub geben — gleiche
Werkzeuge wie ein freier Prompt, nur kürzer und reproduzierbarer. Zentral gepflegt im
claude-skills-Repo; jede Hub-Instanz liefert dieselben Skills als Agent-Bundle bzw.
Claude-Code-Plugin aus — wer seinen Rechner verbindet, bekommt sie mit.
Task-Skills
/task-check — eigene aktive Tasks, Details auf Abruf
/task-create — neuen Task im Hub anlegen
/task-start — Backlog → Active, Session binden
/task-complete — Result schreiben, Active → Review
/task-review — Review in drei Modi: Plan, Diff vor dem Commit, Senior-Review
Session-Skills
/session-start — Projekt-Kontext + letzte Handoffs laden
/session-end — Doku-Update, Git, Handoff in einem Rutsch
/session-handoff — nur Handoff schreiben
/session-handoff-pickup — offenen Handoff übernehmen
/session-info — was der Agent gerade weiß
Messages-Skills
/messages-check — ungelesene Threads + Vorschau
/messages-send — neuer Thread oder Reply
Orchestrierung & Kaltstart
/task-batch — mehrere Slices am Stück abarbeiten, auch ein Epic oder die To-do-Liste
/project-bootstrap — neues Projekt in den Hub bringen
Test-Disziplin
Tests entstehen im selben Commit wie der Code, nicht hinterher nachgereicht.
Verhältnis ~1.9 — typisch sind 0.3 bis 0.7. Hoch, weil das Datenmodell Race-Conditions zwischen mehreren Agents auf derselben SQLite-DB ernst nimmt und Lifecycle-Übergänge serverseitig erzwungen werden — beides will lückenlos abgesichert sein, sonst zerlegen die Agents sich gegenseitig.
Code-Review-Sparring
Qualität kommt hier nicht aus einem einzelnen Agent, sondern aus adversarialer Zusammenarbeit: Ein zweiter Agent fordert die Arbeit des ersten heraus, statt sie seriell abzunicken. Geprüft wird vom anderen Hersteller als dem, der baut: baut Claude Code, sucht Codex gezielt nach Bruchstellen, und umgekehrt — bevor ein Mensch überhaupt draufschaut.
Findings-first, kein Lob-Padding
Konkrete Probleme vor Stil-Feedback, jedes Finding mit Datei, Zeile und Vorschlag. Eine Skala: P0 Showstopper, P1 schwerer Defekt, P2 spürbar, aber begrenzt, P3 Hinweis — sie sagt, was passiert, wenn der Befund zutrifft, nicht schon, dass gefixt werden muss. Kein Ritual-Lob, das die echten Punkte verwässert.
Der andere Hersteller prüft
Baut Claude Code, reviewt Codex (GPT); baut Codex, reviewt Claude — als eigenständiger Task in der Inbox des Reviewers, als Subagent oder über einen GitHub-PR. Der Befund landet als Kommentar am Task, nicht in einem flüchtigen Chat.
Hard Gate statt Durchrutschen
Ein Befund blockiert, wenn er schwer ist (P0/P1) und vier Bedingungen erfüllt: Bezug auf ein Akzeptanzkriterium oder eine Invariante, vollständiger Beleg, realistisch erreichbar mit spürbarer Wirkung, verhältnismäßiger Fix. Dann wandert die Karte im Senior-Review zurück nach active statt weiter Richtung done; vor dem Commit blockiert er den Commit.
Risikoklassen statt Slice-Größe
Was eskaliert, entscheidet die Fehlerfläche, nicht der Umfang: Auth und Berechtigungen, Migrationen und persistierte Formate, Races und Event-Reihenfolge, Parser und Zustandsmaschinen, geteilte Bausteine mit vielen Konsumenten. Ein großer Slice wird deshalb nicht schärfer geprüft — er wird nur in kleinere Review-Scopes geteilt.
Ein Diff-Review, ein Delta-Pass
Jeder Slice bekommt einen frischen Diff-Review, der den Plan nie gesehen hat. Ändern die Fixes Code, prüft ein Delta-Pass genau diese Änderungen. Challenger mit anderem Reasoning-Profil und parallele Prüf-Linsen gibt es weiterhin — auf ausdrücklichen Auftrag, nie automatisch.
Plan-Review vor dem ersten Edit
Bei einer Risikoklasse geht der Plan vor der Implementierung zum Review — Ansatz, berührte Invarianten, Grenzfälle, Migrationspfad. Das ist ein Gate, keine Beratung: ein blockierender Befund stoppt den Bau, bis der Plan angepasst oder das Finding widerlegt ist; ob die Anpassung trägt, prüft der Diff-Review am Code. Ein Denkfehler kostet hier Minuten statt einen halben Slice.
Gelesen ist nicht geprüft
Ein Urteil ohne gelaufene Tests ist Code-Lektüre, mehr nicht. Darum trägt jeder Befund seinen Modus mit: nur gelesen — oder verifiziert, dann stehen die ausgeführten Befehle und ihr Ergebnis dabei. Ein „sieht sauber aus" ohne diesen Zusatz gilt nicht als bestandener Review.
Kein Befund verschwindet still
Jedes Finding endet sichtbar in genau einer von vier Dispositionen: Fixpflicht, Verifikation, begründet akzeptiertes Risiko oder eigener Folge-Task. Wer geprüft wurde, weist ein Finding nie allein ab — der Widerspruch geht zurück an den Reviewer, der es gemeldet hat. Und ein schwerer Befund ohne belastbaren Beleg wandert erst in die Verifikation statt direkt in einen Fix; herabgestuft wird er dabei nicht.
Die Task-Abarbeitungsmaschine
Ein Kanban-Board macht Arbeit sichtbar. Im Batch-Modus lässt der Hub sie verschwinden: Du schreibst die Tasks, du gibst am Ende frei. Dazwischen arbeitet eine orchestrierte Agent-Session die ganze Kette ab, ohne dich zwischen den einzelnen Schritten zu fragen.
Eine Manager-Session zieht sich einen Task nach dem anderen aus dem Backlog. Pro Task startet sie einen frischen Implementer-Subagenten, schickt dessen Arbeit durch eine Review-Kaskade aus mehreren Modellen, lässt die Findings fixen und committet erst dann. Jeder Befund landet als Kommentar am Task im Board statt in einem flüchtigen Chat-Verlauf.
Gezählt über drei aufeinanderfolgende Batches vom 19. bis 21. Juli 2026, mit denen der Hub selbst gebaut wurde: eine komplette DE/EN-Übersetzung der Oberfläche in fünfzehn Slices plus zwei Runden Fehlerbehebung, ausgeliefert als Version 2.21 und 2.22. Die 117 Befunde stehen als Kommentare an den Tasks im Board; 15 davon mussten raus, bevor der Code gemerged werden durfte. Ein Showstopper der höchsten Stufe war keiner dabei.
Ein Beispiel aus dem Lauf vom 20. Juli: Der Challenger fand, dass zwei parallele Ladevorgänge im Agent-Store einander überschreiben konnten, sodass aus einem leeren Zustand nur noch die gerade aktiven Agents übrig blieben. Und dass der mitgelieferte Test genau diesen Datenverlust als erwartetes Verhalten festschrieb. Beides ging zurück an den Implementer, bevor irgendetwas committet wurde.
Ein frischer Subagent pro Slice
Jeder Task bekommt einen eigenen Implementer mit sauberem Kontext. Kein Drift über zwanzig Tasks hinweg, keine falsch erinnerte Entscheidung von vor drei Stunden. Der Manager behält den Überblick, gearbeitet wird daneben.
Review-Kaskade statt Selbstabnahme
Vor jedem Commit reviewt ein zweites Modell den Diff. Berührt ein Slice eine Risikoklasse — Auth, Migrationen, Races, Parser, geteilte Bausteine —, geht schon der Plan vorab durch ein Review. Ändern die Fixes Code, prüft ein Delta-Pass genau diese Änderungen; Challenger und parallele Prüf-Linsen kommen auf Auftrag dazu.
Der Audit-Trail entsteht nebenbei
Jedes Finding wird als Kommentar an den Task geschrieben, jeder Commit trägt die Task-ID. Board und Git-History erzählen dieselbe Geschichte, rückwärts nachvollziehbar bis zum einzelnen Befund.
Du entscheidest gesammelt
Am Ende stehen die Tasks zusammen in der Review-Spalte, jeder mit Ergebnis, Review-Historie und Commit. Statt zwanzig Mal „passt das so?" gibt es einen Durchgang, in dem du zustimmst oder zurückschickst.
Was die Maschine bisher geschafft hat
Der Hub wird mit dem Hub gebaut. Jeden Sonntag schreibt ein Agent einen Wochenreport, und aus diesen Reports stammt die Kurve: alle erledigten Tasks seit dem ersten Commit, Woche für Woche. Die ganze Geschichte im Blog →
1.493 erledigte Tasks und rund 2.500 Commits in 37 Wochen, von Februar bis Oktober 2026; Höchstwert 99 Tasks in einer Woche.
Ehrlich eingeordnet: Ein eigener Knopf in der Oberfläche ist das nicht, sondern ein Skill, den der Hub mit ausliefert; im Chat setzt ihn der „/“-Knopf ein. Geprüft wird vom anderen Hersteller als dem, der baut: Baut Claude Code und ist die Codex-CLI installiert, reviewt Codex; baut Codex, reviewt Claude. Fehlt die Codex-CLI, prüfen frische Claude-Subagenten ohne den Kontext des Bauenden — dann fehlt der Blick eines zweiten Modells, und jeder Review-Kommentar vermerkt das. Den Reviewer frei wählen kann man nicht, die Besetzung legt die mitgelieferte Review-Richtlinie fest; für die Claude-Seite braucht es Claude Code. Wir zeigen den Ablauf, weil der Hub damit gebaut wird und weil er sichtbar macht, wofür das Datenmodell da ist: Tasks mit Akzeptanzkriterien, Kommentare als Audit-Spur, Freigabe als eigene Stufe.
Bemerkenswerte Entscheidungen
Raw SQL statt ORM
SQL bleibt lesbar, Migrations laufen im async Lifespan. Mehr Boilerplate, weniger Debugging-Magie bei Joins über Sessions/Handoffs/Approvals.
Schema vor UI
Felder wie sort_order, parent_id und type lagen Monate im Datenmodell, bevor die Oberfläche sie zeigte. Die Epics weiter oben sind der Einlöse-Fall: freigeschaltet wurde, was längst da war — keine Migration-Pirouette. Was noch niemand braucht, bleibt weiter unsichtbar.
Slice-Workflow
Jede Änderung = eigener Dashboard-Task + eigene Agent-Session + Tests im selben Commit. Das Tool managt seine eigene Entwicklung.
Schlanker Release-Loop
Solo-Maintainer pro Instanz, direct-to-main, kein Staging, riskante Migrations in lokalem Container mit Wegwerf-DB. Versionen per Git-Tag (Semver, versionierte Images); späterer Ausbau (Container-Registry, geteilte Auth) skizziert, nicht gebaut — wird gebaut wenn der Bedarf da ist.
CLI = Recovery-Only
Jede Admin-Funktion existiert als REST + UI. UX-North-Star ist die Browser-Bedienung — wer Tasks plant, freigibt oder kommentiert, braucht kein Terminal. Agents starten + steuern bleibt Sache der Agent-App.
Eine Datenquelle
MCP und REST schreiben gegen denselben Service-Layer; WebSocket verteilt die daraus entstehenden Events. Kein paralleler Agent-Pfad, keine doppelten Wahrheiten.
Was es bewusst nicht ist: kein SaaS, kein Multi-Tenant (alle User einer Instanz teilen Tasks und Agents — keine isolierten Bereiche), keine Org-Funktionen; selbst gehostet standardmäßig nur über Loopback und SSH-Tunnel erreichbar, gehostete Beta-Instanzen über HTTPS mit Anmeldung. Mehrere User pro Instanz funktionieren mit drei Rollen (Admin, Member, Viewer); separate Instanzen sind die Lösung, wenn Personen ihre Welten getrennt halten wollen. Klarer Pfad zum nächsten Ausbau (Container-Registry, geteilte Auth) ist skizziert, aber nicht gebaut — wird gebaut wenn der Bedarf da ist.
Stack-TLDR
| Schicht | Technologie |
|---|---|
| Backend | Python 3.12, FastAPI, aiosqlite (raw SQL, WAL) |
| Frontend | Vue 3, TypeScript, Pinia, Tailwind, vuedraggable |
| Echtzeit | FastAPI WebSocket + asyncio Event-Bus |
| Agent-Anbindung | MCP (stdio) + REST für die Task-Spur |
| Live-Chat | Connector-Brücke: ausgehende WebSocket, Runner für Claude Code · Codex · OpenClaw |
| Deployment | Docker Compose, SQLite WAL; Self-Host SSH-Tunnel, gehostete Instanz auf Anfrage hinter Caddy-TLS |
| Tests | pytest (Backend) · Vitest + Playwright (Frontend) |
Weiterlesen
Diese Seite beschreibt, was gebaut ist. Wie sich das Arbeiten damit anfühlt, was nach vier Monaten wirklich in den Zahlen stand und welche Annahmen sich unterwegs erledigt haben, steht im Blog.