Skip to main content

textual-themes

English · Deutsch


textual-themes - the four-tile logo with terminal windows in different color schemes

Stars Forks Issues Pull Requests

Last Commit License Python Themes

Retro color themes for Textual TUI applications.

41 carefully crafted themes inspired by classic computers, operating systems, vintage diver watches, comic-book color schemes, 80s pastel, Spielberg-era cinema, motorsport liveries, reggae roots and mafia-noir cinema.

⚠ Trademark Disclaimer

This is an independent, fan-made, non-commercial project. Theme names are descriptive of the visual style only — no third-party trademarks are used as theme names. Any remaining brand reference in descriptive text (e.g. "PETSCII style", "GEM Desktop", "Cinnamon-style") is purely descriptive and not affiliated with, endorsed by, sponsored by, or licensed by the respective trademark owners.

Click any thumbnail to open the full-size SVG. Screenshots are taken from the bundled demo app (python -m textual_themes).

Ascot
Ascot
Beastie
Beastie
BeBox
BeBox
Bluesy
Bluesy
Boing
Boing
Brick
Brick
Brotkasten
Brotkasten
Bunty
Bunty
Christophorus
Christophorus
Classic Navy
Classic Navy
Classic Terminal
Classic Terminal
Clipper
Clipper
Commandr
Commandr
Corleone
Corleone
Crimson
Crimson
Cupertino
Cupertino
Fifty-Eight
Fifty-Eight
Flughund
Flughund
Geeko
Geeko
Gemstone
Gemstone
Golden Brown
Golden Brown
Goldfinder
Goldfinder
Goldrunner
Goldrunner
Hercules
Hercules
Hulkula
Hulkula
Joker
Joker
Lenseflare
Lenseflare
Luna
Luna
Marley
Marley
Metropolis
Metropolis
Miami
Miami
Minty
Minty
Motif
Motif
Next
Next
Plan 9
Plan 9
Platoon
Platoon
Racing
Racing
Razzy
Razzy
Spiderized
Spiderized
Synthwave
Synthwave
Warp
Warp

Themes

Dark Themes

Theme Style
Ascot Le-Mans racing green with signal yellow, silver and beige text
Beastie Daemon red on dark slate
BeBox Blue-gray with yellow status-bar accent
Bluesy Royal blue with rich yellow-gold accents
Boing Three-color workbench palette: blue/white/orange
Brotkasten Light blue on royal blue, the iconic 8-bit color cast (PETSCII)
Bunty Aubergine with warm orange accents
Christophorus Navy and gold from the Christophorus logo
Classic Navy Deep navy with silver and muted brick-red
Classic Terminal Phosphor-green on black (CRT)
Commandr Blue/cyan/yellow file-manager palette
Corleone Cold mafia-noir — bronze, steel-gray and ash on bluish black
Crimson Deep red on dark charcoal
Fifty-Eight Black dial with aged gold lume + bezel red (vintage diver)
Flughund Midnight black & moonlit blue
Geeko Dark green with white
Golden Brown Warm mafia-noir — antique gold, sepia and parchment on warm black
Goldfinder Deep black with 18K gold accents — villain glamour
Goldrunner Atari-ST shooter palette: golden ship, magenta city, green tiles on black
Hulkula Vivid green rage with steel-gray edges
Joker Comic Gotham villain — royal purple suit, acid-green hair, yellow vest
Lenseflare 80s Spielberg orange-teal bichromatic on twilight blue
Luna Sky-blue task-bar with green start button
Marley Reggae roots palette — black, green, gold and red
Metropolis Bold blue, crimson red and sun yellow primary triad
Miami Pastel 80s — twilight teal, flamingo pink, sunset coral
Minty Warm mint-green on charcoal
Motif Beige slate-gray corporate Unix toolkit
Next Dark gray with magenta accents — workstation-era 3D bevels
Platoon Muted military olive-drab with khaki accent on near-black
Racing Charcoal with deep blue, cherry red and silver stripes
Razzy Raspberry red on dark slate
Spiderized Red & royal-blue hero suit (high-contrast)
Synthwave Deep purple with neon pink and electric cyan
Warp Dark blue with teal accents

