TL;DR

I moved 40 REST endpoints to GraphQL in 12 days using Claude Code as the grunt-work engine, and the hard part was never writing resolvers — it was proving the new API returned byte-identical data to the old one. The trick was building a differential test harness before writing a single line of schema, then letting the agent iterate against it. Here's the whole playbook, including the N+1 disaster that ate two of those days. 🚀

The Problem

Our mobile app was making 6 network round trips to render one screen.

The backend was a perfectly reasonable Node.js 22 service with ~40 REST endpoints that had grown organically over four years. Nobody designed it badly — it just got designed forty separate times. /users/:id, /users/:id/subscription, /users/:id/preferences, /orders?user=, and so on. Each one returned a slightly different shape of the same underlying data. Two of them spelled the same field differently (createdAt vs created_at), and the mobile client had a normalization layer whose only job was papering over that.