Skip to main content

A tiny Streamlit-inspired terminal UI experiment.

Project description

stui

CI

stui is a tiny Streamlit-inspired framework for building terminal-native Python apps. Write a short script, run it in your terminal, and get a Textual UI with stateful controls.

It is built for local tools, demos, data scripts, model debug panels, SSH sessions, and headless environments where opening a browser, binding a port, or running a dashboard server is unnecessary ceremony. The public API is deliberately small and readable.

stui is not official Streamlit, is not affiliated with Streamlit, and is not a Streamlit compatibility layer. The API intentionally feels familiar, but this project keeps its own smaller surface area.

Preview

stui model demo terminal screenshot

┌─ stui ───────────────────────────────────────────┐
│ stui demo                                        │
│                                                  │
│ x                                                │
│ [██░░░░░░░░░░░░] 10                              │
│                                                  │
│ [ Increment ]                                    │
│                                                  │
│ x = 10                                           │
│ count = 0                                        │
│                                                  │
│ q Quit   r Rerun   tab Focus next                │
└──────────────────────────────────────────────────┘

Install

Use Python 3.11 or newer.

Install the PyPI distribution named stui-terminal:

python -m pip install stui-terminal

The PyPI distribution name is stui-terminal, but the import package and CLI are both stui:

import stui as st

For local development from a checkout, use an editable install with the dev extra:

python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install -e ".[dev]"

For runtime-only local use, install without the dev extra:

python -m pip install -e .

Quickstart

Install from PyPI, then run your app:

python -m pip install stui-terminal
stui run app.py

Or set up the project from source and run the basic example:

git clone https://github.com/marmar9615-cloud/stui-terminal.git
cd stui-terminal
python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install -e ".[dev]"
stui run examples/basic.py

You can also run through the module entry point:

python3.11 -m stui run examples/counter.py

Scripts use the public stui API:

import stui as st

st.title("stui demo")

if "count" not in st.session_state:
    st.session_state.count = 0

value = st.slider("value", 0, 100, 25)

if st.button("Increment"):
    st.session_state.count += 1

st.write("value =", value)
st.write("count =", st.session_state.count)

More examples:

stui run examples/counter.py
stui run examples/model_demo.py
stui run examples/inputs.py
stui run examples/data_display.py
stui run examples/dashboard.py
stui run examples/kitchen_sink.py

Why terminal-native?

Some useful Python apps do not need a browser runtime. stui keeps the interface inside the terminal so it can fit naturally into:

  • SSH sessions, remote machines, and headless boxes.
  • Internal tools where opening ports or managing local server URLs is friction.
  • Offline or locked-down environments where browser access is limited.
  • Model, data, and DevOps workflows that already start from a shell.

That also keeps the boundary simple: stui does not start a web server, use websockets, require port-forwarding, or depend on Streamlit at runtime.

Commands

# Install the project for local development.
python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install -e ".[dev]"

# Run the smoke-size example app.
stui run examples/basic.py

# Run the stateful counter example.
stui run examples/counter.py

# Run the deterministic model-parameter demo.
stui run examples/model_demo.py

# List installed examples and print environment diagnostics.
stui examples
stui doctor

# Run the test suite.
python3.11 -m pytest

Keyboard Shortcuts

  • q: quit the app
  • r: rerun the script
  • tab: focus the next widget
  • enter: press the focused button
  • left or h: decrease the focused slider
  • right or l: increase the focused slider
  • home: set the focused slider to its minimum value
  • end: set the focused slider to its maximum value

Current API

Import the API as:

import stui as st

The public API is intentionally compact:

  • Text: st.title, st.header, st.subheader, st.caption, st.text, st.markdown, st.write, st.divider
  • Status: st.info, st.success, st.warning, st.error, st.exception
  • Display: st.code, st.json, st.progress, st.table, st.dataframe
  • Inputs: st.button, st.slider, st.text_input, st.checkbox, st.number_input, st.selectbox, st.radio
  • State and control flow: st.session_state, st.rerun

Inputs support stable key values and optional callbacks where the function signature documents them. Tables are simple static displays and do not require pandas.

Troubleshooting

stui: command not found

Make sure you installed into the same Python environment that your shell is using:

