StreamSnow ❄️
An open-source toolkit for building, governing, and shipping Streamlit-in-Snowflake apps with Claude Code.
Scaffold a governed monorepo, build dashboards inside enforced data-governance guardrails, and deploy them to Snowflake — without learning the rules by hand.
Status: beta, functional. The CLI (configure / init / new / doctor / validate-app / preview / check / sql-review / review-gate / review-loop / migrate / nav / deploy-sql / deploy-setup / verify-deploy) and the Claude Code plugin (8 skills + shared recipes, with deprecated aliases for the pre-0.3 names) are implemented and CI-green for both runtimes and both deploy sources. Published on PyPI (
uvx streamsnow/pip install streamsnow); APIs may still evolve toward 1.0.
What it is
StreamSnow is a hybrid of two things that work together:
- A
streamsnowCLI (PyPI) — scaffolds a governed Streamlit-in-Snowflake monorepo, runs an interactive setup wizard, and vendors the validation tools, CI, pre-commit hooks, and branding your repo needs. - A Claude Code plugin (marketplace) — ships the skills, subagents, and
hooks that turn Claude Code into a domain expert for this stack:
/start-app(the front door),/preview-app,/validate-app,/review-app,/ship-app, and more.
Think a Claude Code skill pack fused with an installable system + setup.
The CLI gives you the substrate; the plugin gives Claude the playbook. A single
streamsnow.config.yaml is the source of truth both read from.
Why
Building Streamlit apps on Snowflake well means getting a hundred small things right: caching with TTLs, parameterized SQL that survives the deployed Go driver, runtime selection (container vs. warehouse), schema access guardrails, a deploy pipeline, branding, and review discipline. StreamSnow encodes those as executable guardrails — pre-commit + CI gates, scaffolding templates, and Claude Code skills — so every developer (and every Claude session) follows the same rules and ships safely.
Two things you choose
StreamSnow treats two axes as first-class, configurable options:
| Axis | Options |
|---|---|
| Runtime | Container (default — full PyPI, local preview matches deploy) or Warehouse (instant start, Anaconda channel, no compute-pool cost) |
| Deploy source | Stage-copy (default — CI uploads to an internal stage) or Snowflake GIT REPOSITORY (Snowflake pulls from your Git repo) |
Quickstart (target experience)
# 0. Check your machine has the prerequisites (Python 3.11+, uv, git, snow CLI)
uvx streamsnow doctor
# 1. Install the CLI, then configure + scaffold a governed repo with a starter app
uv tool install streamsnow # persistent `streamsnow` on your PATH (uvx runs are one-shot)
mkdir my-snowflake-apps && cd my-snowflake-apps # init scaffolds into the current directory (or pass --dir)
streamsnow init # runs the config wizard, then scaffolds
# (or split it: `streamsnow configure` to set up streamsnow.config.yaml first,
# then `streamsnow init` to scaffold)
# 2. Connect to Snowflake + create local preview secrets
snow connection add --connection-name <name> --account <locator> \
--user <you> --authenticator externalbrowser # init prints the exact command
cp apps/<slug>/.streamlit/secrets.toml.example apps/<slug>/.streamlit/secrets.toml
# 3. Add the Claude Code plugin (inside Claude Code)
/plugin marketplace add kyle-chalmers/streamsnow
/plugin install streamsnow@streamsnow
# 4. Build, preview, validate, ship
streamsnow new marketing campaign-dashboard # or let /start-app drive the whole flow
uv venv && uv pip install -e apps/marketing-campaign-dashboard # install the app's deps first
uv run streamlit run apps/marketing-campaign-dashboard/streamlit_app.py
# /start-app -> /preview-app -> /validate-app -> /review-app -> /ship-app
The skills
One front door plus focused verbs — each skill's SKILL.md stays under 80
lines, with depth in per-skill reference files:
| Skill | What it does |
|---|---|
/start-app |
The front door: spec (incl. backfill from existing source) → scaffold → build pages → ship, with checkpoints. Also --setup (machine + repo) and adopt (existing repos — maps, doesn't scaffold, writes MIGRATION.md) |
/preview-app |
Run an app locally against live Snowflake |
/validate-app |
The pass/fail check that must be clean before shipping |
/review-app |
Senior-reviewer-grade review; --fix applies findings, --auto loops to clean (executable loop primitives + per-change coverage stamping), --sql authors the audit-trail manifests |
/audit-lineage |
Live-warehouse column + lineage verification (read-only, bounded) |
/feedback-app |
Turn user feedback into classified, atomic-commit fixes |
/ship-app |
Validate-gated stage → commit → push → PR → watch CI |
/migrate-app |
Port an external Streamlit app in (lift, then conform) |
Pre-0.3 names (/new-app, /refine-requirements, /add-page, /onboard,
/auto-review-app, /sql-review, /apply-review, /deep-dive-data) still
work as deprecated aliases and will be removed in the next major release.
The audit trail (new in 0.6)
Every query under apps/<slug>/queries/ gets a human-runnable proof: a
fully-rendered, paste-runnable .review.sql under apps/<slug>/sql_review/,
generated from a per-feature manifest and verified by an import-free freshness
- coverage gate (
streamsnow sql-review check). Coverage is keyed to thequeries/convention — the same place the validate gate pushes UI-feeding SQL — so SQL inlined in Python sits outside its reach. The gate fails closed in pre-commit and the generated CI where those configs are adopted; insidestreamsnow validate-appit warns only in 0.6 (FAIL planned for 0.7). A person with nothing but Snowsight can trace a covered visual back to the data and confirm it — see Auditing a visual. For dashboards whose visuals aggregate differently than any single query,"mode": "metrics"manifests (0.6.1) render one authored block per visual.
Make it yours — repo overlays (new in 0.6.1)
The skills are generic procedures; your org's knowledge layers on top without
forking them. Commit .streamsnow/overlays/<skill>.md files and every skill
reads its overlay first — extra steps, local failure signatures, environment
specifics, explicit overrides. Plugin upgrades never touch them; overlays may not
skip mandatory gate invocations, and the coded gates (hooks, CI, pre-commit)
run outside skill prose entirely. See
skills/_shared/overlays.md.
Hooks, in full
Trust demands transparency: this plugin runs hooks, so here is every one of them. All are
stdlib-only, make no network calls, never write outside the repo (plus one best-effort
dedupe state file in $TMPDIR, so the review nudge fires once per state, not every turn),
and fail open — a hook
error never blocks your session; the guards only ever add a confirmation or a note.
| Event | Script | What it does |
|---|---|---|
| PreToolUse (Bash) | hooks/deploy_safety.py |
Pauses before destructive Streamlit/SQL commands (snow streamlit deploy/drop, CREATE OR REPLACE / DROP / ALTER STREAMLIT, stage REMOVE, destructive SQL incl. -f files / stdin) — /ship-app is the sanctioned deploy path |
| SessionStart | hooks/session_start.sh |
One-line skills banner inside a StreamSnow repo, and announces which guards are active |
| Stop | hooks/review_gate_stop.py |
Warn-only nudge (a systemMessage, never a turn continuation) when a substantive app change ends with no review covering it — points at /review-app <slug> --auto. Off-switches: REVIEW_GATE_OFF=1, apps/<slug>/.review/SKIP, or review_gate: {enabled: false} in config |
All hooks are repo-gated on streamsnow.config.yaml — zero cost in unrelated repos — and
declare explicit timeouts so a hung hook can never stall a session. To turn them off, disable
the plugin (claude plugin disable streamsnow). Upgrading from ≤0.5: hook additions do not
reach installed copies automatically — run /plugin uninstall streamsnow then reinstall.
How it's organized
streamsnow/ the PyPI package — CLI, config, policy, scaffolder, tools
├── cli.py configure / init / new / doctor / check
├── config.py typed + validated streamsnow.config.yaml model
├── policy.py schema allow/deny single source of truth
├── scaffolder.py renders a governed repo from config
├── _templates/ the Jinja scaffold templates (repo/ + app/)
└── tools/ governance checks + engines (schema refs, security,
caching, dependency vulns, tombstones, path leaks,
sql_review generator, review gate/loop, migrate, doctor)
.claude-plugin/ Claude Code plugin manifest + marketplace
skills/ agents/ hooks/ Claude Code plugin surface (skills + SessionStart hook)
docs/ examples/ guides + a runnable no-Snowflake example app
Active scaffolding lives in
streamsnow/(templates understreamsnow/_templates/).
The streamsnow Python package is the single source of truth for tool
logic: the CLI, the Claude Code plugin, pre-commit, and CI all call the same
code — one implementation, many consumers.
Documentation
- Getting started — run the example with no Snowflake, then scaffold and preview your own governed app.
- Data discovery — find tables and wire queries inside the schema-access guardrails.
- Deploying — ship apps to Snowflake on merge, for both deploy sources.
- Deploy setup — the one-time Snowflake objects and CI secrets the pipeline needs.
- Auditing a visual — the five-minute runbook for confirming any dashboard number against the warehouse, no code required.
- Production lessons — the incidents behind the guardrails, genericized.
- Distribution — how StreamSnow ships (PyPI CLI + plugin) and why there's no separate copy-paste kit.
- Migrating a consumer repo — bring a repo with home-grown skills onto the plugin (skill map + incremental path).
License
MIT © Kyle Chalmers
StreamSnow is an independent open-source project and is not affiliated with or endorsed by Snowflake Inc., Streamlit, or Anthropic.
Metadata
Release files for streamsnow 0.6.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| streamsnow-0.6.2.tar.gz | 371.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| streamsnow-0.6.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 574.2 kB
Release files / streamsnow-0.6.2.tar.gz
| Download URL | streamsnow-0.6.2.tar.gz |
|---|---|
| Size | 371.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9e6c88c62ba10a18e1b3b5a74216a567afe449c981a8bc9fbc4e79a51fe08fa4
|
|
BLAKE2b-256 checksum How to use checksums |
07dbbb00588578eedbb07090c6db0db2112d582fb7f99a61f11875e1a5ddef18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / streamsnow-0.6.2-py3-none-any.whl
| Download URL | streamsnow-0.6.2-py3-none-any.whl |
|---|---|
| Size | 202.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4a8e66149047ac38f981c6207fded589dd87861b9e0a179719315910e2111f9e
|
|
BLAKE2b-256 checksum How to use checksums |
0dcc5274bb6cc8d19b629bd1d0b7d472f38082f28a8f37efaee5d2cf99856121
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency log