File Formats
Bowire reads, writes, and stores a small handful of file formats. They split into three groups: Bowire-native exports (.bw* family) that the workbench produces and consumes, standard interop formats that Bowire shares with the rest of the ecosystem (NuGet, HAR, OpenAPI, …), and internal on-disk stores under ~/.bowire/ that the workbench manages on the user's behalf.
Bowire-native exports — the .bw* family
Every Bowire-native export uses a .bw prefix so a desktop file manager treats them as one coherent family.
| Extension | Purpose | Produced by | Consumed by |
|---|---|---|---|
.bwf |
Flow — visual flow editor (5 node types, branching, loops, response chaining) | Workbench → Flows tab → Export | Workbench Import (same or another Bowire instance) |
.bwc |
Collection — Postman-style request bundle with environment-variable substitution | Workbench → Collections tab → Export | Workbench Import |
.bwr |
Recording — captured session across REST, gRPC (unary + streaming), WebSocket, SSE, SignalR, MQTT, Socket.IO, GraphQL subscriptions | Workbench → Recording manager → Export, or bowire mock --capture-miss |
Workbench Replay; bowire mock --recording <file>; UseBowireMock(<file>) in embedded mode |
.bwt |
Tests — method-scoped test collection ({ name, serverUrl, protocol, environment, tests: [...] }) for CI execution |
Workbench → Tests tab → Export collection | Workbench Import; CLI test-runner |
.bwe |
Environments — every environment plus globals and the active id, ready to share | Workbench → Environment manager → Export | Workbench Import |
All five are JSON documents — the .bw* extension signals "this is a Bowire artefact" without hiding its plain-text nature. Editors that recognise JSON by sniffing content keep working; file managers get a Bowire-specific affordance.
Standard interop formats
Bowire deliberately uses standard formats for everything that crosses an ecosystem boundary, instead of inventing a Bowire-specific wrapper.
| Format | Purpose | Bowire's role |
|---|---|---|
.nupkg |
NuGet package | Plugin distribution. bowire plugin install <PackageId> pulls from nuget.org or any configured private feed; embedded hosts use dotnet add package. Bowire has no custom plugin-package format — every protocol plugin and template ships as a regular .nupkg. |
.har |
HTTP Archive (1.2) | Alternate recording export and import path. Interop with DevTools, Charles, Insomnia, Postman, and Playwright's recordHar. HAR import into a .bwr recording is on the roadmap. |
.html (*.report.html) |
Self-contained HTML report | Pass/fail summary from the test runner with collapsible step details. Single file — drop it into a CI artefact bucket and link to it. |
.proto |
Protobuf source | Schema upload for gRPC when the target doesn't support Server Reflection. Also produces the FileDescriptorSet for bowire mock --grpc-schema. |
.pb |
Protobuf descriptor set | Compiled FileDescriptorSet (protoc --descriptor_set_out=path.pb --include_imports your.proto). Direct input for bowire mock --grpc-schema. |
.json (OpenAPI 3) |
OpenAPI / Swagger | Schema upload for REST and input for bowire mock --schema. |
.yaml / .yml (OpenAPI 3) |
OpenAPI / Swagger | Same as above; SharpYaml reader is registered explicitly so YAML and JSON variants are interchangeable. |
.graphql |
GraphQL SDL | Schema input for bowire mock --graphql-schema. |
Internal on-disk stores
These live under ~/.bowire/ and are managed by the workbench. They are not user-export formats — exporting the equivalent data goes through the .bw* family above.
| Path | Purpose |
|---|---|
~/.bowire/recordings.json |
Master store of every recording captured in the workbench. The mock CLI also accepts this file directly via --recording; pair with --select <name-or-id> when the store has more than one recording. |
~/.bowire/environments.json |
Master store of every environment, globals, and the currently active id. Sourced by the MCP allowlist and the workbench's variable substitution. |
~/.bowire/plugins/<PackageId>/ |
Unpacked NuGet plugins — runtime DLLs, the original .nuspec, and transitive deps that aren't already provided by the host. Each plugin loads into its own BowirePluginLoadContext so transitive-dep collisions don't cross plugin boundaries. |
~/.bowire/collections/ |
Named collections (.bwc documents) synced to disk so they survive browser changes. Same disk-sync pattern as recordings and environments. |
A note on plugin packaging
Some sister Küstenlogik products (notably Surgewave) ship a custom package format (.swpkg) bundling DLL + manifest + transitive deps into a single archive. Bowire deliberately does not do that — every Bowire plugin is a regular NuGet package, every Bowire host is a regular .NET app, and every install path (CLI, embedded, container, air-gapped) reuses standard NuGet tooling. The advantage is interop with dotnet add package, dotnet pack, private feeds, GitHub Package Registry, and any other NuGet-compatible infrastructure your shop already runs. If a future Bowire feature needs richer per-plugin metadata than .nuspec carries, a bowire-plugin.json sidecar inside the existing .nupkg is the natural extension point — not a wrapper format.
See also
- Plugin Architecture — how plugins load, where deps come from, ALC isolation
- Packages — full NuGet package map
- Mock server —
.bwrrecording replay,--schema/--grpc-schema/--graphql-schemaflags - Recording — how
.bwrfiles are produced