python -m pip install stui-terminal
python -m stui --version

If python -m stui --version works but stui --version does not, your environment's script directory is not on PATH. Running through python -m stui ... is a reliable workaround.

Python Version

stui requires Python 3.11 or newer:

python --version

If that prints an older version, create a 3.11+ environment first:

python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install stui-terminal

Terminal Rendering

stui renders a Textual app inside your terminal. For the best results, use a modern terminal with UTF-8 and color support. If borders, focus rings, or block characters look wrong, try another terminal app, make the window wider, and check that TERM is set to a normal interactive terminal value such as xterm-256color.

macOS Editable Install Quirk

If a local editable install appears to succeed but import stui or stui --version cannot find the package on macOS, check whether the virtual environment or editable-install .pth file was marked hidden:

chflags -R nohidden .venv
python -m pip install -e ".[dev]"
python -m stui --version

Examples

Counter

examples/counter.py shows a minimal stateful app with increment, decrement, and reset controls.

stui run examples/counter.py

Model Demo

examples/model_demo.py shows a small model-parameter playground using text input, checkbox, sliders, status messages, session state, and deterministic scoring. It is intentionally local and fake: there are no network calls or model dependencies.

stui run examples/model_demo.py

Inputs

examples/inputs.py shows text, numeric, selectbox, radio, checkbox, and button controls together.

stui run examples/inputs.py

Data Display

examples/data_display.py shows tables, JSON, and code output.

stui run examples/data_display.py

Dashboard

examples/dashboard.py combines controls, progress, status messages, and a small table into a compact terminal control panel.

stui run examples/dashboard.py

Kitchen Sink

examples/kitchen_sink.py exercises the stable 0.2.0 API surface in one compact app.

stui run examples/kitchen_sink.py

Limitations

  • No browser, web server, websocket, or port-forwarding runtime.
  • No Streamlit dependency and no promise of Streamlit compatibility.
  • No charts, forms, columns, sidebars, or file upload yet.
  • Tables are static display only; there is no full dataframe editing or sorting.
  • Slider input supports numeric values only.
  • Layout is currently linear and script-driven.
  • The app reruns the script as interactions change state, so examples should keep top-level work lightweight.
  • Error handling is still early and meant for development feedback.
  • The package is an MVP and has not stabilized a long-term compatibility policy.

Roadmap

  • Add charts and richer dataframe display.
  • Add simple form-like batching once rerun semantics are clearer.
  • Improve focus behavior, accessibility hints, and keyboard discoverability.
  • Expand example coverage for data scripts, model controls, DevOps panels, and internal tools.
  • Keep the implementation clean-room, readable, and based on Textual first-party widgets where possible.

Contributing

See CONTRIBUTING.md for the local development workflow and project boundaries.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stui_terminal-0.2.0.tar.gz (41.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stui_terminal-0.2.0-py3-none-any.whl (19.3 kB view details)

Uploaded Python 3

File details

Details for the file stui_terminal-0.2.0.tar.gz.

File metadata

  • Download URL: stui_terminal-0.2.0.tar.gz
  • Upload date:
  • Size: 41.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stui_terminal-0.2.0.tar.gz
Algorithm Hash digest
SHA256 da82891b0cf0ecdc0f3be1c148bfcd7c102972d5c1742382fbf0358dabc13a7f
MD5 84e14fae6f52ee515f313f6db25f11b6
BLAKE2b-256 458722d09680ffcc39d43bee19f3721da9cdd0ca7eaf99ef249ee14d2b94e5c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for stui_terminal-0.2.0.tar.gz:

Publisher: publish.yml on marmar9615-cloud/stui-terminal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stui_terminal-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: stui_terminal-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 19.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stui_terminal-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1fee659218f629cdb2dfa792618b0a696e69bab534eadb904375312e4cb4419e
MD5 3fd46dd5485f3e503caa27edfd3066b7
BLAKE2b-256 362abf86673b35bb8d4732e3f1be59ff4b9cf3f744824658b2944d8bbae6cddc

See more details on using hashes here.

Provenance

The following attestation bundles were made for stui_terminal-0.2.0-py3-none-any.whl:

Publisher: publish.yml on marmar9615-cloud/stui-terminal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page