What problem does Graftcode solve

Modern software systems are not hard to build because of business logic.
They are hard to build because of communication.

As systems grow, they are split into modules, services, and components. Each split introduces a boundary—and every boundary needs a way for code on one side to talk to code on the other.

Over time, a surprising amount of effort goes into maintaining those conversations.


When code stops talking directly

Inside a single application, communication is simple. One method calls another. Types are shared. Errors are caught early.

As soon as code crosses a boundary—another process, another service, another language—direct communication disappears. In its place, we introduce an abstraction:

  • an API
  • a contract
  • a protocol
  • a client

That abstraction solves the immediate problem, but it also creates a new one: communication is no longer part of the programming model. It becomes something external, managed separately from the code it represents.


The long path of a simple call

Consider a simple operation: getting the current weather.

In a local application, it’s a method call.

In a distributed system, that same intent often travels a much longer path:

  • transformed into a request model
  • serialized into a transport format
  • sent through a network layer
  • deserialized on the other side
  • mapped back into a programming structure

Each step is reasonable on its own. Together, they form a pattern where the simplest interaction becomes indirect.

As systems evolve, this path tends to grow—not because the business needs it, but because the architecture does.


Integration becomes a parallel system

Over time, integration stops being a thin layer and becomes a system of its own:

  • interfaces must be designed and documented
  • clients must be generated and distributed
  • versions must be coordinated across teams
  • changes must be synchronized carefully

The result is that how systems talk to each other starts to demand as much attention as what those systems actually do.

This isn’t a failure of REST, gRPC, or messaging platforms. These tools solve real problems. The issue is more fundamental:
they all treat communication as something outside the programming model.


Architecture becomes sticky

Once communication is encoded into APIs and protocols, architecture decisions become difficult to reverse.

Changing:

  • a transport
  • a communication style
  • a deployment model

often requires changes across multiple layers and teams. Even small architectural shifts can ripple through contracts, clients, and documentation.

What started as an implementation detail becomes a constraint.


A familiar contrast

Developers already know a better model.

When working with shared libraries or modules:

  • public interfaces are carefully designed
  • private details stay private
  • changes are evolutionary
  • compatibility is enforced by the compiler

Remote communication rarely enjoys the same discipline—not because developers don’t care, but because the tools don’t support it naturally.


The problem in one sentence

The core problem Graftcode addresses is this:

Note

Remote communication forces developers to step outside the programming model they already trust.

Instead of working with code, types, and interfaces, they work with translations of those concepts—schemas, payloads, contracts, and clients.

Graftcode exists to remove that disconnect.


What this means in practice

When communication is externalized:

  • systems become harder to change
  • interfaces drift from implementations
  • integration work accumulates quietly over time

Solving this problem doesn’t mean inventing yet another protocol.
It means bringing communication back to where it belongs: into the runtime and the programming model itself.

That is the direction Graftcode takes.


See also: Where Graftcode fits