Bokeh: Interactive Python Visualizations That Run in the Browser
Interactive Data Visualization in the browser, from Python
At a glance
- What is it?
- Bokeh is a Python visualization library that produces interactive charts, dashboards, and data applications rendered entirely in a web browser, without requiring JavaScript knowledge. It targets Python 3.12 and later and is a NumFOCUS-sponsored project under BSD-3-Clause.
- Who is it for?
- Bokeh suits Python developers who need interactive, shareable visualizations without writing JavaScript. Its Tornado-based server layer makes it a reasonable choice for streaming data dashboards.
- Can I use it commercially?
- Yes. BSD-3-Clause 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 last received commits 1 day ago.
- 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 29, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Bokeh is and who it is for
Bokeh produces interactive plots, dashboards, and data applications that run in a modern web browser. The Python code that defines the chart is separate from the JavaScript that renders it: Bokeh translates the Python model into a format its BokehJS runtime can draw and update. This means a Python data analyst can build a zoomable, hoverable chart without writing any JavaScript.
The README describes its audience broadly, covering developers, educators, end users, financial and insurance analysts, healthcare professionals, scientists, and researchers. The pyproject.toml classifiers confirm this range, listing Science/Research, Office/Business/Financial, and Information Technology as intended audiences. The library requires Python 3.12 or later.
How Bokeh renders interactive charts
Bokeh works by defining a scene graph of plot objects in Python, serializing it, and handing it to BokehJS, which is the JavaScript component included as a separate package at @bokeh/bokehjs on npm. The Python side constructs glyphs, axes, and tools; the JavaScript side handles all browser interaction including pan, zoom, hover tooltips, and selection.
For static output, Bokeh embeds the chart in an HTML file. For live dashboards and streaming data, it uses a Tornado-based server that maintains a synchronized state between the Python model and the browser. The pyproject.toml lists tornado as a dependency only when the platform is not Emscripten, reflecting that Bokeh also runs in WebAssembly contexts such as JupyterLite.
Core dependencies from the pyproject.toml include jinja2 for templating, narwhals for dataframe compatibility, numpy for array operations, pillow for image handling, pyyaml for configuration, and xyzservices for tile provider integration in geographic plots.
Installing Bokeh and creating a first plot
The README gives two installation paths. Using pip:
pip install bokehUsing conda:
conda install bokehAfter installation, the README directs new users to the first steps guides at docs.bokeh.org or to the tutorial repository, which contains live Jupyter Notebooks. The tutorial repository can be cloned and run locally to explore interactive examples without writing any code from scratch.
The repository itself contains an examples directory with subdirectories covering basic plots, advanced topics, interaction patterns, server applications, and topics such as geographic maps. These examples are organized at examples/basic/, examples/interaction/, examples/server/, and examples/topics/. Running any of them locally requires a working Bokeh installation and, for server examples, a running Tornado process.
Limitations and cases where Bokeh is the wrong tool
Bokeh's interactive output depends on a browser. There is no path to a static image without rendering through a headless browser or using Bokeh's export utilities. For workflows that need PNG or PDF output for reports or print, Matplotlib or similar libraries are more direct.
The Tornado server dependency is a real operational cost for production dashboards. A Bokeh server process must remain alive for the browser to receive live updates; if it restarts, the browser session loses its state. This is a different model from a static chart embed, and teams running containerized deployments need to account for it.
Bokeh's Python 3.12 minimum is a genuine constraint for projects that cannot upgrade. The pyproject.toml also lists narwhals (a compatibility layer for multiple dataframe libraries) and xyzservices as required dependencies, which adds surface area for version conflicts in larger dependency trees.
For teams already invested in the JavaScript ecosystem, Vega-Lite and Plotly's JS library offer browser-native interactivity without a Python runtime. Bokeh's advantage is that the entire chart definition stays in Python, which is a meaningful productivity benefit for data teams that do not have JavaScript expertise.
Comparing Bokeh to Plotly
Plotly is the most direct alternative for interactive Python visualization in the browser. Both produce JavaScript-rendered charts from Python. The architectural difference is that Plotly's primary rendering layer is a JavaScript library (Plotly.js) with Python, R, and Julia bindings, while Bokeh was designed from the start as a Python-first project with BokehJS as a supporting layer rather than the primary product.
Bokeh's server model (using Tornado) is more explicitly designed for streaming and live-updating dashboards than Plotly's typical static-embed workflow, though Plotly also has Dash for server-backed dashboards. For geographic tiles, Bokeh integrates xyzservices as a core dependency, making tile map layers a first-class feature.
The choice typically comes down to existing team knowledge and the complexity of the dashboard's server-side logic. Bokeh's BokehJS package is also published to npm, which means JavaScript developers can use it without Python if needed, though that use case is not the primary one the project documents.
Governance, support, and licence
Bokeh is a Sponsored Project of NumFOCUS, a 501(c)(3) nonprofit. NumFOCUS handles fiscal, legal, and administrative matters. The project accepts donations through Open Collective. Corporate sponsors documented in the README include Amazon Web Services, Anaconda, NVIDIA, and Tidelift, among others.
The licence is BSD-3-Clause, which permits use and redistribution in commercial products with minimal restrictions. Community support runs through a Discourse forum at discourse.bokeh.org and through Stack Overflow's bokeh tag. Developer discussion happens on a Slack workspace accessible by invitation.
The repository's default branch is branch-4.0, and the last push was on 2026-09-28. The project has no GitHub releases listed in the repository metadata, though the main documentation site at bokeh.org covers current versions.
Editorial conclusion
Bokeh suits Python developers who need interactive, shareable visualizations without writing JavaScript. Its Tornado-based server layer makes it a reasonable choice for streaming data dashboards. It is not the right tool when a static image is sufficient, when the audience cannot run a browser, or when the deployment environment cannot support the Tornado server dependency. Before adopting it, verify that the Python version in your environment meets the 3.12 minimum and check whether the narwhals and xyzservices dependencies create any version conflicts in your project.
Frequently asked questions
How do I install Bokeh in a Jupyter notebook?
Run `pip install bokeh` in a terminal or use the notebook's package manager. After installing, import Bokeh and use its output_notebook() function to render charts inline. The first steps guides at docs.bokeh.org provide a walkthrough.
How do I use Bokeh in Python?
Install Bokeh with pip or conda, then build a plot by defining figures and glyphs in Python and calling show() or save(). The README points to the first steps guides at docs.bokeh.org and to a tutorial repository with live Jupyter Notebooks as the recommended starting points.
What does Bokeh require to run?
Bokeh requires Python 3.12 or later. Its declared dependencies include jinja2, narwhals, numpy, packaging, pillow, pyyaml, tornado (on non-Emscripten platforms), and xyzservices. A modern web browser is required to view the interactive output.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/bokeh-bokeh)
Community notes