Day One of Opening the Box

By Arshad Ansari

In April I wrote the origin story of AEGIS — my flow-first, self-hosted personal AI orchestration system — and ended on a section titled Why It's Not Open Source Yet. The reasons were honest: secrets in the wrong places, homelab paths hardcoded, a system wired too tightly into exactly one life. Mine.

Today I started unwiring it. The first commits of the public repo landed this morning: github.com/hikmahtech/aegis. There's a sprint's worth of work between here and something I'd actually tell you to run, so read this as a day-one field note, not a launch post. The launch comes when the work is done, not when the repo exists.

Quick orientation if you're new: AEGIS is a small fleet of named agents — Sebas for GTD, Raphael for research, Maou for finance, Pandora's Actor for infrastructure — running scheduled and event-driven Temporal workflows over my own data, and asking me for a decision only when one is actually needed. Local-LLM-first through a LiteLLM proxy that resolves fast / balanced / smart tiers to whatever models you point them at. The spine is FastAPI, Postgres with pgvector, and Temporal, split across three Python packages — aegis-core, aegis-worker, aegis-comms — on a three-node Docker Swarm at home.

The gap between works for me and someone else can run this turns out to be almost entirely plumbing. Which is exactly why I'd been putting it off. Nobody puts "squash the migrations" on a highlight reel.

Three things landed today anyway.

Collapsing the fossil record

The private repo carried twenty-seven database migrations. Read in order, they were a diary: tables appearing, tables being regretted, columns renamed as an idea sharpened, pgvector arriving when knowledge became a first-class citizen. Somewhere in the middle is the migration where the interactions table showed up and a handful of per-domain decision tables quietly stopped mattering — the single best design call the system ever made, recorded as DDL.

Today all twenty-seven became one file: 001_baseline.sql.

The reasoning is boring and correct. Core applies migrations automatically on startup, and a new install shouldn't have to replay two years of my schema archaeology — every intermediate state is another way first boot can fail, and several of those intermediate states reference things that have no business shipping. A fresh database should get the schema the system actually wants, in one step.

But I'll admit the squash felt like something. The docs are titled "AEGIS v3" because there were a v1 and a v2 before it — by the time I wrote the origin story I was already two rewrites in — and the migration history was the only readable record of how v3 itself grew up. That record now exists only in a private repo I'll occasionally visit like an old neighborhood.

Losing the fossil record is the price of a clean first boot. I paid it. I'm allowed to be slightly melancholy about it.

Evicting the baked-in keys

The admin panel is a SPA served by aegis-core, and until today it authenticated the lazy way: API credentials resolved at build time and compiled into the bundle. When you are simultaneously the maintainer, the operator, and the entire user base, this is merely untidy. The moment you publish an image, it becomes a mechanism for shipping the maintainer's keys to everyone who pulls it.

So the panel now logs in at runtime. You bring up the stack, you authenticate, you get a session. Nothing about my accounts is compiled into anything.

The fix was obvious and slightly tedious, which I suspect describes most of the next ten days. There's a whole category of decisions that are perfectly defensible for a single-operator system and indefensible the instant a second person exists. Open-sourcing is mostly the act of finding them all.

A calmer front door

The third thing was the one I actually enjoyed: the admin panel got a redesign I've been calling calm-light. Proper design tokens instead of accumulated ad-hoc styles. Navigation grouped by what you're doing rather than by which week I added the page. And a new Overview screen that is decision-first — the first question it answers, literally at the top, is what needs you right now, and how is the system doing?

AEGIS admin — the decision-first Overview The Overview screen: what needs you right now, and how the system is doing.

This matters more than a coat of paint. The entire thesis of AEGIS is that interruptions have to earn their way in — every flow funnels its need-a-human moments through one interactions primitive precisely so attention gets spent deliberately. The admin panel was the last holdout: a wall of everything, in whatever order I'd built it. Now the front page asks the same question the rest of the system does. If nothing needs you, it says so, quietly.

It's a small alignment. I like it anyway.

The harder problem, named but not solved

Here is the honest part: none of today's work touched the biggest issue, which is that AEGIS still knows too much about me.

It knows it in code. The worker knows that a ticket title shaped a certain way belongs to the infrastructure agent — my personal ticketing convention, expressed as a hardcoded pattern that would silently apply to your tickets too. There are paths that assume my homelab's layout. There are secrets living where they were convenient to put rather than where they are correct to keep. None of this is visible from the outside, and all of it means a fresh install wouldn't start empty — it would start as a slightly broken copy of me.

The rest of the sprint is about exactly this: turning knowledge into configuration. Routing rules become data you edit, not branches you fork. Every integration becomes bring-your-own-credentials. And then a sanitization sweep — the least glamorous pass of all — to get my name, my paths, and my shortcuts out of the defaults.

Config, not code. It's a dull sentence that summarizes a lot of careful work.

Day one down

What I keep noticing is that nothing on today's list was architecture. The flows, the agents, the interaction primitive — all of that survives contact with open-sourcing unchanged, because it was never the problem. The problem was everything around it: the baked-in, the hardcoded, the accreted. The stuff that works precisely because it assumes you're me.

That's what the next stretch of days is for. If you want to watch a private system become a public one, commit by commit, the box is open at github.com/hikmahtech/aegis, and the project lives at /aegis.

One day in. Twenty-six fewer migrations than yesterday.

Building something data-heavy? Let's talk.