GitHub - andri-berger/artwork-tui: Fully customizable, artwork and layout generator as images, operated from the terminal, spreadsheet based.
Generative design tool with a terminal UI — compose layouts, render to canvas, export to Hi-Res Png (any resolution your machine can handle). artwork-tui is a terminal-native artwork and layout generator, operating entirely within the constraints of the TUI. It combines a spreadsheet-driven interface for manual layout composition with a randomizer engine for generative artwork, supporting custom fonts and image assets.
The tool emerged from a simple frustration: existing creative layout tools are either locked behind expensive subscriptions, tied to a specific OS, or bloated with features that obscure rather than enable the creative process. The terminal, by contrast, offers a direct and honest working surface – what you type is what happens, no hidden layers, no telemetry, no forced updates. artwork-tui occupies a genuinely vacant niche: somewhere between a generative art framework (too code-heavy, no interface) and a design tool (too GUI-dependent, too opinionated), it offers a middle ground that has no real equivalent in the current landscape. The spreadsheet metaphor is deliberate – familiar enough to require no learning curve, structured enough to impose a productive constraint on the creative process.
Installation / Configuration / API Reference / API Credit / Gallery

Installation
[](https://github.com/andri-berger/artwork-tui#installation)
Like its sibling filterx-tui, this is a Python TUI installed in an isolated environment — no npm, no Electron shell. One honest caveat upfront: the rendering engine is a real browser. Playwright drives a headless Chromium to compose and rasterize the layouts, so the install includes a one-time browser download (~150 MB). That is the price for GPU-accelerated WebGL filters and pixel-perfect output; everything else stays lean.
#### Generic Install (Native)
[](https://github.com/andri-berger/artwork-tui#generic-install-native) Pulls the install script directly from the repo and wires everything up, including the Playwright browser download. Requires Python 3.11+. As always with curl-into-sh: the script is short and readable — take a look before you run it.
curl -fsSL https://raw.githubusercontent.com/\ andri-berger/artwork-tui/main/install.sh | sh
#### macOS (Homebrew)
[](https://github.com/andri-berger/artwork-tui#macos-homebrew)
Tap the formula and let Homebrew resolve the Python side; the second command fetches the Chromium build Playwright renders with. Dependencies are bundled in that download, so no further setup is needed. Additional, user-generated files are stored in the following directory => ~/Library/Application Support/artwork-tui
brew tap andri-berger/artwork-tui \ https://github.com/andri-berger/artwork-tui brew install artwork-tui #install from tap
#### Linux Arch (AUR)
[](https://github.com/andri-berger/artwork-tui#linux-arch-aur)
Use your AUR helper of choice. The `--with-deps` flag lets Playwright pull the system libraries Chromium needs — on a minimal Arch install this saves you a round of hunting missing shared objects. Firefox works as an alternative engine if you prefer it; webkit is not supported. Additional, user-generated files are stored in the following directories => ~/.local/share/artwork-tui and ~/.local/state/artwork-tui
yay -S artwork-tui #Or use paru instead playwright install chromium --with-deps
playwright install firefox --with-deps
Configuration
[](https://github.com/andri-berger/artwork-tui#configuration)
The interface follows the same anatomy as filterx-tui: file trees on the left feed the pipeline, a tabbed spreadsheet in the center holds every parameter, and a button row drives generation and export. Buttons and function keys are twins here as well — F5 simply presses Afs programmatically — so the API Reference below and this table describe one surface from two angles.
The central idea is that an artwork is nothing but a spreadsheet. Six tabs partition the parameter space: one for global settings, one for the master layout, two for styling the element groups, and two for the image and typography settings that apply across all elements. Every cell is editable, every value ends up in the exported json — which means a finished piece can be reopened, inspected, and modified cell by cell. There is no hidden state.
Elements are addressed by group and index, A00 through F99 — six groups of up to a hundred elements each. The groups A–C can be seeded independently via their buttons, which is what makes generated layouts reproducible: same project file, same seeds, same artwork. As with the sibling project, image previews render inline, so a terminal with a graphics protocol is required — kitty, ghostty, or wezterm.
artwork-tui #Launches the TUI
kitty, ghostty, wezterm
are supported as of now
| Docs | Element | Description | | --- | --- | --- |
|  | Filetree JSON | Choose your project. Every exported artwork doubles as a project file — select any json here to reopen it with all parameters intact. |
|  | Filetree PNG | Choose your background image for the elements. Any png works; the layout engine composes all elements on top of it. |
|  | Filepicker OTF | Choose your fonts for the elements on the canvas. Fonts are loaded per project, so each artwork carries its own typography. |
|  | Table Tab I | Global Setup / Settings — canvas dimensions, output options, and everything that applies to the artwork as a whole rather than to a single element. |
|  | Table Tab II | Main Layout — position and arrangement of the elements on the canvas. This is where the composition itself is defined. |
|  | Table Tab III | Styling A00-C99 Elements. Visual parameters for the first three element groups, one row per element. |
|  | Table Tab IV | Styling D00-F99 Elements. Same structure as Tab III, covering the remaining three groups. |
|  | Table Tab V | Image Settings all Elements (A00 - F99) — filter and rendering parameters applied to image-based elements across all groups. |
|  | Table Tab VI | Text/Font Settings all Elements (A00 - F99) — typography parameters such as font assignment, size, and spacing across all groups. |
|  | Button X | Clear the Canvas and all associated Table Params (in all 6 Tabs). Basically start from scratch. Please export before. |
|  | Button Afs | Set Seed for A00-A99 Elements. Pins the random generator for this group, making generated results reproducible across runs. |
|  | Button Bfs | Set Seed for B00-B99. Same principle, scoped to the B group — the three seedable groups are independent of each other. |
|  | Button Cfs | Set Seed for C00-C99. With all three seeds set, a generated layout is fully deterministic. |
|  | Button Create | Generate Artwork via Random Generator. Draws random values into the grid using the seeds where given — a discovery tool as much as a shortcut. |
|  | Button Export | Export both generated (png) and project file (json) into the directory from where the app was executed / started. Clean Unix-timestamp format. |
API Reference
[](https://github.com/andri-berger/artwork-tui#api-reference)
Everything is keyboard-driven, and the function keys are deliberately thin: F4 through F9 do not implement anything themselves — they programmatically press their button twins from the Configuration table above. One action, one code path, two ways to reach it; whatever holds for a button holds for its key, and the two tables stay in sync by construction rather than by discipline.
The remaining bindings are spreadsheet vocabulary. F1/F2/F3 give you copy/cut/paste on cells — the grid is meant to be worked like a spreadsheet, including moving values between rows, tabs, and element groups. Navigation follows terminal conventions throughout: if you have used any TUI before, your hands already know this table.
| Key | Binding | Description | | --- | --- | --- | | Del | Delete | Delete table cell. | | F1 | Copy | Copy table cell. Think of it as Ctrl-C in a spreadsheet. | | F2 | Cut | Cut table cell. Think of it as Ctrl-C in a spreadsheet. | | F3 | Paste | Paste table cell. Think of it as Ctrl-V in a spreadsheet. | | F4 | Clear | Triggers Button X programmatically (see Table above). | | F5 | Afs | Triggers Button Afs programmatically (see Table above). | | F6 | Bfs | Triggers Button Bfs programmatically (see Table above). | | F7 | Cfs | Triggers Button Cfs programmatically (see Table above). | | F8 | Create | Triggers Button Create programmatically (see Table above). | | F9 | Export | Triggers Button Export programmatically (see Table above). | | Tab | Navigate | Cycle forward through all navigational UI elements — file trees, the six table tabs, and the button row — in a fixed, predictable order. | | Arrow-keys | Navigation | Navigate table/grid cells in all directions: left, right, up, down. Within the file trees, up/down move through entries. | | BackSpace | Navigation | Step back one level — leaves cell editing without applying the change, or collapses the current node in a file tree. | | Space | Navigation | Toggle the element under the cursor — expands or collapses a tree node without moving focus. | | Enter | Navigation | Confirm — commits the edited cell value, or opens the highlighted file into the project. | | Ctrl-Q | System | Exit the app. There is no exit prompt — F9 is the explicit save, so export first if the current grid state matters to you. |
API Credit
[](https://github.com/andri-berger/artwork-tui#api-credit)
This tool stands on other people's work, and the table below is meant as more than a dependency list. Entries are grouped by layer: **Build** covers what produces the README assets, **Utility** the Python and JavaScript toolchain — including d3-random, whose seedable generators are what makes reproducible artwork possible in the first place. **Framework** is the TUI foundation, while **Conversion** and **Processing** form the rendering heart: Playwright drives the browser, html-to-image rasterizes the composed layout, and the PixiJS filter collection provides the WebGL effects layered on top. The layout engine itself is homegrown, but it would have nothing to run on without these.
The **Inspiration** entries are of a different kind than in filterx-tui: no code, not even patterns — purely visual debts. The linked Pinterest board is the moodboard this tool was built to chase, and print-artwork.com is the commercial ancestor both sibling projects were carved out of. If you want to understand what the random generator is aiming at aesthetically, those two links say more than any parameter documentation could.
| Layer | Name | Link | | --- | --- | --- | | Build | Apng | https://github.com/apngasm/apng | | Build | Grim | https://github.com/emersion/grim | | Utility | Biome | https://github.com/biomejs/biome | | Utility | Ruff | https://github.com/astral-sh/ruff | | Utility | Pip Uv | https://github.com/astral-sh/uv | | Utilities | Numpy | https://github.com/numpy/numpy | | Utilities | Random | https://github.com/d3/d3-random | | Framework | Platform | https://github.com/tox-dev/platform | | Framework | Textual | https://github.com/Textualize/textual | | Framework | Textual Img | https://github.com/lnqs/textual-image | | Conversion | Html Image | https://github.com/bubkoo/html-to-image | | Conversion | Playwright | https://github.com/microsoft/playwright | | Processing | OpenCV | https://github.com/opencv/opencv | | Processing | Pixi Filter | https://github.com/pixijs/filters | | Inspiration | Pinterest | https://de.pinterest.com/andri | | Inspiration | Artwork | https://print-artwork.com |
PI Gallery
[](https://github.com/andri-berger/artwork-tui#pi-gallery)
Thirty layouts straight from the random generator — where the filterx gallery shows one image transformed many ways, this one shows the opposite: many compositions from one machine. Each piece below was generated with Create, rendered through the Playwright/PixiJS pipeline, and exported untouched; the differences between them are nothing but different values in the six-tab spreadsheet.
None of these are dead ends, either. Every png in the grid has a json sibling carrying its complete parameter set — reopen it, change a seed or a single cell, and you get a variation instead of starting over. Filenames are the Unix timestamps of their render runs, left as-is: batch outputs, not a curated portfolio. Click any thumbnail for full resolution.




