finds.dev← search

// the find

Textualize/textual

★ 37,415 · Python · MIT · updated Jul 2026

The lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser.

Textual is a Python framework for building terminal UIs with a reactive, widget-based API, and it can serve the exact same app over a browser via textual-serve/textual-web without a rewrite. It's aimed at developers who want to build real TUI applications (not just progress bars) and don't want to hand-roll curses-level redraw logic.

The reactive attribute + message-pump architecture means widgets re-render themselves on state change instead of you managing redraws by hand, which is the actual hard part of TUI work. The CSS-like styling (TCSS) cleanly separates layout from app logic and hot-reloads during development. The widget library is unusually complete out of the box — DataTable, TextArea, Tree, command palette — so you're not stitching together third-party widgets for basic functionality. Serving an app to a browser with one command (textual serve) is a genuinely rare capability for this category.

It's async under the hood, so a blocking call inside an event handler stalls the whole UI, and debugging that requires understanding asyncio even if you didn't choose to use it directly. TCSS looks like CSS but isn't CSS — the properties and box model differ enough that existing CSS knowledge only gets you partway, so it's a new DSL to learn, not a free ride. Rendering cost scales with layout complexity; large DataTables or deeply nested containers can get visibly slower, and there's no profiling guidance in the docs for when that happens. The API moved fast for years before 1.0, so third-party widget packages and tutorials you find online may target an older, incompatible version.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →