Streamlit(ストリームリット)は、Pythonのコードだけでデータの可視化画面や社内ツールをWebアプリにできるオープンソースのフレームワークです。HTML・CSS・JavaScriptを書かずに、表・グラフ・入力フォームを備えた画面を数十行で作れます。ライセンスはApache-2.0で、商用でも無償です。その代わり、ユーザーが操作するたびにスクリプト全体を上から再実行する仕組みのため、UIの作り込みや多人数向けの本番サービスは苦手です。2026年10月14日公開の最新版1.66.0ではPython 3.10の対応が外れ、3.11以上が必要になりました。この記事では、再実行モデルを手元で動かした結果をもとに、できること・できないこと、他ツールとの選び分け、公開方法と料金を整理します。
まとめ:Streamlitの要点と選ぶ条件
- 正体:PythonスクリプトをそのままWebアプリにするOSS。2022年3月にSnowflakeが約8億ドルで買収し、現在もSnowflakeのもとで開発が続く。ライセンスはApache-2.0。
- 最新版:1.66.0(2026年10月14日)。Python 3.11以上が必要で、3.10の環境に入れると1.65.0で止まる。1.57.0からサーバーはTornadoではなくStarlette/uvicornで動く。
- 仕組み:操作のたびにスクリプトを先頭から再実行する。普通の変数は毎回初期化されるので、保持は
st.session_state、重い処理の使い回しはst.cache_dataで行う。 - できないこと:ピクセル単位のデザイン、URLごとの細かなルーティング、本格的なREST APIの提供(
st.Appで簡単なルートは足せる)、多人数が同時に使う一般公開サービス。 - 選ぶ条件:限られた人数がデータを見て操作する社内ダッシュボード、分析やMLモデルの検証画面、LLMアプリの試作。避けるのは、不特定多数向けのプロダクトと、BIツールで足りる定型レポート。
- 公開:Community Cloudは無料だが、非公開アプリは最大1つ(公式トップは「Public apps only」と表記)、メモリは690MB〜2.7GB程度、12時間アクセスがないとスリープする。
Streamlitとは:読み方・開発元・ライセンス
Streamlitは「ストリームリット」と読みます。PythonでWebアプリを作るフレームワークですが、FlaskやDjangoのようにルーティングとHTMLテンプレートを設計する道具ではありません。st.title()やst.line_chart()のような関数を上から順に呼ぶと、その順に画面部品が並びます。データの読み込みはPandas、グラフはMatplotlibやPlotlyと、分析で使っているライブラリをそのまま載せられるのが特徴です。
開発元はSnowflake(2022年に買収)
Streamlitは2019年に公開されたOSSで、Snowflakeは2022年3月2日にStreamlitの買収を発表しました。同社の2022会計年度の年次報告書(Form 10-K)には、全株式を約8億ドル(現金と株式の組み合わせ)で取得する契約を2022年3月に結んだと記載があり、取得は同月31日に完了しています(2023会計年度の10-K)。現在はPyPIの作者欄もSnowflake Inc.で、Snowflake上でアプリを動かす「Streamlit in Snowflake」も提供されています。
ライセンスと商用利用
Streamlit本体のライセンスはPyPIの表記どおりApache-2.0です。商用プロダクトへの組み込み、社内ツールでの利用、改変して配布することも、条件(ライセンス文と著作権表示の同梱、変更点の明示)を守れば無償でできます。お金がかかるのはホスティングの側で、Community Cloudは無料、Streamlit in SnowflakeはSnowflakeのクレジット課金、自前のサーバーならそのサーバー代です。なお、Apache-2.0は第6項で商標の使用を許諾していません。ロゴも、製品への事実に即した言及やリンク以外に使うにはブランドガイドライン上、書面の許可が要ります。
最新版と対応Python:1.66.0は3.11以上
2026年7月の1.59.0以降、Streamlitはおおむね2週間ごとにマイナー版を出しています。直近の変化で影響が大きいのは次の2つです。どちらもPyPIの各版のメタデータとGitHub Releasesで確認しました。
| 版 | 公開日(UTC) | requires_python | 主な変化 |
|---|---|---|---|
| 1.57.0 | 2026-04-28 | >=3.10 | Starletteが既定サーバーに。Tornadoを削除 |
| 1.65.0 | 2026-10-02 | >=3.10 | 3.10で入る最後の版 |
| 1.66.0 | 2026-10-14 | >=3.11 | Python 3.10を削除、3.15に対応 |
注意したいのは、Python 3.10の環境でpip install streamlitを実行してもエラーにならない点です。uvでPython 3.10と3.12の仮想環境を作り、それぞれuv pip install streamlitを実行すると、3.12には1.66.0、3.10には1.65.0が入りました。手元とサーバーでPythonの版が違うと、Streamlitの版も黙ってずれます。requirements.txtでstreamlit==1.66.0のように版を固定し、サーバー側を3.11以上に揃えてください。
実行モデル:操作のたびにスクリプト全体を上から再実行する仕組み
ボタンやスライダーを操作するたびに、Streamlitはスクリプトを先頭から最後まで実行し直して画面を描き直します。コールバックを書かずに済むのはこのためで、「変数が消える」「重い処理が毎回走る」というつまずきの原因もここにあります。
実測:普通の変数・session_state・cache_dataの違い
Streamlit 1.66.0(Python 3.12)で次のアプリを作り、公式のテスト用APIAppTestでボタンを3回ずつ押しました。
import streamlit as st
count = 0
if st.button("+1(普通の変数)"):
count += 1
st.write("普通の変数:", count)
if "n" not in st.session_state:
st.session_state.n = 0
if st.button("+1(session_state)"):
st.session_state.n += 1
st.write("session_state:", st.session_state.n)
普通の変数のボタンは何回押しても表示が1のまま、別のボタンを押すと0に戻りました。再実行のたびにcount = 0から始まるためです。st.session_stateのほうは1、2、3と増えました。session_stateはブラウザのタブとサーバーの接続にひも付いた値で、タブを閉じたり再読み込みしたり、サーバーが再起動したりすると消えます。永続化したい値はデータベースやファイルに書いてください。
重い処理は@st.cache_dataで包みます。0.5秒かかる関数をキャッシュし、スライダーを3→5→3→5と動かしたところ、関数本体が実際に動いたのは2回(3と5の初回だけ)でした。引数が同じなら結果を使い回すので、ファイルの読み込みや集計をこの形にしておけば、同じ条件に戻したときの再計算(この例では0.5秒)が発生しません。データベース接続や機械学習モデルのように、全ユーザーで1つを共有したいオブジェクトには@st.cache_resourceを使います。
画面の一部だけを再実行する:st.fragment
実験版を経て1.37.0で正式版になった@st.fragmentを関数に付けると、その中のウィジェット操作では関数の部分だけが再実行されます。グラフの絞り込みのたびにページ全体のデータ読み込みが走るのを避けたいときに使います。run_everyを指定すると一定間隔で自動的に再実行できるので、数秒ごとに値を更新するモニタリング画面も作れます。公式の解説のとおり、fragmentの外にあるウィジェットを操作すれば従来どおり全体が再実行されます。また、同じ関数に@st.cache_dataと@st.fragmentを両方付ける使い方はサポートされていません。
Streamlitでできること:表・入力・チャット・ログインの標準部品
得意なのは、データを見せて触ってもらう画面です。標準の部品で次のことができます。
- 表とグラフ:
st.dataframeで並べ替え可能な表、st.line_chart・st.bar_chartでグラフ、st.mapで地図。Matplotlibの図はst.pyplot、Plotlyはst.plotly_chartで表示できます。クリック地点を受け取れる地図が要るならfoliumとstreamlit-foliumの使い方で紹介しているst_foliumが使えます。 - 入力部品:スライダー、セレクトボックス、日付入力、ファイルアップロード、カメラ入力など。戻り値をそのまま変数として使えます。
- 表の編集:
st.data_editorでスプレッドシートのように表を直接編集し、結果をDataFrameで受け取れます。 - LLMのチャット画面:
st.chat_input・st.chat_message・st.write_streamで、ストリーミング表示付きのチャットUIが組めます。実装はStreamlitでチャットボットのUIを作る手順で詳しく扱っています。 - マルチページ:1.36.0で入った
st.navigationとst.Pageで複数ページのアプリにできます。 - ログイン:1.42.0(2025年2月)で
st.login()が入り、GoogleやMicrosoft Entra IDなどOpenID Connect対応のIdPでログインさせられます。pip install "streamlit[auth]"でAuthlibとhttpxを入れ、secrets.tomlの[auth]にredirect_uri・cookie_secretなどを書きます。
Streamlitのデメリットとできないこと
どれも再実行モデルと「Pythonだけで書ける」設計の裏返しです。
デザインとURL設計の自由度:テーマ設定とページ単位のURL
レイアウトはst.columns・st.tabs・st.sidebarなどの枠を組み合わせる形で、CSSでピクセル単位に作り込む前提ではありません。テーマ設定(.streamlit/config.tomlの[theme])で配色・フォント・余白はある程度変えられますが、ブランドに合わせたLPや製品画面には向きません。URLもページ単位にしか分けられず、/items/123のようなパスで画面を出し分ける設計はできません(?id=123のようなクエリ文字列ならst.query_paramsで受け取れます)。独自の見た目が要る部品はカスタムコンポーネントで作れますが、そこではReactなどのフロントエンド開発が必要になり、「Pythonだけ」の利点は失われます。
多人数の同時アクセスと重い処理:全セッションが1プロセスに同居する構造
公式のマルチスレッドの解説によると、Streamlitは接続ごとにセッションを作り、各セッションのスクリプトを専用のスレッドで実行します。100人が同時に操作すれば、100本のスクリプト実行が1つのサーバープロセスの上で走ります。キャッシュを使わずに大きなCSVを読み込むアプリは、閲覧者が増えるほど遅くなります。社内の数人〜数十人が使う規模なら問題になりにくい一方、不特定多数が同時に使うサービスでは、負荷分散やセッションの固定を自分で設計する必要があり、Streamlitを選ぶ理由が薄れます。
APIの提供とデータの書き込み:st.Appで足せる範囲と別サーバーにする境目
Streamlitは画面を作る道具です。1.53.0で実験版として入り、1.57.0からst.Appとして使えるようになったASGIのエントリーポイントにroutesを渡せば、JSONを返す小さなエンドポイントなら同じサーバーに載せられます。ただし、ルーティング・認証・入力の検証はStarletteの作法で自分で書くことになります。外部のシステムから本格的に呼ばれるAPIが要るなら、FastAPIなどでバックエンドを分けてStreamlitから呼ぶ構成が素直です。データベースへの書き込みも書けはしますが、再実行のたびに同じ処理が走らないよう、ボタンの中に閉じ込めるなどの注意が要ります。
依存関係の落とし穴:Python 3.10とStarlette
前述のとおり、Python 3.10では最新版が入らず1.65.0で止まります。もう1つ、1.57.0以降のStreamlitはWebサーバーにStarletteを使います。1.66.0の依存はstarlette>=0.46.0,<2と幅が広く、同居するライブラリの上限に合わせて古い版まで下がります。uvでstreamlit==1.66.0とfastapi==0.132.1を一緒に解決したところ、Starletteは0.52.1になりました(FastAPI 0.132.1がstarlette<1.0.0を要求するため)。Starletteの1.0.0以下には2026年に悪用が確認された脆弱性があるので、同居させる場合はStarletteの脆弱性CVE-2026-48710の解説で該当条件を確かめ、Starlette 1.0.1以上を入れられるFastAPI 0.133.0以降へ上げてください(0.133.0の依存はstarlette>=0.40.0で上限なし)。
また、表やグラフのuse_container_width引数は非推奨になり、width="stretch"(Falseならwidth="content")への書き換えが求められています。1.66.0でも動きはしますが、ターミナルのログに「2025-12-31以降に削除」という警告が出ます。
インストールと最初のアプリ:pipから売上ダッシュボードまで
インストール手順(Windows・macOS共通)
Python 3.11以上を用意し、プロジェクトごとに仮想環境を作ってから入れます。
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install streamlit
streamlit version # 1.66.0 と表示されればOK
streamlit hello # デモアプリで動作確認
起動すると、既定ではhttp://localhost:8501でブラウザが開きます。なお、Streamlitは既定で利用状況の統計を送信します(browser.gatherUsageStatsの既定値がtrue)。社内規程で外部送信を止めたい場合は、.streamlit/config.tomlに次を書きます。
[browser]
gatherUsageStats = false
実例:サイドバーで絞り込む売上ダッシュボード
地域と表示日数をサイドバーで切り替え、合計・グラフ・表を連動させる最小例です。データ読み込みを@st.cache_dataで包み、操作のたびに作り直さないようにしています。
import streamlit as st
import pandas as pd
import numpy as np
st.title("売上ダッシュボード")
@st.cache_data
def load_data():
rng = np.random.default_rng(0)
days = pd.date_range("2026-01-01", periods=180, freq="D")
return pd.DataFrame({
"日付": days,
"地域": rng.choice(["東日本", "西日本"], size=len(days)),
"売上": rng.integers(80, 200, size=len(days)),
})
df = load_data()
region = st.sidebar.selectbox("地域", ["すべて", "東日本", "西日本"])
days = st.sidebar.slider("表示日数", 30, 180, 90)
view = df if region == "すべて" else df[df["地域"] == region]
view = view.tail(days)
st.metric("期間売上", f"{view['売上'].sum():,}")
st.line_chart(view, x="日付", y="売上")
st.dataframe(view, width="stretch")
app.pyとして保存し、streamlit run app.pyで起動します。1.66.0で動かすと、初期表示(すべて・90日)の期間売上は12,861、地域を東日本・30日に切り替えると4,111になり、表も30行に絞られました(乱数のシードを0に固定しているので、同じ版なら同じ数字になります)。ウィジェットの値がそのまま変数に入るので、コールバックを書く必要はありません。データ加工はPandasの書き方がそのまま使えます。
MatplotlibとPlotlyのグラフ表示:st.pyplotとst.plotly_chart
標準のグラフで足りないときは、作り慣れた図をそのまま渡せます。Matplotlibの図はst.pyplotで表示します。
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x))
st.pyplot(fig)
拡大やホバーで値を見せたいならPlotlyの図をst.plotly_chartに渡します。
Gradio・Dash・Flask・BIツールとの比較
| ツール | 得意な用途 | 画面の自由度 | 必要な知識 |
|---|---|---|---|
| Streamlit | 社内ダッシュボード・検証画面 | 低(枠を組み合わせる) | Pythonのみ |
| Gradio | MLモデルの入出力デモ | 低(用途特化) | Pythonのみ |
| Dash | 作り込んだ業務ダッシュボード | 中〜高 | Python+コールバック設計 |
| Flask・FastAPI | 汎用Webアプリ・API | 高(自作) | Python+HTML/CSS/JS |
| BIツール | 定型レポート・KPI共有 | 中(製品の範囲内) | GUI操作・SQL |
最短で動くものを見せたいならStreamlitです。モデルに画像や音声を入れて結果を見るだけのデモなら、入力→出力の型に特化したGradioのほうが少ないコードで済みます。操作した部品に関係する処理だけを動かしたい、画面を細かく作り込みたい場合は、コールバック方式のDashが向きます。画面もAPIも自分で設計するならFlaskやDjangoです。
見落としやすいのがBIツールとの比較です。売上やKPIを決まった切り口で毎週見るだけなら、TableauやPower BIのようなBIツールのほうが、権限管理・定期配信・非エンジニアによる修正まで揃っています。Streamlitを選ぶのは、機械学習の推論や独自の計算をPythonで挟みたいとき、画面に入力フォームを置いて業務処理を動かしたいときです。どちらで作るか迷う段階なら、BIツール導入支援のように要件から整理するのも手です。
公開方法と料金:Community Cloud・Snowflake・自前サーバー
Community Cloudの無料枠と上限
GitHubのリポジトリをつなぐだけで公開できるStreamlit Community Cloudは無料です。公式ドキュメントに記載されたリソースの目安(2024年2月時点)は次のとおりで、予告なく変わることがあると明記されています。
| 項目 | Community Cloudの目安 |
|---|---|
| CPU | 0.078〜2コア |
| メモリ | 690MB〜2.7GB |
| ストレージ | 最大50GB |
| スリープ | 12時間アクセスがないと休止 |
| 非公開アプリ | 同時に1つまで(共有の説明ページ) |
非公開アプリの扱いは公式の中で表記が揃っていません。公式サイトのトップはCommunity Cloudを「Public apps only」と案内しているので、非公開アプリを使う計画なら、デプロイ画面で実際に非公開を選べるかを先に確かめてください。上限を超えると、アプリが遅くなるか動かなくなります。スリープしたアプリは、閲覧権限のある訪問者が休止画面の「Yes, get this app back up!」を押すまで起動しないので、朝一番に開く社内ダッシュボードでは最初の表示が遅れる前提で使ってください。
社内だけに公開するときの注意:閲覧者の再招待とアナリティクスの範囲
非公開アプリは、メールアドレスで招待した閲覧者だけが開ける仕組みです。ただし共有の説明ページによると、招待された閲覧者はそのアプリと作者の全公開アプリのアナリティクスも見られ、さらに別の人をワークスペースの閲覧者として招待できます。閲覧者を社員に限定したい、退職者の権限を確実に外したい、といった要件があるなら、Community Cloudの共有機能だけに頼らず、自前のサーバーに置いてst.login()で社内のIdPにつなぐか、Streamlit in Snowflakeを選びます。
Streamlit in Snowflakeと自前サーバー
Snowflakeを使っている会社なら、Streamlit in Snowflakeでデータを社外に出さずにアプリを配れます。ライセンス料は無く、ウェアハウスやコンピュートプールのクレジットで課金されます。費用の内訳と試算はStreamlit in Snowflakeの料金・課金体系にまとめました。自前で動かす場合は、streamlit runをそのままサーバーで起動すれば動きます。1.66.0のサーバーはuvicornで、/_stcore/healthにアクセスするとokが返るので、ロードバランサーのヘルスチェックに使えます。手軽なPaaSならPythonAnywhere(Streamlit対応はベータ)やHerokuも選択肢です。
Streamlitを選ぶ条件・避ける条件
判断の軸は「使う人数」と「画面を作り込む必要があるか」です。
- 選ぶ:使う人が社内の数人〜数十人で、データを見て条件を変える画面が要る。分析や機械学習の結果を、エンジニアでない人に触ってもらいたい。LLMアプリの試作を数日で見せたい。
- 避ける:不特定多数が同時に使うサービスを作る。デザインの細部やURL設計にこだわる。外部システム向けのAPIが主役。決まったKPIを見るだけでBIツールで足りる。
失敗しやすいのは、試作のつもりで作ったStreamlitアプリがそのまま全社に広がり、同時アクセスと権限管理で行き詰まるパターンです。利用者が増えそうだと分かった時点で、キャッシュの設計を見直すか、画面をDashや通常のWebフレームワークに作り直す判断をしてください。ノートブックの延長で分析と画面をまとめたいなら、marimoも候補に入ります。
よくある質問
Streamlitの読み方は?
「ストリームリット」と読みます。
Streamlitは無料で商用利用できますか?
できます。本体はApache-2.0で、商用の製品や社内ツールに組み込んでも費用はかかりません。費用が発生するのはホスティング側です。
どのPythonのバージョンで使えますか?
最新の1.66.0はPython 3.11以上が必要で、3.10の環境では1.65.0までしか入りません。
Streamlitのアプリが重い・遅いときは?
原因の多くは操作ごとの全体再実行です。読み込みや集計は@st.cache_data、DB接続やモデルは@st.cache_resource、一部だけ更新したい箇所は@st.fragmentで対処します。
アプリのデザインはカスタマイズできますか?
テーマ設定で配色・フォント・余白を変えられ、st.columnsやタブでレイアウトも組めます。ピクセル単位で作り込みたい場合や独自のUI部品が要る場合は、ReactなどでカスタムコンポーネントやWebフレームワークを使うことになります。