Skip to main content

turbodesk

Terminal UIs as pure functions from state to an immutable view tree.

from turbodesk import View, run

def app(ui):
    return View.text("Hello world!").center(within=ui.size)

run(app)

An app is a function (UI) -> View. It re-runs whenever a frame is marked dirty (state changed, an event arrived, the terminal resized, a timer fired), and the renderer diffs by row before writing escape codes. State lives in hooks on the ui handle.

uv sync                             # or: pip install -e .
python examples/hello_world.py
python examples/theme_gallery.py    # 19 colour flavours, ← → to browse
python examples/charts.py           # line, scatter and bar charts
python examples/focus.py            # three key-hungry widgets, one keyboard
python examples/filter.py           # type to filter a list
python examples/logs.py             # colourised output, tail -f style
python examples/embed.py htop       # another TUI, embedded (needs tmux)
python examples/vi somefile.py      # a vi clone, built on the core alone
python examples/frogmouth README.md # a Markdown browser, ported from Textual

One dependency (Rich, for glyph-width measurement and for drawing Rich renderables into a view), Python 3.12+, POSIX only.

Version 0.3. What is stable says which parts of the API are safe to build on now and which are still moving.

What's here

  • src/turbodesk/: the core — views, styles, events, terminal, render loop, themes, layout arithmetic, overlapping windows, a command table, key naming, syntax spans, Markdown, ANSI parsing, clipboard
  • src/turbodesk/widgets/: dialogs, button, checkbox, radio set, selection list, textbox, listbox, table, tabs, progress bar, spinner, rule, border, frame, scroller, tree, directory tree, menu bar, status line, charts, editor, ncdu, tmux pane
  • examples/: all 17 bonsai_term examples, ported and running, plus demos, a vi clone and a Markdown browser. Start here, inventory, API and design notes.
  • COMPONENTS.md: the bonsai_term_components port, what moved, what changed shape, what was left out.

Documentation

make docs-serve      # live reload
make docs            # build to docs/site/
make docs-check      # strict: a broken cross-reference fails the build

The docs are their own project under docs/, with their own Makefile (cd docs && make works too).

Built with Zensical. docs/ has a guide, a comparison with Textual and other frameworks grounded in two real ports, and notes on the internals.

Tests

A pyramid, run with make test or uv run pytest:

uv run pytest -m unit          # 2,008 — pure functions, no I/O, about a second
uv run pytest -m integration   #   432 — widgets and apps through a UI
uv run pytest -m e2e           #     7 — real programs on a pty
uv run pytest -m "not slow"    # skips the pty and tmux tests
tests/
├── a_unit/          views, styles, events, markdown, typography, fuzzy matching,
│                    and the vi showcase's grammar
├── b_integration/   the runtime, widgets, dialogs, every example, the whole apps
├── c_e2e/           pty-driven: alternate screen, keys, vi saving, a modal
└── conftest.py      ui / render / screen / scratch_data_dir fixtures

The two products built on turbodesk live in their own repositories and have their own suites — Turbo Python (594 tests) and TurboVI (395) — and a library change is not verified until those pass too.

Metadata

Release files for turbodesk 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for turbodesk 0.3.0
File Size Uploaded
turbodesk-0.3.0.tar.gz 102.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for turbodesk 0.3.0
File Interpreter ABI Platform
turbodesk-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 222.5 kB

Release files / turbodesk-0.3.0.tar.gz

Download URL turbodesk-0.3.0.tar.gz
Size 102.1 kB
Tags Source
SHA-256 checksum
How to use checksums
8a6676d86e1b6a2a83e1470adcbf93b4dbe25a1a184ab00bd44c09fa42d7cc0f
BLAKE2b-256 checksum
How to use checksums
9d9de996e20cd740f28c251cb59b884cb72c7c692f799a13c465f6d1a3f5ccb0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / turbodesk-0.3.0-py3-none-any.whl

Download URL turbodesk-0.3.0-py3-none-any.whl
Size 120.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1bed3e08d3e4ab78c36838212a9fe9ffd2a9be240cd4955e1beef7ecb4269cb9
BLAKE2b-256 checksum
How to use checksums
48a20acecc190b2c00cc179841bdee8910067e85e5d3357138b2851901e399d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

This release

0.3.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page