<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Tutti AI — Blog</title><description>Engineering, research, and product writing on building production multi-agent systems with Tutti AI.</description><link>https://tutti-ai.com</link><language>en-GB</language><item><title>What an agent needs after it works</title><link>https://tutti-ai.com/blog/what-an-agent-needs-after-it-works</link><guid isPermaLink="true">https://tutti-ai.com/blog/what-an-agent-needs-after-it-works</guid><description>Every framework can produce a working demo. The hard part is everything after — running on a schedule, getting better at the same task, and not billing you while idle. Three operational primitives that close the gap, and why the framework — not the user — should own them.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>design</category><category>scheduling</category><category>skills</category><category>serverless</category><author>Chihab</author></item><item><title>Inbox: every channel, one agent</title><link>https://tutti-ai.com/blog/inbox-every-channel-one-agent</link><guid isPermaLink="true">https://tutti-ai.com/blog/inbox-every-channel-one-agent</guid><description>v0.25 lands inbound messaging on five platforms at once — Telegram, Slack, Discord, email, WhatsApp. The hard part wasn&apos;t writing five adapters. It was finding the one shape that made all five behave like the same thing.</description><pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>inbox</category><category>design</category><category>platforms</category><category>voices</category><author>Chihab</author></item><item><title>Smart routing: picking the cheapest model that can still do the job</title><link>https://tutti-ai.com/blog/smart-routing-the-design-story</link><guid isPermaLink="true">https://tutti-ai.com/blog/smart-routing-the-design-story</guid><description>Most agent turns don&apos;t need Opus. The problem is figuring out which ones do — at runtime, before you&apos;ve spent the money. Here&apos;s how Tutti&apos;s SmartProvider does it, what we got wrong on the first try, and where it still falls short.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>smart-routing</category><category>cost</category><category>router</category><category>design</category><author>Chihab</author></item><item><title>Comparing Tutti to LangGraph, CrewAI, AutoGen, and Mastra</title><link>https://tutti-ai.com/blog/comparing-tutti-langgraph-crewai-autogen-mastra</link><guid isPermaLink="true">https://tutti-ai.com/blog/comparing-tutti-langgraph-crewai-autogen-mastra</guid><description>An honest comparison. Each framework gets something right that Tutti doesn&apos;t, and vice versa. Here&apos;s where we differ, and where we&apos;d recommend using something else.</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate><category>Product</category><category>comparison</category><category>langgraph</category><category>crewai</category><category>autogen</category><category>mastra</category><author>Chihab</author></item><item><title>OpenTelemetry on day one: every step is a span</title><link>https://tutti-ai.com/blog/opentelemetry-day-one</link><guid isPermaLink="true">https://tutti-ai.com/blog/opentelemetry-day-one</guid><description>If you can&apos;t explain what an agent did six hours after it did it, you can&apos;t operate it. Tutti emits OTEL spans for every run, LLM call, and tool invocation — and you wire it into whatever you already use.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>observability</category><category>OTEL</category><category>telemetry</category><author>Chihab</author></item><item><title>HITL gating destructive tools by default, not opt-in</title><link>https://tutti-ai.com/blog/hitl-by-default-not-opt-in</link><guid isPermaLink="true">https://tutti-ai.com/blog/hitl-by-default-not-opt-in</guid><description>Most frameworks make human-in-the-loop something you wire in. By the time you remember to add it, the agent has already shipped a tweet. Tutti gates destructive operations by default — the wiring is the runtime.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>HITL</category><category>destructive</category><category>safety</category><author>Chihab</author></item><item><title>Bridging any MCP server as a typed Tutti voice</title><link>https://tutti-ai.com/blog/mcp-bridge-zero-glue</link><guid isPermaLink="true">https://tutti-ai.com/blog/mcp-bridge-zero-glue</guid><description>Every framework eventually needs to talk to every other tool. Re-implementing every integration as a first-party voice is the wrong move. The MCP voice means any MCP server is one install away.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><category>Product</category><category>mcp</category><category>voices</category><category>extensibility</category><author>Chihab</author></item><item><title>Prompt injection is an architecture problem, not a UX one</title><link>https://tutti-ai.com/blog/prompt-injection-architecture</link><guid isPermaLink="true">https://tutti-ai.com/blog/prompt-injection-architecture</guid><description>If you wait until the model has seen the malicious string, you&apos;ve already lost. The defence has to be in the architecture: typed tool outputs, sanitised content, boundary markers, runtime isolation.</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>security</category><category>prompt-injection</category><category>PromptGuard</category><author>Chihab</author></item><item><title>Permission scopes the runtime actually enforces</title><link>https://tutti-ai.com/blog/permission-scopes-runtime-enforced</link><guid isPermaLink="true">https://tutti-ai.com/blog/permission-scopes-runtime-enforced</guid><description>Most frameworks document a permission model. Tutti enforces one. The difference is the runtime refuses to start when an agent has voices it didn&apos;t grant.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>security</category><category>permissions</category><category>design</category><author>Chihab</author></item><item><title>Voices: the plugin model agent frameworks need</title><link>https://tutti-ai.com/blog/voices-the-plugin-model</link><guid isPermaLink="true">https://tutti-ai.com/blog/voices-the-plugin-model</guid><description>Most frameworks treat tools as a flat list. Every team rebuilds the same GitHub wrapper, the same Slack wrapper, the same Stripe wrapper. Voices are how Tutti stops that.</description><pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>voices</category><category>plugins</category><category>design</category><author>Chihab</author></item><item><title>Configuration over code: why score files beat Python graphs</title><link>https://tutti-ai.com/blog/score-files-vs-graphs</link><guid isPermaLink="true">https://tutti-ai.com/blog/score-files-vs-graphs</guid><description>Agent systems aren&apos;t general programs. They&apos;re a small set of repeating patterns. When you write them as code, the configuration disappears. When you write them as config, the system shape is the file.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>score</category><category>config</category><category>design</category><author>Chihab</author></item><item><title>Why I&apos;m building Tutti AI</title><link>https://tutti-ai.com/blog/why-im-building-tutti</link><guid isPermaLink="true">https://tutti-ai.com/blog/why-im-building-tutti</guid><description>I spent early 2026 trying to ship a real multi-agent workflow on top of every framework that almost worked. Each had a different deal-breaker. So I started writing the one I wished existed.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><category>Company</category><category>manifesto</category><category>origin</category><author>Chihab</author></item></channel></rss>