Bowire vs. Scalar
Scalar renders an OpenAPI document into beautiful docs. Bowire discovers the contract from the running service, across every protocol it speaks. Many teams use both.
When Scalar is the better fit
Pick Scalar when your workflow is spec-first: an openapi.yaml / swagger.json is the source of truth, server + clients are generated from it, and you want a polished public docs site with a built-in Try-it console. Scalar reads the spec and renders it beautifully — great fit for contract-first REST APIs where the contract is designed before implementation.
When Bowire is the better fit
Pick Bowire when the direction is reversed: a running server is the source of truth and Bowire discovers the contract at runtime (gRPC reflection, the OpenAPI document the server emits, SignalR hub enumeration, GraphQL introspection, …). Bowire lands one workbench across every protocol your service actually speaks — not only REST — and embeds directly inside the ASP.NET app instead of being a separate hosted site.
Where they differ
Only the rows where Scalar and Bowire differ, from the full comparison. Rows we could not verify for Scalar are left out rather than guessed. Facts as of 2026-08; correct one.
| Feature | Scalar | Bowire |
|---|---|---|
| Multi-protocol supportScalar: REST via OpenAPI / Swagger import | 1 | 20+ |
| gRPC | ✗ | ✓ |
| SOAPBowire: WSDL 1.1 discovery, 1.1 + 1.2 envelopes | ✗ | ✓ |
| GraphQL | ✗ | ✓ |
| SignalR | ✗ | ✓ |
| MCP | ✗ | ✓ |
| JSON-RPCBowire: OpenRPC rpc.discover | ✗ | ✓ |
| SSE | ✗ | ✓ |
| WebSocket | ✗ | ✓ |
| MQTT | ✗ | ✓ |
| AMQPBowire: 0.9.1 RabbitMQ + 1.0 | ✗ | ✓ |
| NATSBowire: core + JetStream + Services API | ✗ | ✓ |
| Socket.IO | ✗ | ✓ |
| OData | ✗ | ✓ |
| AsyncAPIBowire: discovery source — routes to MQTT / Kafka / WS wires | ✗ | ✓ |
| Surgewave | ✗ | ✓ |
| Kafka | ✗ | ✓ |
| Apache Pulsar | ✗ | ✓ |
| DIS (IEEE 1278) | ✗ | ✓ |
| UDP (raw datagrams) | ✗ | ✓ |
| Akka.NET (mailbox tap) | ✗ | ✓ |
| TacticalAPI (situational awareness)Bowire: v1.0.0 stable — descriptor discovery, typed CRUD, server-streaming track pump, the lot | ✗ | ✓ |
| OTLP (OpenTelemetry listener)Bowire: Passive listener — receive traces / metrics / logs from the services under test; first-party opt-in package | ✗ | ✓ |
| Custom protocol plugins | ✗ | ✓ |
| Auto-discoveryScalar: Only via OpenAPI / Swagger import | OpenAPI | ✓ |
| gRPC Reflection | ✗ | ✓ |
| GraphQL introspection | ✗ | ✓ |
| Proto file loading | ✗ | ✓ |
| Service catalogue (Consul / Kubernetes) | ✗ | ✓ |
| Schema drift watch | ✗ | ✓ |
| Standalone tool | ✗ | ✓ |
| CLI mode | ✗ | ✓ |
| Kubernetes / Helm | ✓ | planned |
| SSO / SCIMScalar: Enterprise plan (paid) | Enterprise (paid) | ✓ |
| Native .NETScalar: Requires Scalar.AspNetCore NuGet package | via Scalar.AspNetCore | ✓ |
| Record + replay | ✗ | ✓ |
| Record session | ✗ | ✓ |
| Replay against env | ✗ | ✓ |
| HAR export | ✗ | ✓ |
| Convert to test assertions | ✗ | ✓ |
| Correlated multi-protocol timeline | ✗ | ✓ |
| Native export format | ✗ | .bwr |
| Replay as mock server | ✗ | ✓ |
| Mock from schema (no recording)Scalar: @scalar/mock-server generates REST mocks from OpenAPIBowire: bowire mock --schema (OpenAPI 3 doc), --grpc-schema (FileDescriptorSet), or --graphql-schema (SDL) → running mock, no traffic capture needed | REST only | ✓ |
| Mock engine depth | ✗ | ✓ |
| Multiple duplex channels | ✗ | ✓ |
| Visual flow editor | ✗ | ✓ |
| Branching (if / else) | ✗ | ✓ |
| Loops | ✗ | ✓ |
| Delays / wait steps | ✗ | ✓ |
| Variable forwarding | ✗ | ✓ |
| Per-step assertions | ✗ | ✓ |
| Performance / load testing | ✗ | ✓ |
| CI test runner (JUnit / SARIF / HTML)Bowire: bowire test — runs recordings or flows headless with JUnit, SARIF and HTML reports, GitHub annotations, --fail-on gates | ✗ | ✓ |
| Contract testing (consumer / provider) | ✗ | ✓ |
| Snapshot testingBowire: exact | structural modes, __snapshots__ baselines committed to git, --update-snapshots re-baselining | ✗ | ✓ |
| Data-driven test runsBowire: Per-step datasets — inline rows, CSV, or generator | ✗ | ✓ |
| Endpoint test coverageBowire: Per-method run history + coverage chips in the Discover sidebar — see which endpoints regression runs actually touch | ✗ | ✓ |
| Security scanning | ✗ | ✓ OWASP API Top 10 |
| Out-of-band (OAST) detection | ✗ | ✓ |
| API monitoring / scheduled probes | ✗ | ✓ local |
| Traffic interception / reverse proxyBowire: In-process app.UseBowireInterceptor() middleware plus a YARP-based standalone reverse proxy; Intercept rail with Captured | Live overrides | Mock servers | ✗ | ✓ |
| AI assistant (local-first, BYOK) | ✗ | ✓ |
| Local-first, no accountScalar: OSS client is local; hosted platform is cloud | cloud-hosted | ✓ |
| Git-native workspace | ✗ | ✓ |
| Public API catalogBowire: Internal catalogue built in (browsable in the workbench + bowire catalogue list|providers|use|clear); public hosted docs via the Surgewave Registry | ✓ | internal ✓ / public via Registry |
| Hosted docs page | ✓ | ✗ |
| Custom domainScalar: Scalar Pro tier (paid) | Pro (paid) | ✗ |
| Try-It-Out widget | ✓ | via client |
| API versioningScalar: Scalar Pro tier (paid) | Pro (paid) | via Surgewave Registry |
| Catalog / searchBowire: Built-in catalogue — local file / HTTP / Consul / Kubernetes / Agent providers (bowire catalogue); public sharing via the Surgewave Registry | ✓ | ✓ built-in |
| MCP adapterScalar: REST docs only, via OpenAPI | REST docs only | ✓ every protocol |
| Tools capability | ✗ | ✓ |
| Resources capabilityScalar: Docs content exposed as MCP resourcesBowire: 8 resources: bowire://environments, bowire://recordings (+/{id}), bowire://collections (+/{id}), bowire://flows (+/{id}), bowire://plugins | docs-as-resources | ✓ |
| Prompts capabilityBowire: 4 prompts: replay-recording, compare-responses, fuzz-method, scan-service | ✗ | ✓ |
| stdio transport | ✗ | ✓ |
| Streamable HTTP transport | ✗ | ✓ |
| Platform ops as MCP tools | ✗ | ✓ 15 tools |
| Recording start / stopBowire: bowire.record.start / .stop / .list | ✗ | ✓ |
| Environment listBowire: bowire.env.list — read-only enumeration; an environment-switch tool is tracked in the v2.9 MCP-completion milestone | ✗ | ✓ |
| Replay executeBowire: bowire.record.replay | ✗ | ✓ |
| Mock spin-upBowire: bowire.mock.start / .stop / .list | ✗ | ✓ |
| License | MIT | Apache 2.0 |
| Price | Freemium | Free |
● supported · ◐ partial or paid tier · ○ not supported
Moving over from Scalar
There is nothing to migrate: Bowire reads the same OpenAPI document Scalar renders.
- Standalone:
bowire --url=https://api.example.com/openapi.json— the exact document URL, JSON or YAML, OpenAPI 3 or Swagger 2.0. See REST / OpenAPI. - Embedded:
app.MapBowire()in the ASP.NET app reads the same metadataMicrosoft.AspNetCore.OpenApiuses, so the workbench never runs on a stale spec. - A file on disk: drop it on the Schema Files tab.
Keep Scalar for the public docs site and use Bowire for development, testing and the protocols beyond REST.