Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

535 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kotlin Simple RPCs

GitHub license Kotlin Maven Central KDoc link

Define a service interface once in Kotlin common, then call it over HTTP, sockets, stdin/out, websockets, or in-process, without changing your service code. Built for Kotlin Multiplatform, curl-testable by default, and LSP-protocol-compatible out of the box.

Quick Start

@KsService
interface GreetingService : RpcService {
    @KsMethod("/greet")
    suspend fun greet(name: String): String
}

// Implement once
class GreetingServiceImpl : GreetingService {
    override suspend fun greet(name: String) = "Hello, $name!"
}

// Host over HTTP
val env = ksrpcEnvironment { }
embeddedServer(Netty, 8080) {
    routing { serveHttp("/api", GreetingServiceImpl(), env) }
}.start()

// Call from any platform
val service = HttpClient { }.asHttpChannelClient("http://localhost:8080/api", env)
    .defaultChannel().toStub<GreetingService>()
println(service.greet("world")) // "Hello, world!"

Build Setup

plugins {
    id("com.monkopedia.ksrpc.plugin") version "0.11.1"
}

dependencies {
    implementation("com.monkopedia.ksrpc:ksrpc-core:0.11.1")
    // Add transport modules as needed:
    // implementation("com.monkopedia.ksrpc:ksrpc-ktor-server:0.11.1")
    // implementation("com.monkopedia.ksrpc:ksrpc-ktor-client:0.11.1")
}

Supported Transports

Transport Platforms Module
HTTP JVM, Native, JS/WASM (client) ksrpc-ktor-client, ksrpc-ktor-server
WebSockets JVM, Native, JS/WASM (client) ksrpc-ktor-websocket-client, ksrpc-ktor-websocket-server
Sockets JVM, POSIX Native ksrpc-sockets
Stdin/out JVM, POSIX Native ksrpc-sockets
JSON-RPC 2.0 JVM, POSIX Native ksrpc-jsonrpc
JNI JVM + Kotlin/Native ksrpc-jni
Service Workers JS (experimental) ksrpc-service-worker

Features

  • Service declaration -- Define services with @KsService and @KsMethod; the compiler plugin generates stubs and companions automatically. Guide
  • Sub-services -- Pass services as method parameters or return values for contextual callbacks and hierarchical APIs. Guide
  • Bidirectional communication -- Connection supports hosting and calling services simultaneously over the same channel. Guide
  • Binary data -- Stream binary payloads via RpcBinaryData with adapters for ktor, kotlinx-io, and okio.
  • Typed errors -- Map exceptions to wire-format error codes with @KsError and KsrpcException. Guide
  • Context propagation -- Propagate per-call context (auth tokens, trace IDs) across transports with @KsContext. Guide
  • Introspection -- Opt in with @KsIntrospectable to expose endpoint metadata and schemas at runtime. Guide
  • Flow streaming -- Use Flow<T> in method signatures for streaming results over any transport, backed by KsFlowService. Guide
  • Result<T> returns -- Declare a @KsMethod returning Result<O> to receive failures as Result.failure instead of thrown exceptions, with no wire-format change. Guide
  • JSON-RPC 2.0 notifications -- Mark methods with @KsNotification for fire-and-forget semantics.

Why not gRPC?

ksrpc exists because gRPC and protobuf didn't quite fit. I wanted JSON on the wire so I could curl at services for testing, stdin/out support like LSP, and first-class Kotlin Multiplatform coverage. ksrpc fills that niche: simple service declarations, multiple transports, and broad platform support.

Documentation

Full API reference and guides are hosted at monkopedia.github.io/ksrpc.

License

Copyright 2026 Jason Monk

Licensed under the Apache License, Version 2.0

About

Kotlin Multiplatform RPC library — declare a service interface in common code and a compiler plugin generates kotlinx.serialization-backed stubs over pluggable transports (sockets, pipes, Ktor/WebSocket, JNI).

Topics

Resources

Stars

Watchers

Forks

Releases

Contributors

Languages