First launch

Brief

Run terminal-delight and one window opens with one terminal in it. Behind the window, a small background process called the session host starts and takes charge of your shells, so closing the window, or losing it to a crash, doesn't end them.

The left bar runs down the left side and holds your session as a tree of projects, groups and tasks. At the top of the right edge, a small pill counts agents waiting on you. The window's own controls (theme, gauges, dead agents, notifications, plugins) sit at the bottom right. The terminal itself is drawn as a CRT: scanlines, a soft glow, and glass that curves.

A few things to try first:

Ctrl+Shift+Ta new tab
Alt+V / Alt+Hsplit the pane side by side, or stacked
Alt+arrowsmove between panes
Alt+Kturn a pane to its workbench and back
F1every shortcut, and the language

Type claude or codex at a prompt and Terminal Delight notices the agent, or press Alt+K and use ⌁ LAUNCH AGENT to start one from a panel. Close the window and open it again: your tabs, splits, directories and agents come back where they were.

Technical has which session a window opens, what is saved, and when.

Technical

Starting up

Which session opens#

A session is a set of tabs and panes with a name of its own, 1, 2 or work, saved as ~/.config/terminal-delight/sessions/<name>.toml. A window opens:

  1. the session in TD_SESSION, if set;
  2. otherwise a session whose host is running with no window attached, which is what happens when you close the window and open it again;
  3. otherwise the most recently saved session, preferring one last used on this Hyprland workspace and one with more than a single pane;
  4. otherwise a new one, numbered from 1.

The window's title says which: terminal-delight — 1. On stderr it prints attached to the session host for session '1'. If no host can be reached, it says so and opens anyway, owning its terminals itself. Sessions has the rest, including running without a host.

The window#

  • No title bar from the desktop: Terminal Delight draws its own frame and its own — ☐ ✕. Drag the top bar to move it. ✕ saves before closing.
  • With no saved size, it opens at 1280 by 720, centred.
  • At startup it prints the GPU and driver it found, and warns if the theme's font is missing.
  • Narrower than 720 px, the controls at the bottom right fold into a … menu.

The first look#

First run writes your own theme file, theme.toml, as a copy of the built-in hacker theme, and the window tints it with a warm amber seed, #e0913a. Programs show their real colours. Every pane follows the window's look and starts with a warp of 1.43, text at 75% and the chrome at 80%. Themes and CRT say how to change any of it.

What's saved#

The session file keeps the window's size, every tab with its name, colours, group and project, the split layout, the left bar, the look, the MCP switches and the language. For each pane it keeps the directory the foreground program is in and, if that program is Claude Code or Codex, the command that resumes its conversation: claude --resume <id> or codex resume <id>. Reopening starts a shell in that directory and types the command.

It saves after anything that changes the layout, every 30 seconds, and when you press ✕. A save that would lose more than half the panes or tabs without your having closed them is refused, and the last ten versions are kept in sessions/backups/.

Closing#

Closing a tab sends it to the bay at the foot of the left bar, still running, and Ctrl+Shift+Z brings it back. Closing the last tab asks first, then ends its shells and quits. A session host with no window attached and nothing printed for twelve hours saves and stops.

On the desktop#

From a source checkout, scripts/install-desktop.sh adds a launcher and icon, and on Omarchy or Hyprland scripts/install-send-hotkey.sh binds Super+Alt+T to pull the terminal you're in, and the agent running in it, into Terminal Delight.

Sources

  1. Session choice: instance.rs; the window, saving and the safety nets: main.rs; what a pane remembers: session.rs; the first look: theme.rs (house_outer); the host's idle stop: host.rs.