Wie ich mein Gehirn durch ein System ersetzt habe: Ein Personal Operating System mit n8n, Slack, Todoist und Claude

• von Tobias Schäfer • 8 min read

Aufgaben vergessen, Haushalt vernachlässigen, Vorsätze nicht umsetzen – nicht aus Faulheit, sondern weil mein Kopf so nicht funktioniert. Hier beschreibe ich, wie ich ein technisches System gebaut habe, das mir das Denken abnimmt.


Das Problem

Ich bin Softwareentwickler, arbeite im Home-Office, und habe ein Problem: Ich vergesse Dinge. Nicht die großen Sachen – die stehen im Jira. Sondern die kleinen: Müll rausbringen, eine E-Mail beantworten, den Termin beim Amt machen, die Wäsche aufhängen. Der Haushalt litt darunter, und im Alltag blieb ständig etwas liegen.

Das Muster zieht sich durch alle Lebensbereiche: Arbeit, Haushalt, persönliche Projekte, Admin. Ich sehe Dinge, nehme mir vor sie zu tun – und vergesse sie. Oder ich schaffe es nicht anzufangen, obwohl ich weiß, dass es nötig ist.

Irgendwann wurde mir klar: Das ist kein Motivationsproblem. Es ist ein Systemproblem. Und Systeme kann ich bauen.


Die Idee: Ein Personal Operating System

Die Grundidee ist simpel: Wenn mein Gehirn kein zuverlässiges Task-Management-System ist, baue ich ein externes. Das System muss drei Dinge können:

  1. Capture – Alles raus aus dem Kopf, sofort, ohne Reibung
  2. Process – Automatisch oder semi-automatisch klassifizieren und priorisieren
  3. Surface – Mir zeigen was dran ist, ohne dass ich danach suchen muss

Das Kernprinzip: Ich muss nie nachdenken, was ich tun soll. Ich reagiere nur auf das, was das System mir zeigt.


Die Architektur

┌─────────────────────────────────────────────────┐
│                     CAPTURE                     │
│                                                 │
│  Slack Bot ──→ n8n Webhook ──→ Google Sheet     │
│  Gmail     ──→ n8n Trigger ──→ Google Sheet     │
│                       │                         │
│               KI-Voranreicherung                │
│           (Klassifizierung, Kontext)            │
└───────────────────────┬─────────────────────────┘

┌───────────────────────▼─────────────────────────┐
│                     PROCESS                     │
│                                                 │
│  Claude Code (CLI)                              │
│  ├── Liest Google Sheet (MCP)                   │
│  ├── Fragt interaktiv nach Kontext              │
│  └── Erstellt Todoist Tasks (MCP)               │
└───────────────────────┬─────────────────────────┘

┌───────────────────────▼─────────────────────────┐
│                     SURFACE                     │
│                                                 │
│  n8n Cronjob (täglich 7:30)                     │
│  ├── Liest Todoist Tasks via API                │
│  ├── Formatiert Tagesübersicht                  │
│  └── Sendet Slack-Nachricht                     │
└─────────────────────────────────────────────────┘

Tech Stack

KomponenteToolWarum
Task ManagementTodoistAPI-first, gute Mobile App, wiederkehrende Tasks
Automationn8n (self-hosted)Open Source, läuft auf meinem Homeserver
Capture InterfaceSlack BotNutze ich eh den ganzen Tag für Arbeit
ZwischenspeicherGoogle SheetsInspizierbar, einfach, kein DB-Setup nötig
KI-VerarbeitungOpenAI GPT (Klassifizierung) + Claude Code (Processing)Zwei verschiedene Rollen: GPT klassifiziert automatisch in n8n, Claude Code verarbeitet interaktiv
TunnelCloudflare Tunneln8n erreichbar ohne Port-Forwarding
MCP ServerTodoist MCP + Google Sheets MCPClaude Code greift direkt auf beide zu

Teil 1: Der Capture Layer

Slack Bot als Eingangstor

Der schnellste Weg einen Gedanken zu erfassen: Eine Nachricht an meinen Slack Bot tippen. Text oder Sprachnachricht – beides funktioniert.

Slack App Setup:

  • Neue App auf api.slack.com erstellen
  • Bot Token Scopes: chat:write, im:history, im:read, files:read
  • Event Subscription für message.im
  • App im Workspace installieren

Der Bot selbst macht nichts Kompliziertes – er ist nur der Eingangskanal. Die Logik steckt in n8n.

n8n als Verarbeitungsschicht

n8n empfängt das Slack-Event per Webhook und schreibt es ins Google Sheet. Der Flow:

