%%LOGO_HERO%%

Reactive Python UIs,
straight from a notebook

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
Get started

One file. One command.

  1. pip install indah - a pure-Python wheel, no Node toolchain.
  2. Describe your UI as components bound to reactive signals.
  3. 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)))
Why indah

Built for ephemeral cloud notebooks

The design that lets it start clean in a throwaway container and keep running.

Reactive, not rerun

Mutate a signal and only the components that read it update. No full-script rerun on every click.

No Node, ever

The frontend ships pre-built in the wheel. Nothing to build at install or runtime, so it starts clean in any container.

Single port, proxy-safe

SSE plus HTTP POST over one port passes the Colab and Runpod proxies. No WebSocket, no tunnel.

Streams by default

Tokens and data points arrive over SSE as they are produced, so long runs stay cheap and the page never freezes.

How it compares

Where indah fits

indah is the reactive, no-build, notebook-native option.

%%COMPARE%%
Featureindah StreamlitGradioReflex