Light Themes

Theme Style
Brick Olive-green handheld LCD on beige-gray case
Clipper Globe blue on ivory — jet-age livery
Cupertino Clean light gray with blue accents
Gemstone Monochrome GEM Desktop look
Plan 9 Pulpy yellow/blue/green

Installation

Add the themes to your own Textual project:

pip install "textual-themes[textual] @ git+https://github.com/michaelblaess/textual-themes.git"

The textual extra is what pulls in Textual itself, and nothing else comes with it - the themes are plain data.

Leave the extra off and you get that data on its own:

pip install git+https://github.com/michaelblaess/textual-themes.git

textual_themes.palettes then gives you all 41 palettes with no dependency beyond the standard library. That is the way in for anything that wants the colours without a TUI framework - a Qt application compiled with Nuitka, a static site generator, a script. The theme objects in textual_themes.themes still need Textual and say so if it is missing.

The bundled storybook additionally needs textual-widgets, which lives in the demo extra, so consumers are never forced into that dependency:

pip install "textual-themes[demo] @ git+https://github.com/michaelblaess/textual-themes.git"

Storybook

Browse all 41 themes interactively in the bundled storybook. Install it with a single command — it sets up an isolated environment and adds a textual-themes-demo launcher to your PATH:

Linux / macOS

curl -fsSL https://raw.githubusercontent.com/michaelblaess/textual-themes/main/install.sh | bash

Windows (PowerShell)

irm https://raw.githubusercontent.com/michaelblaess/textual-themes/main/install.ps1 | iex

Then launch it:

textual-themes-demo

Requires Python 3.12+ and git. To update later, just run the installer again; to remove it, delete ~/.textual-themes (Linux/macOS) or %LOCALAPPDATA%\textual-themes (Windows) and the textual-themes-demo launcher.

Quick Start

from textual.app import App, ComposeResult
from textual.widgets import Header, Footer, Static

from textual_themes import register_all

class MyApp(App):
    BINDINGS = [("t", "next_theme", "Theme")]

    def __init__(self):
        super().__init__()
        register_all(self)
        self.theme = "brotkasten"

    def compose(self) -> ComposeResult:
        yield Header()
        yield Static("Hello from the past!")
        yield Footer()

    def action_next_theme(self):
        from textual_themes import RETRO_THEME_NAMES
        names = RETRO_THEME_NAMES
        idx = names.index(self.theme) if self.theme in names else -1
        self.theme = names[(idx + 1) % len(names)]

MyApp().run()

Usage

Register all themes at once

from textual_themes import register_all

class MyApp(App):
    def __init__(self):
        super().__init__()
        register_all(self)       # registers all 41 themes
        self.theme = "boing"     # pick one

Register individual themes

from textual_themes import BROTKASTEN_THEME, CLASSIC_TERMINAL_THEME

class MyApp(App):
    def __init__(self):
        super().__init__()
        self.register_theme(BROTKASTEN_THEME)
        self.register_theme(CLASSIC_TERMINAL_THEME)
        self.theme = "classic-terminal"

Available constants

from textual_themes import (
    # Individual Theme objects
    BROTKASTEN_THEME,
    BOING_THEME,
    GEMSTONE_THEME,
    CLASSIC_TERMINAL_THEME,
    NEXT_THEME,
    BEBOX_THEME,
    BUNTY_THEME,
    CUPERTINO_THEME,
    LUNA_THEME,
    COMMANDR_THEME,
    PLAN9_THEME,
    MOTIF_THEME,
    WARP_THEME,
    GEEKO_THEME,
    MINTY_THEME,
    CRIMSON_THEME,
    RAZZY_THEME,
    BEASTIE_THEME,
    FIFTY_EIGHT_THEME,
    BLUESY_THEME,
    GOLDFINDER_THEME,
    HULKULA_THEME,
    FLUGHUND_THEME,
    CLASSIC_NAVY_THEME,
    BRICK_THEME,
    CLIPPER_THEME,
    SYNTHWAVE_THEME,
    MIAMI_THEME,
    RACING_THEME,
    METROPOLIS_THEME,
    SPIDERIZED_THEME,

    # Collections
    RETRO_THEMES,          # list[Theme] — all 41 themes
    RETRO_THEME_NAMES,     # list[str]   — ["brotkasten", "boing", ...]
    THEME_DISPLAY_NAMES,   # dict[str, str]

    # Helper
    register_all,          # register_all(app) — registers all themes
)

