Smello logo

Smello

Debug your Python app locally. HTTP traffic, logs, and exceptions in one dashboard. Zero code changes.

$ pip install smello smello-server
Smello dashboard showing captured HTTP requests, logs, and exceptions

Why Smello?

Zero code changes

Prefix any command with smello run. HTTP requests, exceptions, and logs, all captured. No imports, no init calls.

Unified timeline

HTTP traffic, log records, and crash tracebacks in one scrollable view. Filter by type, search across everything.

Full-stack visibility

Outgoing calls to any API (requests, httpx, aiohttp, grpc, botocore), incoming requests via the FastAPI middleware, plus Python logs and unhandled exceptions.

AI Agent Skills

/smello-setup

Your AI agent detects your stack, installs Smello, and wires up smello run in your workflow.

Learn more →

/smello-debugger

Your AI agent queries captured events to diagnose failures: API errors, crashes, and log patterns.

Learn more →

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

$ npx skills add smelloscope/smello

Works with

Outgoing HTTP and RPC libraries (auto-patched)

Server frameworks (incoming request capture)

How it works

1
Install
pip install smello smello-server
2
Start the server
smello-server
3
Run your code
smello run my_app.py
4
Browse requests, logs & exceptions
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

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. Log and exception capture are equally non-blocking.

What does it capture exactly?

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.

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.

Do I need to modify my code?

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.

Does it work with async code?

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.

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. Without SMELLO_URL set, init() is a zero-overhead no-op.

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.