Skip to content

File Path Previews

Absolute file paths that show up in a session terminal or in a chat transcript are previewable in place: hover a path (or tap it on a phone) and Hive reads the file from the node that owns it and shows it in a small card - image, audio, video, or the head of a text file.

This closes the loop on pasted attachments. Pasting an image into a terminal uploads it to the daemon and types its path at the prompt (/var/lib/hive/attachments/<session>/paste-1786690246488.png), and agents print paths constantly. Before, that path was dead text and checking what it pointed at meant opening the Files explorer.

Where it works

SurfaceTrigger
Session terminal (PtyTerminal)Paths are underlined on hover; hover previews, click pins the card
Agent chat transcript (session chats, first-class Chats, team messages)Hover a path, or tap it on touch
Chat history and the streaming turn alikeSame handles - history is rendered through the same Markdown pipeline

Markdown links and images that point at a local path are rendered as preview handles too, so ![Image](/var/lib/hive/attachments/<id>/paste-1.png) becomes a preview handle instead of a broken <img> (a daemon-side path is not a URL the WebView can fetch). Remote http(s) images and links keep their normal behaviour.

What is previewable

Detection is by extension, matching the Files explorer:

  • Images - png, jpg/jpeg, gif, webp, avif, bmp, ico, svg
  • Audio - mp3, wav, ogg/oga, flac, m4a, aac, opus
  • Video - mp4, m4v, webm, mov, mkv, ogv
  • Text and code - md, txt, log, json, yaml/yml, toml, rs, ts/tsx, js/jsx, vue, py, go, sh, sql, and the rest of the usual set (first 60 lines are shown)

Anything else - an extensionless path, a binary, a socket - is left as plain text, so ordinary prose does not fill up with false handles. Paths inside code spans and fenced blocks are never turned into handles, and the path component of a URL is ignored.

Quoted paths containing spaces ("/home/dan/my notes/todo.md", the form the terminal paste flow types) are matched whole.

Where the bytes come from

The card reads through the same FsReadText / FsReadBinary wire messages the Files explorer uses, addressed to the node that owns the session. A chat that ran on another node previews its files over cluster forwarding exactly like a local one, and the store's cache means hovering the same path twice costs nothing.

Reads are subject to the daemon's own size cap; a file over the cap reports the daemon's error in the card rather than silently showing nothing.

Interaction details

  • Hover opens after a short delay, so scanning a transcript full of paths does not flash cards
  • The card stays open while the pointer is over it, closes shortly after leaving
  • Click (desktop) or tap (touch) pins the card: on touch it opens as a centred sheet with a backdrop and a close button, since there is no hover there
  • Escape closes a pinned card; scrolling closes an unpinned one
  • Path handles are keyboard reachable - Tab to one, Enter or Space opens it
  • File Explorer - clipboard and drag-and-drop attachments for terminal prompts, and where pasted files land
  • Files Explorer - full-filesystem browsing and the Fs* wire protocol the preview reuses
  • Chats - chat attachments, which are linked context rather than printed paths

Hive - remote AI coding agents over WebSocket.