The Empire Annual  ·  vol. 2026  ·  A Year-End Retrospective

One hundred
and forty-nine
doors and counting.

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.

Coverage: Jan–Dec 2026 Sites: 149 Services: 60 Cron: 68 Skills: 809 Deep copper accent #8a5a3a

01

Origin — what the empire is

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.

operating system

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 legion

Twenty-Eight Agents

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.

02

State of the Empire — 149 / 60 / 68 / 809 / 22

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.

By the numbers
149 sites shipped
60 FastAPI services
68 cron jobs
Skill library
809 reusable skills
22 public b3rt.dev URLs

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.

Sites 149122 hobby + 27 operator, all static HTML +89 since Jan
Services 60FastAPI on :8090–:8199, stdlib sqlite3 +34 since Jan
Cron 68heartbeats, content burners, daily briefs +22 since Jan
Skills 809YAML+markdown, indexed by empire-skills-api +612 since Jan
Public URLs 22apex + 7 b3rt.dev + 10 hobby + 4 customers +9 since Jan
03

Highlights — the year the empire learned to read itself

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.

The empire is a compounding system — the highlights are the moments the compounding turned on.
April · OOB pivot

The dashboard became a router

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.

August · bind-race

launch_static_skill.py

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.

October · subagent pool

Read this before launching

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.

November · truth registry

Empire Truth

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.

04

The Wave 11 Catalog — 50 sites in 4 hours

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 sites. 4 hours. 1 dispatch pattern. 0 framework dependencies.
05

Mistakes — the year's tuition

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.

June CF Pages quota scare60 sites in an afternoon hit the 100-builds/day cap. Fixed by quota-pacing skill. 1 week
September Discord 40333Heartbeat webhook rate-limited per channel. Fixed by 15-minute digest batching. 3 days
October Patch tool driftwrite_file used on a SKILL.md wiped three sibling skills. Fixed by patch-vs-write-file rule. 2 days
Q4 Heroku-era splitTwo parallel operating systems. Migration plan to retire Heroku-era by Q2 2027. ongoing
06

Forward — what 2027 should look like

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.

Q1 2027

Retire Heroku-era

The old Flask dashboard goes read-only. Every empire service moves under empire-OS or is deprecated. The split ends in Q2.

Q2 2027

Empire = customer

Each of the four customer businesses ships at least one empire-native surface. The empire becomes the operating layer, not just the marketing layer.

Q3 2027

Skills as product

809 skills published at skills.b3rt.dev. External agents load empire skills over HTTP. The catalog becomes the empire's API surface.

Q4 2027

One wave only

The winter wave ships. The other three quarters go to hardening. The era of growth ends; the era of curation begins.

A

Appendix — all 149 sites

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.

  1. b3rt.dev (apex)
  2. t3ch.b3rt.dev
  3. art.b3rt.dev
  4. crypto.b3rt.dev
  5. docs.b3rt.dev
  6. services.b3rt.dev
  7. empire.b3rt.dev
  8. dashboard.b3rt.dev
  9. local-history.b3rt.dev
  10. schools.b3rt.dev
  11. apple-b3rt-dev
  12. banjo-b3rt-dev
  13. beekeeping-b3rt-dev
  14. blacksmith-b3rt-dev
  15. breweries-b3rt-dev
  16. canoe-b3rt-dev
  17. castle-b3rt-dev
  18. chevy-engine-b3rt-dev
  19. climbing-b3rt-dev
  20. cob-b3rt-dev
  21. corvette-b3rt-dev
  22. dance-b3rt-dev
  23. dark-sky-b3rt-dev
  24. espresso-b3rt-dev
  25. fern-b3rt-dev
  26. fire-tower-b3rt-dev
  27. fishing-b3rt-dev
  28. gem-b3rt-dev
  29. ghost-towns-b3rt-dev
  30. grocery-b3rt-dev
  31. herbal-b3rt-dev
  32. hymn-b3rt-dev
  33. kayak-b3rt-dev
  34. leather-b3rt-dev
  35. letterpress-b3rt-dev
  36. lutherie-b3rt-dev
  37. mountain-biking-b3rt-dev
  38. music-b3rt-dev
  39. mycology-b3rt-dev
  40. nursery-b3rt-dev
  41. old-growth-b3rt-dev
  42. pipe-b3rt-dev
  43. podcasts-b3rt-dev
  44. pottery-b3rt-dev
  45. radio-ham-b3rt-dev
  46. railroads-b3rt-dev
  47. soap-b3rt-dev
  48. sourdough-b3rt-dev
  49. spring-b3rt-dev
  50. stone-mason-b3rt-dev
  51. tarot-b3rt-dev
  52. tea-b3rt-dev
  53. telescope-b3rt-dev
  54. trail-b3rt-dev
  55. ukulele-b3rt-dev
  56. vine-b3rt-dev
  57. watercolor-b3rt-dev
  58. waterfalls-b3rt-dev
  59. waterfalls-extra-b3rt-dev
  60. weather-b3rt-dev
  61. wildflowers-b3rt-dev
  62. willow-b3rt-dev
  63. wise-b3rt-dev
  64. woodworking-b3rt-dev
  65. wool-b3rt-dev
  66. yarn-b3rt-dev
  67. zombies-b3rt-dev
  68. genealogy-b3rt-dev
  69. stargazing-equipment
  70. bepaired.com (BE Repaired)
  71. sparklingsolutionsboston.com (Sparkling)
  72. b3prompt.com
  73. ai.b3rt.dev (Boardroom)
  74. empire-annual-b3rt-dev (you are here)
  75. empire-hub (:8096)
  76. empire-pulse (:8095)
  77. empire-os (:8096)
  78. empire-truth
  79. empire-skills-api
  80. empire-tools
  81. empire-today
  82. empire-atlas
  83. empire-compass
  84. empire-decision-matrix
  85. empire-docs
  86. empire-edge
  87. empire-goals
  88. empire-health
  89. empire-inventory
  90. empire-invoice
  91. empire-quote-builder
  92. empire-quotes
  93. empire-receipts
  94. empire-sec-audit
  95. empire-time
  96. empire-timesheet
  97. empire-tutorials
  98. empire-wiki
  99. empire-alerts
  100. empire-analytics
  101. empire-ascii-art
  102. empire-backup
  103. empire-bookshelf
  104. empire-cipher-lab
  105. empire-code-review
  106. empire-crypto-tax
  107. empire-expense
  108. empire-frontier
  109. empire-games
  110. empire-graph-engineering
  111. empire-hex-decoder
  112. empire-list
  113. empire-logs
  114. empire-mcp
  115. empire-mileage
  116. empire-payroll
  117. empire-podcast
  118. empire-podcast-archive
  119. empire-pomodoro-pro
  120. empire-regex-playground
  121. empire-soundboard
  122. empire-storyteller
  123. empire-subs
  124. empire-voice
  125. empire-wordquest
  126. empire-audio
  127. empire-deck
  128. empire-gauntlet
  129. empire-stories
  130. empire-trip-planner
  131. empire-b3rt-dev
  132. b3rt-dev-master
  133. phalanx
  134. kanban
  135. boardroom
  136. sparkling-solutions
  137. sparkling-landing
  138. sparkling-crm
  139. sparkling-webhook
  140. academy
  141. astronomy
  142. audit
  143. brewing
  144. changelog
  145. foraging
  146. hiking
  147. learn
  148. mineral-collecting
  149. status