Real-time gRPC traffic viewer — proxy daemon + TUI client.
grpc-tap sits between your application and your gRPC server, capturing every call and displaying it in an interactive terminal UI. Inspect requests, view headers, copy bodies, and replay calls — all without changing your application code.
brew install mickamy/tap/grpc-tapgo install github.com/mickamy/grpc-tap@latest
go install github.com/mickamy/grpc-tap/cmd/grpc-tapd@latestFROM golang:1.25 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /usr/local/bin/grpc-tapd ./cmd/grpc-tapd
FROM gcr.io/distroless/static-debian12
COPY --from=build /usr/local/bin/grpc-tapd /usr/local/bin/grpc-tapd
ENTRYPOINT ["grpc-tapd"]docker build -t grpc-tapd .
docker run --rm -p 8080:8080 -p 9090:9090 \
grpc-tapd -listen=:8080 -upstream=http://host.docker.internal:9000git clone https://github.com/mickamy/grpc-tap.git
cd grpc-tap
make install1. Start the proxy daemon
# Proxy listens on :8080, forwards to upstream gRPC server on :9000
grpc-tapd -listen=:8080 -upstream=http://localhost:90002. Point your application at the proxy
Connect your app to the proxy port (:8080) instead of the upstream port. No code changes needed — grpc-tapd speaks
native gRPC, gRPC-Web, and Connect protocols.
3. Launch the TUI
grpc-tap localhost:9090All gRPC calls flowing through the proxy appear in real-time.
grpc-tapd — gRPC proxy daemon for grpc-tap
Usage:
grpc-tapd [flags]
Flags:
-listen client listen address (required)
-upstream upstream gRPC server address (required)
-grpc gRPC server address for TUI (default: ":9090")
-version show version and exit
grpc-tap — Watch gRPC traffic in real-time
Usage:
grpc-tap [flags] <addr>
Flags:
-version Show version and exit
<addr> is the gRPC address of grpc-tapd (e.g. localhost:9090).
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
Ctrl+d / PgDn |
Half-page down |
Ctrl+u / PgUp |
Half-page up |
/ |
Incremental search |
s |
Toggle sort (chronological/duration) |
Enter |
Inspect call |
e |
Toggle error filter |
a |
Analytics view |
Esc |
Clear search filter |
q |
Quit |
| Key | Action |
|---|---|
j / ↓ |
Scroll down |
k / ↑ |
Scroll up |
c |
Copy request body |
C |
Copy response body |
e |
Edit request & resend |
q |
Back to list |
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
Ctrl+d |
Half-page down |
Ctrl+u |
Half-page up |
s |
Cycle sort (total/count/avg/error rate) |
q |
Back to list |
┌─────────────┐ ┌───────────────────────┐ ┌─────────────────┐
│ Application │─────▶│ grpc-tapd (proxy) │─────▶│ gRPC Server │
└─────────────┘ │ │ └─────────────────┘
│ captures calls │
│ via HTTP/2 proxy │
└───────────┬───────────┘
│ gRPC stream
┌───────────▼───────────┐
│ grpc-tap (TUI) │
└───────────────────────┘
grpc-tapd acts as an HTTP/2 reverse proxy that transparently forwards gRPC traffic to the upstream server. It captures request/response headers, bodies, status codes, and timing for each call. Events are streamed to connected TUI clients via gRPC.
- gRPC (HTTP/2,
application/grpc) - gRPC-Web (
application/grpc-web) - Connect (
application/connect+proto,application/connect+json)
Press e in the inspector to open the captured request body in $EDITOR as JSON (field numbers as keys). After
editing, the modified request is sent to the upstream server via the proxy, and the result appears in the event stream.