Theme names

Use these slugs with app.theme = "...":

Slug Display
brotkasten Brotkasten — Light Blue on Royal Blue
boing Boing — Blue/White/Orange Workbench
gemstone Gemstone — Monochrome GEM Desktop
classic-terminal Classic Terminal — Phosphor Green on Black
next Next — Slate Gray with Magenta Accents
bebox BeBox — Blue-Gray with Yellow Accent
bunty Bunty — Aubergine with Warm Orange Accents
cupertino Cupertino — Clean Light Gray with Blue Accents
luna Luna — Sky Blue with Green Start Accent
commandr Commandr — Blue/Cyan/Yellow File Manager
plan9 Plan 9 — Pulpy Yellow/Blue/Green
motif Motif — Beige Corporate Unix Toolkit
warp Warp — Dark Blue with Teal Accents
geeko Geeko — Dark Green with White
minty Minty — Warm Mint-Green on Charcoal
crimson Crimson — Deep Red on Dark Charcoal
razzy Razzy — Raspberry Red on Dark Slate
beastie Beastie — Daemon Red on Dark Slate
fifty-eight Fifty-Eight — Black Dial, Aged Gold Lume & Bezel Red
bluesy Bluesy — Royal Blue & Gold
goldfinder Goldfinder — Deep Black with 18K Gold Accents
goldrunner Goldrunner — Atari-ST Gold on Violet City
hercules Hercules — Amber Phosphor Monochrome
hulkula Hulkula — Verdant Green with Steel Edges
flughund Flughund — Midnight Black & Moonlit Blue
classic-navy Classic Navy
brick Brick — Olive-Green Handheld LCD
clipper Clipper — Globe Blue on Ivory
synthwave Synthwave — 80s Retro-Futurism
miami Miami — Twilight Teal, Flamingo Pink & Sunset Coral
racing Racing — Charcoal with Blue, Red & Silver Stripes
metropolis Metropolis — Bold Blue, Crimson & Sun Yellow
spiderized Spiderized — Red & Royal-Blue Hero Suit
christophorus Christophorus — Navy & Logo Gold

Requirements

  • Python >= 3.12
  • Textual >= 0.85

Editing themes

To tweak an existing theme or design a new one interactively, try textual-theme-editor by Tom J Gooding — a standalone visual theme editor for Textual. Install it separately (pip install textual-theme-editor); it is GPLv3-licensed and not a dependency of this package.

License

Apache License 2.0 — see LICENSE.

Metadata

Release files for textual-themes 0.15.1

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

Source distribution (sdist)

Source distribution for textual-themes 0.15.1
File Size Uploaded
textual_themes-0.15.1.tar.gz 45.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for textual-themes 0.15.1
File Interpreter ABI Platform
textual_themes-0.15.1-py3-none-any.whl Python 3 none any Details

Total release size: 84.6 kB

Release files / textual_themes-0.15.1.tar.gz

Download URL textual_themes-0.15.1.tar.gz
Size 45.5 kB
Tags Source
SHA-256 checksum
How to use checksums
03d472f39e9d5c2b861fb947e972e9bf6f7e9b9615926dfc812297a3885430e4
BLAKE2b-256 checksum
How to use checksums
185c597e34b81d9fed99c6ca4d1ba719b4a4a809ec2685994ec54ada1f95e7f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / textual_themes-0.15.1-py3-none-any.whl

Download URL textual_themes-0.15.1-py3-none-any.whl
Size 39.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c3b1a5fec74def967fbffdf6e51908e5185bdd4e308c4c466b7052c9c508e7f5
BLAKE2b-256 checksum
How to use checksums
6c0854b09ff6fcd64b435b3b75fda230cf6cb54467fe0b2511ca6a7d8e0e86ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.15.1 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