Compose
Compose is the request builder — the surface where you actually invoke a
method and read its response. It's the workbench's centre of gravity: Discover
finds the methods, Compose runs them. v2.1 rebuilt it as a Hoppscotch-style
per-protocol builder and packaged it as Kuestenlogik.Bowire.Compose (renamed
from Rail.Compose in Welle 2).
For where Compose sits in the whole data-flow — what feeds it and what it hands off to — see rail pipelines & hand-offs.
What the rail is
| Property | Value |
|---|---|
| Rail id | compose (verbatim — deep-link ?rail=compose) |
| Package | Kuestenlogik.Bowire.Compose |
| Sidebar | Library — Collections + Presets |
| Needs a workspace | Yes (RequiresWorkspace) — Compose reads the active workspace's URLs, env, and collections |
| Always on | Yes — it's a core surface, not an optional tool |
The rail has two regions: the Library sidebar on the left (saved requests grouped into collections, plus per-method presets) and the request builder on the right (one tab per open request).
The pipeline
flowchart LR
IN["Method + request config<br/>(from Discover, a collection, or authored by hand)"]
FORM["Schema-backed form / raw JSON<br/>+ metadata headers + auth + variables"]
INV["POST /api/invoke<br/>POST /api/parallel"]
OUT["Response envelope<br/>+ history entry"]
IN --> FORM --> INV --> OUT
- In — a method arrives three ways: click a method row in Discover (opens a builder tab), open a saved entry from a collection, or author a freeform request against a raw URL.
- Build — the request pane renders a schema-backed form or a raw JSON
editor; you set metadata headers, authentication,
and
{{variable}}substitutions. Per-protocol layouts adapt the pane (a REST path+verb+query row, a gRPC service/method selector, a GraphQL query editor, …). - Invoke — the call goes out over
POST /api/invoke(single) orPOST /api/parallel(N-at-once). Variable substitution runs on the body first. - Out — the response lands in the response pane (syntax-highlighted, with the streaming log for streaming methods) and a history entry is recorded.
The Library sidebar
The left sidebar is the Library (SidebarKind = library): it lists the
active workspace's Collections and the per-method
Presets (saved request configurations). Collections are
managed entirely from here — create, rename, reorder, and drag entries between
groups. Opening a collection entry loads it into a builder tab.
Making a request
- Open a method — click it in Discover, or open a saved entry in the Library, or start a freeform request.
- Fill the request — toggle between the form and raw JSON,
set headers + auth, reference
{{env.var}}/{{secret.NAME}}/{{response.path}}placeholders. - Invoke. Read the response in the response pane; click any value to paste
a
{{response.path}}reference into the next request (response chaining).
Hand-offs — where a Compose request goes next
Compose is a hand-off source: a built request can be promoted onto other rails without re-authoring it.
| Action | Goes to | Carries |
|---|---|---|
Drag a Discover method in (application/x-bowire-method) |
(into Compose) | method → new builder tab |
| Save to collection | Library / Collections | request config → collection entry |
| Run as benchmark… | Benchmarks | request → single-method load spec |
| Console record toggle (shift / right-click) | Recordings | the live call → recording step |
| Scan target | Security | the request context → scan target |
Persistence
Open tabs, history, and the Library live in the active workspace — browser
localStorage by default, or the Git-backed / .bww storage
when a disk-backed workspace is active. Switching workspaces swaps the whole
Library and history set at once.
See also
- Auto-discovery — how the methods Compose invokes are found
- Form & JSON input · Authentication · Response chaining
- Collections — the Library's saved-request groups
- Freeform requests — Compose against a raw URL with no schema
- Rail strip · Rail pipelines & hand-offs