GraphQL
Had promise. For most teams we migrate to REST + TypeScript contracts.
GraphQL promised to solve over-fetching and give frontend teams control over their data requirements. On the right problem — many clients with genuinely different data needs over one large graph — it still earns its place, and a team running it well is not making a mistake.
For most applications we'd migrate toward REST with TypeScript contracts. The schema, resolver plumbing, code generation, and bespoke caching add a layer of complexity that rarely pays back, and real-time subscriptions, file uploads, and HTTP caching all come for free on the REST side. When we move a client off GraphQL, the replacement is typed REST endpoints that deliver the type safety GraphQL was prized for without the runtime overhead — and for the rare case that needs flexible queries over a large dataset, a purpose-built query layer beats routing everything through a single /graphql endpoint.