ghostty-terminfo — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ghostty-terminfo (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Ghostty uses xterm-ghostty as its $TERM value. Remote hosts that lack this terminfo entry will show broken terminal behavior. The fix is to transfer the terminfo from the local machine to the remote host.
tic run as a normal user writes to ~/.terminfo, which ncurses searches before the system directory. No sudo, and nothing to add to shell rc files.
| Task | Command | |||
|---|---|---|---|---|
| Check if remote has terminfo | ssh HOST 'infocmp xterm-ghostty >/dev/null 2>&1' | |||
| Install terminfo on remote | `infocmp -x xterm-ghostty \ | ssh HOST tic -x -` | ||
| One-liner check + install | `ssh HOST 'infocmp xterm-ghostty >/dev/null 2>&1' \ | \ | infocmp -x xterm-ghostty \ | ssh HOST tic -x -` |
| Verify after install | `ssh HOST 'infocmp -x xterm-ghostty 2>/dev/null \ | grep -q Smulx && echo OK'` | ||
| Show the terminfo search path | ssh HOST 'infocmp -D' |
If you're already on the machine, just pipe it directly to tic:
infocmp -x xterm-ghostty | tic -x -infocmp -x xterm-ghostty | ssh user@host tic -x -This exports the local terminfo and compiles it on the remote host. Only needs to run once per remote machine.
It lands in the remote user's ~/.terminfo. Because the entry declares aliases (xterm-ghostty|ghostty|Ghostty), tic writes two files — the name and the alias. macOS names the subdirectory by the first letter in hex; Linux uses the letter itself:
~/.terminfo/78/xterm-ghostty ~/.terminfo/x/xterm-ghostty # macOS | Linux
~/.terminfo/67/ghostty ~/.terminfo/g/ghosttyRe-running the install is safe and idempotent; see Common Mistakes for the warnings it prints.
if [ "$TERM" = "xterm-ghostty" ]; then
ssh "$HOST" 'infocmp xterm-ghostty >/dev/null 2>&1' || \
infocmp -x xterm-ghostty | ssh "$HOST" tic -x -
fiOnly runs when connecting from Ghostty, skips if already installed.
Plain infocmp xterm-ghostty succeeding only proves an entry exists — not that the extended capabilities survived, which is the entire point of the -x flags. Check for an extended capability instead:
ssh HOST 'infocmp -x xterm-ghostty 2>/dev/null | grep -q Smulx && echo OK'Smulx, setrgbf, setrgbb, Sync and fullkbd are the extended caps Ghostty ships. To prove the entry is genuinely identical to the local one, compare the compiled bytes rather than infocmp text — the text rendering varies with ncurses version (hex vs decimal colors#256, \n vs ^J, escaped vs unescaped colons), so textual diffs manufacture false positives:
ssh HOST 'cksum ~/.terminfo/*/xterm-ghostty' # remote, macOS or Linux
cksum /Applications/Ghostty.app/Contents/Resources/terminfo/78/xterm-ghostty # localcksum is POSIX, so it gives the same number on both systems; md5 -q is macOS-only. The compiled bytes match across macOS and Linux tic.
A compiled entry can be present on the host, byte-identical to the local one, and still be invisible to the terminal. Presence and resolvability are separate conditions. ncurses only searches ~/.terminfo and the compiled-in system directories:
$ ssh MAC 'infocmp -D' $ ssh LINUX 'infocmp -D' # Debian/Ubuntu
/Users/someone/.terminfo /home/someone/.terminfo
/usr/share/terminfo /etc/terminfo
/usr/share/terminfoinfocmp -D lists only directories that exist. On a host that has never had a user entry it prints the system directories alone, yet ncurses still searches ~/.terminfo — the line appears as soon as tic creates the directory, so a normal install is still the fix.
An entry anywhere else — most often /usr/local/share/terminfo — resolves only if TERMINFO_DIRS points at it, and that is exported per-shell. So the same host can pass a check under one shell and fail under another:
$ ssh HOST 'zsh -lc "echo TERMINFO_DIRS=\$TERMINFO_DIRS"' # zsh ignores /etc/profile
TERMINFO_DIRS=
$ ssh HOST 'bash -lc "echo TERMINFO_DIRS=\$TERMINFO_DIRS"' # /etc/profile exports it
TERMINFO_DIRS=/usr/local/share/terminfo:When zsh is the login shell, that install is broken in practice while a bash -l spot check says it is fine.
Find every copy on the host, then compare against the search path above:
ssh HOST 'for d in ~/.terminfo /usr/local/share/terminfo /etc/terminfo \
/usr/share/terminfo /lib/terminfo; do
find "$d" -name "*ghostty*" 2>/dev/null
done'Anything outside the infocmp -D directories does not exist as far as the terminal is concerned. Do a normal ~/.terminfo install; the stray copy is then inert and can be removed.
infocmp -D is the check that settles it.tic prints older tic versions may treat the description field as an alias on a first install, and additionally alias ghostty multiply defined. when re-run on a host that already has the entry. Both exit 0 and leave a correct entry; the read-back verify is the real verdict./usr/share/terminfo is on the sealed read-only system volume, so tic -o there fails even as root with SIP disabled. ~/.terminfo is the supported target, not a fallback.infocmp xterm-ghostty fails if the local machine doesn't have the terminfo. Run from Ghostty or a machine with Ghostty installed.ncurses-term package ships /usr/share/terminfo/g/ghostty, named ghostty only. $TERM is xterm-ghostty, so infocmp ghostty succeeding proves nothing. Always check by the full name.infocmp -x and tic -x need the extended flag to preserve Ghostty's extended capabilities.TERM=xterm-256color before SSH works but loses Ghostty-specific features. Install the terminfo instead.PATH without the ncurses tools. Confirm with ssh HOST 'command -v tic' before working around it; if it really is absent, prefix the remote command with PATH=/usr/bin:/bin.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.