mise run install builds a release binary and installs it into ~/.local with
a desktop entry and a hicolor icon.
Two wrinkles specific to a Nix-built GTK app installed outside the dev shell:
the launcher is a generated script rather than a symlink, because a desktop
launcher provides a minimal environment and GTK still needs to be pointed at
its GSettings schemas and icon themes; and install registers Nix GC roots for
every store path in the binary's RPATH, so nix-collect-garbage cannot delete
GTK out from under the installed app.
The runtime paths are exported from the flake's shellHook and read back at
install time, so they cannot drift from what the binary was built against.
Two separate problems made the terminal run the wrong shell:
Pty.create took a single argv slice and used argv[0] as both the exec path
and the argument vector's first entry. Session passed {shell, "-shell"},
so the shell received "-zsh" as an ordinary argument rather than as its
argv[0]. Bash quietly tolerated it; zsh rejects it and exits immediately,
which closed the tab and took the window down with it. The exec path and
argv are now separate parameters.
Shell resolution preferred $SHELL, which describes whichever shell launched
us rather than the one the user configured. Inside 'nix develop' that is
Nix's own minimal bash, so the terminal never opened the user's zsh. We now
read the login shell from the passwd database and keep $SHELL only as a
fallback for systems without a usable passwd entry.
shot.sh no longer forces a shell, so screenshots reflect real behavior.
Uses libghostty-vt (the API Ghostty documents for external embedders) for
the terminal core. Ghostty's other C API, ghostty.h, exposes a full terminal
surface but only supports macOS and iOS platform tags, so it cannot be
embedded on Linux.
We supply the layers libghostty-vt deliberately leaves out: PTY and process
management, a Cairo/Pango cell renderer, and a GTK4/libadwaita UI with a
Zen-style vertical tab sidebar.
Nix pins the whole toolchain (Zig 0.16 via zig-overlay, GTK 4.22, libadwaita)
so no host setup is needed.