Samples
One runnable reference app per protocol — built around the same Harbor Control Center domain so the protocol differences read at a glance.
Same domain, every protocol
All eleven samples share Kuestenlogik.Bowire.Samples.Shared — a seeded Harbor Control Center store with ships, docks, cranes, containers, and port calls. So when you compare gRPC and GraphQL on the same data, the only thing different is the wire.
-
Ships, Docks, Cranes, Containers, PortCalls.
A seeded
HarborStorewith 3 ships, 5 docks, 3 cranes, 6 containers, 3 port calls. The PortCall lifecycle (Scheduled → Approaching → Docked → Departing → Completed) gives every sample a natural state machine to demonstrate streaming + mutations. -
One port per sample.
Run several side-by-side without conflicts. Bowire UI lives at
/bowireon each one — point your browser at the URL listed below and the workbench is there. -
Real protocol features, not toy endpoints.
SignalR uses
IAsyncEnumerable<T>streams; GraphQL ships subscriptions via HotChocolate 15; MQTT runs an embedded broker with retained messages and Last Will and Testament; OData covers$select / $filter / $orderby / $expand / $count. Each sample is a usable reference for that protocol.
The multi-protocol showcase
If you only run one sample, run this. Combined serves the same HarborStore over five protocols at once — gRPC, REST, SignalR, WebSocket, SSE — so Bowire's auto-discovery picks all of them up from a single endpoint URL.
One sample per protocol
Each sample is the simplest interesting host for that protocol — the wire features that matter, no scaffolding noise.
Grpc — port 5110
All four call types (unary / server-stream / client-stream / duplex), trailers, auth metadata.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.Grpc
Rest — port 5111
Full HTTP verb coverage, ProblemDetails, multipart upload via IFormFile.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.Rest
SignalR — port 5112
Invoke, IAsyncEnumerable<T> streaming, groups, user-scoped broadcast.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.SignalR
WebSocket — port 5113
Text + binary frames, sub-protocol negotiation, keep-alive.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.WebSocket
Sse — port 5114
Last-Event-ID resume from a 512-event replay buffer — survives reconnects without losing frames.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.Sse
GraphQL — port 5115
HotChocolate 15 — query + mutation + subscription, nested resolvers via [ExtendObjectType].
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.GraphQL
OData — port 5116
OData v4 — $select, $filter, $orderby, $expand, $count across five entity sets.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.OData
Mqtt — port 5117 (broker on :1883)
Embedded MqttServerFactory broker, retained messages, Last Will and Testament.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.Mqtt
SocketIo — port 5118
UI shell only — Socket.IO needs a Node.js broker. The sample's README walks through the broker setup; Bowire connects to it once it's up.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.SocketIo
Mcp — port 5119
AI-invocable [McpServerTool] + [McpServerResource] via HTTP/SSE transport — Claude / Cursor / Copilot can drive the harbor directly.
$ dotnet run --project src/Kuestenlogik.Bowire.Samples.Mcp
Quickstart
Clone, build, run any sample, then point your browser at the URL printed on startup. Every sample auto-launches Bowire at /bowire.
git clone https://github.com/Kuestenlogik/Bowire.Samples.git
cd Bowire.Samples
dotnet build Bowire.Samples.slnx
# pick one
dotnet run --project src/Kuestenlogik.Bowire.Samples.Combined
# → https://localhost:5101/bowire
Want every sample running side-by-side? Each one binds a different port (5101 + 5110–5119), so you can dotnet run them in parallel terminals and switch between them from one Bowire UI by changing the URL.