mrkeyoor.com_
Fri 16 Oct 18:53 UTC
Dataevaluationupdated 06 Oct 2026

streamlit review

Streamlit turns a Python script into an interactive browser app, giving data teams a short route to dashboards, reports, and model interfaces. You write widgets and output in Python, then run the file with Streamlit instead of building a separate frontend.

+72stars / 7d
Verdict

Our Streamlit run installed 35 packages in 28 seconds, then the source build failed after 9 seconds, so app users and framework contributors face very different setup costs. Use it when a Python team needs a credible data app quickly and can design around reruns. Choose Dash or Shiny when exact update boundaries and browser behavior are central to the product.

We ran it

Lab card: what happened when we ran streamlitScreenshot of streamlit (streamlit.io)
Install✓ · 28s35 packages · 37 MB
Build✗ · 9s
Testsn/ano test script
Known vulns0(pip-audit)
Repo9984 files~667,646 lines of source · 153.1 MB · 44 CI workflows

Answers from our run

Does streamlit build from source?

Dependencies installed in 28 seconds (35 packages), and the build failed. We cloned commit 0db4d54 into a clean Debian container with 3 CPUs and no project-specific setup.

Does streamlit have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does streamlit have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use streamlit?

Product teams that need browser interactions to stay independent of Python execution: Streamlit's docs say each interaction reruns the script from top to bottom.

What are the alternatives to streamlit?

Dash, Gradio, Shiny for Python. Our Streamlit run installed 35 packages in 28 seconds, then the source build failed after 9 seconds, so app users and framework contributors face very different setup costs.

Setup3/5Short app quick start, but our source build failed
Docs5/5Clear quick start plus detailed state and contributor guides
Community5/545,907 stars and same-day maintainer activity
Maturity5/5Version 1.65.0 and an active release cadence

Discussed on

  1. hnPrettymapp – Create maps from OpenStreetMap data in a Streamlit webapp324 points
  2. hnSnowflake acquires Streamlit for $800M to help customers build data-based apps129 points
  3. hnShow HN: Hstream – quick Python web apps – Streamlit alternative using htmx104 points
  4. hnStreamlit launches open-source machine learning application dev framework102 points
  5. hnUse pygwalker to build visual analysis app in streamlit71 points

Who it’s for

Python teams turning analyses, models, or data workflows into internal web apps.
Data scientists who need colleagues to use a tool before a frontend team can take it on.
Educators and researchers publishing interactive examples with little browser code.
Small teams comfortable testing Streamlit's top-to-bottom rerun model.

Who it’s NOT for

Product teams that need browser interactions to stay independent of Python execution: Streamlit's docs say each interaction reruns the script from top to bottom.
Custom-component authors who cannot accept a lost event under load: confirmed P2 issue 17215 reports a v2 trigger disappearing when another widget update arrives during a queued rerun.
Apps that write records directly from changing editable tables without extra checks: issue 17026 shows positional state acting on the wrong row after data changes.
External contributors who must upstream their own fixes: the README says outside pull requests are paused.
Contributors expecting a Python-only source build: the documented setup also needs Node, Corepack, Yarn, Protobuf tooling, and browser dependencies.

Setup reality

Our sandbox installed commit 0db4d54 in 28 seconds, adding 35 packages and using 37 MB. The build then failed with exit code 1 after 9 seconds. The supplied measurement summary has no error tail, so it does not identify the failed command or cause. Tests were skipped because no test script or target was detected, and pip-audit found 0 known vulnerabilities.

A normal app has the shorter path shown in the README: install Streamlit, write a Python file, and run streamlit run. Local use needs no Streamlit credential. Community Cloud requires signup, while databases and hosted model APIs bring their own credentials and network access.

Source work is different. The 153.1 MB checkout held 9,984 files and about 667,646 source lines. Streamlit's contributor guide also calls for uv, Node through nvm, Corepack and Yarn, a Protobuf compiler, and Playwright system packages. Our scan found 44 CI workflows, no Dockerfile, and no tests directory.

Three Python lines make the first useful app

Streamlit's README turns 3 lines of executable Python into a browser app. The code imports Streamlit, creates a slider, and prints the squared value. streamlit run streamlit_app.py opens it. A data scientist can put controls around an analysis while staying in Python, without first designing an API and a separate client application.

The surface extends well beyond that example. Streamlit has tables, charts, forms, multipage navigation, chat elements, and custom components. Community Cloud provides the hosted route advertised in the README, while Apache-2.0 licensing leaves self-hosting open. The framework is most convincing for internal reports, model controls, and review queues where useful access matters more than a bespoke application shell.

One browser interaction can rerun the whole Python file

Streamlit's architecture reruns 1 file of Python code from top to bottom after each browser interaction, while every tab creates its own session. That model keeps the page readable as Python: the order in the file largely matches the order on screen. It also means an innocent widget change can repeat database reads, model setup, or data transforms unless the app handles state and expensive work deliberately.

