Use when building a data dashboard in Streamlit — arranging metrics and charts, wiring filters and inputs, and structuring the page so reruns stay fast.
Installs into .claude/skills of the current project.
Are you the author of Building Streamlit Dashboards?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/mouadja02-building-streamlit-dashboards)
---
name: building-streamlit-dashboards
description: Use when building a data dashboard in Streamlit — arranging metrics and charts, wiring filters and inputs, and structuring the page so reruns stay fast.
license: Apache-2.0
source: "https://github.com/streamlit/agent-skills"
attribution: "streamlit/agent-skills by Streamlit"
---
> **Attribution:** Sourced from [streamlit/agent-skills](https://github.com/streamlit/agent-skills) by [Streamlit](https://streamlit.io).
# Streamlit dashboards
Compose metrics, charts, and data into clean dashboard layouts.
## Cards with borders
Use `border=True` to create visual cards. Supported on `st.container`, `st.metric`, `st.columns`, and `st.form`:
```python
# Container card
with st.container(border=True):
st.subheader("Sales Overview")
st.line_chart(sales_data)
# Metric card
st.metric("Revenue", "$1.2M", "+12%", border=True)
# Column cards
for col in st.columns(3, border=True):
with col:
st.metric("Users", "1.2k")
```
## Card labels
Add context to cards with headers or bold text:
```python
# With subheader
with st.container(border=True):
st.subheader("Monthly Trends")
st.line_chart(data)
# With bold label
with st.container(border=True):
st.markdown("**Top Products**")
st.dataframe(top_products)
```
## KPI rows
Use horizontal containers for responsive metric rows:
```python
with st.container(horizontal=True):
st.metric("Revenue", "$1.2M", "-7%", border=True)
st.metric("Users", "762k", "+12%", border=True)
st.metric("Orders", "1.4k", "+5%", border=True)
```
Horizontal containers wrap on smaller screens. Prefer them over `st.columns` for metric rows.
## Metrics with sparklines
Add trend context with `chart_data`:
```python
weekly_values = [700, 720, 715, 740, 762, 755, 780]
st.metric(
"Active Users",
"780k",
"+3.2%",
border=True,
chart_data=weekly_values,
chart_type="line", # or "bar"
)
```
Sparklines show y-values only—use for evenly-spaced data like daily/weekly snapshots.
## Dashboard layout
Combine cards into a dashboard:
```python
# KPI row
with st.container(horizontal=True):
st.metric("Revenue", "$1.2M", "-7%", border=True, chart_data=rev_trend, chart_type="line")
st.metric("Users", "762k", "+12%", border=True, chart_data=user_trend, chart_type="line")
st.metric("Orders", "1.4k", "+5%", border=True, chart_data=order_trend, chart_type="bar")
# Charts row
col1, col2 = st.columns(2)
with col1:
with st.container(border=True):
st.subheader("Revenue by Region")
st.bar_chart(region_data, x="region", y="revenue")
with col2:
with st.container(border=True):
st.subheader("Monthly Trend")
st.line_chart(monthly_data, x="month", y="value")
# Data table
with st.container(border=True):
st.subheader("Recent Orders")
st.dataframe(orders_df, hide_index=True)
```
## Sidebar filters
Put filters in the sidebar to maximize dashboard space:
```python
with st.sidebar:
date_range = st.date_input("Date range", value=(start, end))
region = st.multiselect("Region", regions, default=regions)
# Main area is all dashboard content
```
## Dashboard templates
Ready-to-use dashboard templates are available in `templates/apps/`:
| Template | Features |
|----------|----------|
| `dashboard-metrics` | Metric cards with sparklines, date filtering, focus mode |
| `dashboard-metrics-snowflake` | Same as above, with Snowflake connection |
| `dashboard-companies` | Company comparison, filterable data tables |
| `dashboard-compute` | `@st.fragment` for independent updates, popover filters |
| `dashboard-compute-snowflake` | Same as above, with Snowflake connection |
| `dashboard-feature-usage` | Feature adoption tracking, trend analysis |
| `dashboard-seattle-weather` | Weather data visualization |
| `dashboard-stock-peers` | Stock peer comparison |
| `dashboard-stock-peers-snowflake` | Same as above, with Snowflake connection |
Each template uses synthetic data that can be replaced with real queries. See `templates/apps/README.md` for setup instructions.
## Related skills
- `using-streamlit-layouts`: Columns, containers, tabs, dialogs
- `displaying-streamlit-data`: Charts, dataframes, column configuration
- `optimizing-streamlit-performance`: Caching and fragments for heavy dashboards
## References
- [st.container](https://docs.streamlit.io/develop/api-reference/layout/st.container)
- [st.metric](https://docs.streamlit.io/develop/api-reference/data/st.metric)
- [st.columns](https://docs.streamlit.io/develop/api-reference/layout/st.columns)