Build data apps with the Python tools you know.
Panel is an open-source library for interactive dashboards and web apps. Widgets, plots and layouts are ordinary Python objects that you connect to your data and models, pass between functions and classes, and test like the rest of your code. There are no string IDs to match up and no script that reruns on every click.
pip install panelImport your libraries.
import numpy as np, panel as pnimport holoviews as hv pn.extension()Create the controls.
window = pn.ui.IntSlider(name="Window", value=30, start=5, end=90)sigma = pn.ui.FloatSlider(name="Volatility", value=1.0, start=0.2, end=3)ticker = pn.ui.RadioButtonGroup(name="Series", options=["AAPL", "MSFT", "NVDA"])Define the plot.
def series(window, sigma, ticker): rng = np.random.default_rng(sum(map(ord, ticker))) walk = np.cumsum(rng.normal(0.05, sigma, 400)) smooth = np.convolve(walk, np.ones(window) / window, "same") return hv.Curve(walk).opts(alpha=0.4) * hv.Curve(smooth)Connect the controls and arrange the app.
plot = pn.bind(series, window, sigma, ticker)pn.ui.Row(pn.ui.Column(window, sigma, ticker), plot).servable()Update only what needs to change
When a user changes a control, Panel runs only the code connected to it. In a small app, rerunning everything is cheap and the difference is hard to notice. In a real application that loads large datasets, fits models and keeps user state, it determines how quickly the app responds and how much caching and state management you have to write to keep it that way.
Full-script execution
In this example, a full script rerun repeats all five steps unless caching or other controls are added.
Panel
Only the model and forecast update. The dataset and table stay in place.
Built with Panel
Explore example apps for science, finance and machine learning. Each includes source code you can run and adapt.

Gaia million star atlas
Explore a million stars with linked views of their positions, brightness and color.

Model serving monitor
Monitor model response times, drift and alerts

Portfolio analyzer
Explore investments with linked tables and price charts

Glaciers of the world
Filter and explore data on 200,000 glaciers

Penguin crossfilter
Explore penguin data across four linked plots

Storm surge studio
Explore a flood model with interactive controls
AI tools for developers and users
Use HoloViz skills to help coding assistants work with Panel, and Lumen to add an assistant to your app.
Build with coding assistants
HoloViz skills give coding assistants guidance on building, reviewing, debugging and testing Panel apps with current APIs. Install them for Claude Code, Codex, Copilot, Cursor, Gemini CLI and other supported tools.
pip install holoviz-skillsholoviz-skills installBrowse the skillsLet users explore through chat
Lumen lets users change filters and adjust views through plain-language requests. The assistant works with the app's existing controls and respects their available options and limits.
from lumen.ai import Plannerfrom lumen.ai.agents import ChatAgent, ComponentControlAgentfrom lumen.ai.llm import OpenAI agent = ComponentControlAgent(components=page)assistant = Planner(agents=[ChatAgent, agent], llm=OpenAI())drawer = pn.ui.Drawer(assistant, anchor="right", variant="docked")page.main.append(drawer)Run the penguin copilot
Organize your app as it grows
Connect widgets to functions for a simple app, or use reusable components to organize a larger one. Both approaches work together.
Connect a function
Use pn.bind to connect a Python function to widgets. Panel updates the result when their values change.
plot = pn.bind(view, df, window=window) pn.ui.Column(window, plot).servable()Create a reusable component
Group data, settings and behavior in a component. Param lets you define valid values and how changes affect the app, making components easier to reuse and test.
class Explorer(pn.viewable.Viewer): data = param.DataFrame(allow_refs=True) window = param.Integer(30, bounds=(5, 90)) @param.depends("data", "window") def plot(self): return view(self.data, self.window)Combine components
Build pages from smaller components that share data and stay in sync.
class Dashboard(pn.viewable.Viewer): data = param.DataFrame() def __panel__(self): ref = self.param.data return pn.ui.Tabs( ("Explore", Explorer(data=ref)), ("Report", Report(data=ref)), )Built this way, Panel apps run in production as multi-page internal platforms with authentication, editable tables, review workflows and chat assistants used by whole teams. Lumen, a complete AI data exploration application, is built entirely with Panel. Because Panel keeps a live Python session for every visitor, it suits apps built around data, models and computation. A consumer product such as a public message board or a full word processor is better served by a general-purpose web framework, which can still embed Panel apps through FastAPI or Django.
Choosing between functions and classesFrom development to deployment
Work in a notebook or your preferred editor, then deploy the same app for others to use.
In a notebook
Explore data with live widgets and plots in Jupyter, JupyterLab, VS Code, Colab or marimo.
pn.ui.Row(controls, plot)From your editor
Build your app in a Python file, mark the layout with .servable() and run panel serve. Development mode reloads the app as you edit.
panel serve app.py --devIn production
Host your app on your own infrastructure, add authentication, or integrate it with FastAPI or Django. Compatible apps can also run entirely in the browser with WebAssembly.
Browser deployment
panel convert app.pyUse your preferred plotting library
Display your existing plots in Panel and connect them to interactive controls. Where supported, selections and clicks in a plot can update the rest of the app.

Matplotlib
Figures from Matplotlib, Seaborn and Plotnine

Plotly
Charts with click, hover and selection support

Bokeh
Interactive plots and visualizations

hvPlot and HoloViews
Plots with automatically generated controls

Altair and Vega
Charts with selections that update your app

ECharts
Interactive charts from ECharts and pyecharts

Deck.gl
Large maps and geographic visualizations

Vizzu
Animated transitions between charts
Panel also supports VTK, ipywidgets, Folium and HTML content.
Tables, chat, editors and more
Panel includes more than 130 components for building app interfaces, with documentation and examples for each.

Tabulator
Sort, filter and edit large tables

ChatInterface
Streaming responses and conversation steps

Terminal
Display live output and accept text input

JSONEditor
Edit and validate structured data

Trend
Track a value alongside its recent history

Gauge
Show a value within a range

Swipe
Compare two views with a draggable divider

TextEditor
Write and format rich text

Perspective
Explore data with pivot tables, filters and charts

CrossSelector
Choose items by moving them between lists

CodeEditor
Edit code with syntax highlighting
Player
Step through a sequence or play it as an animation
Extend your app
Handle live data, add custom interfaces and manage access to your app. The guides below cover these features in detail.
Live data and streaming
Update charts as new data arrives or display results as they become available. Panel supports asynchronous functions, scheduled updates and streaming responses.
Custom components
Build components in React, Vue or JavaScript and use them alongside Panel's existing widgets.
Run apps in the browser
Package compatible apps to run entirely in the browser with WebAssembly, without a separate Python server.
Authentication and performance
Control access with OAuth, cache expensive computations and use Panel's admin tools to inspect performance.
Developed in the open, since 2018
Panel is maintained by a team at Anaconda together with contributors from research labs, banks, and instrument makers. Ask questions on Discourse or Discord, and report bugs on GitHub.
- GitHub stars
- 5.8k
- First release
- 2018
- Contributors
- 220+
- License
- BSD-3