Smello logo

Smello

Capture outgoing HTTP and gRPC requests from your Python code and browse them in a local web dashboard.

$ pip install smello smello-server
Smello dashboard showing captured HTTP requests

Why Smello?

Two Lines of Code

import smello and smello.init() in your entrypoint.

Full Request & Response

Headers, body, status code, and timing for every captured call. Sensitive headers redacted automatically.

requests, httpx, gRPC & boto3

Auto-patches requests, httpx, grpc, and botocore. Captures Google Cloud and AWS SDK traffic.

AI Agent Skills

/setup-smello

Your AI agent explores your code and adds Smello automatically.

Learn more →

/http-debugger

Inspect captured traffic, find failures, and analyze responses.

Learn more →

Works with Claude Code, Cursor, GitHub Copilot, and 20+ AI coding tools.

$ npx skills add smelloscope/smello

Works With

Auto-patches popular Python HTTP and RPC libraries

requests requests
httpx httpx
gRPC gRPC
boto3 boto3 / AWS
Google Cloud Google Cloud
OpenAI OpenAI SDK
Anthropic Anthropic SDK
Stripe Stripe SDK

How It Works

1
Set the env var
export SMELLO_URL=http://localhost:5110
2
Add two lines
import smello; smello.init()
3
Run the server
smello-server run
4
Browse traffic
http://localhost:5110
import smello
smello.init()  # reads SMELLO_URL env var, or pass server_url="..."

# Every outgoing request is now captured
import requests
resp = requests.get("https://api.stripe.com/v1/charges")

import httpx
resp = httpx.get("https://api.openai.com/v1/models")

# Browse captured requests at http://localhost:5110

Frequently Asked Questions

Does Smello add latency to my requests?

No. Captured data is serialized and sent to the server via a background thread using a queue. Your application's HTTP calls return at their normal speed.

Does it capture sensitive data?

Authorization and cookie headers are redacted by default. You can configure additional headers to redact or filter specific hosts via the ignore_hosts option.

Does it work with async code?

Yes. Smello patches both httpx.Client (sync) and httpx.AsyncClient (async), as well as both sync and async gRPC channels.

What about production use?

Smello is designed for local development and debugging. It stores data in a local SQLite database and runs a lightweight server on your machine. There is no cloud component.

Can I use it with Docker?

Yes. Run smello-server in a container and point your app to it via the SMELLO_URL environment variable. The dashboard is served directly by the server.

Does the client SDK have any dependencies?

No. The smello client package has zero dependencies. It uses urllib.request from the standard library to send captured data, avoiding any patching recursion.

Smello — HTTP Request Inspector for Python