
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/Kotlin, Python, JavaScript/TypeScript, Ruby and PHP.

Same local feel. Any language.
tRPC's typed calls stop at the TypeScript border. Graftcode gives you the same feel across .NET, Java/Kotlin, Python, JavaScript/TypeScript, Ruby and PHP
/USED BY LEADING COMPANIES
/AT GLANCE
Both give you great typed DX. The difference shows the moment you leave TypeScript.
/WHY SWITCH
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.

tRPC's type safety stops at the TypeScript border. Graftcode gives you the same local-call feel whether the other side is .NET, Java/Kotlin, Python, JavaScript/TypeScript, Ruby and PHP.

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

tRPC requires either a monorepo or explicit sharing of router types with the frontend. Graftcode, on the other hand, turns any public API into installable packages that you can manage and update just like any other dependency in your project even when consuming third-party APIs.
/SHOW, DON'T TELL
The same typed call - getUser(42) - but the project no longer has to be purely in TypeScript or share any source files between client and server.
export const appRouter = router({
getUser: publicProcedure
.input(z.object({ id: z.number() }))
.query(({ input }) => db.find(input.id)),
});
export type AppRouter = typeof appRouter;const trpc = createTRPCClient<AppRouter>({ links });
const user = await trpc.getUser.query({ id: 42 });public class UserService {
public User GetUser(int id) => _db.Find(id);
}from acme_user_service import UserService
user = UserService.get_user(42)/FEATURE MATRIX
| Capability | TRPC | Graftcode |
|---|---|---|
| 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 | ||
| Switch between WebSocket, HTTP/2, TCP, queues, events, or PaaS channels with a single env var. | [×] 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 | [-] PARTIAL |
| Expose methods are immediately callable via MCP | [×] NO | [✓] YES |
/BY THE NUMBERS
60%
less code for AI to touch
1/8
of CPU usage comparing to REST or gRPC
20
coding languages supported
10
package managers supported
/FAQS
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
Many developers are loving Graftcode and what it brings to them.


















“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.”
Expose one class, install the Graft, and make your first typed cross-service call inabout 10 minutes.
