well-typed/grapesy

Native Haskell gRPC client and server based on `http2`

94

stars

751

commits

Haskell

primary language

Sep 3, 2026

updated

README

grapesy: industrial strength gRPC library for Haskell

Haskell library providing gRPC client and server.

Interoperability matrix

The gRPC framework comes with a test suite that tests interoperability between implementations as well compliance to the gRPC specification. As the table below shows, grapesy passes all of these tests, apart from the Open Request Cost Aggregation (ORCA) tests, which is not yet supported by grapesy.

Legend and version information

Legend:

  • ✅ passed
  • ❌ failed
  • ❔ not supported by the reference (or reference does not conform to the gRPC specification)
  • 🚫 not supported by grapesy

We last tested against version v1.83.0 (released July 21, 2026).

grapesy server versus reference client

TestPythonC++GoJavagrapesy
cancel_after_begin
cancel_after_first_response
client_compressed_streaming
client_compressed_unary
client_streaming
custom_metadata
empty_stream
empty_unary
large_unary
orca_oob🚫🚫🚫🚫🚫
orca_per_rpc🚫🚫🚫🚫🚫
ping_pong
server_compressed_streaming
server_compressed_unary
server_streaming
special_status_message
status_code_and_message
timeout_on_sleeping_server
unimplemented_method
unimplemented_service

grapesy client versus reference server

TestPythonC++GoJavagrapesy
cancel_after_begin
cancel_after_first_response
client_compressed_streaming
client_compressed_unary
client_streaming
custom_metadata
empty_stream
empty_unary
large_unary
orca_oob🚫🚫🚫🚫🚫
orca_per_rpc🚫🚫🚫🚫🚫
ping_pong
server_compressed_streaming
server_compressed_unary
server_streaming
special_status_message
status_code_and_message
timeout_on_sleeping_server
unimplemented_method
unimplemented_service

Unsupported tests

There are additional tests that are not supported by grapesy, but since these are not supported by most (or indeed any) of the reference implementations that we tested, we did not consider them any further. The full list is:

Memory profiles

Screenshots of the "Area Chart" display of the eventlog2html output for selected RPC communication patterns.

Many connections

Client opens many connections and does a single non-streaming RPC.

Client profile:

Client many connections
profile

Server profile:

Server many connections
profile

Many calls

Client opens a single connection and does many RPCs.

Client profile:

Client many connections
profile

Server profile:

Server many connections
profile

Many messages

Client opens a single connection and does a single RPC that sends many messages.

Client profile:

Client many connections
profile

Server profile:

Server many connections
profile

Benchmarks

Run typeLinux (RPCs/s)OSX (RPCs/s)
GrapesyJavaGrapesyJava
sequential protobuf4654.5007169.2832919.7831907.350
concurrent protobuf3326.28310908.6505032.9504571.750
sequential json2371.2332427.900909.4171574.817
concurrent json3019.7336143.5671151.0173563.867

Contributors

edsko

639 commits

phadej

64 commits

FinleyMcIlwaine

40 commits

well-typed/grapesy

Native Haskell gRPC client and server based on `http2`

94

stars

751

commits

Haskell

primary language

Sep 3, 2026

updated

README

grapesy: industrial strength gRPC library for Haskell

Haskell library providing gRPC client and server.

Interoperability matrix

The gRPC framework comes with a test suite that tests interoperability between implementations as well compliance to the gRPC specification. As the table below shows, grapesy passes all of these tests, apart from the Open Request Cost Aggregation (ORCA) tests, which is not yet supported by grapesy.

Legend and version information

Legend:

  • ✅ passed
  • ❌ failed
  • ❔ not supported by the reference (or reference does not conform to the gRPC specification)
  • 🚫 not supported by grapesy

We last tested against version v1.83.0 (released July 21, 2026).

grapesy server versus reference client

TestPythonC++GoJavagrapesy
cancel_after_begin
cancel_after_first_response
client_compressed_streaming
client_compressed_unary
client_streaming
custom_metadata
empty_stream
empty_unary
large_unary
orca_oob🚫🚫🚫🚫🚫
orca_per_rpc🚫🚫🚫🚫🚫
ping_pong
server_compressed_streaming
server_compressed_unary
server_streaming
special_status_message
status_code_and_message
timeout_on_sleeping_server
unimplemented_method
unimplemented_service

grapesy client versus reference server

TestPythonC++GoJavagrapesy
cancel_after_begin
cancel_after_first_response
client_compressed_streaming
client_compressed_unary
client_streaming
custom_metadata
empty_stream
empty_unary
large_unary
orca_oob🚫🚫🚫🚫🚫
orca_per_rpc🚫🚫🚫🚫🚫
ping_pong
server_compressed_streaming
server_compressed_unary
server_streaming
special_status_message
status_code_and_message
timeout_on_sleeping_server
unimplemented_method
unimplemented_service

Unsupported tests

There are additional tests that are not supported by grapesy, but since these are not supported by most (or indeed any) of the reference implementations that we tested, we did not consider them any further. The full list is:

Memory profiles

Screenshots of the "Area Chart" display of the eventlog2html output for selected RPC communication patterns.

Many connections

Client opens many connections and does a single non-streaming RPC.

Client profile:

Client many connections
profile

Server profile:

Server many connections
profile

Many calls

Client opens a single connection and does many RPCs.

Client profile:

Client many connections
profile

Server profile:

Server many connections
profile

Many messages

Client opens a single connection and does a single RPC that sends many messages.

Client profile:

Client many connections
profile

Server profile:

Server many connections
profile

Benchmarks

Run typeLinux (RPCs/s)OSX (RPCs/s)
GrapesyJavaGrapesyJava
sequential protobuf4654.5007169.2832919.7831907.350
concurrent protobuf3326.28310908.6505032.9504571.750
sequential json2371.2332427.900909.4171574.817
concurrent json3019.7336143.5671151.0173563.867

Contributors

edsko

639 commits

phadej

64 commits

FinleyMcIlwaine

40 commits

Languages

Haskell

99.9%