gRPC
Rostyman supports all four gRPC streaming patterns — Unary, Server Streaming, Client Streaming, and Bidirectional Streaming — with a visual Proto Explorer, a Monaco-based JSON request editor, metadata, authentication, TLS configuration, and a response panel that shows status codes, timing, and stream logs.
Opening a gRPC Tab
Click + New Tab and select gRPC, or open a saved gRPC request from the sidebar. Each tab has its own proto file, selected method, request body, metadata, auth, and TLS configuration.
Layout Overview
The gRPC tab is split into two panels:
- Left panel (Proto Explorer, 220px) — import proto files and browse the package/service/method tree
- Right panel — the URL bar, sub-tabs (Message, Metadata, Auth, TLS, Settings), and response area
Proto Explorer (Left Panel)
Loading a Proto File
The Proto Explorer header shows Proto Explorer in uppercase. Below it, a path input field and a load button let you import .proto files.
To load a proto file:
- Type or paste the absolute file path in the path input, e.g.:
/home/user/api/user.proto
C:\projects\api\user.proto - Press Enter or click Import Proto
Rostyman parses the file using protobufjs. Relative imports in the proto file are resolved from the same directory as the loaded file, so if user.proto imports common/types.proto, it will be found automatically if it exists at the same path relative to user.proto.
While loading, the button shows Loading... and is disabled. Once parsed, the method tree populates immediately.
Method Tree
The tree shows the full hierarchy from the proto file:
▶ package.name
▶ ServiceName
MethodName UNARY
ListMethod SERVER STREAM
UploadMethod CLIENT STREAM
ChatMethod BIDI STREAM
- Packages — top-level namespace from the
packagedeclaration - Services — each
serviceblock in the proto - Methods — each
rpcin a service, with a method type badge
Method type badges identify the streaming mode with distinct colors:
| Badge | Color | Pattern |
|---|---|---|
UNARY | Green | Single request, single response |
SERVER STREAM | Cyan | Single request, multiple responses |
CLIENT STREAM | Yellow | Multiple requests, single response |
BIDI STREAM | Purple | Multiple requests, multiple responses |
Click any method to select it. Rostyman reads the request message's fields and pre-populates the JSON editor with a skeleton object where string fields default to "", booleans to false, and numeric fields to 0.
URL / Config Bar (Right Panel)
The config bar runs across the top of the right panel.
Status Badge
A pill on the left shows the current operation status:
| Status | Color | Meaning |
|---|---|---|
| idle | Gray | No call in progress |
| calling | Amber | Unary or client-stream call in flight |
| streaming | Amber | Server/bidi streaming active |
| done | Green | Call completed successfully |
| error | Red | Call failed |
Server URL
The server address input accepts host:port without a scheme:
localhost:50051
grpc.api.example.com:443
192.168.1.10:9090
Do not include grpc:// or https:// — TLS is controlled separately in the TLS tab. Environment variables ({{variable}}) are resolved at invoke time.
Selected Method Display
When a method is selected in the Proto Explorer, a pill in the config bar shows ServiceName/MethodName and the streaming mode badge. This is a read-only indicator — to change the method, click a different one in the left panel.
Duration
After a completed Unary or Client Streaming call, the response duration in milliseconds (e.g., 42ms) appears next to the method display.
Invoke / Stop Button
- Invoke (Play icon, accent color) — starts the call. Disabled if no method is selected or a unary call is already in flight.
- Stop (Square icon, red) — available during Server Streaming or Bidi Streaming. Clicking it sends a disconnect and closes the stream.
Environment Selector
The Environment dropdown controls variable resolution for the server URL, request body, and metadata values.
Save / Save As
Press Ctrl+S (or Cmd+S on macOS) to save. The Save button highlights in the accent color when there are unsaved changes. If the tab has no saved request yet, the Save As dialog appears instead.
Sub-tabs
Five sub-tabs appear below the config bar:
Message Tab
The Message tab contains a full Monaco editor for composing the gRPC request body as JSON.
When you select a method from the Proto Explorer, the editor is pre-populated with a skeleton based on the method's input message fields:
{
"id": 0,
"name": "",
"active": false
}
Edit the skeleton with your actual values. Environment variables ({{variable}}) in string values are resolved at invoke time.
For Client Streaming, the request body should be a JSON array of message objects — each element is sent as one message in the stream:
[
{ "chunk": "part one" },
{ "chunk": "part two" },
{ "chunk": "part three" }
]
For Bidirectional Streaming, a separate Bidi Send input area appears below the main editor. Use it to send individual messages to the server while the stream is open, without ending it.
Monaco editor features available in the request editor:
- JSON syntax highlighting and bracket matching
- Line numbers, word wrap, code folding
- 2-space indentation, no minimap
Metadata Tab
Metadata is the gRPC equivalent of HTTP headers — key-value pairs sent with every call on this request. Common uses include passing authentication tokens, request IDs, and tenant identifiers.
The metadata editor shows a table with three columns:
| Column | Description |
|---|---|
| Enabled checkbox | Toggle a metadata entry without deleting it |
| Key | Metadata key name (lowercase recommended per gRPC spec) |
| Value | Metadata value — supports {{variable}} substitution |
Click + Add to append a new row. Click × to remove a row.
When there are no rows, a "No metadata" placeholder is shown.
Authentication configured in the Auth tab is also injected as metadata at invoke time (see below). Auth metadata takes precedence over manually entered metadata with the same key.
Auth Tab
The Auth tab configures how authentication credentials are injected into the gRPC call. The selected auth type is applied as metadata at invoke time.
Auth Type selector:
| Type | Description |
|---|---|
| None | No authentication. No metadata is injected. |
| Bearer Token | Injects authorization: Bearer <token> as metadata. |
| API Key | Injects a custom header name with a custom value as metadata. |
| Basic Auth | Base64-encodes username:password and injects authorization: Basic <encoded> as metadata. |
Bearer Token fields:
- Token — the raw token value. Supports
{{variable}}.
API Key fields:
- Header Name — the metadata key to use (default:
x-api-key). Supports{{variable}}. - Value — the API key value. Supports
{{variable}}.
Basic Auth fields:
- Username — supports
{{variable}}. - Password — supports
{{variable}}.
All credential values are stored in the tab state and persisted when saved to a collection.
TLS Tab
The TLS tab controls whether the connection uses TLS and how certificates are handled.
Enable TLS (toggle)
When off, the connection is made over plain TCP (insecure). When on, TLS is used and additional options appear.
Default: off.
Skip Certificate Verification (toggle, visible when TLS is enabled)
When on, the client connects without verifying the server's certificate. Useful for local development with self-signed certificates. Do not use in production.
Default: on (when TLS is first enabled).
When Skip Certificate Verification is turned off, three path fields appear for mutual TLS:
| Field | Description |
|---|---|
| CA Certificate Path | Absolute path to the Certificate Authority file used to verify the server's certificate |
| Client Certificate Path | Absolute path to the client's TLS certificate (for mutual TLS) |
| Client Key Path | Absolute path to the client's private key (for mutual TLS) |
All three path fields accept absolute file system paths. Leave Client Certificate and Client Key empty if you only need server-side TLS (not mutual TLS).
Example for a self-signed CA with client certs:
CA Path: /etc/ssl/myapp/ca.crt
Cert Path: /etc/ssl/myapp/client.crt
Key Path: /etc/ssl/myapp/client.key
Settings Tab
The Settings tab provides call-level configuration options.
| Setting | Default | Description |
|---|---|---|
| Timeout | 30000 ms | Maximum time to wait for a unary or client-stream call to complete. 0 means no timeout. For streaming calls, this is the connection timeout. |
| Compression | Off | Enable gzip compression for request messages. |
| Max Message Size | 4 MB | Maximum size of a single received message. Messages larger than this cause a receive error. |
Response Panel
After a Unary or Client Streaming call completes, the Response sub-tab becomes active automatically. For Streaming calls, a Stream Log panel appears below the main tab area.
Unary / Client Streaming Response
The Response tab shows:
- Status — the gRPC status code and message (e.g.,
OK,NOT_FOUND,INTERNAL,UNAUTHENTICATED) - Duration — call duration in milliseconds, also shown in the config bar
- Response body — the full JSON-formatted response message in a Monaco editor with syntax highlighting
- Copy button — copies the response body to clipboard
If the call fails, the response area shows the error message from the gRPC status.
Streaming Response Log
For Server Streaming, Client Streaming, and Bidirectional Streaming calls, a collapsible Stream Log panel appears below the sub-tabs. It shows every stream event in chronological order.
| Entry type | Color | Meaning |
|---|---|---|
| receive | Blue/accent | A message received from the server |
| send | Green | A message you sent (bidi streams) |
| info | Muted | Stream lifecycle events (started, ended, stream ID) |
| error | Red | Stream errors |
Each row shows a timestamp and the full JSON-formatted message. The log auto-scrolls to the latest entry. Click the collapse/expand chevron in the log header to hide the log and give more space to the editor.
Streaming Modes in Detail
Unary
Single request, single response — the standard RPC pattern.
- Select a method with no streaming flags in the Proto Explorer
- Fill in the request body
- Click Invoke
- The response appears in the Response tab
Server Streaming
The server returns multiple messages over time after a single request.
- Select a method with
SERVER STREAMbadge - Fill in the request body
- Click Invoke — the button changes to Stop
- Each response message appears in the Stream Log as it arrives
- The stream closes automatically when the server finishes, or click Stop to close early
Client Streaming
The client sends multiple messages, then the server responds once.
- Select a method with
CLIENT STREAMbadge - Write a JSON array in the request body — each array element is one message
- Click Invoke
- Rostyman sends all array elements as a stream and then signals end-of-stream
- The single server response appears in the Response tab
Bidirectional Streaming
Both sides exchange messages simultaneously.
- Select a method with
BIDI STREAMbadge - Fill in the initial request body in the editor
- Click Invoke — the connection opens, the initial message is sent, the button becomes Stop
- Received messages appear in the Stream Log
- Use the Bidi Send input below the editor to send additional messages while the stream is open
- Click Stop to close the stream and receive any final response
Saving to a Collection
Press Ctrl+S (or Cmd+S on macOS) to save the gRPC request.
What is persisted:
- Server URL
- Proto file path
- Selected service and method
- Request body (JSON)
- Metadata rows
- Auth type and credential fields
- TLS configuration
- Settings (timeout, compression, max message size)
Tips
- If your proto has import statements, make sure all imported
.protofiles are in the same directory tree — relative imports are resolved from the loaded file's directory - Use Bearer Token auth with
{{token}}and store tokens in your environments — no need to copy-paste tokens into the metadata table - For mutual TLS in development, generate a local CA and client cert with
mkcertoropenssl, then point the TLS tab at the generated files - The Stream Log retains up to 500 entries per session — long-running streams that produce many messages will rotate old entries out
- Unary calls switch to the Response tab automatically; click the Stream Log tab to review streaming results from a previous call