<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohammed Arshad Ansari</title>
    <description>The latest articles on DEV Community by Mohammed Arshad Ansari (@mohammed_arshadansari_f2).</description>
    <link>https://dev.to/mohammed_arshadansari_f2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3609964%2Fd0a642d8-0372-4976-99f8-0575aa92a93c.png</url>
      <title>DEV Community: Mohammed Arshad Ansari</title>
      <link>https://dev.to/mohammed_arshadansari_f2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohammed_arshadansari_f2"/>
    <language>en</language>
    <item>
      <title>I open-sourced AEGIS: a self-hosted, flow-first personal AI orchestration platform</title>
      <dc:creator>Mohammed Arshad Ansari</dc:creator>
      <pubDate>Mon, 13 Jul 2026 15:26:15 +0000</pubDate>
      <link>https://dev.to/mohammed_arshadansari_f2/i-open-sourced-aegis-a-self-hosted-flow-first-personal-ai-orchestration-platform-4c74</link>
      <guid>https://dev.to/mohammed_arshadansari_f2/i-open-sourced-aegis-a-self-hosted-flow-first-personal-ai-orchestration-platform-4c74</guid>
      <description>&lt;p&gt;For the past year I've run most of my day on a system I built for exactly one user: me. Last week I open-sourced it. It's called AEGIS, it's MIT-licensed, and this is the honest tour.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bet
&lt;/h2&gt;

&lt;p&gt;Every week there's a new agent framework that promises to do everything. AEGIS is a smaller, stranger bet: that software can learn the shape of one person's life well enough to interrupt &lt;em&gt;less&lt;/em&gt;. It watches the boring things — tasks, email, money, a&lt;br&gt;
  knowledge base, homelab alerts — and only reaches for me when a decision is genuinely mine to make. It's not a chatbot I log into; it's a fleet of scheduled and event-driven workflows that mostly run without me.&lt;/p&gt;

&lt;p&gt;## The shape&lt;/p&gt;

&lt;p&gt;Four named agents, each a permission boundary with a personality: Sebas (GTD), Raphael (research), Maou (money), Pandora's Actor (infrastructure). The spine is FastAPI + Postgres (with pgvector) + Temporal, on a small Docker Swarm at home. Models&lt;br&gt;
  resolve through a LiteLLM proxy — local-first, reaching for Claude or GPT only when a job needs the horsepower.&lt;/p&gt;

&lt;p&gt;A few design decisions did most of the work.&lt;/p&gt;

&lt;p&gt;## One primitive for every interruption&lt;/p&gt;

&lt;p&gt;The decision I'm proudest of is a table. Every time the system needs a human, it's the same shape: a row in a Postgres &lt;code&gt;interactions&lt;/code&gt; table, a card in my chat app, and a Temporal workflow that durably waits — for days if it has to — until I tap a&lt;br&gt;
  button.&lt;/p&gt;

&lt;p&gt;Approvals, choices, drafts to review, plain acknowledgements — one mechanism, five card kinds, one callback format. No per-feature approval tables; adding a new "ask the human" moment costs nothing. And because interrupting me is now a formal act with a&lt;br&gt;
  paper trail, flows get written to do more work before they ask. That one decision turned AEGIS from a notification machine into a queue of interruptions that have to earn their way in.&lt;/p&gt;

&lt;p&gt;## Durability instead of cron-and-hope&lt;/p&gt;

&lt;p&gt;A card a workflow waits on for three days is miserable to build with cron and a queue — you hand-roll a state machine and reconcile it after every deploy. Temporal's durable execution is exactly this: the workflow awaits a signal, and the wait survives&lt;br&gt;
  restarts, redeploys, and the occasional node reboot. Schedules reconcile from DB config, so changing a flow's cadence needs no redeploy.&lt;/p&gt;

&lt;p&gt;## Behavior is data, not code&lt;/p&gt;

&lt;p&gt;The change that made AEGIS forkable was deleting every line that said &lt;code&gt;if agent == "sebas"&lt;/code&gt;. Capabilities, tool grants, and routing now live in database metadata, edited from an admin panel. The code asks "who owns GTD?" and gets an answer; it never&lt;br&gt;
  names names. Rename the agents, re-scope them, or add your own — no Python.&lt;/p&gt;

&lt;p&gt;## Local-LLM-first, for real&lt;/p&gt;

&lt;p&gt;Everything routes through a LiteLLM proxy exposing three tiers — fast / balanced / smart. Each agent is assigned a &lt;em&gt;tier&lt;/em&gt;, never a model name, so swapping models is proxy config and the app code never changes. One reasoning-model gotcha is handled&lt;br&gt;
  explicitly: reasoning models bill hidden reasoning tokens against &lt;code&gt;max_tokens&lt;/code&gt; before any visible output, so a tight cap returns &lt;code&gt;finish_reason=length&lt;/code&gt; with empty content — the client detects that and raises a typed truncation error instead of handing&lt;br&gt;
  an empty string to &lt;code&gt;json.loads&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;## What it is not&lt;/p&gt;

&lt;p&gt;Not a SaaS — no hosted version, and it does nothing until you point it at your own accounts and models. Not another framework to build on; it's a complete, opinionated application you fork and configure for your own life. If that sounds like more setup&lt;br&gt;
  than you want, reading the code is a perfectly good outcome.&lt;/p&gt;

&lt;p&gt;## Take it apart&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/hikmahtech/aegis" rel="noopener noreferrer"&gt;https://github.com/hikmahtech/aegis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The longer tour + design essays: &lt;a href="https://hikmahtechnologies.com/aegis" rel="noopener noreferrer"&gt;https://hikmahtechnologies.com/aegis&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd genuinely like to know what breaks — and what you'd reach for on the "smart" tier these days. That's the slot I still escalate most often.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>selfhosted</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
