Compare
tRPC vs. Graftcode

Same local feel. Any language.

tRPC's typed calls stop at the TypeScript border. Graftcode gives you the same feel across .NET, Java, Python and Go.

/USED BY LEADING COMPANIES

3G TMS
ARC CORE
IBM
Intermodal Tank Transport
NewDoors
First Premier Bank
TotalEnergies
TRUMPF
Stratus
SIEMENS
Nuance
Walter
Tangram
Nevada
BREAS
Statistics Norway
3G TMS
ARC CORE
IBM
Intermodal Tank Transport
NewDoors
First Premier Bank
TotalEnergies
TRUMPF
Stratus
SIEMENS
Nuance
Walter
Tangram
Nevada
BREAS
Statistics Norway
3G TMS
ARC CORE
IBM
Intermodal Tank Transport
NewDoors
First Premier Bank
TotalEnergies
TRUMPF
Stratus
SIEMENS
Nuance
Walter
Tangram
Nevada
BREAS
Statistics Norway

/AT GLANCE

gRPC vs Graftcode

Both give you great typed DX. The difference shows the moment you leave TypeScript.

tRPC
  • Great typed DX - but only if the whole stack is TypeScript
  • Needs a router + procedures - the router is your contract
  • No in-process ↔ remote switch by configuration
  • No native MCP / AI-agent exposure
  • Streaming support is limited
  • Same typed, local-feeling calls - across 14+ runtimes
  • Expose ordinary classes - no router, no procedures
  • Install the Graft as a normal npm / NuGet / pip package
  • In-process ↔ remote is a config switch, not a rewrite
  • Public methods become MCP tools automatically

/WHY SWITCH

Three reasons teams move from tRPC

tRPC gave TypeScript a great typed RPC. The limits show the moment you leave the monorepo, add a second language, or bring in an AI agent.

Typed call reaching Graftcode from outside a TypeScript-only stack

One feel, every language

tRPC's type safety stops at the TypeScript border. Graftcode gives you the same local-call feel whether the other side is .NET, Java, Python, Go — or Node.

A public method exposed without a tRPC router

No router, just methods

tRPC needs a router and procedures that become your contract. Graftcode reads your plain public methods — nothing to define, distribute, or keep in sync.

A Graft package installed outside a single monorepo

No monorepo lock-in

tRPC's types only travel inside a monorepo. Graftcode ships a versioned Graft any repo or language installs like a normal package.

/SHOW, DON'T TELL

Same local feel — now cross-language

The same typed call — getUser(42) — but the caller no longer has to be TypeScript.

TRPC
  1. define a router
    export const appRouter = router({
      getUser: publicProcedure
        .input(z.object({ id: z.number() }))
        .query(({ input }) => db.find(input.id)),
    });
    export type AppRouter = typeof appRouter;
  2. infer client types
    const trpc = createTRPCClient<AppRouter>({ links });
    const user = await trpc.getUser.query({ id: 42 });
GRAFTCODE
  1. expose a class
    public class UserService {
      public User GetUser(int id) => _db.Find(id);
    }
  2. call from any language
    from acme_user_service import UserService
    
    user = UserService.get_user(42)

Same typed, local-feeling call.tRPC keeps it inside TypeScript - Graftcode takes it across every runtimes.

/FEATURE MATRIX

The honest, line-by-line comparison

CapabilityTRPC
PROGRAMMING MODEL
Call with Strongly Typed Methods
[✓] YES
Regular Exception support
[-] PARTIAL
Complex DTOs & arrays passed by value in one call
[✓] YES
PROGRAMMING DEPENDENCIES & CONTRACTS
No additional SDK
[×] NO
No contract files
[×] NO
Use remote modules as dependencies
[-] PARTIAL
TOPOLOGY & TRANSPORT
Monolith <-> Microservices switch by configuration
[×] NO
Switch remote <-> in-memory with config only
[×] NO
TOPOLOGY & TRANSPORT
Same programming model for queues / event buses
[×] NO
Full streaming
[-] LIMITED
Automatic Native MCP
[×] NO
TRPC compared with Graftcode
CapabilityTRPCGraftcode
PROGRAMMING MODEL
Call with Strongly Typed Methods[✓] YES[✓] YES
Regular Exception support[-] PARTIAL[✓] YES
Complex DTOs & arrays passed by value in one call[✓] YES[✓] YES
PROGRAMMING DEPENDENCIES & CONTRACTS
No additional SDK[×] NO[✓] YES
No contract files[×] NO[✓] YES
Use remote modules as dependencies[-] PARTIAL[✓] YES
TOPOLOGY & TRANSPORT
Monolith <-> Microservices switch by configuration[×] NO[✓] YES
Switch remote <-> in-memory with config only[×] NO[✓] YES
TOPOLOGY & TRANSPORT
Same programming model for queues / event buses[×] NO[✓] Via plugins
Full streaming[-] LIMITED[✓] YES
Automatic Native MCP[×] NO[✓] YES

