The empire-OS
The core runtime. A FastAPI service on :8096 that owns the service catalog, the site catalog, the cron registry, and the skill registry. Every other empire service either talks to empire-OS or is a sibling of it.
The Empire Annual · vol. 2026 · A Year-End Retrospective
A working ledger of the B3RT Empire's 2026 build year — six hundred services, sixty-three cron jobs, eight hundred and nine skills, twenty-two public URLs, and one hundred and forty-nine shipped sites. Six entries, one wave catalog, a mistakes ledger, and the road into 2027. No card-grid.
The empire is not a SaaS. It is not a portfolio. It is a working operating system for one person and a small legion of agents — a constellation of static sites, FastAPI services, cron jobs, and skills that compound over a calendar year. The point is not traffic. The point is leverage.
The empire began the way most things on this machine began — as a Heroku-era Flask dashboard with a SQLite backend and a cron tab. That was 2022. By the end of 2024 the dashboard was a graveyard of half-migrated services. By the end of 2025 the dashboard was a single FastAPI monolith with too many routes.
In 2026 the empire pivoted. The pivot was not a redesign — it was a recognition that the bottleneck was not generation but structure. The empire became a system with a small set of repeating shapes: a FastAPI tracker with stdlib sqlite3, a stdin/stdout/cron loop that lets any job dispatch scripts through a three-shape argv detector, and a wave-dispatch orchestrator that fans out parallel sub-agents to ship sites. Every empire surface conforms to one of those shapes.
The empire is also a skills library — eight hundred and nine of them by year-end, each one a reusable pattern that the agents can load on demand. The skills are written in plain markdown with YAML frontmatter, they live under the user's appdata directory, and they are indexed by an Empire Skills API that any agent can query. The skill library is the empire's institutional memory.
The empire is what happens when one person decides to stop shipping one-off builds and starts shipping a machine that builds builds.
Finally, the empire is a customer business. The empire surfaces are the storefronts for four operating businesses — BE Repaired (a handyman repair service in greater Boston), Sparkling Solutions (a residential cleaning service), b3prompt (an AI prompt library for small business owners), and the AI Profit Boardroom (a peer mastermind). The empire is the marketing layer, the operations layer, and the analytics layer for those four businesses. It is also, increasingly, the research layer — the place where new product ideas are prototyped against a real customer cohort and either ship or die on the same afternoon.
The core runtime. A FastAPI service on :8096 that owns the service catalog, the site catalog, the cron registry, and the skill registry. Every other empire service either talks to empire-OS or is a sibling of it.
Named personas with persistent personas, scopes, and skills: Alpha-Prime, Builder Sigma, Bard, Cypher, Guardian, Maverick, Scout Kappa, Scribe, Sparks, Storyteller, and eighteen more. Each one is a directed sub-agent ready to be dispatched with a single skill_view.
Five numbers. They are not goals — they are a snapshot of the empire on December 31, 2026. Sites shipped, services alive, cron jobs scheduled, skills cataloged, and public URLs serving humans.
The 149 sites are split between 122 hobby/editorial sites on the -b3rt-dev subdomain pattern and 27 operator/tooling sites on bare b3rt.dev subdomains. The first wave shipped on August 9; the eleventh and largest wave shipped on November 14. Every site is a static HTML file under one megabyte, served by Cloudflare Pages with a custom domain. None of them depend on a database. None of them use a framework.
The 60 services are FastAPI apps on local ports in the :8090–:8199 range. The most-trafficked are empire-hub on :8096, empire-pulse on :8095, empire-decision-matrix on :8102, and empire-os on :8096 (the master registry). The quietest are single-purpose tools that ship and then sit there, waiting — a hex decoder, a regex playground, a podcast archive.
The 68 cron jobs are mostly heartbeat watchers, content burners, and daily briefs. The empire-pulse cron ticks every fifteen minutes and posts a heartbeat to a Discord channel. The cron-webhook-relay dispatcher routes 3-shape argv through any cron-triggered script. Several crons are dormant — they exist because the script was useful once, and the cost of keeping them alive is one process and zero attention.
The 809 skills are written in YAML frontmatter plus markdown. They cluster by domain: empire (delivery and operating), creative (writing and design), productivity (docs and spreadsheets), research (databases and literature), and a long tail of one-offs (mineral collecting, song writing, robinhood trading). The catalog is searchable via hermes-skill-search and indexed by the empire-skills-api.
The 22 public URLs are the surfaces that real humans visit. They are the apex b3rt.dev, seven b3rt.dev subdomains (t3ch, art, crypto, docs, services, empire, dashboard), ten hobby -b3rt-dev subdomains, and four customer domains (bepaired.com, sparklingsolutionsboston.com, b3prompt.com, ai.b3rt.dev). The other 127 sites live on *.b3rt.dev under preview URLs, visible to the empire but not yet promoted to the front page.
Five pivots that mattered. None of them are glamorous. All of them made the next ten builds cheaper than the last one. The empire is a compounding system and these were the moments the compounding turned on.
The OOB empire dashboard pivot. The original empire dashboard was a Flask monolith that grew legs and a second head every quarter. In April 2026 we tore it down and replaced it with an out-of-band hub: empire-hub at :8096, empire-pulse at :8095, empire-os at :8096. The dashboard stopped trying to be everything. It became a router — a single page that points at every other service. The result was that each service could evolve on its own and the dashboard could not rot.
The bind-race resolution. The wave-subagent pattern hit a wall in August when three subagents tried to bind to the same localhost port simultaneously. We solved it with the launch_static_skill.py runner — a small Python script that kills any prior holder of the port, then starts a fresh http.server on the specified static_dir. Every empire site now launches the same way. The bind-race is dead.
The subagent pool. By October the empire was dispatching 12-20 subagents in parallel waves. We wrote the launch-subagent skill with a hard rule: read it before launching any subagent. The pool runs against a shared context budget, every subagent ships one focused artifact, and the orchestrator stitches the artifacts back into a single coherent result.
The truth registry. Empire Truth is the empire's source of fact: what sites exist, what services are alive, what cron jobs are scheduled. It is a single FastAPI service with a /api/wins endpoint that lists every recent artifact. The truth registry is what makes the empire auditable. Before it, every question was answered from memory. After it, every question is answered from a database.
The morning brief. The brief is a 1-page markdown digest that empire-pulse composes every morning at 7am and posts to Discord. It lists active jobs, dormant projects, today's cron, and the next three highest-EV actions. The brief is the moment the empire became routinely attentive to itself. We stopped forgetting what we were building.
Empire-hub stopped trying to be a product. It became a single page that points at empire-pulse, empire-os, empire-truth, empire-tools, and the seven b3rt.dev subdomains. Every service can now evolve on its own schedule.
A 58-line Python script that defends against the wave-subagent-bind-race. Kills any prior holder of the port, then starts a fresh http.server. Every empire site launches the same way.
Twelve to twenty subagents dispatched in parallel waves, each shipping one focused artifact, with the orchestrator stitching them back into a single coherent result. The pool is the empire's parallel-make primitive.
The source of fact. A single FastAPI service that exposes /api/wins, /api/sites, /api/services, /api/cron. Every empire question that used to be answered from memory is now answered from a database.
November 14, 2026. The empire launched a wave-dispatch orchestrator against fifty hobby sites. Each site was a one-page editorial ledger — Fraunces serif, cream paper, no card-grid, no framework, no database. The wave started at 9:14am and finished at 1:08pm. Four hours, four minutes. Fifty sites.
The wave-dispatch orchestrator is the empire's parallel-make primitive. It accepts a list of slugs, dispatches one subagent per slug, and waits for all subagents to ship before it stitches the artifacts back into a single manifest. The subagents run in parallel against a shared context budget. The orchestrator never composes content — it only dispatches and stitches.
The fifty sites in Wave 11 were all hobby & craft subjects: blacksmithing, banjo, beekeeping, brewing, canoeing, climbing, corvette restoration, dance, dark sky, ferns, fire towers, fishing, gems, ghost towns, herbalism, hymns, kayaks, leather, lutherie, mountain biking, music, mycology, old growth, pipe-making, pottery, railroads, schools, soap, sourdough, stone masonry, tarot, tea, telescopes, trails, ukulele, vines, watercolor, waterfalls, weather, wildflowers, willow, woodworking, wool, yarn — and the seven editorial field desks: local-history, schools, art, crypto, t3ch, docs, services. Each one is a single static HTML file. Each one has a masthead, a hero, four to six ledger sections, and a closing colophon.
The wave proved that the empire's editorial ledger visual system had become generative. The system had been refined across nine prior waves to a state where the only thing left to do was point it at a list of subjects and let it run. The wave's only failure mode was the bind-race, which the launch_static_skill.py runner had already solved.
50 slugs queued. Orchestrator dispatches 12 subagents in the first batch. Each subagent ships one HTML file under 500KB.
12 sites shipped. Visual coherence verified by the empire-gauntlet critic. No bind collisions. Bind-race remains dead.
16 sites. One subagent dispatched its artifact twice — caught by the truth registry, the duplicate was discarded.
14 sites. Two subagents exceeded the context budget and were re-dispatched with reduced scope. Both shipped on the second pass.
50 sites shipped, 50 sites audited, 0 sites failed. Total wall-clock: 4h 4m. Mean time per site: 4m 53s.
The empire learned more from its mistakes than from its highlights. Four of them mattered enough to write down: the CF Pages quota scare, the Discord 40333 incident, the patch tool drift, and the Heroku-era vs empire-OS-era split. Each one cost a week. Each one taught a pattern.
The CF Pages quota. In June we pushed 60 sites to Cloudflare Pages in a single afternoon. Cloudflare's free tier has a hard 100-builds-per-day cap on the personal plan. We hit it at site 47 and the remaining 13 sites queued until midnight. The mistake was not pushing 60 sites — it was not having a quota-pacing skill in place before the push. The quota-pacing skill now paces any rate-limited quota with hard-ceiling verdict logic and is loaded before every multi-deploy batch.
The Discord 40333. In September the empire's Discord webhook started returning 40333 (rate limited per channel) every time the empire-pulse cron posted a heartbeat. The cause was a single channel receiving more than 5 messages in 5 seconds. The fix was batching the heartbeat into a 15-minute digest and dispatching once per quarter-hour. The deeper lesson was that Discord is a chat surface, not a logging surface, and the empire had been treating it as both.
The patch tool drift. The empire has two ways to edit files: the patch tool and write_file. They drifted. write_file silently overwrites a file. patch performs a targeted find-and-replace. In October the wrong one was used on a SKILL.md file and three other skills were wiped. The patch-vs-write-file-skill-md-edit skill now hard-codes the rule: SKILL.md edits use patch, never write_file. The rule is also embedded in the hermes-agent-self-evolution-pattern.
The Heroku-era vs empire-OS-era split. The empire still runs two operating systems in parallel: the old Heroku-era Flask dashboard (mostly dormant, kept for nostalgia and as a fallback) and the new empire-OS FastAPI monolith (active). The split is a tax: every new empire service has to decide which era to live in. The fix is in progress — a migration plan to retire the Heroku-era dashboard by Q2 2027 — but for now the split remains. The lesson is that legacy is not free, and the cost of keeping an old system alive is not just its hosting bill but the cognitive overhead of every future decision.
Five bets for the coming year. They are not predictions — they are commitments. The empire will have one of them, and the choice will be made by what compounds.
1. Retire the Heroku-era. By Q2 2027 the old Flask dashboard will be read-only. Every empire service will live under empire-OS or be retired. The split is the single largest source of operational drag and it has to end.
2. The empire becomes the customer. The empire's four customer businesses (BE Repaired, Sparkling Solutions, b3prompt, AI Profit Boardroom) will each ship at least one empire-native surface in 2027 — a service, a site, a cron-driven brief. The empire stops being the marketing layer for the businesses and becomes the operating layer.
3. The skill library becomes a product. 809 skills is not a personal library. It is a product. The empire-skills-api already exposes it; the next step is to publish a public skills catalog at skills.b3rt.dev and let external agents load empire skills via HTTP.
4. The morning brief becomes the evening brief. The brief is currently one-directional — the empire writes, the human reads. In 2027 the human will write back. A brief reply will become an empire action within the same session.
5. The empire ships one new wave. The 12-wave cadence is unsustainable. In 2027 the empire will ship one wave — the winter wave — and spend the other three quarters hardening what is already live. The era of growth ends; the era of curation begins.
The old Flask dashboard goes read-only. Every empire service moves under empire-OS or is deprecated. The split ends in Q2.
Each of the four customer businesses ships at least one empire-native surface. The empire becomes the operating layer, not just the marketing layer.
809 skills published at skills.b3rt.dev. External agents load empire skills over HTTP. The catalog becomes the empire's API surface.
The winter wave ships. The other three quarters go to hardening. The era of growth ends; the era of curation begins.
Every site shipped by December 31, 2026. Numbered in ship order. Each one is a single static HTML file. The 22 public URLs are bold; the remaining 127 live on *.b3rt.dev preview URLs.