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.
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.
The source explanation of the layers, shared service, and write rules.
Three war stories
What changed when the work met reality
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.
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.
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.
I don’t use agents as autocomplete. I use them as implementation collaborators inside explicit boundaries.
1Problem
2Explicit constraints
3Agent implementation
4Deterministic tests / evals
5Production verification
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.