Link hover cards, rules and integrations
Explore this workspace.
Technical background
Hovering a link opens a card that says where it goes, what a click will do, and offers Open, Copy and Show in folder. A Link Tooltip settings page holds rules that customise the card per pattern, and an Integrations page runs declarative integration.json manifests that fetch a preview of what a link actually refers to — a ticket's status, a message, a session. Doing this also repaired Tabby's linkifier, which could never make a file path or a bare IP clickable at all.
The problem
A terminal prints links all day — URLs, file paths, issue keys, IP addresses — and a terminal's answer to all of them is the same: underline it, and open it if you Ctrl+click. You cannot tell where a link goes without following it, you cannot tell what a ticket key refers to without leaving the window, and Tabby could not make a file path or a bare IP clickable at all.
How it works
Hovering a link opens a card that names the link, shows the path or URL it will really open, and offers Open, Copy and Show in folder. A Link Tooltip settings page holds rules — a pattern, and what the card should do for anything matching it. An Integrations page runs declarative integration.json manifests: a manifest says how to recognise a reference, how to fetch it, and which fields to show, so hovering a ticket key shows its title, status and assignee without a plugin being written for it. The manifest format is tabby-links/INTEGRATIONS.md, and the built-in manifests are kept interchangeable with the Windows Terminal fork this was ported from.
Try it
- Open Settings → Link Tooltip and leave
enabledon. - Print something with a link in it and hover it — a URL, or a path such as
./package.json. - Add a rule with the Add rule button to change the delay, the width, or which buttons that kind of link gets.
- Open Settings → Integrations, enable one, and fill in its credential. Hover a reference it claims.
Settings
linkTooltip.enabled:trueMaster switch for the hover card. Detection stays on.
linkTooltip.detectLinks:trueWhether links are detected and made clickable at all.
linkTooltip.showDelay:250Milliseconds of hover before the card appears.
linkTooltip.hideDelay:400Milliseconds before it goes away.
linkTooltip.maxWidth:640Upper bound on the card's width — further limited by the pane.
linkTooltip.showButtons:trueShow Open / Copy / Show in folder on the card.
linkTooltip.safeSchemes:[]Extra URI schemes that open without a confirmation dialog.
linkTooltip.rules:[]The rule list. Each rule is a pattern plus the overrides it applies.
linkTooltip.integrations:{}Per-integration state, keyed by manifest id.
Details
- Tabby's linkifier was broken for file paths and bare IPs.
@xterm/addon-web-linksfilters every match through an internalisUrl()—new URL(text)must parse — soUnixFileHandler,WindowsFileHandlerandIPHandlernever produced a clickable link. Our provider vendors that addon'sLinkComputerminus the filter, which fixes all three. - A rule pattern is a remotely triggerable freeze. It runs synchronously on the mouse-move handler against text a remote host printed, and
(a+)+bon thirtyas takes about twelve seconds. Patterns are probed at increasing input lengths and refused both on save and on compile, so a rule hand-written intoconfig.yamlis covered too. - Credentials live in
<config dir>/integration-credentials.json, encrypted through the OS keystore — never inconfig.yaml, which Config Sync uploads verbatim. - An unconfigured integration still gets Open and Copy link. Resolving a ticket key to a URL needs only the matcher; only previewing needs a credential.
What this does not claim
- The first version of the ReDoS probe used fixed 64-character inputs and took 127 seconds on
(a+)+b— it reproduced the freeze it was meant to prevent. The probe escalates input length now, which is also why Tabby's own default handler regexes survive: they contain nested quantifiers and are simply fast, so a static syntax check would have refused them. - The punycode/IDN homograph annotation the reference fork has was silently dropped by this port and only added in a second pass. Several other keys degraded the same way — see Field groups, tabs, actions and detected patterns.
In upstream Tabby
Upstream ships tabby-linkifier, which detects links and opens them; it has no hover card, no rules and no integrations. Its Open and Show in folder use openExternal('file://' + p), which yields file://C:\foo on Windows — an existing upstream bug this fork sidesteps with platform.openPath() and showItemInFolder().