Articles
2026
July
- Jul 6
Engineered, Not Vibed
I disappeared into my office for six weeks to build an AI agent framework. By the end I was debugging consequences of decisions I never made, four levels deep in a design I didn't choose.
aisoftware-engineeringaisefounding-story10 min read - Jul 4
Building AiSE Kit: From Markdown Files to Multi-Agent Plugin
The theory is nice. But how do you actually ship it? It started as a folder I copied between projects. The single most surprising thing I learned: a markdown file that describes how to use a tool is the adapter.
aisoftware-engineeringaiseopen-source5 min read - Jul 4
Making Agent Work Visible
When an agent built three features overnight, the activity feed just said 'MCP: updated status.' No name, no context, no accountability. That's not a team member. That's a ghost.
exponentialbuilding-in-publiclaunch3 min read
April
- Apr 22
The Lean AiSE Model
The first story through this process needs heavy specification. By the twentieth, the accumulated decisions have pruned most branch points away automatically. You only specify what's genuinely new.
aisoftware-engineeringaiseprocess7 min read - Apr 15
Two Months of Beats
Two months in, the sharp irony hit: even though we now had an issue tracker that could decompose work, AiSE kit was keeping track of specs in markdown files instead.
exponentialbuilding-in-publicproduct3 min read
March
- Mar 25
Reviewing Documents with AI Should Be Better
When I want Claude Code to review a document, I can describe my comments in prose and hope it finds the right passage. Or I can manually annotate the file and pollute it with review artifacts. Both options are terrible.
aitoolsvscodeopen-source4 min read - Mar 23
Design Trees and The Problem with Vibe Coding
The agent knows something you don't: where it would diverge. Ask it before it builds, 'what would you decide here, and what are the alternatives?' and suddenly you're pruning the design tree instead of rolling dice.
aisoftware-engineeringaisedesign13 min read - Mar 13
Plugging holes in ORB
ORB had been in use for a few months at this point. We’d shipped it, built Sirius on it, written a lot of templates. It worked. But we’d never done a proper security review of the compilation pipeline, and that had been nagging at me.
rubysecurityopen-source4 min read
February
- Feb 10
The Board
Agents work great in a terminal. Humans need to see the shape of their work. So I embedded a React app in a Go binary and gave Beats a browser-based board.
exponentialbuilding-in-publicui3 min read - Feb 1
Rewriting the MCP Server
The hand-rolled MCP implementation hit its limits. We rewrote it using the ruby-mcp SDK: cleaner architecture, added resource support, and a fraction of the code.
airubybuilding-in-public2 min read
January
- Jan 24
Turn Any Folder into an MCP Service
Exposing internal resources to AI agents requires too much bespoke engineering. AnyMCP replaces all of that: drop files into a folder, and the platform auto-generates MCP endpoints, authentication, and tool schemas.
aiany-mcpmcpopen-source5 min read - Jan 20
Giving AI Agents a Design System
Self-documenting components made adding MCP possible. The MCP server made AI agents understand our design system. And that changed everything about how fast we can build UIs.
aidesign-systemsbuilding-in-public3 min read - Jan 12
Living with an Append-Only Log
After a month of daily use, the append-only event log has proven its worth. But the flat JSONL format is hitting limits. Relationships between issues are the feature I underestimated most.
exponentialbuilding-in-publicarchitecture3 min read
2025
December
- Dec 18
A Todo List That Tracks Itself
Steve Yegge's `beads` has the right instinct: a git-native, session-surviving todo list for agents. But I disagree ith him that such a tool should be only for agents.
exponentialbuilding-in-publictools4 min read - Dec 10
From Vibe Coding to Engineering
In March we were using Copilot for tab completions. By September we were vibe coding entire apps. By December the question changed: how do we engineer with AI, not just vibe with it?
aisoftware-engineeringbuilding-in-public3 min read - Dec 2
TextMate Grammars Are Regex All the Way Down
VS Code doesn't use tree-sitter yet, so I needed a second grammar for the same language. TextMate grammars are just regex patterns in a JSON file. It was exactly as painful as that sounds.
toolingopen-sourcebuilding-in-public4 min read - Dec 1
Writing the Grammar
A template language nobody's editor understands is a template language nobody uses. Writing the tree-sitter grammar was my first priority after shipping ORB.
rubytoolingopen-sourcebuilding-in-public4 min read
November
- Nov 28
Introducing JSX, but for Ruby
At KUY.io we were building the Sirius design system and leaning hard on ViewComponents. ERB couldn't keep up. So we built ORB, a JSX-like template language for Rails.
rubyrailsopen-sourcebuilding-in-public4 min read - Nov 27
Like Shampoo for External Markup
We were building Olympus and needed to render email content safely. Every Ruby sanitizer either stripped too much or didn't think about email at all. Dandruff came out of that gap.
rubysecurityopen-sourcebuilding-in-public4 min read - Nov 7
Token Generators and ViewComponent 4
A big Sirius2 week: ViewComponent 4 upgrade, Ruby-generated semantic tokens, a searchable documentation index, and icons extracted into sirius2-icons.
rubydesign-systemsbuilding-in-public2 min read - Nov 5
Why Our UI Is Black and White
Sirius2's interface is deliberately black and white. Color appears only when it means something. Depth appears only when it signals interactivity or hierarchy. Here's why.
design-systemsbuilding-in-public4 min read
June
- Jun 24
RBAC for Humans and Machines
CI needs to push to repositories. Deployment scripts need to create tags. The moment you add machine actors, user-based permissions fall apart.
rubyarchitecturebuilding-in-public3 min read - Jun 19
Catching Secrets Before They Land
Someone will eventually push an AWS key to a repository. The question is whether you catch it before it lands or after it's in the git history forever.
rubysecuritytoolingbuilding-in-public4 min read - Jun 17
GPG Verification in a Web App
We wanted GPG enforcement in Codex. Not just displaying badges, but verifying signatures, challenging key ownership, and signing merge commits ourselves.
rubysecuritytoolingbuilding-in-public3 min read - Jun 13
The Day Codex Broke Sirius
Codex's split-pane repo view exposed bugs in ResourceList, monospace Text, InlineGrid, Menu spacing, Card sections, and IndexTable. All in one afternoon.
design-systemsbuilding-in-public2 min read - Jun 6
How Git Push Actually Works Over HTTP
Git's smart HTTP protocol is elegant but poorly documented for implementers. Here's what we learned wrapping git-http-backend with Rails authentication.
rubytoolingbuilding-in-public4 min read - Jun 2
The Last Piece of Atlassian
We replaced Jira with Meera. Now Bitbucket Server is becoming a liability. GitHub doesn't feel right for corporate code. GitLab bundles too much. Time to build our own git platform.
rubyrailstoolingbuilding-in-public3 min read
May
- May 28
Four Pixels
We shrank the default button by 4 pixels. Every product felt different overnight. Here's why small numbers matter in a design system.
design-systemsbuilding-in-public1 min read - May 15
Separating Storage from Metadata
Flux needed content-addressable storage and shared blob stores. Refactoring the storage layer while actively building Docker support and security scanning was... educational.
rubyrailsarchitecturebuilding-in-public5 min read - May 12
Implementing the Docker Registry Protocol
Adding Docker registry support to Flux meant implementing the OCI Distribution Spec from scratch. The protocol is elegant. The edge cases are not.
rubytoolingbuilding-in-public5 min read
March
- Mar 28
Preparing to Replace Nexus
Nexus has been our artifact server for years. It's also been our most unreliable piece of infrastructure. Time to build something that fits our stack.
rubyrailstoolingbuilding-in-public3 min read - Mar 15
A Tab Is Faster Than Ten Lines
GitHub Copilot didn't change how we think about code. It changed how fast the tedious parts happen. A tab completion for a while loop beats typing it out every time.
aibuilding-in-public2 min read
February
- Feb 28
Converting Fifty Views in a Week
Journey had fifty-something ERB views. Over seven days we converted them to HERB and Sirius2 components. What we learned: the hard part isn't the syntax, it's deciding what stays.
rubyrailsbuilding-in-public3 min read - Feb 12
There and Back Again
Journey worked fine for a year. But now we need it to do more, roadmapping across our whole portfolio, and Sirius2, HERB, and Turbo 8 are ready to be put through their paces.
rubyrailsbuilding-in-public2 min read
2024
March
- Mar 21
Switching to Semantic Design Tokens
Raw tokens say 'use blue-7.' Semantic tokens say 'this is a primary action.' The difference sounds academic until you're maintaining consistency across five products.
rubydesign-systemsbuilding-in-public4 min read - Mar 1
The Slot Problem
ViewComponent slots are Ruby blocks with yielded objects. HERB templates are HTML-like tags. Bridging the two turned out to be one of the more interesting design problems in building the language.
rubyrailsbuilding-in-public3 min read
February
- Feb 25
Dogfooding HERB in the Design System
HERB is our new template language for Rails. Sirius2 is our design system. Using one to build the other is the fastest way to find where both need work.
rubyrailsdesign-systemsbuilding-in-public2 min read - Feb 23
A new Template Language for Ruby
ERB was killing our productivity in Sirius2. So we started building a template language. Turns out that's a tokenizer, a parser, a compiler, and a long list of things you didn't think about.
rubyrailsbuilding-in-public4 min read
2023
September
- Sep 21
LDAP Changes Everything
LDAP sync landed in Meera this week. Users provisioned from Active Directory automatically. This is the feature that makes it a real internal tool, not just a side project.
rubyrailsbuilding-in-public2 min read - Sep 21
When Bitbucket Breaks Your CI
Wave CI started crashing on startup. Turned out Bitbucket Server had deprecated a REST endpoint we used for build status posting. No heads-up, just a broken API.
toolingbuilding-in-public1 min read