Pair-build mode: how we work with vibe coders without taking over their project

Most agencies eat the codebase. We don't. Here's how EdsDev runs pair-build engagements with vibe coders shipping in Cursor and Claude Code — without hijacking the keyboard or the vision.

Pair-build mode: how we work with vibe coders without taking over their project

The problem with hiring help when you’re already shipping

You’ve got a half-built app in Cursor. The auth kind of works. The Stripe webhook fires twice sometimes. You know exactly where the duct tape is — because you put it there at 1am last Tuesday.

Then you hire an agency. Two weeks later they’ve rewritten your folder structure, replaced your ORM, introduced a monorepo, and you can’t find your own login page. The thing still doesn’t ship.

This is the default failure mode of dev-for-hire when the client is a builder. We’ve seen it from both sides. So at EdsDev we run something different on these engagements. We call it pair-build mode.

What pair-build actually is

Pair-build is a working agreement, not a methodology with a capital M. The shape:

That’s it. No Jira. No two-week sprints. No “discovery phase.”

Why this works for vibe coders specifically

If you’re shipping fast with AI tooling, you’ve built up a tacit model of your own codebase that doesn’t live in any document. You know that lib/db.ts is sacred and lib/utils.ts is a graveyard. You know the LLM keeps trying to add Zod schemas you don’t want.

A traditional agency engagement requires you to externalize all of that. Which takes weeks. Which is why you didn’t hire one in the first place.

Pair-build skips externalization. We learn your codebase the same way you did: by editing it, getting things wrong, and watching you correct us in real time. The first session is usually rough. The third session we’re moving faster than you alone.

The rules we follow on someone else’s repo

These are non-negotiable on our side:

1. No silent refactors

If we want to change a pattern you established, we ask. In a comment, in a Loom, in chat. We don’t ship a PR that quietly renames your User model to Account because we think it’s cleaner. Your code, your call.

2. Match the AI tool, don’t fight it

If you’re using Claude Code and we prefer Cursor, we use Claude Code. The point is your future self can reproduce what we did with the tools you already pay for. We’ve watched too many handoffs die because the outgoing dev used some bespoke prompt chain nobody else could run.

3. Commits explain themselves

We write commit messages like we’re writing to you specifically, because we are:

fix(stripe): handle webhook idempotency via event.id

Webhook was firing 2x on subscription.updated because Stripe 
retries on any non-2xx. Added idempotency check against 
processed_events table. Migration in 0007.

Left your existing error logging untouched.

That last line matters. It’s the difference between a collaborator and a contractor.

4. We document the trap doors

Every codebase has them. The env var that breaks prod if you change it. The seed script that wipes the DB. We write these down in NOTES.md as we find them. You get to keep that file.

A real example (anonymized)

Client came to us with a B2B SaaS, ~8k lines, built mostly in Cursor over six weeks. Working product, three paying customers. The problem: Postgres on Supabase was eating their lunch on a specific dashboard query — 4-6 seconds.

What a normal agency would do: propose a two-week “performance audit,” rebuild the data layer, suggest Redis, charge $20k.

What we did:

  1. Session one (90 min): paired in their editor, used their existing AI setup to read the query, ran EXPLAIN ANALYZE, found a missing index on a join column and a N+1 in the controller.
  2. Shipped the index migration and a select rewrite. Query dropped to 180ms.
  3. Session two (60 min): set up a basic query log so they’d catch the next one themselves. Wrote three paragraphs in their NOTES.md about how to read EXPLAIN output.

Total: ~3 hours of our time. Their codebase looks almost identical to before. They can now diagnose the next slow query without us.

That’s the goal. Make ourselves less necessary, not more.

When pair-build is wrong

It’s not the right mode for every engagement. Skip it if:

We turn down maybe a third of pair-build inquiries for one of these reasons. Usually we route them to a fixed-scope build instead.

The pricing thing

We charge for pair-build by the session, not by the sprint. A session is 60-90 minutes plus whatever async follow-up the work needs (code review, a small PR, a Loom walkthrough). Most clients buy them in packs of four.

This aligns incentives correctly. We don’t make more money by dragging things out. You don’t pay for a Slack channel where nothing happens for three days.

What you should ask any collaborator before they touch your repo

Steal these questions. Use them on us, use them on anyone:

If the answers are vague, you’re about to lose control of your project.

The short version

Vibe coders don’t need to be rescued. They need a second pair of hands that respects the work already done, knows the AI tooling, and leaves the codebase more legible than it was found. That’s the entire job.

If you’re shipping something and want a collaborator who won’t try to take the wheel, come talk to us.

Related posts