Streamlit Apps in Wizard

SkillDatabases & data

Lets your agent create and edit Streamlit apps in the Wizard codebase.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Streamlit Apps in Wizard skill

About this capability

Create or modify Streamlit apps in the Wizard. Use when building new wizard apps, adding Streamlit pages, or working with apps/wizard/ code.

What this skill tells your AI

The instructions your AI receives, as published by owid/etl in .claude/skills/develop-wizard-app/SKILL.md and read by ahel’s review.

Apps live in apps/wizard/app_pages/. Run with make wizard or .venv/bin/etlwiz <alias>.

Creating a New App

  1. Create apps/wizard/app_pages/your_app/app.py:
import streamlit as st
st.set_page_config(page_title="Wizard: Your App", page_icon="🪄", layout="wide")

def main():
    st.title("Your App")

main()
  1. Register in apps/wizard/config/config.yml under a section's apps list:
- title: "Your App"
  alias: your-app
  entrypoint: app_pages/your_app/app.py
  description: "What it does"
  maintainer: "@slack-handle"
  icon: ":material/icon:"

Key Utilities

# Caching (supports ttl, show_time, works outside Streamlit too)
from apps.wizard.utils.components import st_cache_data
@st_cache_data(custom_text="Loading...", ttl="1h")

# URL-synced widgets (shareable state)
from apps.wizard.utils.components import url_persist
url_persist(st.selectbox)(label="Option", options=["a", "b"], key="my_key")
# ⚠️ Booleans stored as "True"/"False" strings in URL

# Charts
from apps.wizard.utils.components import grapher_chart, grapher_chart_from_url
grapher_chart(catalog_path="grapher/ns/ver/ds#var")
grapher_chart(variable_id=123, selected_entities=["France"], tab="map")

# Data loading
from apps.wizard.utils.cached import load_variables_in_dataset, load_variable_data

# Environment & DB
from etl.config import OWID_ENV  # .base_site, .indicators_url, .data_api_url
from etl.db import get_engine
from sqlalchemy.orm import Session

Components (apps.wizard.utils.components)

  • Pagination(items, items_per_page, pagination_key) — paginated lists
  • grapher_chart() / grapher_chart_from_url() — OWID charts
  • st_wizard_page_link(alias) — link to another Wizard page
  • tag_in_md(name, color, icon) — colored badge markup for st.markdown (or use native st.badge)
  • st_toast_error() — error toast
  • preview_file(path) — code preview in expander

Rules

  • st.set_page_config() must be the first Streamlit command
  • Use @st_cache_data for expensive operations
  • Use url_persist() for shareable widget state
  • Material icons: :material/icon_name: (Google Material Symbols)
  • HTTP requests: always timeout=30 and .raise_for_status()
  • Layout: use native st.container(horizontal=True, vertical_alignment=..., horizontal_alignment=...) for rows, st.columns(..., border=True) for grids. No CSS/HTML hacks (st.markdown(..., unsafe_allow_html=True) with <style>) — they break silently across Streamlit versions.
  • Sections in config.yml need title, description and apps; the home page is generated from them (no images).

Signals

GitHub stars
156
Forks
30
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
develop-wizard-app
Source
github.com/owid/etl