Bokeh: interactive browser plots driven from Python
Interactive Data Visualization in the browser, from Python
At a glance
- What is it?
- Bokeh renders interactive charts in the browser while you keep writing Python. The package is on PyPI and conda-forge, requires Python 3.12 or newer, and ships under BSD-3-Clause, with a BokehJS front end doing the drawing.
- Who is it for?
- Adopt Bokeh if you want interactive plots, dashboards or data applications in the browser while writing Python, and if your runtime is Python 3.12 or newer. Do not adopt it if you need to run on Python 3.11 or earlier, since pyproject.toml sets requires-python to >=3.12, or if you want a static image file rather than a browser-rendered figure.
- 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 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 November 13, 2026, and from our analysis. They are not legal advice.
Star history
- bokeh/bokeh20,474 ★ · +18
| Repository | 2026-09-21 | 2026-11-13 |
|---|---|---|
| bokeh/bokeh | 20.5k | 20.5k |
18 Stars in the last 53 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
What Bokeh solves, and who ends up using it
Bokeh targets the gap between a Python analysis and a chart someone can actually interact with in a browser. The README describes it as an interactive visualization library for modern web browsers, offering "elegant, concise construction of versatile graphics" with interactivity that holds up across large or streaming datasets. The stated audience is anyone who wants interactive plots, dashboards and data applications without leaving Python.
That audience is narrower than "anyone who plots data". If the deliverable is a PNG for a slide deck, a browser rendering pipeline is overhead. Bokeh earns its place when the chart is the product: a figure a colleague pans and zooms, a dashboard that updates, a data application served to other people. The pyproject.toml classifiers list scientific and engineering visualization, financial and insurance, healthcare, legal and information technology audiences, which describes the same shape of user.
How Bokeh works: Python objects, BokehJS rendering
Bokeh is split into two halves. The Python package in src/ builds a model of a plot, and BokehJS, the JavaScript library in bokehjs/, draws it in the browser. The Python side is not generating an image; it is describing figures, glyphs, axes, tools and data sources that the JavaScript side consumes.
The dependency list in pyproject.toml reflects that split. Jinja2 and pyyaml handle templating and configuration, numpy and narwhals handle array and dataframe interchange, pillow covers image handling, xyzservices supplies tile provider metadata, and tornado is pulled in on every platform except emscripten, which points at the server component. The build backend is setuptools with setuptools-git-versioning, so the version is derived from git rather than written by hand, and the repository layout keeps bokehjs/, src/, tests/, examples/, docs/ and tools/ as separate top-level entries.
For the reader, the practical consequence is that Bokeh is not a thin wrapper over a Python drawing canvas. Interactive behaviour lives in JavaScript that the Python objects configure. That is why the same figure can be embedded in a notebook, exported to an HTML file, or served by a Bokeh server without rewriting the plotting code.
Installing Bokeh and drawing a first figure
The README gives two installation paths, pip and conda, and points at the installation documentation for detail. Both are single commands.
pip install bokehOr, if your environment is conda-based:
conda install bokehAfter installing, the README directs new users to the first steps guides and the tutorial repository of Jupyter notebooks. The repository itself carries an examples/ directory with subdirectories for basic, plotting, interaction, models, output, server, styling, topics and advanced material, so there is a runnable example for most starting points.
A first use is a Python script that builds a figure and writes it to an HTML file, which is the output path the examples/output/ directory covers. The README does not include a code sample, so take the exact call from the first steps guides; the dedicated examples/output/ directory shows that output handling is a first-class concern.
If you work in a notebook, the README points to the Bokeh tutorial repository for live Jupyter notebooks, and the repository has a top-level jupyter/ directory. The library is used in notebook contexts, but the README does not spell out the notebook-specific setup steps, so treat the tutorial repository as the source for that.
Where Bokeh is the wrong tool
The clearest limitation is the Python floor. pyproject.toml sets requires-python to ">=3.12" and the classifiers list 3.12, 3.13, 3.14 and 3.15. If your production environment is pinned to Python 3.11 or earlier, this release line will not install, and no amount of plotting need changes that. That is a hard boundary, not a preference.
A second limitation is the rendering model itself. Because drawing happens in the browser through BokehJS, any workflow that expects a static raster or vector file as the primary artifact is working against the grain. Bokeh can export, but the centre of the design is an interactive browser document. If your consumer is a print pipeline or a PDF report, the interaction is dead weight.
Third, the server story carries operational cost. Tornado is a dependency on non-emscripten platforms, and the repository has a dedicated examples/server/ directory, which tells you the server is a real, supported mode rather than an afterthought. It also means that if you deploy a Bokeh server, you own a long-running Python process with its own lifecycle. The README does not document rollback, version pinning or upgrade procedures for that process, so plan for that gap rather than discovering it in production.
Bokeh against a grammar-of-graphics library
The natural alternative to consider is a grammar-of-graphics plotting library, where you compose a chart from declarative layers and the library decides the rendering. Bokeh's approach is different in kind. You construct figure and glyph objects directly, and the interactive layer is configured on those objects. The result is more explicit control over what exists in the document, at the cost of writing more structure yourself.
The second axis of difference is the runtime. A grammar-of-graphics library typically produces a static image through a rendering backend. Bokeh produces a browser document through BokehJS. That distinction decides the choice more than syntax does: if the chart must be panned, linked to another chart, or updated by a running server, the browser document is the requirement, and Bokeh is built for it. If the chart is a figure in a paper, the browser runtime is unnecessary surface area.
Bokeh is also not a dashboard framework in the server-plus-frontend sense. It provides the plotting and a server, and the repository's examples/server/ directory shows what that looks like, but the README does not present it as a general application framework. Budget for that difference if you are comparing it against a full dashboard stack.
Maintenance, licence and upgrade cost
The repository is not archived and the last push was on 2026-11-02, so the project is being worked on now. The default branch is branch-4.0, which is worth noting if you track the main line: you are following a major-version branch rather than a generic main. The repository publishes no GitHub releases, so the GitHub releases page will not tell you how often versions ship.
The licence is BSD-3-Clause, declared in pyproject.toml with license-files pointing at LICENSE.txt. BSD-3-Clause is permissive and permits commercial use and redistribution with the licence text retained. That is a factual description of the licence terms, not legal advice; if your organisation has specific obligations around attribution or patent clauses, have someone qualified read LICENSE.txt.
Upgrade cost is where the documentation is thinnest. The README does not document rollback, deprecation policy or migration between major versions, and with a 4.0 branch in play, a major-version bump is exactly the kind of event where that matters. The dependency floor on Python 3.12 also means an upgrade of Bokeh can force an upgrade of your interpreter. Pin the version, read the changelog for the target release, and check the requires-python line before you move.
Editorial conclusion
Adopt Bokeh if you want interactive plots, dashboards or data applications in the browser while writing Python, and if your runtime is Python 3.12 or newer. Do not adopt it if you need to run on Python 3.11 or earlier, since pyproject.toml sets requires-python to >=3.12, or if you want a static image file rather than a browser-rendered figure. Before committing, verify the Python version constraint, the dependency list (jinja2, narwhals, numpy, packaging, pillow, pyyaml, tornado, xyzservices), and whether your deployment can run the Bokeh server, because the README documents none of that.
Frequently asked questions
How do I install Bokeh?
The README gives two commands: pip install bokeh, or conda install bokeh for conda environments. It refers readers to the installation documentation for more detail. Note that pyproject.toml sets requires-python to >=3.12, so the interpreter must be 3.12 or newer.
How do I install Bokeh in a Jupyter notebook?
The README does not give notebook-specific installation steps; it points to the first steps guides and to the Bokeh tutorial repository of live Jupyter notebooks. Installation itself is the same pip or conda command, since the package is the same. Treat the tutorial repository as the source for notebook usage.
How do I use Bokeh with Python?
You install the package, then build figures in Python and render them in the browser through BokehJS. The README directs new users to the first steps guides and the repository's examples/ directory, which has subdirectories for basic, plotting, interaction, output, server and styling examples.
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)Star history chart for your README
[](https://hysenlabs.com/projects/bokeh-bokeh)Was this useful?