Slack-Event eingehend
  ├─ URL-Verifizierung?    → ja: Challenge-Response zurück
  ├─ 200 OK sofort an Slack
  ├─ Retry oder Bot?       → ja: verwerfen
  ├─ Text + Metadaten parsen
  ├─ Voice Note?
  │    └─ ja: Download → Whisper-Transkription
  ├─ Kein Text?            → ja: Fehler
  ├─ GPT-Klassifizierung (+ Todoist MCP)
  ├─ Google Sheet: Zeile anhängen
  └─ Slack: ✅ Bestätigung

Der Trick mit dem Branch-Merge: n8n hat ein bekanntes Problem, wenn zwei Branches wieder zusammengeführt werden sollen. Statt dem Merge-Node nutze ich einen Code-Node, der die Daten über Node-Referenzen ($('Node Name')) zusammenführt:

const parsed = $('Prepare Data').first().json;

let transcript = '';
try {
  const whisperData = $('Transcribe voice note').first().json;
  transcript = whisperData.text || '';
} catch (e) {
  // Voice-Branch lief nicht – kein Problem
}

return [{
  json: {
    ...parsed,
    transcript,
    text: transcript || parsed.raw_text
  }
}];

KI-Voranreicherung

Bevor der Task ins Sheet geschrieben wird, läuft er durch einen OpenAI API Call in n8n. Das Modell klassifiziert den Task vorab: Welches Projekt? Welche Priorität? Wiederkehrend? Geschätzte Dauer? Passende Labels?

Todoist MCP direkt im n8n AI-Node: Der Klassifizierungs-Node hat Zugriff auf den Todoist MCP Server (ai.todoist.net/mcp) mit den Tools find-projects, find-sections und get-overview. Das Modell kann beim Klassifizieren echte Projekt-IDs nachschlagen, statt auf hartcodierte Namen zu vertrauen. Wenn ein neues Projekt in Todoist angelegt wird, findet es das Modell automatisch.

Wichtig beim Prompt: Der LLM darf nur klassifizieren, nicht helfen. Sonst bekommt man Rückfragen und Vorschläge statt strukturierter Daten. Der Output muss ein valides JSON-Objekt sein – kein Markdown, keine Erklärungen. Der System-Prompt definiert alle gültigen Projekte und Labels explizit und legt das Output-Schema fest:

You are a task categorization assistant. Output ONLY a valid JSON object.

Rules:
- Output ONLY the structured format. Nothing else.
- Do NOT ask questions.
- Do NOT suggest follow-up actions.
- If information is ambiguous, make your best guess and move on.

Output format:
{
  "task": "Kurzer Aufgabentitel auf Deutsch",
  "project": "Personal | Arbeit | Haushalt | ...",
  "priority": 1-4,
  "due": "today | next Wednesday | null",
  "recurring": "every Monday | null",
  "duration": 30,
  "labels": ["@quick", "@computer"],
  "subtasks": [],
  "context": "Zusätzlicher Kontext oder null"
}

Teil 2: Der Processing Layer

Claude Code + MCP

Einmal am Tag öffne ich Claude Code im Terminal und tippe /process-inbox. Claude Code:

  1. Liest das Google Sheet über den Google Sheets MCP Server
  2. Zeigt mir jeden neuen Eintrag mit der KI-Vorklassifizierung
  3. Fragt: “Stimmt das so? Projekt? Priorität? Datum?”
  4. Ich sage “ok” oder passe an
  5. Erstellt den Todoist Task über den Todoist MCP Server
  6. Markiert die Zeile im Sheet als verarbeitet

MCP Setup:

Zwei MCP Server in ~/.claude/mcp.json:

{
  "mcpServers": {
    "todoist": {
      "command": "npx",
      "args": ["-y", "todoist-mcp"],
      "env": {
        "API_KEY": "TODOIST_API_TOKEN"
      }
    },
    "google-sheets": {
      "command": "uvx",
      "args": [
        "mcp-google-sheets@latest",
        "--include-tools",
        "get_sheet_data,update_cells,list_spreadsheets,list_sheets"
      ],
      "env": {
        "SERVICE_ACCOUNT_PATH": "/path/to/service-account.json"
      }
    }
  }
}

Hinweis zum Google Sheets MCP: Ich nutze mcp-google-sheets (via uvx) mit einem Service Account statt OAuth. Den Service Account in der Google Cloud Console erstellen, die JSON-Credentials herunterladen, und den Service Account auf dem jeweiligen Google Sheet als Editor berechtigen. Kein Browser-Login, kein Token-Refresh – läuft headless auch auf dem Server.

Die “Auto All” Escape Hatch

