Selected work

The engineering behind Bunch

Bunch looks like a continuity app. Underneath, it asks a harder question: how do you let AI act on private, durable state without giving the model god mode?

I built Bunch as AI-native software: ChatGPT, Codex, and a web app can work with the same private records, through one set of rules I can test and operate.

Architecture

Two interfaces. One set of rules.

ChatGPT / CodexAI clients enter through MCP tools.
MCP
Web appBrowser interactions enter through REST routes.
REST
typed domain contractsShared definitions keep stored records, API routes, and tool schemas aligned.
SystemServiceThe shared transactional service owns mutation rules for both interfaces.
PostgreSQLDurable, owner-scoped records and activity history.
private mediaOwner-authorized storage that does not expose image bytes to the model.
AI providersExplicit generation jobs with accounting and bounded retries.

versions · retries · audit · cost controls

Bunch architecture. The two top interfaces converge on the shared service before durable records are read or changed.

Text equivalent

ChatGPT and Codex use MCP; the web app uses REST. Both pass typed domain contracts into SystemService. SystemService applies the same rules before accessing PostgreSQL, private media, or AI providers. Version checks, retry safety, audit events, and cost controls apply beneath both interfaces.

  • ChatGPT and Codex use MCP while the web app uses REST.
  • Both interfaces pass typed domain contracts into SystemService instead of implementing separate business rules.
  • SystemService applies the same version, retry, audit, privacy, and cost boundaries before reaching PostgreSQL, private media, or AI providers.

Three war stories

What changed when the work met reality

  1. 01 · change the architecture when reality disproves the plan.

    Oh shit, web ChatGPT doesn’t work the way I hoped.

    The original assumption was that a custom GPT could be the integration surface Bunch needed. The platform did not work that way in practice.

    I investigated the available paths instead of preserving the original plan. The custom GPT route could not provide the durable, private integration surface the product required.

    I changed the architecture: the web app and MCP became two front doors onto the same records, typed contracts, and SystemService rules.

  2. 02 · learn unfamiliar infrastructure by shipping through it.

    I felt like a fish out of water wiring up MCP.

    MCP was unfamiliar infrastructure. The first implementation encoded assumptions that looked reasonable locally.

    Real ChatGPT behavior exposed the gaps: discovery probes, OAuth handoff, anonymous transport checks, and resource audiences all had sharper protocol boundaries than the first pass expected.

    I debugged those boundaries directly and turned each failure into compatibility behavior, regression coverage, hosted verification, or installation guidance.

  3. 03 · shipping to humans changes the engineering.

    Then I got brave enough to ask for alpha users.

    The moment I invited alpha users, Bunch stopped being software I could explain away and became software I had to operate.

    A personal tool can survive rough edges that other people should never have to interpret. Inviting alpha users made ownership, authentication, destructive actions, onboarding, cost, and accessibility operating concerns.

    The pilot work tightened owner isolation and browser/API boundaries, added explicit capacity controls, and made AI usage and spend visible and bounded.

    Acceptance moved beyond “the code exists” to deterministic tests, accessible browser checks, packaging, onboarding, and separately reported production verification.

Agent workflow

I don’t use agents as autocomplete. I use them as implementation collaborators inside explicit boundaries.

  1. 1Problem
  2. 2Explicit constraints
  3. 3Agent implementation
  4. 4Deterministic tests / evals
  5. 5Production verification
  6. 6Ratchet the specification

The human work stays human

  • defining invariants
  • decomposing the problem
  • deciding what evidence counts
  • reviewing plausible-but-wrong implementations
  • tightening the specification after failures

Production evidence

What the evidence can and cannot establish

The linked pull requests document merged changes and their recorded checks. They do not, by themselves, establish a current production deployment, a successful authenticated connection, or an outcome for any person using Bunch.

Dig deeper

Inspect the implementation trail