/BY THE NUMBERS

The payoff, in numbers

60%

less code for AI to touch

1/8

of REST/RPC overhead via Hypertube™

20

coding languages supported

10

package managers supported

/FAQS

Before you ask

  • Inside TypeScript, tRPC is genuinely low-ceremony — that's its strength. But it still needs a router that acts as your contract, it's confined to the TypeScript/JavaScript ecosystem, and it has no config-driven topology or MCP path. Graftcode keeps the low ceremony and removes those limits.

/COMMUNITY

Join grafters community

Many developers are loving Graftcode and what it brings to them.

Community member avatar 1-1
Community member avatar 1-2
Community member avatar 1-3
Community member avatar 1-4
Community member avatar 1-5
Community member avatar 1-6
Community member avatar 1-7
Community member avatar 1-8
Community member avatar 1-9
Community member avatar 1-10
Community member avatar 1-11
Community member avatar 1-12
Community member avatar 1-13
Community member avatar 1-14
Community member avatar 1-15
Community member avatar 1-16
Community member avatar 1-17
Community member avatar 1-18
Community member avatar 1-19
Community member avatar 1-20
Community member avatar 1-21
Community member avatar 1-22
Community member avatar 1-23
Community member avatar 1-24
Community member avatar 1-25
Community member avatar 1-26
Community member avatar 2-1
Community member avatar 2-2
Community member avatar 2-3
Community member avatar 2-4
Community member avatar 2-5
Community member avatar 2-6
Community member avatar 2-7
Community member avatar 2-8
Community member avatar 2-9
Community member avatar 2-10
Community member avatar 2-11
Community member avatar 2-12
Community member avatar 2-13
Community member avatar 2-14
Community member avatar 2-15
Community member avatar 2-16
Community member avatar 2-17
Community member avatar 2-18
Community member avatar 2-19
Community member avatar 2-20
Community member avatar 2-21
Community member avatar 2-22
Community member avatar 2-23
Community member avatar 2-24
Community member avatar 2-25
Community member avatar 2-26
Community member avatar 3-1
Community member avatar 3-2
Community member avatar 3-3
Community member avatar 3-4
Community member avatar 3-5
Community member avatar 3-6
Community member avatar 3-7
Community member avatar 3-8
Community member avatar 3-9
Community member avatar 3-10
Community member avatar 3-11
Community member avatar 3-12
Community member avatar 3-13
Community member avatar 3-14
Community member avatar 3-15
Community member avatar 3-16
Community member avatar 3-17
Community member avatar 3-18
Community member avatar 3-19
Community member avatar 3-20
Community member avatar 3-21
Community member avatar 3-22
Community member avatar 3-23
Community member avatar 3-24
Community member avatar 3-25
Community member avatar 3-26

“Graftcode appears to be an exceptionally useful platform. Its key value proposition is allowing developers to concentrate on core business requirements instead of tedious service integration tasks. I believe the concept of beginning with a monolithic structure and then having the option to dynamically transition to a microservice architecture will prove to be extremely valuable.”

Maciej_e$

GitHub

Start and contribute to the project on GitHub.

JOIN
LinkedIn

Connect with us on LinkedIn.

JOIN
Twitter / X

Follow along on X.

JOIN
Discord

Join the conversation on Discord.

JOIN

Keep the speed.Drop the spaghetti code.

Expose one class, install the Graft, and make your first typed cross-service call inabout 10 minutes.