Plotly Dash: building Python data apps without writing JavaScript
Data Apps & Dashboards for Python. No JavaScript Required.
At a glance
- What is it?
- Dash ties Plotly.js charts and React UI components to Python callbacks, so a data scientist can ship an interactive app from a single script. The catch is that the open source package stops at your laptop.
- Who is it for?
- Adopt Dash if you already work in Python and need an interactive chart or dashboard that a colleague can open in a browser, and if single-machine hosting is enough for you.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 16, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The gap Dash fills between a notebook and a web app
A pandas analysis usually ends as a notebook cell or a static PNG. The moment someone else needs to filter by region, change a date range, or hover a series to read a value, the notebook stops being the right delivery format, and the usual answer is to hand the problem to a front-end developer. Dash exists to remove that handoff. The README describes it as a Python framework for building ML and data science web apps, built on Plotly.js for charting, React for UI elements, and Flask underneath. The intended user is the analyst or data scientist who can write Python but does not want to write JavaScript, CSS or a React component tree. The README's own example is a dropdown tied to a Plotly graph, where selecting a value causes the app to pull data into a Pandas DataFrame; the source for that app is 43 lines. A second example with five inputs, three outputs and cross filtering is 160 lines, all Python. That ratio is the whole pitch: the front-end work is expressed as Python objects and function signatures rather than as a separate codebase.
How callbacks turn Python functions into a reactive UI
The mechanism is a declarative callback registry. You construct a layout out of component objects (dropdowns, sliders, graphs, tables), each with an id, and then decorate Python functions that declare which component properties they read and which they write. On the browser side, a renderer (the repository keeps it under dash/dash-renderer, built as dash_renderer.min.js) tracks those dependencies and issues requests to the Flask server whenever an input property changes; the server runs your function and returns the new property values. This is why the README calls the code declarative and reactive: you never write the event wiring, and the dependency graph is derived from the decorators rather than maintained by hand. Two consequences follow from that design. First, the callback runs on the server, so its cost is a request-latency cost, not a browser cost, which is fine for filtering a DataFrame and less fine for a long model fit. Second, because the graph is derived from declared inputs and outputs, a component whose id you rename in the layout but not in the callback produces a broken dependency rather than a silent no-op, which is a common first-run error. The charting layer is Plotly.js, and the README states that about 50 chart types are supported, including maps.
Installing Plotly Dash and getting a first app running
The package is published on PyPI as dash, and setup.py declares python_requires=">=3.9", so check your interpreter before anything else. The repository's requirements directory holds the dependency lists that setup.py reads in, including the install list used for a plain install. The README points to the getting-started tutorial at dash.plotly.com/getting-started, which it says walks through a first app in under five minutes, and to dash.gallery for complete Python and R examples. The repository also exposes console entry points, including dash-generate-components, renderer and dash-update-components, which are development tooling rather than something you call to run an app. What the README does not print is a full first-app script. It describes the shape instead: a layout built from UI elements such as dropdowns, sliders and graphs, with those elements tied to analytical Python code, and callbacks whose inputs and outputs are declared in Python. Take the exact component names and the callback wiring from the tutorial rather than guessing them, because a component whose id does not match the one declared in the callback produces a broken dependency rather than a silent no-op. The three foundations to keep in mind while reading that tutorial are the ones the README names: Plotly.js for charts, React for the UI elements, and Flask as the server underneath.
Where Dash Open Source runs out
The README is unusually direct about this: with Dash Open Source, apps run on your local laptop or workstation but cannot be easily accessed by others in your organization. There is no built-in authentication, no horizontal scaling story, and no background job execution in the open source package. The features that address those gaps (App Manager, Kubernetes scaling, no-code auth with LDAP, AD, Okta, SAML and others, and the Job Queue for moving heavy computation out of synchronous callbacks) are listed as Dash Enterprise capabilities. That split is the single most important thing to understand before adopting. If your app is a personal analysis tool, a demo, or something you will deploy behind your own reverse proxy and auth layer, the open source package is sufficient and the MIT licence is permissive. If your requirement is a department-wide dashboard with SSO and someone else operating it, you are evaluating a commercial product, not this repository. A second limitation is architectural rather than commercial: synchronous callbacks mean a slow computation blocks a request. The README explicitly frames the Job Queue as the answer to that problem, and it is an Enterprise feature, so on the open source package you are expected to keep callbacks fast or handle asynchrony yourself. The setup.py extras hint at the escape hatches that exist (celery, diskcache, async, fastapi, quart), but the README does not document how to wire them into a deployment.
Dash versus Streamlit: two different answers to the same question
The comparison people search for most is against Streamlit, and the difference is in the programming model rather than the feature list. Streamlit reruns your whole script top to bottom on every interaction and derives the UI from the order in which you call its functions; state lives in the script's variables and in session state. Dash keeps a persistent Flask app with a component tree and a callback graph, so each interaction triggers only the callbacks whose inputs changed, and the layout is an explicit object you construct. The practical effect is that Dash gives you finer control over what recomputes and where state lives, which matters when a page has many interacting filters, while Streamlit tends to be faster to a first working screen. Dash also exposes the React component layer directly: the repository contains components/ with dash-core-components and dash-table, and there is a documented path (MAKE_A_NEW_BACK_END.md, the dash-generate-components entry point) for wrapping your own React components so they appear as Python classes. If you never expect to need a custom component or a hand-tuned callback graph, that advantage is theoretical, and the simpler model may suit you better.
Maintenance, releases and what upgrading actually costs
The repository is not archived, and the last push was on 2026-09-15. Recent releases are v4.4.1 on 2026-07-21, v4.4.0 on 2026-07-03 and v4.3.0 on 2026-06-19, so the cadence is roughly monthly minor releases with patches between. The project is maintained by Plotly, and the README links to a project-maintenance page. For upgrade planning, the interesting detail is that the Python package and the JavaScript renderer version together: the renderer is built from dash/dash-renderer and shipped as a minified bundle inside the package, so a pip upgrade moves both sides at once and you are not managing that pairing yourself. The licence situation has one wrinkle worth stating plainly. setup.py declares license="MIT" for the dash package, and the repository carries a LICENSE file, so the thing you install from PyPI is MIT-licensed. The root package.json, which describes the build tooling for the monorepo, is marked "license": "UNLICENSED". Those are different artifacts with different terms, and if you plan to vendor or redistribute repository contents rather than the pip package, read the LICENSE file and the individual package manifests rather than assuming one licence covers everything. This is a description of what the files say, not legal advice.
Editorial conclusion
Adopt Dash if you already work in Python and need an interactive chart or dashboard that a colleague can open in a browser, and if single-machine hosting is enough for you. Do not adopt it if you need company-wide deployment, authentication or background job execution out of the box, because the README states that Dash Open Source apps run on a local laptop or workstation and cannot be easily accessed by others in your organization; those capabilities belong to Dash Enterprise. Before committing, verify three things: that your Python version is 3.9 or newer, that your callbacks stay fast enough to run synchronously (the Job Queue that moves heavy computation off the request path is an Enterprise feature), and that you are comfortable with the MIT licence terms for the open source package while noting that the repository's root package.json is marked UNLICENSED and covers the build tooling rather than the published pip package.
Frequently asked questions
What is Plotly Dash used for?
It is used to build interactive web apps and dashboards from Python, tying UI elements such as dropdowns, sliders and graphs to analytical code. The README's examples include a dropdown driving a Plotly graph and a cross-filtering app with five inputs and three outputs.
How do I install Plotly Dash?
Install the dash package from PyPI, for example with pip install dash, after confirming your Python is 3.9 or newer as setup.py requires. The README points to the getting-started tutorial for a first app.
Is Plotly Dash free and open source?
The dash package is published under the MIT licence, and setup.py declares that licence for the package. The README separately describes Dash Enterprise as a commercial offering that adds hosting, authentication and job queue features.
What is the difference between Plotly and Dash?
Plotly.js is the charting library Dash is built on, while Dash is the Python framework that wraps it together with React and Flask to produce a full app. The README lists Plotly.js, React and Flask as the three foundations.
What is Plotly Dash Enterprise?
It is the commercial tier that adds the deployment features the open source package lacks: App Manager for deploying apps, Kubernetes scaling, no-code authentication, and the Job Queue for moving heavy computation out of synchronous callbacks.
Can I use Plotly Dash for commercial work?
The dash package is MIT-licensed according to setup.py, which is a permissive licence, but the README also markets Dash Enterprise for organization-wide deployment. Review the LICENSE file for the terms that apply to your use.
Community notes