Async-native debug toolbar for Python ASGI frameworks with optional Litestar integration
Project description
debug-toolbar
Async-native debug toolbar for Python ASGI frameworks with first-class Litestar support.
Documentation: https://jacobcoffee.github.io/debug-toolbar
Source Code: https://github.com/JacobCoffee/debug-toolbar
Screenshots
More Screenshots
Full-Width Top Position
SQL Queries with EXPLAIN
EXPLAIN Query Plan Modal
Light Theme
Request History
Events Panel (Lifecycle Hooks)
N+1 Query Detection
Alerts Panel (Proactive Issue Detection)
MCP Integration (Claude Code)
Memory Panel
SQL Panel with Query Analysis
Profiling Panel
WebSocket Panel (Live Updates)
Features
- Async-Native: Built from the ground up for async/await patterns
- Framework-Agnostic Core: Core package works with any ASGI framework
- Litestar Integration: First-class plugin support for Litestar applications
- Pluggable Panels: Easy to add, remove, or customize debug panels
- Minimal Overhead: Negligible performance impact when disabled
- Type-Safe: Full type annotations with strict type checking
- Dark/Light Themes: Toggle between dark and light themes
- Flexible Positioning: Place toolbar on any edge (left, right, top, bottom)
- SQL Query Analysis: EXPLAIN query plans for PostgreSQL, SQLite, MySQL, MariaDB
- N+1 Detection: Automatic detection of N+1 query patterns with fix suggestions
- Flame Graphs: Interactive profiling visualization in speedscope format
- Memory Profiling: Multi-backend support (tracemalloc, memray)
- Proactive Alerts: Automatic detection of security, performance, and database issues
- MCP Integration: AI assistant integration for automated debugging with Claude Code
- WebSocket Debugging: Real-time connection tracking with live updates and message inspection
Installation
# Core package only
pip install debug-toolbar
# With Litestar integration
pip install debug-toolbar[litestar]
# With Advanced-Alchemy SQLAlchemy panel
pip install debug-toolbar[advanced-alchemy]
# All extras
pip install debug-toolbar[all]
Or with uv:
uv add debug-toolbar[litestar]
Quick Start
Litestar
from litestar import Litestar, get
from debug_toolbar.litestar import DebugToolbarPlugin, LitestarDebugToolbarConfig
@get("/")
async def index() -> dict[str, str]:
return {"message": "Hello, World!"}
config = LitestarDebugToolbarConfig(enabled=True)
app = Litestar(
route_handlers=[index],
plugins=[DebugToolbarPlugin(config)],
)
With SQLAlchemy (Advanced-Alchemy)
from litestar import Litestar
from advanced_alchemy.extensions.litestar import SQLAlchemyPlugin, SQLAlchemyAsyncConfig
from debug_toolbar.litestar import DebugToolbarPlugin, LitestarDebugToolbarConfig
db_config = SQLAlchemyAsyncConfig(connection_string="sqlite+aiosqlite:///app.db")
toolbar_config = LitestarDebugToolbarConfig(
enabled=True,
extra_panels=["debug_toolbar.extras.advanced_alchemy.SQLAlchemyPanel"],
)
app = Litestar(
plugins=[
SQLAlchemyPlugin(config=db_config),
DebugToolbarPlugin(toolbar_config),
],
)
Generic ASGI
from debug_toolbar import DebugToolbar, DebugToolbarConfig
config = DebugToolbarConfig(enabled=True)
toolbar = DebugToolbar(config)
# Wrap your ASGI app
app = toolbar.wrap(your_asgi_app)
Built-in Panels
| Panel | Description |
|---|---|
| Timer | Request timing and CPU time |
| Request | HTTP method, path, headers, cookies |
| Response | Status code, response headers |
| Logging | Log records captured during request |
| Versions | Python and package versions |
| Headers | Categorized headers with security analysis |
| Settings | Application configuration viewer |
| Templates | Jinja2/Mako render tracking |
| Profiling | cProfile/pyinstrument with flame graphs |
| Alerts | Proactive security/performance issue detection |
| Memory | Memory profiling (tracemalloc/memray) |
| Cache | Redis/memcached operation tracking |
| Routes | Application routes (Litestar-specific) |
| Events | Lifecycle hooks and exception handlers (Litestar-specific) |
| WebSocket | Real-time connection tracking, message inspection, live updates |
| SQLAlchemy | Query tracking with N+1 detection (requires advanced-alchemy extra) |
Configuration
from debug_toolbar.litestar import LitestarDebugToolbarConfig
config = LitestarDebugToolbarConfig(
enabled=True,
exclude_paths=["/_debug_toolbar", "/static", "/health"],
max_request_history=50,
intercept_redirects=False,
show_toolbar_callback=lambda request: request.app.debug,
extra_panels=["myapp.panels.CustomPanel"],
exclude_panels=["VersionsPanel"],
)
Creating Custom Panels
from typing import Any, ClassVar
from debug_toolbar.core import Panel, RequestContext
class MyCustomPanel(Panel):
panel_id: ClassVar[str] = "MyCustomPanel"
title: ClassVar[str] = "My Panel"
template: ClassVar[str] = "panels/my_panel.html"
has_content: ClassVar[bool] = True
async def generate_stats(self, context: RequestContext) -> dict[str, Any]:
return {"custom_data": "Your debug information here"}
Development
# Clone the repository
git clone https://github.com/JacobCoffee/debug-toolbar.git
cd debug-toolbar
# Install dependencies
make dev
# Run tests
make test
# Run all CI checks
make ci
Package Structure
debug_toolbar/
├── core/ # Framework-agnostic core
│ ├── panels/ # Built-in panels
│ │ ├── timer.py, request.py, response.py # Default panels
│ │ ├── headers.py, settings.py # Optional panels
│ │ ├── profiling.py, memory/, alerts.py # Advanced panels
│ │ ├── templates.py, cache.py # Integration panels
│ │ └── websocket.py # WebSocket debugging
│ ├── config.py # DebugToolbarConfig
│ ├── context.py # RequestContext (contextvars-based)
│ ├── panel.py # Panel base class
│ ├── storage.py # LRU request history storage
│ └── toolbar.py # DebugToolbar manager
├── litestar/ # Litestar integration
│ ├── panels/ # Litestar-specific panels (routes, events)
│ ├── config.py # LitestarDebugToolbarConfig
│ ├── middleware.py
│ └── plugin.py # DebugToolbarPlugin
└── extras/ # Optional integrations
└── advanced_alchemy/ # SQLAlchemy panel with N+1 detection
Versioning
This project uses Semantic Versioning.
- Major versions introduce breaking changes
- Major versions support currently supported Litestar versions
- See the Litestar Versioning Policy for details
Contributing
Contributions are welcome! Please see CONTRIBUTING.rst for guidelines.
License
MIT License - see LICENSE for details.
Acknowledgements
Inspired by:
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
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 litestar_debug_toolbar-0.3.1-py3-none-any.whl.
File metadata
- Download URL: litestar_debug_toolbar-0.3.1-py3-none-any.whl
- Upload date:
- Size: 150.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c331a470709ccbf55ee0f0e2f8d15a8428f5ddb7a5b10222aee4577147792590
|
|
| MD5 |
5338ccf5665aeab3a212dcc434d7aa6c
|
|
| BLAKE2b-256 |
6b017969d1c77f14aecd49042c6215abeea98cdfa023f9b8319da71e94466f3e
|
Provenance
The following attestation bundles were made for litestar_debug_toolbar-0.3.1-py3-none-any.whl:
Publisher:
publish.yml on JacobCoffee/debug-toolbar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
litestar_debug_toolbar-0.3.1-py3-none-any.whl -
Subject digest:
c331a470709ccbf55ee0f0e2f8d15a8428f5ddb7a5b10222aee4577147792590 - Sigstore transparency entry: 789719118
- Sigstore integration time:
-
Permalink:
JacobCoffee/debug-toolbar@47a5d2ecae872499f90f61f29c3c4e8db6d2c59c -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/JacobCoffee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@47a5d2ecae872499f90f61f29c3c4e8db6d2c59c -
Trigger Event:
push
-
Statement type: