Smello Server
A local web dashboard for inspecting outgoing and incoming HTTP requests, pytest results, logs, and exceptions captured by the smello client SDK.
Setup
pip install smello-server
smello-server
Or run with Docker:
docker run -p 127.0.0.1:5110:5110 ghcr.io/smelloscope/smello
The server listens at http://localhost:5110.
Then install the client SDK and run your code with Smello:
pip install smello
smello run my_app.py
Outgoing HTTP requests, pytest results, unhandled exceptions, and optional log records are captured automatically.
Failed outgoing calls retain exception details. If a library raises after receiving a response, Smello stores both the response status and headers and the exception.
To capture tests, install the client with pip install "smello[pytest]". The bundled plugin supports pytest 7 and later.
Pytest events include runtime trace and span IDs plus stable collection memberships. Outgoing Requests, HTTPX, aiohttp, botocore, and gRPC calls inherit the active test membership as child operations. The dashboard always shows runtime parenthood. Its Group selector can add one available pytest level or remote-host grouping without changing event deep links. Virtual groups merge only across adjacent siblings, which preserves record order. Timeline filters retain matching records' runtime ancestors, so filtered children remain connected to their runtime context.
See Debug pytest tests with Smello for a runnable example and dashboard walkthrough.
Calls to the OpenAI, Anthropic, and Gemini APIs render as a readable conversation in the dashboard, with the system prompt, tool calls, and token usage broken out. The raw JSON stays one tab away.
API
Smello Server provides a JSON API for exploring captured events from the command line.
Install the smello client to query it without assembling API URLs:
smello query
smello query --type exception
smello query --method POST --host api.stripe.com --ancestors
smello query --app myapp --session debug-payment --format jsonl
smello query --session debug-payment --stats
smello query 5ae54ca2
# List every app, session, host, event type, and method captured
smello meta
# Clear all events
smello clear
# Equivalent HTTP API call
curl -X DELETE http://localhost:5110/api/events
Use --server or SMELLO_URL to select another server. A dashboard URL also
identifies its server; development URLs on port 5111 map to the API on port 5110.
CLI Options
smello-server --host 0.0.0.0 --port 5110 --db-path /tmp/smello.db # LAN access
Event retention
Smello Server deletes events older than seven days when it starts and every hour after that. Set SMELLO_RETENTION_DAYS to a non-negative integer to change the retention period:
SMELLO_RETENTION_DAYS=30 smello-server
Set it to 0 to keep events indefinitely. The server rejects negative or malformed values at startup.
Requires
- Python >= 3.14
Links
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file smello_server-0.13.0.tar.gz.
File metadata
- Download URL: smello_server-0.13.0.tar.gz
- Upload date:
- Size: 314.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf95e7e2d30e7f678eaaa759ece43d8e5dc18abd199678feafc3f09c69a0bd8f
|
|
| MD5 |
1112a8be5bd5ac26ed5d097c56d4185a
|
|
| BLAKE2b-256 |
4af1f5eb0e047a728c6b1097390ee405750d432287066c8c7156540611ef3c17
|
Provenance
The following attestation bundles were made for smello_server-0.13.0.tar.gz:
Publisher:
publish-server.yml on smelloscope/smello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
smello_server-0.13.0.tar.gz -
Subject digest:
bf95e7e2d30e7f678eaaa759ece43d8e5dc18abd199678feafc3f09c69a0bd8f - Sigstore transparency entry: 2393467199
- Sigstore integration time:
-
Permalink:
smelloscope/smello@50d09a0f3a91a0039c15b43a4c4e1c7acf5b94c0 -
Branch / Tag:
refs/tags/smello-server/v0.13.0 - Owner: https://github.com/smelloscope
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-server.yml@50d09a0f3a91a0039c15b43a4c4e1c7acf5b94c0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file smello_server-0.13.0-py3-none-any.whl.
File metadata
- Download URL: smello_server-0.13.0-py3-none-any.whl
- Upload date:
- Size: 298.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27da8c833c76956b7ee92bc79afd1a345a59a9f8a34bf4ca8a5cd027dd35898b
|
|
| MD5 |
7951d6f4bbda6e2429fcc7eaf55f88cd
|
|
| BLAKE2b-256 |
6b710c9cd70296dbde22e3e5516a063ada01139c3bd5c3dbce958257066a132a
|
Provenance
The following attestation bundles were made for smello_server-0.13.0-py3-none-any.whl:
Publisher:
publish-server.yml on smelloscope/smello
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
smello_server-0.13.0-py3-none-any.whl -
Subject digest:
27da8c833c76956b7ee92bc79afd1a345a59a9f8a34bf4ca8a5cd027dd35898b - Sigstore transparency entry: 2393467515
- Sigstore integration time:
-
Permalink:
smelloscope/smello@50d09a0f3a91a0039c15b43a4c4e1c7acf5b94c0 -
Branch / Tag:
refs/tags/smello-server/v0.13.0 - Owner: https://github.com/smelloscope
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-server.yml@50d09a0f3a91a0039c15b43a4c4e1c7acf5b94c0 -
Trigger Event:
push
-
Statement type: