Monstar is a Wayland terminal emulator built on libghostty.
We maintain source-built monstar
and prebuilt monstar-bin AUR
packages. Both are automatically updated after we tag a release.
We also attach binaries to GH Releases: https://github.com/rockorager/monstar/releases
Install the current development version on Arch Linux from the
monstar-git AUR package:
Build and install Monstar from source into ~/.local:
zig build -Doptimize=ReleaseFast install --prefix "$HOME/.local"
The command installs the executable, desktop entry, app icon, manual pages,
and bundled themes. Add $HOME/.local/bin to PATH, then launch Monstar:
monstar
See Development for build requirements.
Run Monstar without arguments to start $SHELL. Monstar falls back to
/bin/sh when SHELL is unset. Pass -e to run a command directly:
monstar -e fish --login
Pass -- to run a shell expression:
monstar -- 'git log --oneline | less'
Set the working directory, initial size, title, app ID, font, and one-off configuration overrides with command-line options:
monstar --working-directory ~/src \
--title scratch \
--window-size-chars 100x32 \
--font Iosevka \
-o background-opacity=0.95
Run monstar --help, man monstar, or man 5 monstar for the complete
command and configuration reference.
Write configuration to $XDG_CONFIG_HOME/monstar/config. Use
~/.config/monstar/config when XDG_CONFIG_HOME is unset. Start with:
font-family = Iosevka
font-size = 12.5
theme = light:Rose Pine Dawn,dark:Rose Pine
background-opacity = 0.95
window-padding-x = 8
window-padding-y = 6
mouse-scroll-multiplier = precision:1,discrete:3
Set font-family to choose the primary font; the default is Fontconfig's
standard monospace family. Fontconfig normally selects matching bold and
italic faces and supplies language and emoji fallbacks automatically. Monstar
also bundles Nerd Font symbols.
For explicit control over separate bold, italic, bold-italic, or ordered
fallback families, define a virtual family such as Monstar Custom in
$XDG_CONFIG_HOME/fontconfig/conf.d/50-monstar.conf (normally
~/.config/fontconfig/conf.d/50-monstar.conf), then set
font-family = Monstar Custom. An annotated template is installed at
<prefix>/share/doc/monstar/examples/50-monstar.conf and lives at
dist/50-monstar.conf in the source tree.
By default, background-opacity affects only the default terminal background
and padding. Set background-opacity-cells = true to apply it to explicit cell
background colors too. Monstar requests compositor-provided blur whenever the
background is translucent; set background-blur = false to keep it clear.
Leave theme unset to follow the desktop light/dark preference with Monstar's
built-in Fluent 2 color schemes. Load bundled iTerm2 color schemes by name. Put
custom themes in $XDG_CONFIG_HOME/monstar/themes or
~/.config/monstar/themes.
Set the default command for new windows. Commands run through /bin/sh -c
unless prefixed with direct::
command = fish --login
# command = direct:fish --no-config
Other settings:
dev.rockorager.monstar).Ctrl+Shift+G is pressed.50000000).0 disables the protocol (default 320000000).true).0 disables the flash (default 200).#RRGGBB or RRGGBB; explicit colors override the theme.
cursor-color and cursor-text also accept cell-foreground and
cell-background to match the cursor cell at runtime.0–255; repeat the key
for more entries.Press Ctrl+Shift+, or send SIGUSR1 to reload the configuration:
pkill -USR1 monstar
Visual and interaction settings apply immediately. Process and storage settings apply to new windows.
| Shortcut | Action |
|---|---|
Ctrl+Shift+C / Ctrl+Shift+V | Copy / paste |
Ctrl+Shift+F | Search scrollback |
Ctrl+Shift+N | Open a new window in the current directory |
Ctrl+Shift+, | Reload configuration |
Shift+PageUp / Shift+PageDown | Scroll back / forward one page |
Shift+Home / Shift+End | Scroll to the top / bottom of scrollback |
Ctrl++ / Ctrl+= / Ctrl+- | Adjust the font size |
Ctrl+0 | Reset the font size |
Ctrl + left click | Open a hyperlink or detected URI |
Ctrl + right click | Copy a hyperlink or detected URI |
Ctrl + drag | Make a rectangular selection |
Writing-key shortcuts follow the active XKB keyboard layout.
Scrollback search updates as you type. Press Ctrl+N and Ctrl+P to move
between matches. Press Enter to copy a match to the primary selection. Press
Escape to restore the previous viewport.
Scrollback keybindings pass through to applications using the alternate screen.
Hold Shift while dragging to select text after an application captures the
mouse. Hold Ctrl+Shift instead of Ctrl to open or copy a link in this
state. Middle-click to paste the primary selection.
Ctrl+Shift+N through the systemd
user manager. Optional transient scopes place each shell process tree in a
separate scope.Enable a transient systemd scope for each newly spawned shell with:
linux-cgroup = always
If the session bus or systemd scope is unavailable, Monstar leaves the shell
in its inherited cgroup. Link opening falls back to xdg-open when the portal
is unavailable. Monstar disables optional Wayland protocols when the
compositor does not support them.
Monstar speaks the required subset of the D-Bus wire protocol directly, so
D-Bus is not a build or library dependency. Pass -Ddbus=false to compile the
client out entirely, at the cost of desktop notifications, launcher progress,
portal-based link/file opening (falls back to xdg-open), portal appearance
detection, and systemd cgroup isolation. Nothing else is affected. systemd
itself is never a build dependency; it is only used at runtime, over the
session bus, when linux-cgroup = always is configured and a systemd user
session is detected.
Monstar uses TERM=monstar by default.
If a remote server does not recognize monstar over SSH, send it the installed
definition from your local machine:
infocmp -x monstar | ssh YOUR-SERVER tic -x -
Alternatively, send the definition from the latest commit:
curl -fsSL https://raw.githubusercontent.com/rockorager/monstar/main/dist/monstar.terminfo \
| ssh YOUR-SERVER tic -x -
See Ghostty's Terminfo docs for details.
Reference distributions recorded on an Intel Core Ultra 7 258V. Lower is better. Results vary by workload.
Launch-and-exit time over 100 fresh runs of true:
Key event to echoed-frame commit over 200 injected keys:
Sample-time distributions from eight vtebench workloads:
vtebench measures producer blocking and PTY read throughput, not frame presentation or input latency.
/dev/dri/renderD128.monstar -e true, foot true, ghostty -e true, kitty true, and
alacritty -e true. The result covers the complete process lifetime, not
time to the first visible frame.WAYLAND_DEBUG=client. The test injected 200 keys with wtype at intervals
from 50 to 100 ms. A marked 20 ms raw-PTY echo delay was subtracted from each
sample to separate output commits from toolkit-only redraws. The result
includes client key handling, the PTY round trip, rendering, and buffer
commit. It excludes physical input, compositor presentation, and display
latency.5b350e2, ReleaseFast), foot 1.27.0,
Ghostty 1.3.2 tip (c5a21ed), kitty 0.47.4, and Alacritty 0.17.0.Building requires:
tic)wayland-protocols 1.49zig build
zig build fmt
zig build test
To smoke-test Kitty graphics animation in a running Monstar window:
python3 scripts/kitty-animation.py
The checkerboard image should change colors four times per second for eight seconds, including while no terminal output or input occurs.
Zig
98.2%
Shell
1.4%
Monstar is a Wayland terminal emulator built on libghostty.
We maintain source-built monstar
and prebuilt monstar-bin AUR
packages. Both are automatically updated after we tag a release.
We also attach binaries to GH Releases: https://github.com/rockorager/monstar/releases
Install the current development version on Arch Linux from the
monstar-git AUR package:
Build and install Monstar from source into ~/.local:
zig build -Doptimize=ReleaseFast install --prefix "$HOME/.local"
The command installs the executable, desktop entry, app icon, manual pages,
and bundled themes. Add $HOME/.local/bin to PATH, then launch Monstar:
monstar
See Development for build requirements.
Run Monstar without arguments to start $SHELL. Monstar falls back to
/bin/sh when SHELL is unset. Pass -e to run a command directly:
monstar -e fish --login
Pass -- to run a shell expression:
monstar -- 'git log --oneline | less'
Set the working directory, initial size, title, app ID, font, and one-off configuration overrides with command-line options:
monstar --working-directory ~/src \
--title scratch \
--window-size-chars 100x32 \
--font Iosevka \
-o background-opacity=0.95
Run monstar --help, man monstar, or man 5 monstar for the complete
command and configuration reference.
Write configuration to $XDG_CONFIG_HOME/monstar/config. Use
~/.config/monstar/config when XDG_CONFIG_HOME is unset. Start with:
font-family = Iosevka
font-size = 12.5
theme = light:Rose Pine Dawn,dark:Rose Pine
background-opacity = 0.95
window-padding-x = 8
window-padding-y = 6
mouse-scroll-multiplier = precision:1,discrete:3
Set font-family to choose the primary font; the default is Fontconfig's
standard monospace family. Fontconfig normally selects matching bold and
italic faces and supplies language and emoji fallbacks automatically. Monstar
also bundles Nerd Font symbols.
For explicit control over separate bold, italic, bold-italic, or ordered
fallback families, define a virtual family such as Monstar Custom in
$XDG_CONFIG_HOME/fontconfig/conf.d/50-monstar.conf (normally
~/.config/fontconfig/conf.d/50-monstar.conf), then set
font-family = Monstar Custom. An annotated template is installed at
<prefix>/share/doc/monstar/examples/50-monstar.conf and lives at
dist/50-monstar.conf in the source tree.
By default, background-opacity affects only the default terminal background
and padding. Set background-opacity-cells = true to apply it to explicit cell
background colors too. Monstar requests compositor-provided blur whenever the
background is translucent; set background-blur = false to keep it clear.
Leave theme unset to follow the desktop light/dark preference with Monstar's
built-in Fluent 2 color schemes. Load bundled iTerm2 color schemes by name. Put
custom themes in $XDG_CONFIG_HOME/monstar/themes or
~/.config/monstar/themes.
Set the default command for new windows. Commands run through /bin/sh -c
unless prefixed with direct::
command = fish --login
# command = direct:fish --no-config
Other settings:
dev.rockorager.monstar).Ctrl+Shift+G is pressed.50000000).0 disables the protocol (default 320000000).true).0 disables the flash (default 200).#RRGGBB or RRGGBB; explicit colors override the theme.
cursor-color and cursor-text also accept cell-foreground and
cell-background to match the cursor cell at runtime.0–255; repeat the key
for more entries.Press Ctrl+Shift+, or send SIGUSR1 to reload the configuration:
pkill -USR1 monstar
Visual and interaction settings apply immediately. Process and storage settings apply to new windows.
| Shortcut | Action |
|---|---|
Ctrl+Shift+C / Ctrl+Shift+V | Copy / paste |
Ctrl+Shift+F | Search scrollback |
Ctrl+Shift+N | Open a new window in the current directory |
Ctrl+Shift+, | Reload configuration |
Shift+PageUp / Shift+PageDown | Scroll back / forward one page |
Shift+Home / Shift+End | Scroll to the top / bottom of scrollback |
Ctrl++ / Ctrl+= / Ctrl+- | Adjust the font size |
Ctrl+0 | Reset the font size |
Ctrl + left click | Open a hyperlink or detected URI |
Ctrl + right click | Copy a hyperlink or detected URI |
Ctrl + drag | Make a rectangular selection |
Writing-key shortcuts follow the active XKB keyboard layout.
Scrollback search updates as you type. Press Ctrl+N and Ctrl+P to move
between matches. Press Enter to copy a match to the primary selection. Press
Escape to restore the previous viewport.
Scrollback keybindings pass through to applications using the alternate screen.
Hold Shift while dragging to select text after an application captures the
mouse. Hold Ctrl+Shift instead of Ctrl to open or copy a link in this
state. Middle-click to paste the primary selection.
Ctrl+Shift+N through the systemd
user manager. Optional transient scopes place each shell process tree in a
separate scope.Enable a transient systemd scope for each newly spawned shell with:
linux-cgroup = always
If the session bus or systemd scope is unavailable, Monstar leaves the shell
in its inherited cgroup. Link opening falls back to xdg-open when the portal
is unavailable. Monstar disables optional Wayland protocols when the
compositor does not support them.
Monstar speaks the required subset of the D-Bus wire protocol directly, so
D-Bus is not a build or library dependency. Pass -Ddbus=false to compile the
client out entirely, at the cost of desktop notifications, launcher progress,
portal-based link/file opening (falls back to xdg-open), portal appearance
detection, and systemd cgroup isolation. Nothing else is affected. systemd
itself is never a build dependency; it is only used at runtime, over the
session bus, when linux-cgroup = always is configured and a systemd user
session is detected.
Monstar uses TERM=monstar by default.
If a remote server does not recognize monstar over SSH, send it the installed
definition from your local machine:
infocmp -x monstar | ssh YOUR-SERVER tic -x -
Alternatively, send the definition from the latest commit:
curl -fsSL https://raw.githubusercontent.com/rockorager/monstar/main/dist/monstar.terminfo \
| ssh YOUR-SERVER tic -x -
See Ghostty's Terminfo docs for details.
Reference distributions recorded on an Intel Core Ultra 7 258V. Lower is better. Results vary by workload.
Launch-and-exit time over 100 fresh runs of true:
Key event to echoed-frame commit over 200 injected keys:
Sample-time distributions from eight vtebench workloads:
vtebench measures producer blocking and PTY read throughput, not frame presentation or input latency.
/dev/dri/renderD128.monstar -e true, foot true, ghostty -e true, kitty true, and
alacritty -e true. The result covers the complete process lifetime, not
time to the first visible frame.WAYLAND_DEBUG=client. The test injected 200 keys with wtype at intervals
from 50 to 100 ms. A marked 20 ms raw-PTY echo delay was subtracted from each
sample to separate output commits from toolkit-only redraws. The result
includes client key handling, the PTY round trip, rendering, and buffer
commit. It excludes physical input, compositor presentation, and display
latency.5b350e2, ReleaseFast), foot 1.27.0,
Ghostty 1.3.2 tip (c5a21ed), kitty 0.47.4, and Alacritty 0.17.0.Building requires:
tic)wayland-protocols 1.49zig build
zig build fmt
zig build test
To smoke-test Kitty graphics animation in a running Monstar window:
python3 scripts/kitty-animation.py
The checkerboard image should change colors four times per second for eight seconds, including while no terminal output or input occurs.
Zig
98.2%
Shell
1.4%