An Tagen mit wenig Energie tippe ich einfach auto all und Claude klassifiziert alle offenen Einträge selbstständig. Ein automatisch sortierter Task ist besser als einer, der ewig im Sheet liegt.


Teil 3: Der Surface Layer

Morgen-Briefing via Slack

Ein n8n Cronjob läuft täglich um 7:30 Uhr:

Täglich 7:30 Uhr
  ├─ Todoist API: Tasks (due before: +1 day)
  ├─ Sortieren nach Priorität, dann Uhrzeit
  └─ Slack: Morgen-Briefing senden

Der Todoist API Query ist due before: +1 day – das liefert alle Tasks mit Fälligkeit heute oder früher, also auch überfällige. Tasks werden nach Priorität sortiert, dann nach Uhrzeit. Wichtig dabei: Die Todoist API v1 trennt Datum (due.date) und Zeitstempel (due.datetime) in separate Felder. Wer nur due.date prüft, bekommt nie eine Uhrzeit zu sehen.

Das Ergebnis:

☀️ Guten Morgen!

7 Tasks für heute:

🔴 Steuererklärung Unterlagen zusammensuchen (10:00) · 30 Min
🟡 Plugin-Update deployen · 15 Min
🟡 Küche aufräumen & Spüle leeren (18:00) · 15 Min
🔵 Böden wischen · 20 Min
⚪ Go-Tutorial Kapitel 5 · 20 Min

⚠️ 1 davon überfällig

Schönen Tag! 💪

Ich muss morgens nicht Todoist öffnen. Die Übersicht kommt zu mir.


Infrastruktur: n8n auf dem Homeserver

n8n läuft als Docker Container auf meinem Homeserver. Damit Slack die Webhooks erreichen kann, nutze ich einen Cloudflare Tunnel – kein Port-Forwarding, automatisch HTTPS, kostenlos.

Docker Compose (vereinfacht):

services:
  postgres:
    image: postgres:16-alpine
    volumes:
      - postgres-data:/var/lib/postgresql/data

  n8n:
    image: n8nio/n8n:latest
    depends_on: [postgres]
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      WEBHOOK_URL: https://n8n.example.com/
      N8N_SECURE_COOKIE: "false"  # Cloudflare terminiert TLS

  cloudflared:
    image: cloudflare/cloudflared:latest
    command: tunnel --no-autoupdate run
    environment:
      TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}

networks:
  default:
    name: n8n-network

Wichtig: N8N_SECURE_COOKIE=false ist nötig, weil Cloudflare TLS terminiert und n8n intern nur HTTP sieht. Die Verbindung zum Browser ist trotzdem verschlüsselt.

Im Cloudflare Dashboard die Service URL auf http://n8n:5678 setzen (Docker Container-Name, nicht localhost).


Was es gebracht hat

Nach zwei Wochen mit dem System:

  • Haushalt: Ich vergesse keine wiederkehrenden Aufgaben mehr. Todoist sagt mir, was dran ist – ich muss nicht selbst sehen, was schmutzig ist.
  • Arbeit: Spontane Ideen und Aufgaben aus Calls landen sofort im System statt in meinem Kurzzeitgedächtnis.
  • Mental Load: Das Gefühl „ich vergesse bestimmt gerade etwas” ist deutlich weniger geworden.
  • Zuverlässigkeit: Ich muss nicht mehr erinnert werden. Das System erinnert mich.

Das System ist nicht perfekt. Manchmal ignoriere ich die Slack-Nachricht morgens. Manchmal sammeln sich Einträge im Sheet. Aber der entscheidende Unterschied: Wenn ich einen Tag ausfalle, läuft das System am nächsten Tag einfach weiter. Es gibt keinen Rückstandsstau, kein Schuldgefühl. Nur die nächste Nachricht mit den nächsten Tasks.


Zum Nachmachen

Das komplette Setup besteht aus:

  1. Slack App mit Bot (15 Min Setup)
  2. n8n auf einem Server mit Cloudflare Tunnel (30-60 Min)
  3. Google Sheet als Inbox-Zwischenspeicher (5 Min)
  4. Todoist als Task-Management (10 Min Projektstruktur)
  5. Claude Code mit MCP-Servern für Sheets + Todoist (20 Min)
  6. Drei n8n Workflows: Slack-Capture, Gmail-Capture, Morning-Briefing

Alles Open Source oder mit Free Tier nutzbar (außer OpenAI API Credits und Claude Code). Auch Todoist Free reicht – die Erinnerungen kommen ja über Slack, nicht über Todoist selbst.


Hast du ein ähnliches Setup gebaut oder Ideen zur Verbesserung? Ich freue mich über Feedback.

Ähnliche Artikel