@gregjohnso/pi-imgview
Display images from inside the pi coding agent: imgcat-style inline rendering in supported terminals, and one-click open in the system browser.
Package details
Install @gregjohnso/pi-imgview from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@gregjohnso/pi-imgview- Package
@gregjohnso/pi-imgview- Version
0.1.0- Published
- May 6, 2026
- Downloads
- not available
- Author
- gregjohnso
- License
- MIT
- Types
- extension
- Size
- 36.2 KB
- Dependencies
- 0 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./extensions/imgview"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
Imgview Extension
Show images from inside pi: render them inline in the terminal (iTerm2 / Kitty / WezTerm / Ghostty), open them in the system browser, or both.
The LLM gets a single tool, show_image, with a mode switch. You also
get three slash commands (/imgcat, /imgshow, /imgboth) for driving
the same code path by hand.
Why a separate tool when pi-tui can already render image attachments? Because the LLM has no way to attach an image on its own initiative.
show_imageis the bridge: it takes a path/URL, loads bytes, sniffs the MIME, and returns a tool result with{ type: "image", … }content — which pi-tui then renders inline using the host terminal's image protocol. For terminals without image support, the browser path is a reliable fallback.
Install
# from npm
pi install npm:@gregjohnso/pi-imgview
# or directly from git
pi install git:github.com/gregjohnso/pi-imgview
Then /reload inside pi, or start a new session.
To develop locally, symlink this repo into your extensions directory:
ln -s /absolute/path/to/pi-imgview/extensions/imgview ~/.pi/agent/extensions/imgview
Tools exposed to the LLM
| Tool | Purpose |
|---|---|
show_image |
Display an image inline in the terminal and/or in the user's browser |
show_image parameters
| Param | Type | Default | Meaning |
|---|---|---|---|
source |
string | — | Local path (absolute, relative-to-cwd, or ~/...), http(s):// URL, or data: URI. |
mode |
enum | terminal |
terminal | browser | both. Inline terminal is the strong default. Browser modes only fire when the user explicitly asks. |
caption |
string | — | Optional one-line note shown alongside the image. |
The tool's prompt guidelines instruct the LLM to never pick browser or
both on its own initiative — launching an external browser window is
disruptive. Use the /imgshow slash command, or pass mode: "browser"
explicitly, when you do want it.
Returned content:
- A text summary (source label, MIME, byte count, mode, caption, browser path if any).
- For
terminalandboth: an{ type: "image", data, mimeType }part that pi-tui renders inline using the host terminal's image protocol. Pi-tui auto-converts non-PNG to PNG when the host uses the Kitty graphics protocol; iTerm2-family terminals consume the bytes directly.
User commands
| Command | Effect |
|---|---|
/imgcat <path|url> |
Render the image inline in the terminal. |
/imgshow <path|url> |
Open the image in the system's default browser. |
/imgboth <path|url> |
Both. |
<path|url> may be:
- a local file (absolute, relative to cwd, or
~/...) - an
http:///https://URL (downloaded and sniffed) - a
data:URI
Browser opening
Browser mode writes a tiny self-contained HTML viewer (image embedded as
a base64 data URI) to $TMPDIR/pi-imgview/imgview-<id>.html and then:
| Platform | Command |
|---|---|
| macOS | open <html> |
| Linux | xdg-open <html> |
| Windows | cmd /c start "" <html> |
HTML files inherit the user's default-browser association on every supported platform, so this routes through the actual browser rather than (e.g.) Preview.app on macOS.
Supported MIME types
image/png, image/jpeg, image/gif, image/webp, image/bmp,
image/avif, image/svg+xml. MIME is determined by magic-byte sniff
first, file-extension hint second.
Anything else is rejected with a clear error rather than silently forwarded — base64 of an unknown blob in the model's context window is never useful.
Limits
- Images larger than
SOFT_MAX_BYTES(default 8 MiB) trigger a warning in the tool result. Inline rendering still works; the warning is for context-window awareness. https://fetches use the globalfetchand respect the agent's abort signal.- The custom message renderer for the slash-command path uses pi-tui's
Imagecomponent withmaxWidthCells: 60; the LLM-tool path inherits pi's normal tool-result image rendering.
Settings (module constants in index.ts)
SOFT_MAX_BYTES = 8 * 1024 * 1024 // warn-only soft cap
TMP_ROOT = $TMPDIR/pi-imgview
DEFAULT_MODE = "terminal"
Running the unit tests
cd ~/.pi/agent/extensions/imgview
npx tsx --test utils.test.ts
Why this is separate from antigravity-image-gen
antigravity-image-gen creates images by calling Google Antigravity,
then returns them as tool-result attachments. pi-imgview displays
existing images — files on disk, things at URLs, or data URIs the model
constructs on its own. They compose: have the model generate via
antigravity, save the result to disk, then show_image it.
Share your own pi extension by publishing it to npm with the pi-package
keyword — pi's package gallery auto-indexes it.