How do I…

Develop against the cloud like it is production

The question every developer has before shipping is the same: "will this actually work in production?" The only honest answer comes from running the change against the cloud services it will run on. Wayfinder gives you a like-for-like environment: the same services as production, at a fraction of the size and cost, brought up when you need it and torn down when you're done.

9 min read 🛠 Walkthrough ☁️ Real cloud · MCP · IDE
0 mocks of production between your code and real cloud
1 declaration. The same real services from dev through prod
~30 s code change to live against real cloud
MCP IDE and agent wired into the Wayfinder control plane

The story, in four steps

Container fakes of cloud services run on a developer's laptop so changes can be tested in seconds without waiting on cloud, but they quietly drift from the real services over time. The gap only shows up in staging or production, when it is hardest to fix. Wayfinder flips the order: real cloud from your first commit, the same way of working through to production, torn down when you are done.

Full cloud stack all the way through Real services, vended by Wayfinder Container fakes for cloud services Passes locally, fails in cloud Same real services, every environment Spin up, prove, tear down Pulling the feedback loop forward Agent + IDE on real cloud

The walkthrough

Why the "like-for-like" container trap is so seductive and so wrong, what to do instead, and the IDE workflow that makes real cloud from day one feel faster than mocking.

The bet behind every container fake of a cloud service is "the API is the same, so the behaviour is the same." It almost never is. As a concrete example, Wayfinder's own resource graph runs on Amazon Neptune in cloud and was first tested against a local Neo4j container. Same Bolt protocol, same openCypher driver, "should be fine." Two failures only ever appeared in cloud.

cypher · works in Neo4j, fails in Neptune Label wildcard %: a Neo4j extension, not standard openCypher
MATCH (this:OrgSystem {uid: $uid})-[l]-(that:%)
RETURN that
// ✅ Neo4j local: returns related nodes
// ❌ Neptune:     parse error: % is not openCypher
server config · default differed silently neptune_query_timeout shipped at 25 ms; Neo4j has no equivalent
neptune_query_timeout = 25     # ms, Neptune default in our cluster
                               # every non-trivial cypher query timed out
                               # local tests never hit it
  • Mean time to recovery grows. When a production issue can't be reproduced quickly against a like-for-like environment, recovery is delayed. Every hour spent trying to recreate the conditions production was in is an hour the issue is still live.
  • Divergent environments are costly to keep aligned. Maintaining and managing a different-shaped environment alongside production takes constant effort. It makes troubleshooting production issues harder when the local environment doesn't match, and it stops you validating against anything close enough to production to be a useful signal.
  • The shape of the environment hides real cloud behaviour. Object stores, queues, databases, identity and networking each behave differently in cloud than in a different-shaped local copy. Runtime, limits, IAM, eventual consistency and regional behaviour are all part of the contract, not just the API surface. The more cloud services your code touches, the wider the gap between what local tests can tell you and what production will accept.

See it on your own stack

Book a 20-minute demo. We'll declare a real cloud service in a manifest, share it across two environments, wire the MCP server into an IDE, and have you change code against real cloud inside the call.