Development-time vs production-time behavior

One of the most common sources of confusion in distributed systems is when certain things happen.

Client generation, interface discovery, routing, execution, monitoring—these concerns often blend together, making it unclear which parts are design-time, build-time, or runtime responsibilities.

Graftcode makes a clear distinction between development time and production time, and each phase has a very different role.

Understanding this separation is key to understanding both the architecture and the security model.


Development time: discovering and consuming interfaces

Development time is when developers:

  • write code
  • explore services
  • add dependencies
  • evolve interfaces

In Graftcode, this phase is centered around interfaces, not traffic.


Exposing interfaces during development

During development, a service is started together with a Graftcode Gateway.

When the Gateway starts, it:

  • loads the configured runtimes
  • loads the specified modules
  • analyzes public interfaces
  • builds a Unified Graft Model (UGM)

At this stage:

  • no production traffic exists
  • no business logic is executed on behalf of consumers
  • only interface metadata is made available

This metadata is what enables everything that follows.


Discovering services with Graftcode Vision

Developers typically use Graftcode Vision at development time to:

  • see what a service exposes
  • understand available methods
  • copy package manager commands
  • obtain configuration examples

Vision operates directly against the running Gateway, which means it always reflects the current state of the code.

There is no separate documentation lifecycle.


Adding remote services as dependencies

When a developer decides to use a remote service, they do not generate a client manually.

Instead, they:

  • copy a package manager command
  • install the dependency
  • import the generated client

At that moment, the Graftcode Engine:

  • generates a strongly typed client on demand
  • tailored to the requested technology
  • based on the current Unified Graft Model

The result behaves like any other dependency in the project.


Immediate feedback through tooling

Because Grafts are normal dependencies:

  • IDEs provide autocomplete
  • type errors appear immediately
  • signature changes are visible without running code

If an interface evolves:

  • new methods appear after dependency update
  • removed members cause compile-time errors
  • mandatory changes are detected early

This tight feedback loop is one of the main benefits of the development-time model.


Production time: executing calls

Production time begins once services are deployed and real calls start flowing.

In this phase, the focus shifts from discovery to execution.


No cloud in the execution path

A critical distinction in Graftcode is that the cloud is not part of production execution.

Once a Graft has been generated:

  • calls go directly from caller to receiver
  • execution happens through Hypertube
  • communication uses TCP/IP or WebSocket

The Graftcode cloud:

  • does not forward calls
  • does not process payloads
  • does not see runtime data

Execution is fully under your control.


Runtime execution through Hypertube

At production time, execution happens through Hypertube™, but it is important to understand what this actually means.

Hypertube is not an external service and not a remote system operated by Graftcode.

It is a runtime connection engine that runs entirely within the customer’s environment:

  • partially inside the generated Graft (on the caller side)
  • partially inside the Graftcode Gateway (on the receiver side)

Both sides are deployed and controlled by the user.

There is no traffic routed outside the customer’s network and no execution leaving their infrastructure.


Direct, internal communication

When a caller invokes a method on a Graft:

  • the Graft uses its embedded Hypertube component
  • the call is translated into a binary runtime-level message
  • the message is sent directly to a Graftcode Gateway
  • execution happens inside the target runtime hosted by that Gateway

This communication is:

  • direct
  • point-to-point
  • over standard TCP/IP or WebSocket
  • entirely within the customer’s network

There is no intermediary, proxy, or cloud service involved in call execution.


Hypertube is part of your runtime, not ours

Hypertube does not operate as a shared platform component.

It:

  • does not aggregate traffic
  • does not inspect payloads centrally
  • does not relay calls through third-party infrastructure

From a deployment and security perspective, Hypertube behaves like a runtime library, not like a service.

If your systems can communicate directly today, they can communicate through Hypertube in exactly the same way—just with a different execution model.


Why this matters

This design ensures that:

  • all production execution stays within your network boundary
  • existing network controls, firewalls, and load balancers apply unchanged
  • Graftcode does not become a runtime dependency for production traffic

The Graftcode cloud is involved only in development-time interface discovery and client generation.

At production time, Graftcode does not sit in the execution path.


Configuration replaces code changes

At production time, architectural decisions are expressed through configuration.

For example:

  • which Gateway instance to call
  • which transport channel to use
  • whether calls are local or remote
  • which plugins are enabled

These decisions do not require changes to application code.

This allows:

  • DevOps to control deployment behavior
  • developers to focus on business logic
  • architecture to evolve independently

Versioning and evolution across phases

The separation between development time and production time also clarifies how interfaces evolve.

During development:

  • interfaces are explored
  • changes are discovered through tooling
  • compatibility is enforced by the type system

During production:

  • older Grafts continue to work
  • newer Grafts unlock additional capabilities
  • deprecation can be managed safely

There is no forced synchronization between producers and consumers.


Why this separation matters

Many systems mix concerns:

  • runtime behavior depends on design-time artifacts
  • documentation lags behind implementation
  • execution paths depend on build-time choices

Graftcode avoids this by clearly separating responsibilities:

  • development time is about understanding and consuming interfaces
  • production time is about executing calls efficiently and safely

Each phase uses the cloud only where it provides value.


In short

In Graftcode:

  • development time focuses on discovery, typing, and feedback
  • production time focuses on execution and performance
  • the cloud enables interface discovery, not call execution
  • runtime behavior remains local and controllable

This separation makes distributed systems easier to reason about, easier to secure, and easier to evolve.


See also: What goes to Graftcode Cloud