🚀 Dash Devtools Plus — Supercharge Your Dash Debugging with Source Jumps, Live Insights & More

Hi Dash community!

I’m excited to introduce the first public release of Dash Devtools Plus, an open-source development and debugging enhancement for Dash applications, powered by Dash Hooks.

Dash Devtools Plus adds a focused drawer to Dash’s native Dev Tools: trace callbacks, inspect components, capture state, understand direct imports, watch server resources, collect runtime context, and tailor the toolbar—all while keeping the running app in view. It is available only in an explicitly debug-enabled Dash session, so development metadata stays out of normal production use.

Dash Devtools Plus logo

Project repository: github.com/CNFeffery/dash-devtools-plus

Quick start

pip install dash-devtools-plus -U

Dash discovers and registers the package automatically through its dash_hooks entry point after installation. If the defaults suit your app, there is no need to import dash_devtools_plus or call configure_devtools_plus(). The panel appears only when debug mode and Dash’s native Dev Tools UI are both enabled. Call configure_devtools_plus(...) before creating the Dash instance only when you need to override the defaults.

Smallest working app

Here is the smallest complete Dash app that enables Devtools Plus with its default settings:

from dash import Dash, html

app = Dash(__name__)
app.layout = html.Div("Hello, Dash Devtools Plus")

if __name__ == "__main__":
    app.run(debug=True)

Once the app is running, select Devtools Plus from Dash’s native toolbar in the lower-right corner.

A closer look at the workspaces

Callback relationships

Turn Dash’s registered callbacks into a searchable development view. Filter by callback name, docstring, source file, inputs, outputs, and state; then inspect source locations, dependency roles, topology, registration details, and runtime metadata.

Callback relationships

Server resource monitor

Keep a compact live pulse on the development machine: CPU, memory, system-disk usage, recent CPU and memory trends, plus host, operating-system, Python, processor, core-count, and uptime details.

Server resource monitor

Component inspector

Click what you see and trace it back to the Dash component that owns it. The inspector highlights the nearest supported component and reports its identity, DOM mapping, layout path, current props, and nested component-valued props.

Component inspector

State snapshots

Capture selected component properties while exploring an app, name the snapshot, and restore it later in the same browser tab. This is especially handy for returning to a useful debugging state without rebuilding it manually.

Create a state snapshot

Imported dependencies

See what the project actually imports rather than every package in the environment. Dependencies are grouped into the standard library, Dash components, Dash Hooks, and other libraries, with versions, imported modules, and expandable Dash-component/Hook details where available. The inventory respects the configured project_root boundary, keeps project-local modules—including manually registered Hooks—out of the external-dependency list, and requires third-party imports to map to installed Python distributions.

Imported dependencies

Toolbar skins

Give Dash’s native Dev Tools toolbar and error display a look that suits your development desk. Built-in options include Native style, Luminous Dock, Paper Atelier, Mint Circuit, and Coral Workbench—without changing the native toolbar’s workflow.

Toolbar skin choices

Runtime environment

Collect the key context needed to reproduce an issue in one concise view: Dash and Dash Devtools Plus versions, Python version and implementation, server operating system and architecture, browser version/platform/language/viewport, and installed third-party packages directly imported by the app.

Use Copy environment report to copy a complete, issue-ready Markdown report for a GitHub issue, support ticket, or debugging note. Refresh reads the server details again and captures the current browser window dimensions. The report deliberately omits the hostname, full user agent, project paths, standard-library modules, and project-local modules.

Runtime environment

Practical workflows: from the browser back to your code

Open a callback’s source in your local IDE

For a local Dash project, configure Devtools Plus before constructing Dash. The example below is a complete runnable app with a callback that will appear in the Callback relationships workspace.

from pathlib import Path

from dash import Dash, Input, Output, dcc, html
from dash_devtools_plus import configure_devtools_plus

PROJECT_ROOT = Path(__file__).resolve().parent

configure_devtools_plus(
    default_locale="en",
    accent_color="#119DFF",
    editor="vscode",
    project_root=PROJECT_ROOT,
)

app = Dash(__name__)
app.layout = html.Div(
    [
        html.H2("Callback source-jump demo"),
        dcc.Slider(
            id="value", min=0, max=100, step=1, value=50,
            marks={0: "0", 50: "50", 100: "100"},
        ),
        html.Div(id="message"),
    ],
    style={"maxWidth": "680px", "margin": "3rem auto"},
)


@app.callback(Output("message", "children"), Input("value", "value"))
def show_value(value):
    return f"The current value is {value}."


if __name__ == "__main__":
    app.run(debug=True)

Open the app, select Devtools Plus in Dash’s lower-right toolbar, and choose Callback relationships. The callback row includes its project-relative source location and an editor action; using that action opens the corresponding file and location in the configured IDE.

The key parameters are:

  • editor="vscode" selects the IDE used by source-opening actions. "cursor" and "pycharm" are also supported; use None to avoid selecting a preferred editor.
  • project_root=PROJECT_ROOT defines the server-side project boundary. It must be an existing directory, and only files under it are exposed as project callback sources or direct imports.
  • default_locale and accent_color tailor the initial UI language and highlight color.

When the Dash server runs in a container but your editor is on the host machine, keep the server-side boundary and the editor-visible path distinct:

configure_devtools_plus(
    project_root="/app",
    editor_project_root=r"C:\projects\my-dash-app",
    editor="cursor",
)

Here, project_root is the path visible to the server, while editor_project_root is the matching local checkout that Cursor should open.

Inspect a rendered component, then preserve a debugging state

Using the same app, open Component inspector, choose Start component inspection, hover the slider or output text, and click it. The panel maps the rendered element back to the owning Dash component and shows its ID, layout path, DOM mapping, and live props. Press Esc at any time to exit inspection without making a selection.

When you reach a useful test state, open State snapshots, choose New snapshot, select the component props to capture, and save it with a meaningful name. You can restore that state later in the same browser tab—useful when iterating on a complex callback flow. A restore can trigger callbacks, and snapshots intentionally remain scoped to browser-session storage rather than becoming server-side persisted data.

Understand the project around the app

Set project_root once and the Imported dependencies workspace can inventory direct project imports within that boundary, rather than dumping the entire Python environment. In the same debug-only session, the Server resource monitor gives a quick view of CPU, memory, and runtime information while you reproduce a local performance issue.

Useful links:

I’d love to hear which development and debugging workflows you would find most valuable. Looking ahead, the next phase is to bring more Agent-integrated capabilities into Dash Devtools Plus, helping accelerate the development and iteration of Dash applications.

Wow - this looks amazing! Best use of Dash Hooks, that I’ve seen so far. Looking forward to taking it for a spin.

Thanks for sharing :heart:

This looks really great! We will give it a shot internally as well!

Totally agree! It looks fantastic, and we’re definitely going to test it out internally too

Totally awesome!

What would be a nice addition if that was possible:

sortable columns in the callback grid for call count, time, and data transfer to easily identify performance problems.

That’s a good idea. I will continue to investigate the feasibility of the relevant features. For each new feature released for dash-devtools-plus in the future, I will create a separate post with detailed introductions.

holy moly this is cool. so great to see some innovation on this side of Dash!

This looks really useful for Dash development. The callback tracing, component inspector, and state snapshots could save a lot of time when tracking down issues. Nice work on the first release!

Thanks for the suggestion! v0.1.4 adds sortable callback counts and timings, with transfer estimates in the details. I’ve shared screenshots here.