
Developing With Streamlit
Ship interactive Python data apps and dashboards faster when your coding agent needs Streamlit-specific patterns instead of guessing widget APIs.
Overview
Developing-with-streamlit is an agent skill for the Build phase that teaches coding agents Streamlit-first patterns for Python data apps and dashboards.
Install
npx skills add https://github.com/streamlit/agent-skills --skill developing-with-streamlitWhat is this skill?
- Bundled with the Streamlit package under `.agents/skills/developing-with-streamlit/SKILL.md` for agent discovery via the
- Covers idiomatic Streamlit app structure, components, caching, and common solo-builder pitfalls
- Pairs with a venv-aware path resolver that checks Pipfile, Poetry, PDM, and uv lockfiles relative to the project dir
- Exit-coded discover helper surfaces install vs missing-skill vs upstream layout changes on stderr
- Keeps procedural Streamlit knowledge in SKILL.md so Claude Code, Cursor, and Codex reuse one playbook
- Discover script defines 6 documented exit codes (0 success through 5 invalid arguments)
Adoption & trust: 1.6k installs on skills.sh; 199 GitHub stars; 2/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
Your agent defaults to generic Python web stacks and misuses Streamlit reruns, state, and widgets when you only need a fast interactive app.
Who is it for?
Solo builders creating Streamlit dashboards, internal tools, or demo apps with Claude Code, Cursor, or Codex in an existing Python venv.
Skip if: Teams building production React or Next.js frontends, pure REST APIs with no UI, or workflows where Streamlit is not installed and you will not add it.
When should I use this skill?
User builds or extends a Streamlit app, asks about `st` components, multipage layout, caching, or needs the bundled SKILL.md path from their project environment.
What do I get? / Deliverables
You get Streamlit-aligned implementation guidance and a reliable path to the bundled SKILL.md in your project venv so the agent ships working apps in fewer fix-up loops.
- Streamlit app code aligned with bundled skill guidance
- Resolved absolute path to developing-with-streamlit/SKILL.md when using discover.py
Recommended Skills
Journey fit
Streamlit work happens while you are assembling the product UI and logic in Python, before you polish deploy and ops. The skill targets layout, widgets, session state, and app structure—the visible app surface—even when some logic lives in Python modules.
How it compares
Use this procedural Streamlit skill instead of asking the agent to freestyle `st` APIs from memory or copy unrelated Flask tutorials.
Common Questions / FAQ
Who is developing-with-streamlit for?
It is for solo and indie Python builders and small teams who ship Streamlit UIs and want their agent to follow Streamlit’s execution model and component APIs.
When should I use developing-with-streamlit?
Use it during Build when scaffolding widgets, pages, caching, charts, or forms; during Validate when prototyping a clickable data app; and during Ship when hardening structure before hosting.
Is developing-with-streamlit safe to install?
It ships with the Streamlit package you already install via pip; review the Security Audits panel on this Prism page and pin Streamlit versions you trust before running discover scripts in CI.
SKILL.md
READMESKILL.md - Developing With Streamlit
#!/usr/bin/env python3 """Discover the Streamlit package's bundled agent-skills SKILL.md. Usage: python scripts/discover.py [--project-dir PATH] When --project-dir is given, the script resolves `.venv`, `../.venv`, `Pipfile`, `poetry.lock`, `pdm.lock`, and `uv.lock` relative to that path (so its checks land on the user's project rather than on the script's installed location). Exit codes: 0 - success; prints the absolute path to the bundled SKILL.md on stdout. 1 - Streamlit is not installed in the detected interpreter. 2 - Streamlit is installed but predates bundled skills (no .agents/skills/). 3 - no usable Python interpreter was found. 4 - .agents/skills/ exists but the expected developing-with-streamlit/SKILL.md is missing from the documented sub-path (likely upstream restructured). The agent should read the listed available skills directly. 5 - invalid script argument. On non-zero exit, a human-readable "ERROR:" block is printed on stderr. """ from __future__ import annotations import argparse import os import shutil import subprocess import sys from pathlib import Path from typing import List, Optional, Tuple def find_venv_python(venv_root: Path) -> Optional[Path]: """Return the venv's Python executable, cross-platform. POSIX venvs put it at bin/python; Windows venvs put it at Scripts/python.exe. """ for candidate in ( venv_root / "bin" / "python", venv_root / "Scripts" / "python.exe", ): if candidate.is_file(): return candidate return None def find_git_root(start: Path) -> Optional[Path]: """Walk up from `start` looking for a `.git` directory or file. Returns the directory containing `.git` (the repo root), or None if no git repository is found above `start`. Handles the worktree case where `.git` is a file pointing at the real repo dir. """ for ancestor in [start, *start.parents]: if (ancestor / ".git").exists(): return ancestor return None def detect_interpreter(project_dir: Path) -> Optional[Tuple[List[str], str]]: """Pick the right Python interpreter, in documented priority order. Returns ``(cmd, tag)`` where ``cmd`` is the command for ``subprocess.run`` and ``tag`` identifies which detection branch fired (``virtual-env``, ``venv-local``, ``venv-parent``, ``venv-git-root``, ``conda``, ``pipenv``, ``poetry``, ``pdm``, ``uv``, or ``system``). The tag lets callers give targeted install advice on exit 1 instead of a buffet of unrelated package-manager commands. """ venv = os.environ.get("VIRTUAL_ENV") if venv: py = find_venv_python(Path(venv)) if py: return [str(py)], "virtual-env" py = find_venv_python(project_dir / ".venv") if py: return [str(py)], "venv-local" py = find_venv_python(project_dir.parent / ".venv") if py: return [str(py)], "venv-parent" # Walk up to the git repo root and look for a `.venv` there. Helpful for # monorepos where the project's venv lives at repo root but the agent's # cwd / --project-dir points deep into a subdirectory. git_root = find_git_root(project_dir) if ( git_root is not None and git_root != project_dir and git_root != project_dir.parent ): py = find_venv_python(git_root / ".venv") if py: return [str(py)], "venv-git-root" conda = os.environ.get("CONDA_PREFIX") if conda: py = find_venv_python(Path(conda)) if py: return [str(py)], "conda" if shutil.which("pipenv") and (project_dir / "Pipfile").is_file(): return ["pipenv", "run", "python"], "pipenv" if shutil.which("poetry") and (project_dir / "poetry.lock").is_file(): return ["poetry", "run", "python"], "poetry" if shutil.which("pdm") and (project_dir / "pdm.lock").is_file(): return ["pdm", "run", "python"], "pdm" if sh