skills/setup-smello/SKILL.md
Explore a Python codebase and propose a plan to integrate Smello traffic capture (HTTP and gRPC). Use when the user wants to add Smello to their project, set up request monitoring, or capture outgoing API calls for debugging.
npx skillsauth add smelloscope/smello setup-smelloInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are helping the user integrate Smello into their Python project. Smello captures outgoing HTTP requests (via requests and httpx) and gRPC calls (via grpc) and displays them in a local web dashboard at http://localhost:5110. Google Cloud libraries (BigQuery, Firestore, Pub/Sub, Analytics Data API, Vertex AI, etc.) use gRPC under the hood and are captured automatically.
Your job is to explore the codebase, then present a plan. Do NOT make any changes until the user approves.
Investigate the project to understand:
pip + requirements.txt, pip + pyproject.toml, uv, poetry, pipenv, or something else?requests, httpx, grpc, or Google Cloud client libraries? Search for import requests, import httpx, from requests, from httpx, import grpc, from google.cloud, from google.analytics.if __name__ == "__main__": blocksmanage.py, wsgi.py, asgi.py), Flask (app = Flask(...), create_app()), FastAPI (app = FastAPI()), etc.pyproject.toml ([project.scripts])docker-compose.yml, docker-compose.dev.yml, compose.yml, compose.dev.yml, Dockerfile, or similar files. Identify development-specific compose files vs production ones..env files, or settings modules to toggle dev-only features (this informs where to gate smello.init()).After exploring, present a clear plan with these sections:
The recommended approach is to install smello as a regular (not dev) dependency. It has zero dependencies itself, and smello.init() is a safe no-op when SMELLO_URL is not set — no patching, no threads, no side effects. This means users don't need conditional imports or try/except ImportError guards in production.
Based on the package manager detected:
pip install smello (add smello to requirements.txt)smello to [project.dependencies]uv add smellopoetry add smellopipenv install smelloThe server is covered separately in section D below.
smello.init() to the entrypointPropose the exact file and location. The two lines must go before any HTTP library imports or usage:
import smello
smello.init()
Common placement patterns:
manage.py (for runserver) or a custom AppConfig.ready() methodcreate_app() or the app factorylifespan handlerif __name__ == "__main__":Since Smello uses the server URL as its activation signal, the recommended pattern is to always call smello.init() and control activation via the SMELLO_URL environment variable:
import smello
smello.init() # only activates when SMELLO_URL is set
Then in .env or the shell:
SMELLO_URL=http://localhost:5110
This way the code has zero conditional logic — without SMELLO_URL, init() is a safe no-op (no patching, no threads, no side effects).
Smello supports full configuration via SMELLO_* environment variables. Suggest adding these to the project's .env, .env.development, or equivalent:
SMELLO_URL=http://localhost:5110 # server URL (activates Smello)
# SMELLO_CAPTURE_HOSTS=api.stripe.com,api.openai.com # only capture these hosts
# SMELLO_IGNORE_HOSTS=localhost,internal.svc # skip these hosts
# SMELLO_REDACT_HEADERS=Authorization,X-Api-Key # headers to redact
All parameters can also be passed explicitly to smello.init(), which takes precedence over env vars:
SMELLO_CAPTURE_HOSTS=api.example.com or capture_hosts=["api.example.com"]SMELLO_IGNORE_HOSTS=... or ignore_hosts=[...]SMELLO_URL=http://smello:5110 or server_url="http://smello:5110"Authorization and X-Api-Key headers are redacted by defaultBoolean env vars accept true/1/yes and false/0/no (case-insensitive). List env vars are comma-separated.
Ask the user which server setup they prefer:
smello-server separately (skip this section)smello-server to their project's dev dependenciespip install smello-server includes the full web dashboard — Docker is not required for the UI.
If the user chooses Docker Compose, propose adding a Smello service:
smello:
image: ghcr.io/smelloscope/smello
ports:
- "5110:5110"
volumes:
- smello-data:/data
And add smello-data to the volumes: section. The app container should set SMELLO_URL=http://smello:5110 (or pass server_url="http://smello:5110" to init()) to reach the Smello server over the Docker network.
Prefer adding this to a dev-specific compose file (docker-compose.dev.yml, compose.dev.yml, compose.override.yml) if one exists. If only a single compose file exists, note that the user may want to create a dev overlay.
If the user chooses to add the server as a dev dependency, use the same package manager pattern from section A:
smello-server to requirements-dev.txtsmello-server to the dev dependency groupuv add --dev smello-serverpoetry add --group dev smello-serverpipenv install --dev smello-serverThen run with smello-server run, or as a standalone tool:
# With uv
uv tool install smello-server
# With pipx
pipx install smello-server
After presenting the plan, ask the user which parts they want to proceed with. Do NOT edit any files until explicitly told to do so.
pip install smello (Python >= 3.10, zero dependencies)pip install smello-server (Python >= 3.14, includes web dashboard) or Docker ghcr.io/smelloscope/smellorequests (patches Session.send()), httpx (patches Client.send() and AsyncClient.send()), and grpc (patches insecure_channel() and secure_channel())Authorization, X-Api-Keyhttp://localhost:5110| Variable | Type | Default |
|----------|------|---------|
| SMELLO_URL | string | None (inactive) |
| SMELLO_CAPTURE_ALL | bool | true |
| SMELLO_CAPTURE_HOSTS | comma-separated list | [] |
| SMELLO_IGNORE_HOSTS | comma-separated list | [] |
| SMELLO_REDACT_HEADERS | comma-separated list | Authorization,X-Api-Key |
Precedence: explicit init() parameter > env var > hardcoded default.
development
Debug HTTP requests, logs, and exceptions captured by Smello. Use when the user asks to inspect traffic, debug API calls, troubleshoot failed requests, analyze response bodies, check captured logs or exceptions, or understand what their code is doing. Also use when the user wants to run a script or app with Smello instrumentation to start a debugging session. Also use when the user pastes a Smello dashboard URL like http://localhost:5110/#<uuid> or http://localhost:5111/#<uuid> — extract the UUID after the hash as the event ID. Supports gRPC calls from Google Cloud libraries. Requires a running Smello server.
development
Explore a Python codebase and propose a plan to integrate Smello — capture HTTP requests, logs, and exceptions in a local web dashboard. Use when the user wants to add Smello to their project, set up request monitoring, debug logging, or capture outgoing API calls and crashes for debugging.
development
Debug HTTP requests, logs, and exceptions captured by Smello. Use when the user asks to inspect traffic, debug API calls, troubleshoot failed requests, analyze response bodies, check captured logs or exceptions, or understand what their code is doing. Also use when the user pastes a Smello dashboard URL like http://localhost:5110/#<uuid> or http://localhost:5111/#<uuid> — extract the UUID after the hash as the event ID. Supports gRPC calls from Google Cloud libraries. Requires a running Smello server.
development
Debug HTTP requests captured by Smello. Use when the user asks to inspect traffic, debug API calls, troubleshoot failed requests, analyze response bodies, or understand what requests their code is making. Also use when the user pastes a Smello dashboard URL like http://localhost:5110/#<uuid> or http://localhost:5111/#<uuid> — extract the UUID after the hash as the request ID. Supports gRPC calls from Google Cloud libraries. Requires a running Smello server.