Wayland Compositor for Terminals & TTYs. Run GUI apps (Chromium, Firefox, Nautilus) in your terminal or directly on bare TTY with Dwindle tiling, full input support, and clipboard integration. Renders via Kitty Graphics Protocol, Unicode halfblocks, or ASCII — whatever your terminal supports.
yay -S veil-host-bin velogin-bin
Veil is a Wayland compositor that can run:
It's built on Smithay (Rust Wayland compositor framework) and supports: Multi-window tiling (dwindle layout, 4-window max), full keyboard + mouse input, clipboard sync, and GPU/CPU encoding pipelines.
Perfect for: Embedded systems, headless servers, SSH sessions, Wayland development, and anyone who wants a compositor in their terminal.
veil append app to add apps to a running instance. Socket-based coordination.yay -S veil-host-bin # Compositor
yay -S velogin-bin # Login manager (optional)
Veil Compositor:
curl -fsSL https://viewerofall.pages.dev/install/veil/install.sh | bash
Abyss (Velogin) Login Manager:
curl -fsSL https://raw.githubusercontent.com/viewerofall/veilTDC/main/veil-login/dist/install.sh | sudo bash
Download from GitHub Releases:
curl -fsSL https://github.com/viewerofall/veil/releases/download/v2.0.0/veil-host-x86_64.tar.gz | tar xz
sudo install -m755 veil-host /usr/local/bin/
Requires Rust 1.78+:
git clone https://github.com/viewerofall/veil.git
cd veil
cargo build --release -p veil-host
sudo install -m755 target/release/veil-host /usr/local/bin/
veil-host run firefox
veil-host run nautilus
veil-host run helium-browser
Launches the compositor, opens your app in a fullscreen (or tiled if multiple) window.
# Terminal 1: Start daemon with first app
veil-host run firefox
# Terminal 2: Append another app to the same compositor
veil-host append nautilus
# Add a third
veil-host append kitty
# Override: kill daemon, start fresh
veil-host append chromium -O
| Keys | Action |
|---|---|
Super+H / J / K / L | Focus window (left/down/up/right) |
Super+= / - | Resize focused window (grow/shrink) |
Super+S | Swap focused with adjacent |
Super+R | Rotate split direction |
Super+Q | Exit Veil |
Ctrl+C | Kill focused app |
Note: All keybinds use Super key (Windows key) to avoid conflicts with in-app shortcuts.
| Flag | Description |
|---|---|
-m, --mode <mode> | Render mode: kitty, halfblock, ascii (auto-detects by default) |
--gpu | Enable GPU compute encoding (default: on) |
--debug | Write logs to /tmp/veil.log |
--stats | Show FPS and resolution in status bar |
-O, --override | Kill existing daemon, start fresh |
Abyss (package name: velogin) is a graphical TTY login manager. Runs on bare TTY with DRM/KMS, handles PAM authentication, session selection, avatar loading, and login cooldown.
From AUR:
yay -S velogin-bin
Curl install (recommended):
curl -fsSL https://raw.githubusercontent.com/viewerofall/veilTDC/main/veil-login/dist/install.sh | sudo bash
sudo systemctl enable --now seatd.service
sudo systemctl disable getty@tty1.service
sudo systemctl enable abyss.service
On next boot, you'll see Abyss on tty1 instead of a text login prompt. Select your session and login. Veil will launch automatically if selected.
App (Firefox, Nautilus, etc.)
↓ Wayland protocol
veil-host (Smithay compositor)
├─ Dwindle layout engine
├─ libinput input handling
├─ Compositor globals (xdg-shell, wl_seat, wl_shm, etc.)
├─ Software compositing (blit surfaces into RGBA)
├─ GPU encoding (wgpu compute shaders) or CPU fallback
└─ Output backends:
├─ Terminal (Kitty/halfblock/ASCII escape codes)
└─ DRM/KMS (direct framebuffer on bare TTY)
↓
Terminal / Framebuffer
| Protocol | Status |
|---|---|
| wl_compositor / wl_subcompositor | ✓ full |
| xdg_shell (toplevel + popup) | ✓ full |
| wl_seat (keyboard, pointer, touch) | ✓ full |
| wl_shm (shared memory buffers) | ✓ full |
| wl_data_device (clipboard) | ✓ full |
| wl_output + xdg_output | ✓ full |
| zwp_linux_dmabuf_v1 (GPU buffers) | ✓ optional (SHM fallback) |
| xwayland (X11 apps) | ✓ full |
Create ~/.config/veil/config.lua:
keybinds = {
mod_key = "super",
focus_left = "h", -- Super+H
focus_right = "l", -- Super+L
focus_up = "k", -- Super+K
focus_down = "j", -- Super+J
resize_grow = "equal", -- Super+=
resize_shrink = "minus", -- Super+-
swap_windows = "s", -- Super+S
rotate_split = "r", -- Super+R
quit = "q", -- Super+Q
}
render_mode = "auto" -- auto, kitty, halfblock, ascii
gpu_encode = true
Tested and working: Helium (Chromium), Firefox, Nautilus, Thunar, foot terminal, kitty terminal, Niri (nested), Hyprland (nested).
Requirements:
Terminals (nested mode): Kitty, WezTerm, xterm (with sixel). Generic xterm via sixel. Anything else via halfblock/ASCII.