Debug your Python app locally. HTTP traffic, pytest results, logs, and exceptions in one dashboard. Zero code changes.
Prefix any command with smello run to capture HTTP requests, pytest results, exceptions, and logs. No imports or init calls.
HTTP traffic, pytest results, log records, and crash tracebacks in one scrollable view. Filter by type or search across every event.
See outgoing API calls from requests, httpx, aiohttp, grpc, and botocore. Smello also captures incoming FastAPI and Django requests, pytest results, Python logs, and unhandled exceptions.
Calls to the OpenAI, Anthropic, and Gemini APIs render as a readable conversation instead of a wall of JSON. You see the system prompt, tool calls, and token usage at a glance.
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)
Test frameworks (bundled plugin)
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
Smello doesn't send data synchronously from your application's HTTP call or pytest hook. The hook queues capture data, and a background thread sends it to the server.
Smello captures outgoing HTTP requests and responses (method, URL, headers, body, status, duration), incoming FastAPI and Django requests (path, status, route, client IP), pytest results (status, fixtures, timings, failures), Python log records (level, logger, message, source location), and unhandled exceptions (type, traceback, stack frames). Everything appears in a single 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 incoming request capture (FastAPI or Django), 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. Django middleware works with both sync and async views.
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.