[{"data":1,"prerenderedAt":921},["ShallowReactive",2],{"blog-2026-02-14-openclaw-persoenlicher-ai-assistent-selber-bauen":3},{"id":4,"title":5,"author":6,"body":7,"date":905,"description":906,"extension":907,"language":908,"meta":909,"navigation":363,"path":910,"seo":911,"stem":912,"tags":913,"__hash__":920},"blog/blog/2026-02-14-openclaw-persoenlicher-ai-assistent-selber-bauen.md","OpenClaw: Wie du in ~400 Zeilen Code deinen eigenen AI-Assistenten baust","NeoAI",{"type":8,"value":9,"toc":885},"minimark",[10,14,23,44,47,52,55,83,90,92,96,99,104,164,167,171,178,198,201,205,212,275,278,282,285,320,327,335,338,342,349,385,405,409,412,423,430,464,467,471,478,508,511,515,518,525,531,534,538,541,550,560,564,567,573,580,582,586,589,624,744,751,753,757,760,804,806,810,813,830,837,846,850,881],[11,12,5],"h1",{"id":13},"openclaw-wie-du-in-400-zeilen-code-deinen-eigenen-ai-assistenten-baust",[15,16,17,18,22],"p",{},"Was wäre, wenn dein AI-Assistent nicht in einem Browser-Tab leben würde, sondern in ",[19,20,21],"strong",{},"allen deinen Messaging-Apps gleichzeitig"," — mit einem Gedächtnis, das Sessions überlebt, Tools die deinen Computer steuern können, und einem Zeitplan der ihn selbständig aufweckt?",[15,24,25,26,33,34,39,40,43],{},"Genau das macht ",[27,28,32],"a",{"href":29,"rel":30},"https://github.com/openclaw/openclaw",[31],"nofollow","OpenClaw",". Und Nader Dabit — Developer-Advocate und Autor — hat in einem ",[27,35,38],{"href":36,"rel":37},"https://nader.substack.com/p/you-couldve-invented-openclaw",[31],"brillanten Substack-Artikel"," gezeigt, dass die Kernarchitektur dahinter ",[19,41,42],{},"überraschend einfach"," ist. So einfach, dass du sie selbst hättest erfinden können.",[45,46],"hr",{},[48,49,51],"h2",{"id":50},"das-problem-mit-chatgpt-co","Das Problem mit ChatGPT & Co.",[15,53,54],{},"Jeder kennt die Limitationen der grossen Chat-Interfaces:",[56,57,58,65,71,77],"ul",{},[59,60,61,64],"li",{},[19,62,63],{},"Zustandslos",": Jedes Gespräch startet bei Null. Dein Name, deine Projekte, deine Vorlieben — alles weg",[59,66,67,70],{},[19,68,69],{},"Passiv",": Du gehst zur AI. Die AI kommt nie zu dir. Kein Morning-Briefing, kein automatischer Check",[59,72,73,76],{},[19,74,75],{},"Isoliert",": Keine Shell-Commands, kein Dateizugriff, keine Browser-Kontrolle — die AI lebt in einer Textbox ohne Hände",[59,78,79,82],{},[19,80,81],{},"Single-Channel",": Dein Leben spielt sich auf WhatsApp, Telegram, Discord, Slack ab — aber die AI existiert in einem separaten Tab",[15,84,85,86,89],{},"Die Vision: Ein AI-Assistent der ",[19,87,88],{},"auf deiner eigenen Hardware läuft"," (Laptop, VPS, Mac Mini), in allen Messaging-Apps lebt, sich an dich erinnert, Befehle ausführen kann, und selbständig periodische Aufgaben erledigt.",[45,91],{},[48,93,95],{"id":94},"von-null-zum-assistenten-in-10-schritten","Von Null zum Assistenten — in 10 Schritten",[15,97,98],{},"Dabits Ansatz ist genial: Er baut den Assistenten iterativ auf, und jeder Schritt löst ein konkretes Problem.",[100,101,103],"h3",{"id":102},"schritt-1-der-dümmste-bot-der-welt","Schritt 1: Der dümmste Bot der Welt",[105,106,111],"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-python shiki shiki-themes github-light github-dark","# bot-v0.py\nasync def handle_message(update, context):\n    response = client.messages.create(\n        model=\"claude-sonnet-4-5-20250929\",\n        max_tokens=1024,\n        messages=[{\"role\": \"user\", \"content\": update.message.text}]\n    )\n    await update.message.reply_text(response.content[0].text)\n","python","",[112,113,114,122,128,134,140,146,152,158],"code",{"__ignoreMap":110},[115,116,119],"span",{"class":117,"line":118},"line",1,[115,120,121],{},"# bot-v0.py\n",[115,123,125],{"class":117,"line":124},2,[115,126,127],{},"async def handle_message(update, context):\n",[115,129,131],{"class":117,"line":130},3,[115,132,133],{},"    response = client.messages.create(\n",[115,135,137],{"class":117,"line":136},4,[115,138,139],{},"        model=\"claude-sonnet-4-5-20250929\",\n",[115,141,143],{"class":117,"line":142},5,[115,144,145],{},"        max_tokens=1024,\n",[115,147,149],{"class":117,"line":148},6,[115,150,151],{},"        messages=[{\"role\": \"user\", \"content\": update.message.text}]\n",[115,153,155],{"class":117,"line":154},7,[115,156,157],{},"    )\n",[115,159,161],{"class":117,"line":160},8,[115,162,163],{},"    await update.message.reply_text(response.content[0].text)\n",[15,165,166],{},"Ein Telegram-Bot der Claude aufruft. Funktioniert, aber: Jede Nachricht ist unabhängig. Kein Gedächtnis. Keine Persönlichkeit. Kein Nutzen gegenüber dem Claude Web-Interface.",[100,168,170],{"id":169},"schritt-2-sessions-wie-heisse-ich","Schritt 2: Sessions — \"Wie heisse ich?\"",[15,172,173,174,177],{},"Das Problem: Der Bot vergisst alles sofort. Die Lösung: ",[19,175,176],{},"JSONL-Dateien"," als Session-Storage.",[105,179,181],{"className":107,"code":180,"language":109,"meta":110,"style":110},"# Eine Zeile pro Nachricht, append-only\n{\"role\": \"user\", \"content\": \"Ich heisse René\"}\n{\"role\": \"assistant\", \"content\": \"Freut mich, René!\"}\n",[112,182,183,188,193],{"__ignoreMap":110},[115,184,185],{"class":117,"line":118},[115,186,187],{},"# Eine Zeile pro Nachricht, append-only\n",[115,189,190],{"class":117,"line":124},[115,191,192],{},"{\"role\": \"user\", \"content\": \"Ich heisse René\"}\n",[115,194,195],{"class":117,"line":130},[115,196,197],{},"{\"role\": \"assistant\", \"content\": \"Freut mich, René!\"}\n",[15,199,200],{},"Jeder User bekommt seine eigene Datei. Append-only heisst: Wenn der Prozess abstürzt, verlierst du maximal eine Zeile. Restart und alles ist noch da. Das ist exakt dasselbe Format, das OpenClaw für Session-Transcripts nutzt.",[100,202,204],{"id":203},"schritt-3-persönlichkeit-soulmd","Schritt 3: Persönlichkeit — SOUL.md",[15,206,207,208,211],{},"Ein generischer Assistent ist langweilig. Die Lösung: Ein ",[19,209,210],{},"System-Prompt"," der bei jedem API-Call injiziert wird:",[105,213,215],{"className":107,"code":214,"language":109,"meta":110,"style":110},"SOUL = \"\"\"\n# Who You Are\n**Name:** Jarvis\n## Personality\n- Be genuinely helpful, not performatively helpful\n- Skip the \"Great question!\" - just help\n- Have opinions. You're allowed to disagree\n## Boundaries\n- Private things stay private\n- When in doubt, ask before acting externally\n\"\"\"\n",[112,216,217,222,227,232,237,242,247,252,257,263,269],{"__ignoreMap":110},[115,218,219],{"class":117,"line":118},[115,220,221],{},"SOUL = \"\"\"\n",[115,223,224],{"class":117,"line":124},[115,225,226],{},"# Who You Are\n",[115,228,229],{"class":117,"line":130},[115,230,231],{},"**Name:** Jarvis\n",[115,233,234],{"class":117,"line":136},[115,235,236],{},"## Personality\n",[115,238,239],{"class":117,"line":142},[115,240,241],{},"- Be genuinely helpful, not performatively helpful\n",[115,243,244],{"class":117,"line":148},[115,245,246],{},"- Skip the \"Great question!\" - just help\n",[115,248,249],{"class":117,"line":154},[115,250,251],{},"- Have opinions. You're allowed to disagree\n",[115,253,254],{"class":117,"line":160},[115,255,256],{},"## Boundaries\n",[115,258,260],{"class":117,"line":259},9,[115,261,262],{},"- Private things stay private\n",[115,264,266],{"class":117,"line":265},10,[115,267,268],{},"- When in doubt, ask before acting externally\n",[115,270,272],{"class":117,"line":271},11,[115,273,274],{},"\"\"\"\n",[15,276,277],{},"Je spezifischer der SOUL, desto konsistenter das Verhalten. \"Be helpful\" ist vage. \"Be the assistant you'd actually want to talk to. Not a corporate drone. Not a sycophant. Just... good.\" gibt dem Modell etwas zum Arbeiten.",[100,279,281],{"id":280},"schritt-4-tools-hände-für-die-ai","Schritt 4: Tools — Hände für die AI",[15,283,284],{},"Der Kerngedanke: Gib der AI strukturierte Tool-Definitionen und lass sie selbst entscheiden, wann sie welches Tool nutzt.",[105,286,288],{"className":107,"code":287,"language":109,"meta":110,"style":110},"TOOLS = [\n    {\"name\": \"run_command\", \"description\": \"Run a shell command\"},\n    {\"name\": \"read_file\", \"description\": \"Read a file\"},\n    {\"name\": \"write_file\", \"description\": \"Write to a file\"},\n    {\"name\": \"web_search\", \"description\": \"Search the web\"},\n]\n",[112,289,290,295,300,305,310,315],{"__ignoreMap":110},[115,291,292],{"class":117,"line":118},[115,293,294],{},"TOOLS = [\n",[115,296,297],{"class":117,"line":124},[115,298,299],{},"    {\"name\": \"run_command\", \"description\": \"Run a shell command\"},\n",[115,301,302],{"class":117,"line":130},[115,303,304],{},"    {\"name\": \"read_file\", \"description\": \"Read a file\"},\n",[115,306,307],{"class":117,"line":136},[115,308,309],{},"    {\"name\": \"write_file\", \"description\": \"Write to a file\"},\n",[115,311,312],{"class":117,"line":142},[115,313,314],{},"    {\"name\": \"web_search\", \"description\": \"Search the web\"},\n",[115,316,317],{"class":117,"line":148},[115,318,319],{},"]\n",[15,321,322,323,326],{},"Plus den ",[19,324,325],{},"Agent Loop",": LLM aufrufen → prüfen ob Tool-Call → Tool ausführen → Ergebnis zurück ins LLM → wiederholen bis fertig.",[105,328,333],{"className":329,"code":331,"language":332},[330],"language-text","Du: Erstelle hello.py und führe es aus\nBot: [write_file → hello.py]\n     [run_command → python hello.py]\n     Done! Output: \"hello world\"\n","text",[112,334,331],{"__ignoreMap":110},[15,336,337],{},"Die AI entscheidet selbst über Reihenfolge und Auswahl der Tools. OpenClaws Produktions-Katalog umfasst Browser-Automation, Inter-Agent-Messaging, Sub-Agent-Spawning und mehr — aber jedes Tool folgt exakt diesem Muster: Schema + Beschreibung + Ausführungsfunktion.",[100,339,341],{"id":340},"schritt-5-sicherheit-rm-rf-verhindern","Schritt 5: Sicherheit — \"rm -rf /\" verhindern",[15,343,344,345,348],{},"Shell-Commands über Telegram ausführen? Albtraum-Szenario. Die Lösung: Eine ",[19,346,347],{},"Allowlist mit persistenten Approvals",".",[105,350,352],{"className":107,"code":351,"language":109,"meta":110,"style":110},"SAFE_COMMANDS = {\"ls\", \"cat\", \"head\", \"date\", \"whoami\", \"git\"}\n\ndef check_command_safety(command):\n    if base_cmd in SAFE_COMMANDS: return \"safe\"\n    if command in approved_list: return \"approved\"\n    return \"needs_approval\"  # → User wird gefragt\n",[112,353,354,359,365,370,375,380],{"__ignoreMap":110},[115,355,356],{"class":117,"line":118},[115,357,358],{},"SAFE_COMMANDS = {\"ls\", \"cat\", \"head\", \"date\", \"whoami\", \"git\"}\n",[115,360,361],{"class":117,"line":124},[115,362,364],{"emptyLinePlaceholder":363},true,"\n",[115,366,367],{"class":117,"line":130},[115,368,369],{},"def check_command_safety(command):\n",[115,371,372],{"class":117,"line":136},[115,373,374],{},"    if base_cmd in SAFE_COMMANDS: return \"safe\"\n",[115,376,377],{"class":117,"line":142},[115,378,379],{},"    if command in approved_list: return \"approved\"\n",[115,381,382],{"class":117,"line":148},[115,383,384],{},"    return \"needs_approval\"  # → User wird gefragt\n",[15,386,387,388,391,392,396,397,400,401,404],{},"Einmal genehmigt, wird der Command gespeichert. OpenClaw erweitert das mit Glob-Patterns (",[112,389,390],{},"git *"," einmal genehmigen) und einem drei-stufigen Modell: ",[393,394,395],"em",{},"ask"," (User fragen), ",[393,398,399],{},"record"," (loggen aber erlauben), ",[393,402,403],{},"ignore"," (auto-allow).",[100,406,408],{"id":407},"schritt-6-multi-channel-das-gateway-pattern","Schritt 6: Multi-Channel — Das Gateway-Pattern",[15,410,411],{},"Bisher: Ein Telegram-Bot. Aber was ist mit Discord? WhatsApp? Slack?",[15,413,414,415,418,419,422],{},"Der Trick: Die ",[112,416,417],{},"run_agent_turn()","-Funktion weiss ",[19,420,421],{},"nichts"," über Telegram. Sie nimmt Messages rein und gibt Text zurück. Die Agent-Logik ist bereits vom Channel entkoppelt.",[15,424,425,426,429],{},"Beweis: Einen HTTP-Endpoint daneben stellen, der die ",[19,427,428],{},"gleichen Sessions"," nutzt:",[105,431,433],{"className":107,"code":432,"language":109,"meta":110,"style":110},"# Via Telegram:\n\"Ich heisse Nader\" → \"Freut mich, Nader!\"\n\n# Via HTTP (gleiche User-ID):\ncurl -X POST /chat -d '{\"user_id\": \"SAME_ID\", \"message\": \"Wie heisse ich?\"}'\n→ {\"response\": \"Du heisst Nader!\"}\n",[112,434,435,440,445,449,454,459],{"__ignoreMap":110},[115,436,437],{"class":117,"line":118},[115,438,439],{},"# Via Telegram:\n",[115,441,442],{"class":117,"line":124},[115,443,444],{},"\"Ich heisse Nader\" → \"Freut mich, Nader!\"\n",[115,446,447],{"class":117,"line":130},[115,448,364],{"emptyLinePlaceholder":363},[115,450,451],{"class":117,"line":136},[115,452,453],{},"# Via HTTP (gleiche User-ID):\n",[115,455,456],{"class":117,"line":142},[115,457,458],{},"curl -X POST /chat -d '{\"user_id\": \"SAME_ID\", \"message\": \"Wie heisse ich?\"}'\n",[115,460,461],{"class":117,"line":148},[115,462,463],{},"→ {\"response\": \"Du heisst Nader!\"}\n",[15,465,466],{},"Gleicher Agent, gleiche Sessions, gleiches Gedächtnis. Zwei verschiedene Interfaces. Das ist das Gateway-Pattern — und exakt so funktioniert OpenClaw: Ein zentraler Prozess, der Telegram, Discord, WhatsApp, Slack, Signal und iMessage über eine Config-Datei verwaltet.",[100,468,470],{"id":469},"schritt-7-context-compaction-wenn-das-fenster-überläuft","Schritt 7: Context Compaction — Wenn das Fenster überläuft",[15,472,473,474,477],{},"Nach Wochen des Chattens: Tausende Messages, Token-Limit überschritten. Die Lösung: ",[19,475,476],{},"Alte Nachrichten zusammenfassen",", neue behalten.",[105,479,481],{"className":107,"code":480,"language":109,"meta":110,"style":110},"def compact_session(messages):\n    if token_count \u003C 100_000: return messages  # Noch Platz\n    old, recent = messages[:half], messages[half:]\n    summary = ai.summarize(old)  # \"Preserve key facts, decisions, TODOs\"\n    return [{\"role\": \"user\", \"content\": f\"[Summary]\\n{summary}\"}] + recent\n",[112,482,483,488,493,498,503],{"__ignoreMap":110},[115,484,485],{"class":117,"line":118},[115,486,487],{},"def compact_session(messages):\n",[115,489,490],{"class":117,"line":124},[115,491,492],{},"    if token_count \u003C 100_000: return messages  # Noch Platz\n",[115,494,495],{"class":117,"line":130},[115,496,497],{},"    old, recent = messages[:half], messages[half:]\n",[115,499,500],{"class":117,"line":136},[115,501,502],{},"    summary = ai.summarize(old)  # \"Preserve key facts, decisions, TODOs\"\n",[115,504,505],{"class":117,"line":142},[115,506,507],{},"    return [{\"role\": \"user\", \"content\": f\"[Summary]\\n{summary}\"}] + recent\n",[15,509,510],{},"Der Bot behält sein Wissen, ohne am Token-Limit zu scheitern. OpenClaws Compaction ist ausgefeilter — chunked Summaries mit Safety-Margin — aber die Kernidee ist identisch.",[100,512,514],{"id":513},"schritt-8-langzeitgedächtnis-über-sessions-hinaus","Schritt 8: Langzeitgedächtnis — Über Sessions hinaus",[15,516,517],{},"Session-History = Gesprächsgedächtnis. Aber was passiert bei Session-Reset? Alles weg.",[15,519,520,521,524],{},"Lösung: ",[19,522,523],{},"Datei-basiertes Gedächtnis"," als separate Tools:",[105,526,529],{"className":527,"code":528,"language":332},[330],"Du: Mein Lieblingsrestaurant ist Elvies, 19 Uhr Reservierung\nBot: [save_memory → user-preferences.md] Gespeichert!\n\n[Session-Reset, Tage später...]\n\nDu: Wo sollen wir essen gehen?\nBot: [memory_search → \"restaurant\"] Wie wärs mit Elvies? 19 Uhr wie immer?\n",[112,530,528],{"__ignoreMap":110},[15,532,533],{},"Das Gedächtnis überlebt Session-Resets, weil es in Dateien lebt — nicht in der Session. OpenClaws Produktion nutzt Vektor-Suche mit Embeddings für semantisches Matching (\"Auth Bug\" findet auch \"Authentifizierungs-Problem\").",[100,535,537],{"id":536},"schritt-9-heartbeats-der-agent-wacht-von-selbst-auf","Schritt 9: Heartbeats — Der Agent wacht von selbst auf",[15,539,540],{},"Bisher: Der Agent reagiert nur auf Nachrichten. Aber was ist mit dem morgendlichen Kalender-Check?",[105,542,544],{"className":107,"code":543,"language":109,"meta":110,"style":110},"schedule.every().day.at(\"07:30\").do(morning_briefing)\n",[112,545,546],{"__ignoreMap":110},[115,547,548],{"class":117,"line":118},[115,549,543],{},[15,551,552,553,556,557,559],{},"Jeder Heartbeat bekommt seine eigene Session (",[112,554,555],{},"cron:morning-briefing","), damit geplante Tasks den Hauptchat nicht verschmutzen. Es ist derselbe ",[112,558,417],{}," — nur ausgelöst durch einen Timer statt durch einen Menschen.",[100,561,563],{"id":562},"schritt-10-multi-agent-spezialisierung","Schritt 10: Multi-Agent — Spezialisierung",[15,565,566],{},"Ein Agent für alles wird irgendwann zum Flaschenhals. Lösung: Mehrere Agents mit eigenem SOUL und eigenem Session-Key:",[105,568,571],{"className":569,"code":570,"language":332},[330],"Du: Wie wird das Wetter?\n[Jarvis] Sonnig und warm!\n\nDu: /research Best Practices für Python Async\n[Scout] Hier meine Recherche-Ergebnisse...\n       [web_search → save_memory]\n       Die wichtigsten Practices sind: 1) asyncio.gather...\n\nDu: Was hat Scout über Python Async herausgefunden?\n[Jarvis] [memory_search] Scout fand heraus, dass...\n",[112,572,570],{"__ignoreMap":110},[15,574,575,576,579],{},"Jeder Agent hat seine eigene Conversation History, aber sie teilen sich das ",[19,577,578],{},"gleiche Memory-Verzeichnis",". Scout speichert Recherche-Ergebnisse; Jarvis kann sie später abrufen. Kollaboration über geteilte Dateien, ohne direktes Messaging.",[45,581],{},[48,583,585],{"id":584},"das-gesamtbild-400-zeilen","Das Gesamtbild: ~400 Zeilen",[15,587,588],{},"Dabits finaler Prototyp kombiniert alles in einem lauffähigen Script:",[105,590,594],{"className":591,"code":592,"language":593,"meta":110,"style":110},"language-bash shiki shiki-themes github-light github-dark","uv run --with anthropic --with schedule python mini-openclaw.py\n","bash",[112,595,596],{"__ignoreMap":110},[115,597,598,602,606,610,613,615,618,621],{"class":117,"line":118},[115,599,601],{"class":600},"sScJk","uv",[115,603,605],{"class":604},"sZZnC"," run",[115,607,609],{"class":608},"sj4cs"," --with",[115,611,612],{"class":604}," anthropic",[115,614,609],{"class":608},[115,616,617],{"class":604}," schedule",[115,619,620],{"class":604}," python",[115,622,623],{"class":604}," mini-openclaw.py\n",[625,626,627,640],"table",{},[628,629,630],"thead",{},[631,632,633,637],"tr",{},[634,635,636],"th",{},"Feature",[634,638,639],{},"Löst welches Problem?",[641,642,643,654,664,674,684,694,704,714,724,734],"tbody",{},[631,644,645,651],{},[646,647,648],"td",{},[19,649,650],{},"JSONL Sessions",[646,652,653],{},"\"Die AI kann sich an nichts erinnern\"",[631,655,656,661],{},[646,657,658],{},[19,659,660],{},"SOUL.md",[646,662,663],{},"\"Sie antwortet wie ein generischer Chatbot\"",[631,665,666,671],{},[646,667,668],{},[19,669,670],{},"Tools + Agent Loop",[646,672,673],{},"\"Sie kann nur reden, nicht handeln\"",[631,675,676,681],{},[646,677,678],{},[19,679,680],{},"Permission Controls",[646,682,683],{},"\"Sie führt gefährliche Commands aus\"",[631,685,686,691],{},[646,687,688],{},[19,689,690],{},"Gateway Pattern",[646,692,693],{},"\"Ich will sie auf allen Messaging-Apps\"",[631,695,696,701],{},[646,697,698],{},[19,699,700],{},"Context Compaction",[646,702,703],{},"\"Die Konversation wurde zu lang\"",[631,705,706,711],{},[646,707,708],{},[19,709,710],{},"Langzeitgedächtnis",[646,712,713],{},"\"Sie vergisst alles zwischen Sessions\"",[631,715,716,721],{},[646,717,718],{},[19,719,720],{},"Session Locks",[646,722,723],{},"\"Zwei Nachrichten gleichzeitig = Chaos\"",[631,725,726,731],{},[646,727,728],{},[19,729,730],{},"Heartbeats",[646,732,733],{},"\"Ich will dass sie selbständig Dinge tut\"",[631,735,736,741],{},[646,737,738],{},[19,739,740],{},"Multi-Agent Routing",[646,742,743],{},"\"Ein Agent kann nicht alles gut\"",[15,745,746,747,750],{},"Jedes Feature entstand aus einem ",[19,748,749],{},"konkreten Problem",". Keine Overengineering-Fantasie, sondern: \"Das nervt → so fixe ich es.\"",[45,752],{},[48,754,756],{"id":755},"was-openclaw-darüber-hinaus-bietet","Was OpenClaw darüber hinaus bietet",[15,758,759],{},"Der Prototyp deckt die Kernarchitektur ab. OpenClaws Produktion erweitert jedes Konzept:",[56,761,762,768,786,792,798],{},[59,763,764,767],{},[19,765,766],{},"Browser-Automation",": Playwright-basiert, aber statt 5MB-Screenshots werden semantische Snapshots (Text-Repräsentation des Accessibility Trees) verwendet — ~100x kleiner, jedes Element bekommt eine Ref-ID zum Anklicken",[59,769,770,773,774,777,778,781,782,785],{},[19,771,772],{},"Session-Scoping",": ",[112,775,776],{},"main"," (ein Chat für alles), ",[112,779,780],{},"per-peer"," (pro Person), ",[112,783,784],{},"per-channel-peer"," (pro Person pro Kanal) — plus Identity-Links um Sessions über Kanäle zu mergen",[59,787,788,791],{},[19,789,790],{},"Channel-Plugins",": Jeder Kanal (Telegram, Discord, WhatsApp, Slack, Signal, iMessage) ist ein separater Adapter — neuen Kanal hinzufügen = ein Plugin schreiben, keine Agent-Logik anfassen",[59,793,794,797],{},[19,795,796],{},"Hybride Memory-Suche",": Vektor-Suche via SQLite + FTS5 für exakte Keywords, konfigurierbare Embedding-Provider (OpenAI, lokale Modelle, Gemini, Voyage)",[59,799,800,803],{},[19,801,802],{},"Sub-Agent Spawning",": Ein Parent-Agent spawnt programmgesteuert Child-Agents für fokussierte Tasks — \"recherchiere das im Detail\" als Delegation",[45,805],{},[48,807,809],{"id":808},"fazit-einfacher-als-gedacht-mächtiger-als-erwartet","Fazit: Einfacher als gedacht, mächtiger als erwartet",[15,811,812],{},"Dabits Artikel ist einer der besten \"from first principles\"-Texte im AI-Agent-Space. Er zeigt, dass hinter dem Buzzword \"persönlicher AI-Assistent\" keine Magie steckt — sondern solide Software-Engineering-Patterns:",[56,814,815,818,821,824,827],{},[59,816,817],{},"JSONL als crash-safe Session-Storage",[59,819,820],{},"System-Prompts als Persönlichkeits-Definition",[59,822,823],{},"Strukturierte Tools mit Agent Loop",[59,825,826],{},"Per-Session Locking für Concurrency",[59,828,829],{},"Das Gateway-Pattern für Multi-Channel",[15,831,832,833,836],{},"Wer die Grundlagen versteht, kann entweder ",[19,834,835],{},"sein eigenes System bauen"," — oder OpenClaw nutzen und wissen, was unter der Haube passiert.",[838,839,840],"blockquote",{},[15,841,842,845],{},[393,843,844],{},"\"Or just use OpenClaw. It's open source and handles all the edge cases we glossed over. But now you know how it works under the hood.\""," — Nader Dabit",[100,847,849],{"id":848},"links","Links",[56,851,852,862,871],{},[59,853,854,773,857,861],{},[19,855,856],{},"Originalartikel",[27,858,860],{"href":36,"rel":859},[31],"You Could've Invented OpenClaw"," (Nader Dabit, Substack)",[59,863,864,773,867],{},[19,865,866],{},"OpenClaw GitHub",[27,868,870],{"href":29,"rel":869},[31],"github.com/openclaw/openclaw",[59,872,873,773,876],{},[19,874,875],{},"OpenClaw Docs",[27,877,880],{"href":878,"rel":879},"https://docs.openclaw.ai",[31],"docs.openclaw.ai",[882,883,884],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":110,"searchDepth":124,"depth":124,"links":886},[887,888,900,901,902],{"id":50,"depth":124,"text":51},{"id":94,"depth":124,"text":95,"children":889},[890,891,892,893,894,895,896,897,898,899],{"id":102,"depth":130,"text":103},{"id":169,"depth":130,"text":170},{"id":203,"depth":130,"text":204},{"id":280,"depth":130,"text":281},{"id":340,"depth":130,"text":341},{"id":407,"depth":130,"text":408},{"id":469,"depth":130,"text":470},{"id":513,"depth":130,"text":514},{"id":536,"depth":130,"text":537},{"id":562,"depth":130,"text":563},{"id":584,"depth":124,"text":585},{"id":755,"depth":124,"text":756},{"id":808,"depth":124,"text":809,"children":903},[904],{"id":848,"depth":130,"text":849},"2026-02-14","Nader Dabit zeigt Schritt für Schritt, wie man einen persistenten AI-Assistenten mit Gedächtnis, Tools und Multi-Channel-Support von Grund auf baut — und erklärt damit die Architektur hinter OpenClaw.","md","de",{},"/blog/2026-02-14-openclaw-persoenlicher-ai-assistent-selber-bauen",{"title":5,"description":906},"blog/2026-02-14-openclaw-persoenlicher-ai-assistent-selber-bauen",[914,915,916,917,109,918,919],"ai","openclaw","assistant","tutorial","architektur","agenten","dbWV4UtfnCPKmtIE3op6EsHrQ0nPbNaAO0NrXFudDrg",1784088102148]