Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

layout.toml

Defines window positions, sizes, and properties for the TUI. (The Desktop GUI keeps its own layout separately.)

Layouts are saved with .savelayout [name] to ~/.vellum-fe/layouts/, and the current layout auto-saves per character to profiles/<name>/layout.toml.

Basic Structure

terminal_width = 120
terminal_height = 40

[[windows]]
name = "main"
widget_type = "text"
row = 0
col = 0
rows = 37
cols = 120

Window Properties

Required

PropertyTypeDescription
namestringUnique identifier
widget_typestringWidget type (see Widgets)
rowintegerTop row position (0 = top)
colintegerLeft column position (0 = left)
rowsintegerHeight in rows
colsintegerWidth in columns

Optional

PropertyTypeDefaultDescription
visiblebooltrueShow window
show_borderbooltrueDraw border
border_stylestring"single"single, double, rounded, thick, quadrant_inside, quadrant_outside
border_colorstring"#808080"Border color
border_sidesarrayall sidesWhich sides to draw, e.g. ["top", "bottom"]; [] for none
titlestring-Custom title
show_titlebooltrueShow title in border
title_positionstring"top-left"Where the title sits on the border
buffer_sizeinteger10000Lines to keep (text windows)
background_colorstring-Background color
text_colorstring-Default text color
transparent_backgroundboolfalseSee-through background
text_sizefloat-Per-window font point size (GUI)
font_familystring-Per-window font (GUI)
content_alignstring-Content alignment override
tts_speakboolfalseSpeak new lines routed here (TTS)

Size Constraints

[[windows]]
name = "compass"
widget_type = "compass"
min_rows = 3
max_rows = 5
min_cols = 7
max_cols = 15

Widget-Specific Properties

Text Windows

[[windows]]
name = "main"
widget_type = "text"
streams = ["main"]              # Streams to display
buffer_size = 10000
compact = false                 # Remove blank lines
wordwrap = true                 # Wrap long lines (also on inventory/tabbed)

Tabbed Text

[[windows]]
name = "channels"
widget_type = "tabbedtext"
buffer_size = 5000

[[windows.tabs]]
name = "Speech"
streams = ["speech"]
show_timestamps = true

[[windows.tabs]]
name = "Thoughts"
streams = ["thoughts"]

Progress Bars

[[windows]]
name = "health"
widget_type = "progress"
id = "health"                   # health, mana, stamina, spirit, concentration, pbarStance
color = "#00FF00"
numbers_only = false            # true: show only current/max numbers

Countdowns

[[windows]]
name = "roundtime"
widget_type = "countdown"
id = "roundtime"                # roundtime, casttime, stuntime

Room Window

[[windows]]
name = "room"
widget_type = "room"
show_desc = true
show_objs = true
show_players = true
show_exits = true
show_name = true

Example Layout

terminal_width = 160
terminal_height = 50

# Main game text - left side
[[windows]]
name = "main"
widget_type = "text"
streams = ["main"]
row = 0
col = 0
rows = 45
cols = 100
buffer_size = 10000

# Channels - right side
[[windows]]
name = "channels"
widget_type = "tabbedtext"
row = 0
col = 100
rows = 30
cols = 60
buffer_size = 2000

[[windows.tabs]]
name = "Speech"
streams = ["speech"]

[[windows.tabs]]
name = "Thoughts"
streams = ["thoughts"]

# Status bars
[[windows]]
name = "health"
widget_type = "progress"
id = "health"
row = 30
col = 100
rows = 1
cols = 60

# Command input - bottom
[[windows]]
name = "command_input"
widget_type = "command_input"
row = 47
col = 0
rows = 3
cols = 160
completion_color = "#808080" # Optional; defaults to theme text_secondary (TUI; GUI/web use theme colors)

Hidden Windows

Set visible = false to define windows that can be shown later via the menu:

[[windows]]
name = "society"
widget_type = "text"
streams = ["society"]
visible = false
# ... position and size still required

Show via: Menu → Windows → Add Window → Text Windows → Society