There are 2 main cache decorators. st.cache_data is for serializable results and returns copies, while st.cache_resource shares objects such as models or database connections across reruns and sessions. Session State preserves per-session values. Those tools make serious apps possible, but they also become application architecture. A prototype that feels linear can accumulate cache invalidation rules and concurrency questions as more users arrive.

What happened when we ran it

In our sandbox, we measured a 28-second install for commit 0db4d54, adding 35 Python packages and using 37 MB on disk. The container had 3 CPUs, 8 GB of RAM, Python 3.12 on Debian, no secrets, and no elevated privileges. Pip-audit reported 0 known vulnerabilities in that installed environment. Our measurement setup covered repository mechanics, not app latency or server capacity.

The build ran for 9 seconds and exited with code 1. The supplied measurement summary contains no error tail, so it does not reveal which command failed or why. Blaming Protobuf, Node, or a missing Debian package would be guesswork. Tests were skipped because the harness found no test script or target, so our run provides no passing test count.

The checkout itself was substantial: 9,984 files, about 667,646 lines of source, and 153.1 MB. We found 44 CI workflow files, no Dockerfile, and no tests directory. That last observation describes the scanned directory layout, not an assertion that Streamlit has no tests. The repository's Makefile names separate Python, frontend, integration, and browser-test commands, but the generic harness did not select one.

The source checkout needs more than the 37 MB Python environment

Streamlit's 153.1 MB source checkout needs Python, Node, Yarn, Protobuf, and Playwright tooling. The contributor guide tells Ubuntu developers to install build tools and a Protobuf compiler, then use nvm for the pinned Node version and Corepack for Yarn. The Python side uses uv, and Playwright can install browser binaries and system libraries. This is a web framework codebase, even though its users mainly write Python.

That distinction gives the 9-second build failure its proper weight. It does not show that a normal Streamlit app is broken, because the 28-second dependency install completed. It does show that a fresh Python-focused container was insufficient for the build target the lab chose. If you plan to patch the framework, reproduce the documented contributor environment and run the relevant Make targets before estimating the work.

Queued reruns and changing rows need application-level checks

Confirmed P2 issue 17215 reports that a Custom Components v2 trigger can disappear when another widget update arrives while a rerun is queued. The reproduction uses a 5-second fragment and was reported against Streamlit 1.63.0 and 1.64.0. A built-in button survives the same sequence. Component authors handling payments, approvals, or destructive actions should test overlapping events instead of assuming every browser trigger reaches Python.

Issue 17026 documents a different state hazard. In its example, selecting TICK-102, inserting a new row, and then acting on the saved position closes TICK-101. The report says keyed dataframes and editors can retain positional selection or edit state after the data changes. Until the behavior changes, resolve actions against stable record identifiers and reject state created for an older frame.

Version 1.65.0 shipped four days before this review

Release 1.65.0 arrived on October 2, 2026. It added an on_change="ignore" mode to several widgets, required fields for text and number input, and alternative-text support across many display commands. The notes also list fixes for query-bound widgets, hung script threads, cached awaitables, and dialog reruns. This is active product work around the same execution model that creates Streamlit's tradeoffs.

GitHub showed 45,907 stars and 1,188 open issues and pull requests combined on October 6. The repository was pushed that same day, and current pull requests were receiving maintainer activity. The large queue should not be read as 1,188 bugs, but it does tell you to search for your exact widget and state pattern before choosing the framework for a sensitive workflow.

Outside pull requests are paused

GitHub listed 1,188 issues and pull requests as open when the README said outside code submissions were paused. Users can still file reproducible bugs, request features, comment on specifications, and publish custom components. The contributor guide attributes the pause to more incoming AI-assisted code than maintainers can review. For an organization that requires an upstream path for its own patch, that policy is a practical adoption limit.

Streamlit remains the shortest route here when a Python team wants a useful data app and accepts the framework's page model. Our 28-second install supports trying it. The failed 9-second source build argues for a separate contributor evaluation. Before a prototype becomes a production tool, test reruns with real data, identify stable record IDs, and decide whether a fix can wait for the maintainer team.

Alternatives

ProjectWhat it isPick it when
Dash gh↗A Python data-app framework built around explicit reactive callbacks and Plotly charts.pick this instead when callback-level update control matters more than Streamlit's shorter script model.
Gradio gh↗A Python toolkit for wrapping models and functions in shareable interfaces.pick this instead when the main job is an ML demo, media tool, or model playground.
Shiny for PythonA reactive Python framework descended from the R Shiny application model.pick this instead when explicit reactive dependencies and finer update boundaries matter more than a linear script.

Sources

  1. Streamlit README
  2. Streamlit repository metadata
  3. Streamlit 1.65.0 release notes
  4. Streamlit contributor guide at tested commit
  5. Streamlit Session State documentation
  6. Queued custom-component trigger issue 17215
  7. Changing dataframe row state issue 17026

More data reviews

wine-quality-svc-tuning · dhis2-immunisation-audit · OpenTerminal · The-Quant-Trading-Vault · multimodal-product-discovery · edgequake · the whole board →