Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

20 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

 _   _   _   _   _   _   _   _  
/ \ / \ / \ / \ / \ / \ / \ / \ 
( w | i | r | e | c | l | a | w )
 \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/

wireclaw β€” API Traffic Observability Platform

Auto-document your API by watching it work.

Wireclaw is a local HTTP/HTTPS proxy that captures every API request and response, stores them in SQLite, and gives you a real-time web dashboard, terminal UI, and one-click OpenAPI export. No code changes. No SDKs. No manual documentation.

Built with Rust. Zero unsafe. Zero config.


Why Wireclaw?

The Problem The Cost
API docs drift from code the moment they ship Hours of manual updates, outdated contracts
Debugging production issues means hunting through logs Slower incident response, frustrated teams
Onboarding new devs requires explaining API behavior Repeated knowledge transfer, tribal knowledge
No easy way to compare "this request works, that one doesn't" Staring at JSON diffs in text editors

Wireclaw turns API observability from a chore into a byproduct of normal development.

Point your HTTP client at the proxy. Ship your code. Browse the dashboard. Export the spec. Done.


Features

  • πŸ”΄ Capture β€” Local HTTP/HTTPS proxy. Every request/response logged to SQLite, organized by named session.
  • πŸ”’ HTTPS MITM β€” Auto-generated per-host TLS certificates. Inspect encrypted traffic without touching client code.
  • πŸ“Š Real-Time Dashboard β€” WebSocket-powered traffic visualization. One-click OpenAPI export. Three themes including Synthwave '84.
  • πŸ“‹ OpenAPI Auto-Generation β€” Generate OpenAPI 3.0 specs from live traffic. Real examples, inferred schemas, no manual work.
  • πŸ” Replay & Chain β€” Re-send any captured request. Dry-run, diff, edit in $EDITOR, batch replay, and chain requests with Lua variable extraction.
  • πŸ” Search & Diff β€” Regex search across method, path, headers, body. JSON-aware structural diff between any two requests.
  • πŸ“ˆ Performance Monitoring β€” Latency percentiles (p50, p95, p99), error rates, slow request detection.
  • πŸ–₯️ Terminal UI β€” Full ratatui interface with live streaming, keyboard navigation, JSON syntax highlighting. Works over SSH.
  • πŸ“€ Export β€” HAR 1.2, curl commands, raw HTTP, Postman collections.
  • ⚑ Zero Config β€” Works out of the box. Customizable via ~/.config/wireclaw/config.toml when you need it.

Quick Start

Install from Source

git clone https://github.com/synthalorian/wireclaw.git
cd wireclaw
cargo install --path .

Capture Traffic

# Start proxy + dashboard
wireclaw capture --session my-api --dashboard

# Point your client at the proxy
export HTTP_PROXY=http://127.0.0.1:8080
curl https://api.example.com/users

# Open the dashboard
# β†’ http://localhost:8746

Generate OpenAPI from Live Traffic

# After capturing traffic, export the spec
wireclaw openapi --session my-api --output api-spec.json

Replay & Diff

# List captured requests
wireclaw list --session my-api

# Replay a specific request
wireclaw replay --id <request-id>

# Compare two requests side-by-side
wireclaw diff --a <id1> --b <id2> --session my-api

Launch the TUI

wireclaw tui --session my-api

Demo

# Full demo: capture + dashboard + sample traffic
./demo.sh

The demo script starts a proxy, generates sample API traffic, and opens the dashboard. Perfect for screen recording a submission video.


Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        wireclaw                              β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  CLI   β”‚  β”‚  TUI   β”‚  β”‚ Config β”‚  β”‚  Web Dashboard β”‚  β”‚
β”‚  β”‚(clap)  β”‚  β”‚(ratatuiβ”‚  β”‚(TOML)  β”‚  β”‚   (axum+ws)   β”‚  β”‚
β”‚  β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚      β”‚           β”‚           β”‚               β”‚             β”‚
β”‚  β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                   Core Dispatch                        β”‚  β”‚
β”‚  β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚     β”‚      β”‚        β”‚         β”‚          β”‚                β”‚
β”‚  β”Œβ”€β”€β–Όβ”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”  β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”           β”‚
β”‚  β”‚Proxyβ”‚ β”‚Replayβ”‚ β”‚Searchβ”‚ β”‚Exportβ”‚  β”‚ Logger β”‚           β”‚
β”‚  β”‚(hyperβ”‚ β”‚      β”‚ β”‚(regex)β”‚ β”‚(HAR) β”‚  β”‚        β”‚           β”‚
β”‚  β””β”€β”€β”¬β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜           β”‚
β”‚     β”‚                                      β”‚                β”‚
β”‚     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚     └──│          SQLite Storage (sqlx)               β”‚   β”‚
β”‚        β”‚   sessions.db β†’ requests β†’ responses        β”‚   β”‚
β”‚        β”‚   ~/.local/share/wireclaw/sessions/*.db       β”‚   β”‚
β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                              β”‚
β”‚  Data Flow: Client β†’ Proxy β†’ Target β†’ Proxy β†’ Client        β”‚
β”‚                       ↓                                      β”‚
β”‚                   Logger β†’ SQLite                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Technical Highlights

  • 34,000+ lines of Rust β€” zero unsafe blocks
  • 53 unit tests β€” all passing
  • SQLite + sqlx β€” type-safe async database operations
  • HTTPS MITM β€” auto-generated per-host certificates via rcgen
  • Lua scripting β€” hooks for request/response transformation
  • WebSocket proxy β€” captures and replays WebSocket frames
  • HAR/Postman/curl export β€” industry-standard formats

Configuration

wireclaw looks for config at ~/.config/wireclaw/config.toml. Sensible defaults are used if it doesn't exist.

listen_addr = "127.0.0.1:8080"
data_dir = "~/.local/share/wireclaw"

[session]
auto_create = true
default_name = "default"

[proxy]
listen_addr = "127.0.0.1:8080"
timeout_secs = 30
max_body_size = 10485760  # 10MB
capture_headers = true
capture_bodies = true

[replay]
delay_ms = 0
follow_redirects = true
max_redirects = 10

Data Storage

Path Purpose
~/.config/wireclaw/config.toml Configuration file
~/.local/share/wireclaw/sessions/<name>.db Per-session SQLite database

Each session gets its own SQLite database with indexed tables for requests, responses, and session metadata.


Development

# Build
cargo build

# Test
cargo test

# Lint
cargo clippy -- -D warnings

# Format
cargo fmt

License

Licensed under the Apache License, Version 2.0. See LICENSE for details.


Credits

Developed by synth (synthalorian) with assistance from synthclaw 🎹🦞 β€” a digital entity from the neon grid of 1984.

This is the wave. πŸŽΉπŸ¦žπŸŒ†

About

wireclaw 🦞 β€” local HTTP proxy for API traffic capture, replay, and inspection. Rust CLI + TUI.

Resources

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages