[{"data":1,"prerenderedAt":888},["ShallowReactive",2],{"blog-2026-03-18-fabro-ki-workflow-engine-fuer-experten":3},{"id":4,"title":5,"author":6,"body":7,"date":872,"description":873,"extension":874,"language":875,"meta":876,"navigation":96,"path":877,"seo":878,"stem":879,"tags":880,"__hash__":887},"blog/blog/2026-03-18-fabro-ki-workflow-engine-fuer-experten.md","Fabro: Die Dark Software Factory für KI-Agenten mit Hirn","NeoAI",{"type":8,"value":9,"toc":858},"minimark",[10,14,17,22,37,51,146,150,153,156,163,167,174,177,305,308,342,345,349,352,470,487,490,494,497,500,520,523,527,536,563,566,570,573,593,600,604,607,618,627,631,634,660,664,752,761,765,768,771,778,781,786,809,854],[11,12,13],"p",{},"Es gibt zwei Arten, mit KI-Coding-Agenten zu arbeiten. Die erste: jeden Schritt manuell begleiten, jede Entscheidung abnicken, jeden Output prüfen — Babysitting auf Entwicklerniveau. Die zweite: dem Agenten die Aufgabe überlassen, nach einer Stunde zurückkommen, und einen 50-Dateien-Diff vorfinden, dem man nicht vertraut.",[11,15,16],{},"Fabro nennt beides unzureichend. Und bietet einen dritten Weg.",[18,19,21],"h2",{"id":20},"was-ist-fabro","Was ist Fabro?",[11,23,24,31,32,36],{},[25,26,30],"a",{"href":27,"rel":28},"https://fabro.sh",[29],"nofollow","Fabro"," — \"The Dark Software Factory\" — ist eine Open-Source Workflow-Engine für KI-Coding-Agenten. Das Kernkonzept: Softwareprozesse werden nicht als Prompt, sondern als ",[33,34,35],"strong",{},"versionierter, deterministischer Graph"," definiert. Der Agent führt den Graph aus. Der Entwickler greift nur da ein, wo es wirklich drauf ankommt.",[11,38,39,40],{},"Das Projekt ist in Rust geschrieben, MIT-lizenziert, selbst-gehostet, und braucht — das ist bemerkenswert — kein Python, kein Node.js, kein Docker. Ein einzelnes Binary, keine Abhängigkeiten.",[41,42,43],"sup",{},[25,44,50],{"href":45,"ariaDescribedBy":46,"dataFootnoteRef":48,"id":49},"#user-content-fn-1",[47],"footnote-label","","user-content-fnref-1","1",[52,53,57],"pre",{"className":54,"code":55,"language":56,"meta":48,"style":48},"language-bash shiki shiki-themes github-light github-dark","# Installation via Claude Code\ncurl -fsSL https://fabro.sh/install.md | claude\n\n# Via Codex\ncodex \"$(curl -fsSL https://fabro.sh/install.md)\"\n\n# Via Bash\ncurl -fsSL https://fabro.sh/install.sh | bash\n","bash",[58,59,60,69,91,98,104,120,125,131],"code",{"__ignoreMap":48},[61,62,65],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"sJ8bj","# Installation via Claude Code\n",[61,70,72,76,80,84,88],{"class":63,"line":71},2,[61,73,75],{"class":74},"sScJk","curl",[61,77,79],{"class":78},"sj4cs"," -fsSL",[61,81,83],{"class":82},"sZZnC"," https://fabro.sh/install.md",[61,85,87],{"class":86},"szBVR"," |",[61,89,90],{"class":74}," claude\n",[61,92,94],{"class":63,"line":93},3,[61,95,97],{"emptyLinePlaceholder":96},true,"\n",[61,99,101],{"class":63,"line":100},4,[61,102,103],{"class":67},"# Via Codex\n",[61,105,107,110,113,115,117],{"class":63,"line":106},5,[61,108,109],{"class":74},"codex",[61,111,112],{"class":82}," \"$(",[61,114,75],{"class":74},[61,116,79],{"class":78},[61,118,119],{"class":82}," https://fabro.sh/install.md)\"\n",[61,121,123],{"class":63,"line":122},6,[61,124,97],{"emptyLinePlaceholder":96},[61,126,128],{"class":63,"line":127},7,[61,129,130],{"class":67},"# Via Bash\n",[61,132,134,136,138,141,143],{"class":63,"line":133},8,[61,135,75],{"class":74},[61,137,79],{"class":78},[61,139,140],{"class":82}," https://fabro.sh/install.sh",[61,142,87],{"class":86},[61,144,145],{"class":74}," bash\n",[18,147,149],{"id":148},"das-kernproblem-agenten-haben-keinen-prozess","Das Kernproblem: Agenten haben keinen Prozess",[11,151,152],{},"Aktuelle KI-Coding-Agenten sind gut darin, Aufgaben zu erledigen — aber sie haben kein Prozessgedächtnis. Jede Session beginnt von vorne. Es gibt keine formale Unterscheidung zwischen \"planende Phase\" und \"implementierende Phase\", kein eingebautes Review-Gate, keine automatische Verifikation.",[11,154,155],{},"Das Ergebnis ist entweder Micromanagement oder blinder Vertrauen.",[11,157,158,159,162],{},"Fabro's Antwort: ",[33,160,161],{},"Workflow-as-Code",". Der Prozess wird explizit gemacht, in Graphviz DOT geschrieben, versioniert wie Quellcode — und ist damit reviewbar, wiederholbar und iterierbar.",[18,164,166],{"id":165},"workflow-graphen-in-graphviz-dot","Workflow-Graphen in Graphviz DOT",[11,168,169,170,173],{},"Das zentrale Artefakt in Fabro ist eine ",[58,171,172],{},".fabro","-Datei — ein gerichteter Graph in der Graphviz DOT-Sprache. Jeder Knoten ist eine Stage: Agent, Shell-Kommando, Human Gate oder Bedingung. Kanten definieren den Ablauf.",[11,175,176],{},"Ein einfaches Plan-Approve-Implement-Workflow:",[52,178,182],{"className":179,"code":180,"language":181,"meta":48,"style":48},"language-dot shiki shiki-themes github-light github-dark","digraph PlanImplement {\n  graph [\n    goal=\"Plan, approve, implement, and simplify a change\"\n    model_stylesheet=\"\n      * { model: claude-haiku-4-5; reasoning_effort: low; }\n      .coding { model: claude-sonnet-4-5; reasoning_effort: high; }\n    \"\n  ]\n\n  start [shape=Mdiamond, label=\"Start\"]\n  exit  [shape=Msquare,  label=\"Exit\"]\n\n  plan      [label=\"Plan\",      prompt=\"Analyze the goal. Write a step-by-step plan.\"]\n  approve   [shape=hexagon,     label=\"Approve Plan\"]\n  implement [label=\"Implement\", class=\"coding\"]\n  simplify  [label=\"Simplify\",  class=\"coding\"]\n\n  start -> plan -> approve\n  approve -> implement [label=\"Approve\"]\n  approve -> plan      [label=\"Revise\"]\n  implement -> simplify -> exit\n}\n","dot",[58,183,184,189,194,199,204,209,214,219,224,229,235,241,246,252,258,264,270,275,281,287,293,299],{"__ignoreMap":48},[61,185,186],{"class":63,"line":64},[61,187,188],{},"digraph PlanImplement {\n",[61,190,191],{"class":63,"line":71},[61,192,193],{},"  graph [\n",[61,195,196],{"class":63,"line":93},[61,197,198],{},"    goal=\"Plan, approve, implement, and simplify a change\"\n",[61,200,201],{"class":63,"line":100},[61,202,203],{},"    model_stylesheet=\"\n",[61,205,206],{"class":63,"line":106},[61,207,208],{},"      * { model: claude-haiku-4-5; reasoning_effort: low; }\n",[61,210,211],{"class":63,"line":122},[61,212,213],{},"      .coding { model: claude-sonnet-4-5; reasoning_effort: high; }\n",[61,215,216],{"class":63,"line":127},[61,217,218],{},"    \"\n",[61,220,221],{"class":63,"line":133},[61,222,223],{},"  ]\n",[61,225,227],{"class":63,"line":226},9,[61,228,97],{"emptyLinePlaceholder":96},[61,230,232],{"class":63,"line":231},10,[61,233,234],{},"  start [shape=Mdiamond, label=\"Start\"]\n",[61,236,238],{"class":63,"line":237},11,[61,239,240],{},"  exit  [shape=Msquare,  label=\"Exit\"]\n",[61,242,244],{"class":63,"line":243},12,[61,245,97],{"emptyLinePlaceholder":96},[61,247,249],{"class":63,"line":248},13,[61,250,251],{},"  plan      [label=\"Plan\",      prompt=\"Analyze the goal. Write a step-by-step plan.\"]\n",[61,253,255],{"class":63,"line":254},14,[61,256,257],{},"  approve   [shape=hexagon,     label=\"Approve Plan\"]\n",[61,259,261],{"class":63,"line":260},15,[61,262,263],{},"  implement [label=\"Implement\", class=\"coding\"]\n",[61,265,267],{"class":63,"line":266},16,[61,268,269],{},"  simplify  [label=\"Simplify\",  class=\"coding\"]\n",[61,271,273],{"class":63,"line":272},17,[61,274,97],{"emptyLinePlaceholder":96},[61,276,278],{"class":63,"line":277},18,[61,279,280],{},"  start -> plan -> approve\n",[61,282,284],{"class":63,"line":283},19,[61,285,286],{},"  approve -> implement [label=\"Approve\"]\n",[61,288,290],{"class":63,"line":289},20,[61,291,292],{},"  approve -> plan      [label=\"Revise\"]\n",[61,294,296],{"class":63,"line":295},21,[61,297,298],{},"  implement -> simplify -> exit\n",[61,300,302],{"class":63,"line":301},22,[61,303,304],{},"}\n",[11,306,307],{},"Was hier passiert:",[309,310,311,320,328],"ul",{},[312,313,314,319],"li",{},[33,315,316],{},[58,317,318],{},"plan"," ist ein Agent-Knoten. Er analysiert die Codebase, schreibt einen Plan.",[312,321,322,327],{},[33,323,324],{},[58,325,326],{},"approve"," ist ein Human Gate (Hexagon). Der Workflow pausiert. Der Entwickler prüft den Plan, approvet oder schickt ihn zur Revision.",[312,329,330,335,336,341],{},[33,331,332],{},[58,333,334],{},"implement"," und ",[33,337,338],{},[58,339,340],{},"simplify"," sind Coding-Stages mit einem anderen Model (Sonnet statt Haiku).",[11,343,344],{},"Der Graph ist diffbar. Er lebt im Repository. Er kann wie Code reviewed und geändert werden.",[18,346,348],{"id":347},"multi-model-routing-via-css-stylesheets","Multi-Model-Routing via CSS-Stylesheets",[11,350,351],{},"Einer der originellsten Aspekte von Fabro ist das Model-Routing. Statt alle Nodes an dasselbe LLM zu schicken, werden Models in einer CSS-ähnlichen Syntax zugewiesen — mit Selector-Spezifität:",[52,353,357],{"className":354,"code":355,"language":356,"meta":48,"style":48},"language-css shiki shiki-themes github-light github-dark","/* Standard: schnell und günstig */\n* {\n  model: claude-haiku-4-5;\n  reasoning_effort: low;\n}\n\n/* Coding-Stages: Frontier-Model */\n.coding {\n  model: claude-sonnet-4-5;\n  reasoning_effort: high;\n}\n\n/* Cross-Kritik mit anderem Provider */\n#review {\n  model: gemini-3.1-pro-preview;\n}\n","css",[58,358,359,364,374,382,396,400,404,409,416,423,434,438,442,447,454,466],{"__ignoreMap":48},[61,360,361],{"class":63,"line":64},[61,362,363],{"class":67},"/* Standard: schnell und günstig */\n",[61,365,366,370],{"class":63,"line":71},[61,367,369],{"class":368},"s9eBZ","*",[61,371,373],{"class":372},"sVt8B"," {\n",[61,375,376,379],{"class":63,"line":93},[61,377,378],{"class":78},"  model",[61,380,381],{"class":372},": claude-haiku-4-5;\n",[61,383,384,387,390,393],{"class":63,"line":100},[61,385,386],{"class":78},"  reasoning",[61,388,389],{"class":372},"_",[61,391,392],{"class":78},"effort",[61,394,395],{"class":372},": low;\n",[61,397,398],{"class":63,"line":106},[61,399,304],{"class":372},[61,401,402],{"class":63,"line":122},[61,403,97],{"emptyLinePlaceholder":96},[61,405,406],{"class":63,"line":127},[61,407,408],{"class":67},"/* Coding-Stages: Frontier-Model */\n",[61,410,411,414],{"class":63,"line":133},[61,412,413],{"class":74},".coding",[61,415,373],{"class":372},[61,417,418,420],{"class":63,"line":226},[61,419,378],{"class":78},[61,421,422],{"class":372},": claude-sonnet-4-5;\n",[61,424,425,427,429,431],{"class":63,"line":231},[61,426,386],{"class":78},[61,428,389],{"class":372},[61,430,392],{"class":78},[61,432,433],{"class":372},": high;\n",[61,435,436],{"class":63,"line":237},[61,437,304],{"class":372},[61,439,440],{"class":63,"line":243},[61,441,97],{"emptyLinePlaceholder":96},[61,443,444],{"class":63,"line":248},[61,445,446],{"class":67},"/* Cross-Kritik mit anderem Provider */\n",[61,448,449,452],{"class":63,"line":254},[61,450,451],{"class":74},"#review",[61,453,373],{"class":372},[61,455,456,458,461,463],{"class":63,"line":260},[61,457,378],{"class":78},[61,459,460],{"class":372},": gemini-3.",[61,462,50],{"class":78},[61,464,465],{"class":372},"-pro-preview;\n",[61,467,468],{"class":63,"line":266},[61,469,304],{"class":372},[11,471,472,473,476,477,480,481],{},"Die Spezifität-Logik folgt CSS: ",[58,474,475],{},"#id > .class > shape > *",". Ein Node kann einer Klasse zugewiesen werden (",[58,478,479],{},"class=\"coding\"","), und bekommt damit automatisch das konfigurierte Model. Das bedeutet: billiges Model für Planung und Analyse, teures Model nur dort, wo es zählt. Laut Fabro-Dokumentation reduziert das die Token-Kosten erheblich ohne Qualitätseinbussen bei den kritischen Stages.",[41,482,483],{},[25,484,50],{"href":45,"ariaDescribedBy":485,"dataFootnoteRef":48,"id":486},[47],"user-content-fnref-1-2",[11,488,489],{},"Unterstützt werden aktuell: Anthropic, OpenAI, Gemini — mit automatischen Fallback-Chains wenn ein Provider nicht erreichbar ist.",[18,491,493],{"id":492},"human-in-the-loop-als-first-class-concept","Human-in-the-Loop als First-Class Concept",[11,495,496],{},"Fabro behandelt menschliche Entscheidungen nicht als Sonderfall, sondern als normalen Node-Typ. Human Gates sind Hexagon-förmige Knoten, die den Workflow pausieren bis ein Mensch interagiert.",[11,498,499],{},"Drei Arten von Human-Interaktion:",[309,501,502,508,514],{},[312,503,504,507],{},[33,505,506],{},"Approval Gates"," — Approve oder Revise, mit Feedback",[312,509,510,513],{},[33,511,512],{},"Interview Steps"," — Strukturierte Eingabe sammeln (z.B. Feature-Specs, Anforderungen)",[312,515,516,519],{},[33,517,518],{},"Mid-turn Steering"," — Laufende Agenten können während der Ausführung gesteuert werden",[11,521,522],{},"Das gibt Engineers die Kontrolle zurück, ohne sie in jeden Schritt zu involvieren.",[18,524,526],{"id":525},"cloud-sandboxes-und-ssh-zugriff","Cloud Sandboxes und SSH-Zugriff",[11,528,529,530,535],{},"Agenten laufen standardmässig auf dem lokalen Rechner. Für sicherheitsrelevante oder ressourcenintensive Workflows bietet Fabro Cloud Sandboxes via ",[25,531,534],{"href":532,"rel":533},"https://daytona.io",[29],"Daytona"," — isolierte Cloud-VMs mit:",[309,537,538,541,544,547,555],{},[312,539,540],{},"Snapshot-basiertem Setup (schnelle Umgebungsinitalisierung)",[312,542,543],{},"Konfigurierbaren Netzwerk-Kontrollen",[312,545,546],{},"Automatischem Cleanup nach dem Run",[312,548,549,554],{},[33,550,551],{},[58,552,553],{},"fabro ssh"," — Shell-Zugang in laufende Sandboxes",[312,556,557,562],{},[33,558,559],{},[58,560,561],{},"fabro preview"," — Port-Forwarding für Live-Previews",[11,564,565],{},"Das bedeutet: untrusted Code läuft nicht mehr auf dem eigenen Laptop. Der Agent kann beliebige Befehle ausführen, ohne das lokale System zu gefährden.",[18,567,569],{"id":568},"git-checkpointing-und-retrospektiven","Git Checkpointing und Retrospektiven",[11,571,572],{},"Nach jeder Stage committet Fabro automatisch den aktuellen Stand auf einem Git-Branch — inklusive Execution-Metadaten. Das erlaubt:",[309,574,575,581,587],{},[312,576,577,580],{},[33,578,579],{},"Resume"," — Unterbrochene Workflows können von jedem Checkpoint fortgesetzt werden",[312,582,583,586],{},[33,584,585],{},"Revert"," — Zurückrollen auf jeden Zustand",[312,588,589,592],{},[33,590,591],{},"Tracing"," — Vollständige Nachvollziehbarkeit was welcher Agent wann geändert hat",[11,594,595,596,599],{},"Am Ende jedes Runs generiert Fabro eine ",[33,597,598],{},"automatische Retrospektive",": Kosten, Dauer, berührte Dateien, und ein LLM-geschriebenes Narrativ das erklärt was gemacht wurde und wo Reibung entstand. Die Idee dahinter ist ein Compounding-Effekt: Workflows verbessern sich über Zeit, nicht nur der Code.",[18,601,603],{"id":602},"api-server-und-web-ui","API-Server und Web-UI",[11,605,606],{},"Fabro läuft entweder als lokales CLI oder als persistenter API-Server mit REST-Endpunkten und SSE-Event-Streaming. Eine React Web-UI ist eingebaut. Das bedeutet:",[309,608,609,612,615],{},[312,610,611],{},"Workflows können programmatisch getriggert werden (CI/CD-Integration)",[312,613,614],{},"Runs werden gequeued und parallel ausgeführt",[312,616,617],{},"Der Laptop muss nicht offen bleiben — Workflows laufen auch nach dem Schliessen weiter",[11,619,620,621],{},"Die vollständige OpenAPI-Spezifikation inklusive Client-SDKs ist dokumentiert.",[41,622,623],{},[25,624,50],{"href":45,"ariaDescribedBy":625,"dataFootnoteRef":48,"id":626},[47],"user-content-fnref-1-3",[18,628,630],{"id":629},"was-fabro-nicht-ist","Was Fabro NICHT ist",[11,632,633],{},"Ähnlich wie Paperclip ist Fabro ehrlich darin, was es nicht löst:",[309,635,636,642,648,654],{},[312,637,638,641],{},[33,639,640],{},"Kein Agent-Framework"," — Fabro baut keine Agenten. Es orchestriert sie.",[312,643,644,647],{},[33,645,646],{},"Kein Prompt-Manager"," — Prompts gehören zu den Workflow-Nodes, nicht zu Fabro selbst.",[312,649,650,653],{},[33,651,652],{},"Kein Code-Review-Tool"," — Fabro orchestriert Arbeit, nicht Pull Requests.",[312,655,656,659],{},[33,657,658],{},"Keine Magie"," — Ein schlecht definierter Graph liefert schlechte Ergebnisse. Fabro macht den Prozess explizit, aber nicht automatisch gut.",[18,661,663],{"id":662},"installation-und-einstieg","Installation und Einstieg",[52,665,667],{"className":54,"code":666,"language":56,"meta":48,"style":48},"# Fabro global installieren\ncurl -fsSL https://fabro.sh/install.sh | bash\n\n# Einmaliges Setup\nfabro install\n\n# Pro-Projekt initialisieren\ncd my-project\nfabro init\n\n# Ersten Workflow ausführen\nfabro run plan-implement.fabro --goal \"Add input validation to the login form\"\n",[58,668,669,674,686,690,695,703,707,712,720,727,731,736],{"__ignoreMap":48},[61,670,671],{"class":63,"line":64},[61,672,673],{"class":67},"# Fabro global installieren\n",[61,675,676,678,680,682,684],{"class":63,"line":71},[61,677,75],{"class":74},[61,679,79],{"class":78},[61,681,140],{"class":82},[61,683,87],{"class":86},[61,685,145],{"class":74},[61,687,688],{"class":63,"line":93},[61,689,97],{"emptyLinePlaceholder":96},[61,691,692],{"class":63,"line":100},[61,693,694],{"class":67},"# Einmaliges Setup\n",[61,696,697,700],{"class":63,"line":106},[61,698,699],{"class":74},"fabro",[61,701,702],{"class":82}," install\n",[61,704,705],{"class":63,"line":122},[61,706,97],{"emptyLinePlaceholder":96},[61,708,709],{"class":63,"line":127},[61,710,711],{"class":67},"# Pro-Projekt initialisieren\n",[61,713,714,717],{"class":63,"line":133},[61,715,716],{"class":78},"cd",[61,718,719],{"class":82}," my-project\n",[61,721,722,724],{"class":63,"line":226},[61,723,699],{"class":74},[61,725,726],{"class":82}," init\n",[61,728,729],{"class":63,"line":231},[61,730,97],{"emptyLinePlaceholder":96},[61,732,733],{"class":63,"line":237},[61,734,735],{"class":67},"# Ersten Workflow ausführen\n",[61,737,738,740,743,746,749],{"class":63,"line":243},[61,739,699],{"class":74},[61,741,742],{"class":82}," run",[61,744,745],{"class":82}," plan-implement.fabro",[61,747,748],{"class":78}," --goal",[61,750,751],{"class":82}," \"Add input validation to the login form\"\n",[11,753,754,755,760],{},"Die Dokumentation unter ",[25,756,759],{"href":757,"rel":758},"https://docs.fabro.sh",[29],"docs.fabro.sh"," ist ausführlich — von Hello World bis zu parallelen Multi-Model-Ensembles.",[18,762,764],{"id":763},"einschätzung","Einschätzung",[11,766,767],{},"Fabro adressiert ein reales Problem: Die Lücke zwischen \"ich habe einen Agenten, der manchmal gute Ergebnisse liefert\" und \"ich habe einen zuverlässigen Softwareprozess, der reproduzierbar gute Ergebnisse liefert.\"",[11,769,770],{},"Die Graphviz-DOT-Syntax ist ungewöhnlich, aber konsequent: ein Softwareprozess ist ein Graph, und DOT ist eine bewährte, diffbare, lesbare Sprache dafür. Das CSS-ähnliche Model-Routing ist konzeptionell originell und praktisch sinnvoll.",[11,772,773,774,777],{},"Was mich besonders interessiert: das explizite Bekenntnis zu ",[33,775,776],{},"Verifikation als First-Class Concept",". Build-Failures und Testfehler triggernn automatische Fix-Loops. Human Gates sind keine Notlösung, sondern ein designierter Teil des Workflows. Das ist eine andere Philosophie als \"give the agent more context and hope for the best.\"",[11,779,780],{},"Ob Fabro sich durchsetzt, hängt davon ab, wie viel Aufwand Teams bereit sind, in die Workflow-Definition zu investieren. Der Lernaufwand ist real. Der potenzielle Return — wiederholbare, qualitätsgesicherte, kostenoptimierte Codier-Prozesse — ist es ebenfalls.",[11,782,783],{},[33,784,785],{},"Links:",[309,787,788,795,803],{},[312,789,790,791],{},"Website: ",[25,792,794],{"href":27,"rel":793},[29],"fabro.sh",[312,796,797,798],{},"GitHub: ",[25,799,802],{"href":800,"rel":801},"https://github.com/fabro-sh/fabro",[29],"fabro-sh/fabro",[312,804,805,806],{},"Dokumentation: ",[25,807,759],{"href":757,"rel":808},[29],[810,811,814,819],"section",{"className":812,"dataFootnotes":48},[813],"footnotes",[18,815,818],{"className":816,"id":47},[817],"sr-only","Footnotes",[820,821,822],"ol",{},[312,823,825,826,830,831,830,838,830,846],{"id":824},"user-content-fn-1","Fabro GitHub README und offizielle Dokumentation, Stand März 2026: ",[25,827,829],{"href":800,"rel":828},[29],"github.com/fabro-sh/fabro"," ",[25,832,837],{"href":833,"ariaLabel":834,"className":835,"dataFootnoteBackref":48},"#user-content-fnref-1","Back to reference 1",[836],"data-footnote-backref","↩",[25,839,837,843],{"href":840,"ariaLabel":841,"className":842,"dataFootnoteBackref":48},"#user-content-fnref-1-2","Back to reference 1-2",[836],[41,844,845],{},"2",[25,847,837,851],{"href":848,"ariaLabel":849,"className":850,"dataFootnoteBackref":48},"#user-content-fnref-1-3","Back to reference 1-3",[836],[41,852,853],{},"3",[855,856,857],"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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":48,"searchDepth":71,"depth":71,"links":859},[860,861,862,863,864,865,866,867,868,869,870,871],{"id":20,"depth":71,"text":21},{"id":148,"depth":71,"text":149},{"id":165,"depth":71,"text":166},{"id":347,"depth":71,"text":348},{"id":492,"depth":71,"text":493},{"id":525,"depth":71,"text":526},{"id":568,"depth":71,"text":569},{"id":602,"depth":71,"text":603},{"id":629,"depth":71,"text":630},{"id":662,"depth":71,"text":663},{"id":763,"depth":71,"text":764},{"id":47,"depth":71,"text":818},"2026-03-18","Fabro ist eine Open-Source Workflow-Engine, die KI-Coding-Agenten in versionierte, deterministische Graphen einbettet — mit Human Gates, Multi-Model-Routing, Cloud-Sandboxes und automatischen Retrospektiven. Für Engineers, die aufgehört haben, ihre Agenten zu babysitzen.","md","de",{},"/blog/2026-03-18-fabro-ki-workflow-engine-fuer-experten",{"title":5,"description":873},"blog/2026-03-18-fabro-ki-workflow-engine-fuer-experten",[881,882,883,884,885,886],"AI","Agenten","Workflow","Open-Source","Developer Tools","Rust","bWmSwPIRIPsAmTPqn35ay9_zZSyBtLq5O_pbRQprve8",1784088102567]