Debug your Python app locally. HTTP traffic, logs, and exceptions in one dashboard. Zero code changes.
Prefix any command with smello run. HTTP requests, exceptions, and logs, all captured. No imports, no init calls.
HTTP traffic, log records, and crash tracebacks in one scrollable view. Filter by type, search across everything.
Outgoing calls to any API (requests, httpx, aiohttp, grpc, botocore), incoming requests via the FastAPI middleware, plus Python logs and unhandled exceptions.
Your AI agent detects your stack, installs Smello, and wires up smello run in your workflow.
Your AI agent queries captured events to diagnose failures: API errors, crashes, and log patterns.
Works with Claude Code, Cursor, GitHub Copilot, and 20+ AI coding tools.
Outgoing HTTP and RPC libraries (auto-patched)
Server frameworks (incoming request capture)
pip install smello smello-server
smello-server
smello run my_app.py
http://localhost:5110
# Run any Python script or command
$ smello run my_app.py
$ smello run pytest tests/
$ smello run uvicorn app:app
# Enable log capture
$ smello run --capture-logs --log-level INFO my_app.py
# Filter to specific hosts
$ smello run --capture-host api.stripe.com my_app.py
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. Log and exception capture are equally non-blocking.
Outgoing HTTP requests and responses (method, URL, headers, body, status, duration), incoming HTTP requests via the FastAPI middleware (path, status, route, client IP), Python log records (level, logger, message, source location), and unhandled exceptions (type, traceback, stack frames). Everything appears in a single unified timeline.
Authorization and cookie headers are redacted by default. You can configure additional headers to redact or filter specific hosts via the ignore_hosts option.
No. smello run my_app.py activates Smello before your code runs. No imports or init calls needed. The only exception is FastAPI incoming request capture, which requires adding one middleware line. Instrumentation propagates to subprocesses, so smello run gunicorn app:app also captures traffic from worker processes.
Yes. Smello patches httpx.AsyncClient, aiohttp.ClientSession, and async gRPC channels. The FastAPI middleware is a native ASGI middleware, so it handles async request handlers without blocking.
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. Without SMELLO_URL set, init() is a zero-overhead no-op.
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.
No. The smello client package has zero dependencies. It uses urllib.request from the standard library to send captured data, avoiding any patching recursion.