Blog

Engineering notes, platform updates, and thinking out loud.

Building a workflow engine that treats humans and agents the same

Most workflow engines bolt human steps on as a special case. We built one where approvals and agent decisions are the same type — same execution model, same state machine.

Read more →

Merging 22 submodules into one monorepo — lessons from the migration

22 repos, 204 cross-repo link: dependencies, an 11-step mode-switching tool. We merged everything into one monorepo. Here's what died, what survived, and what surprised us.

Read more →

Running your own release pipeline across 145 packages

Plan → snapshot → checks → build → verify → version → changelog → publish → git → report. How we built a release pipeline that catches broken exports before npm publish.

Read more →

How we built a Go service manager (kb-dev) to replace docker-compose

Our bash script left orphan processes, lied about service health, and couldn't handle concurrent starts. We replaced it with a Go binary that tracks PIDs, kills process groups, and speaks JSON.

Read more →

Two-tier memory for long-running agents: working memory vs persistent facts

The context window creates the illusion that memory is free. By turn 30, it's 80% noise. We built a two-tier system: sliding window for now, structured storage for forever.

Read more →

Contract-based adapters: swap Kafka for NATS without touching business logic

12 core contracts, strict layer rules, and a dependency graph that physically prevents plugins from importing adapters. How we made infrastructure genuinely swappable.

Read more →

Duck typing for plugins: why we killed the plugin interface

No base class. No implements. No runtime registration call. If a package has a manifest with schema: kb.plugin/3, it's a plugin. Here's why that works better than an interface.

Read more →

Going from 10-minute builds to 15-second incremental rebuilds in a 125-package monorepo

We built a Go binary with content-addressable caching, DAG scheduling via Kahn's algorithm, and ordered categories that handle both TypeScript and Go packages.

Read more →

KB Labs web bootstrap

The initial web monorepo includes three surfaces: website, docs, and app shell.

Read more →

Open the closed: why vendor lock-in is a design choice, not a given

Every platform dependency is a bet. We explain why we think the only safe bet is a typed contract — and how 12 core contracts shape every architectural decision we make.

Read more →

Why we chose self-hosted over SaaS-first

The default playbook is hosted service with a free tier. We went the other way — npm install, your infrastructure, your data. Here's why self-hosted first isn't a compromise.

Read more →