Samples

One runnable reference app per protocol — built around the same Harbor Control Center domain so the protocol differences read at a glance.

Browse the repo

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 HarborStore with 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 /bowire on 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.

Where to next