indah turns a single Python file into an interactive app you launch from a Colab or Runpod cell. Reactive, single-port, streaming - and no Node anywhere, at install or runtime.
pip install indah - a pure-Python wheel, no Node toolchain.launch() prints a URL and embeds the app inline in a Colab or
Runpod cell. Mutate a signal and only what reads it re-renders.import indah
from indah import Signal, computed, Column, Slider, Text, Session
a, b = Signal(2), Signal(3)
total = computed(lambda: f"a + b = {a.value + b.value}")
page = Column(children=[
Slider(a, min=0, max=10, label="a"),
Slider(b, min=0, max=10, label="b"),
Text(total),
])
indah.launch(indah.create_app(session=Session(page)))
The design that lets it start clean in a throwaway container and keep running.
Mutate a signal and only the components that read it update. No full-script rerun on every click.
The frontend ships pre-built in the wheel. Nothing to build at install or runtime, so it starts clean in any container.
SSE plus HTTP POST over one port passes the Colab and Runpod proxies. No WebSocket, no tunnel.
Tokens and data points arrive over SSE as they are produced, so long runs stay cheap and the page never freezes.
Every demo below runs in the browser - no install, no clone. Open one and start clicking.
indah is the reactive, no-build, notebook-native option.
| Feature | indah | Streamlit | Gradio | Reflex |
|---|---|---|---|---|
| Reactive updates (no full-script rerun) | Yes | Reruns the script | Event callbacks | Yes |
| No Node build at install or runtime | Yes | Yes | Yes | Needs a Node build |
| Single port, notebook-proxy friendly | Yes (SSE + POST) | WebSocket | WebSocket | WebSocket |
| Token / point streaming built in | Yes | Limited | Yes | Limited |
| Runs inside a throwaway Colab / Runpod container | Yes | Often | Often | Build step breaks |