Skip to content

feat: native image and PDF preview support#993

Open
abaj8494 wants to merge 741 commits intoalexpasmantier:mainfrom
abaj8494:image-preview
Open

feat: native image and PDF preview support#993
abaj8494 wants to merge 741 commits intoalexpasmantier:mainfrom
abaj8494:image-preview

Conversation

@abaj8494
Copy link
Copy Markdown

Summary

  • Add inline image rendering in the preview pane using ratatui-image, with automatic detection of terminal graphics protocol (Kitty/iTerm2/Sixel) from environment variables and font size from ioctl
  • Add native PDF preview by converting the first page via pdftoppm and rendering through the same pipeline
  • Support remote image/PDF URLs with download-to-cache for cable channels, EXIF orientation, and a "Loading..." indicator while previews generate
  • Add TERM=dumb to bat-using cable channels to prevent OSC 10/11 escape sequence leaks

Details

Image rendering

  • Introduces PreviewContent enum (Text | Image) to the preview system
  • Detects image files by extension and decodes via the image crate with EXIF orientation support
  • Renders using ratatui-image StatefulImage with per-entry protocol state caching
  • Graphics protocol detected from env vars (KITTY_WINDOW_ID, TERM_PROGRAM, LC_TERMINAL) — no terminal escape queries, so no conflicts with crossterm's event reader
  • Font cell size obtained via TIOCGWINSZ ioctl for accurate image scaling

PDF rendering

  • Converts first page of PDFs to JPEG via pdftoppm (from poppler-utils)
  • Cached by content hash to avoid re-rendering

Cable channel support

  • Remote URLs (http/https) are downloaded to a cache directory and previewed natively
  • Uses entry.output() for path detection to correctly handle tab-separated cable channel entries
  • Switches files.toml preview from bat to tv-preview for broader format support

New dependencies

  • ratatui-image — terminal image rendering
  • image — image decoding with EXIF support
  • rustixtcgetwinsize ioctl for terminal pixel dimensions

Test plan

  • Run tv files in a Kitty terminal and select an image file — should render inline
  • Select a PDF file — should render first page as image
  • Select a text file — should render normally with syntax highlighting
  • Run in iTerm2/WezTerm — should auto-detect protocol and render images
  • Run in a terminal without graphics support — should fall back gracefully
  • Verify no escape sequence leaks appear in the search bar
  • Test with a cable channel that uses tab-separated output format

dependabot bot and others added 30 commits October 21, 2025 20:21
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5
to 6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/setup-node/releases">actions/setup-node's
releases</a>.</em></p>
<blockquote>
<h2>v6.0.0</h2>
<h2>What's Changed</h2>
<p><strong>Breaking Changes</strong></p>
<ul>
<li>Limit automatic caching to npm, update workflows and documentation
by <a
href="https://github.com/priyagupta108"><code>@​priyagupta108</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1374">actions/setup-node#1374</a></li>
</ul>
<p><strong>Dependency Upgrades</strong></p>
<ul>
<li>Upgrade ts-jest from 29.1.2 to 29.4.1 and document breaking changes
in v5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1336">#1336</a></li>
<li>Upgrade prettier from 2.8.8 to 3.6.2 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1334">#1334</a></li>
<li>Upgrade actions/publish-action from 0.3.0 to 0.4.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1362">#1362</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/setup-node/compare/v5...v6.0.0">https://github.com/actions/setup-node/compare/v5...v6.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/setup-node/commit/2028fbc5c25fe9cf00d9f06a71cc4710d4507903"><code>2028fbc</code></a>
Limit automatic caching to npm, update workflows and documentation (<a
href="https://redirect.github.com/actions/setup-node/issues/1374">#1374</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/13427813f706a0f6c9b74603b31103c40ab1c35a"><code>1342781</code></a>
Bump actions/publish-action from 0.3.0 to 0.4.0 (<a
href="https://redirect.github.com/actions/setup-node/issues/1362">#1362</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/89d709d423dc495668cd762a18dd4a070611be3f"><code>89d709d</code></a>
Bump prettier from 2.8.8 to 3.6.2 (<a
href="https://redirect.github.com/actions/setup-node/issues/1334">#1334</a>)</li>
<li><a
href="https://github.com/actions/setup-node/commit/cd2651c46231bc0d6f48d6b34433b845331235fe"><code>cd2651c</code></a>
Bump ts-jest from 29.1.2 to 29.4.1 (<a
href="https://redirect.github.com/actions/setup-node/issues/1336">#1336</a>)</li>
<li>See full diff in <a
href="https://github.com/actions/setup-node/compare/v5...v6">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-node&package-manager=github_actions&previous-version=5&new-version=6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
A channel to browse through tldr entries
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
## 📺 PR Description

Television channel to browse and preview TLDR help pages for
command-line tools

This channel should work with any client that implements the '--list'
option. In practice all official clients and other popular clients
implement this recommended flag as specified in the client
specification,
https://github.com/tldr-pages/tldr/blob/main/CLIENT-SPECIFICATION.md

## Checklist

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [ ] I have added a reasonable amount of documentation to the code
where appropriate
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
This aims to improve UX a bit by avoiding users having to manually pull
channels on tv's first run.
…cess

This aims to reduce flakyness in CI environments where machines can be a
bit slower
## 📺 PR Description

Channel for selecting television cable channels.

I would prefer this channel to be builtin. This channel doesn't respect
command line flags `--config-file` or `--cable-dir`. Instead it would be
nice to allow immediate jump into the remote-control, for example, using
`tv <ctrl-t>`. Nevertheless, the channel does the job.

## Checklist

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [ ] I have added a reasonable amount of documentation to the code
where appropriate
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
This PR was created by a GitHub Action to update the changelog.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
This PR was created by a GitHub Action to update the changelog.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
…ntier#754)

## 📺 PR Description

<!-- summary of the change + which issue is fixed if applicable. -->

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [X] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [ ] I have added a reasonable amount of documentation to the code
where appropriate
This was causing garbled ui characters when result items containing ansi
escape sequences also contained control characters/tabs/newlines/etc
This PR was created by a GitHub Action to update the changelog.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
fixes alexpasmantier#735

The problem seems to lie in interactive mode shells trying to reach the
tty before tv initializes it resulting in a SIGTTOU.
The fix simply delays that with a subshell which is kind of a hack but
does seem to work consistently.
Will need a more robust sync mechanism in the future.
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
github-actions bot and others added 27 commits March 1, 2026 14:42
This PR was created by a GitHub Action to update the changelog.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
Curly braces in commit messages (e.g. ${EDITOR:-}) cause Docusaurus
MDX compilation failures. Escape them in the current changelog and add
git-cliff postprocessors to prevent future occurrences.
Bump all website dependencies to latest versions, including major
upgrades for @docsearch/react (3→4) and typescript (5.6→5.9). Fix
SearchBar component for docsearch v4 API changes and escape <STRING>
in patch-notes.md for MDX compatibility.
Add pnpm overrides to fix npm vulnerabilities in transitive deps:
- serialize-javascript >=7.0.3 (RCE via RegExp.flags)
- minimatch >=3.1.4 (ReDoS)

Update Cargo.lock to fix Rust vulnerabilities:
- time 0.3.44 → 0.3.47 (stack exhaustion DoS)
- bytes 1.11.0 → 1.11.1 (integer overflow in BytesMut::reserve)
…xpasmantier#923)

## 📺 PR Description

closes alexpasmantier#917 
Persistence was not being called on the `execute` execution path, this
should cover it

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [ ] I have added a reasonable amount of documentation to the code
where appropriate
## 📺 PR Description

It's not a good idea to assume everyone has uploaded an ssh-publickey to
alexpasmantier's account.

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [x] I have added a reasonable amount of documentation to the code
where appropriate
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
…lexpasmantier#933)

`dump_context()` was deep-cloning the entire `MergedConfig` on every
render frame. Now it clones an `Arc`.
## 📺 PR Description

This PR closes alexpasmantier#940

```bash
echo aaaa\nwwww\neeee\nrrrr\ntttt\nyyyy | tv -- --select-1 --input 'a'
```

Running this command now automatically selects `aaaa` entry. The
`--select-1` command now does so after `--input` is applied

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [x] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [x] I have added a reasonable amount of documentation to the code
where appropriate
alexpasmantier#949)

## 📺 PR Description

Fixes a panic in `previewer/state.rs` that occurred when `scroll`
exceeded the actual number of lines in `content.lines`.
The root cause was that `for_render_context` used `total_lines` to
compute slice bounds, but `total_lines` and `content.lines.len()` can be
out of sync (e.g. while a new preview is still loading). This caused:

range start index 4906 out of range for slice of length 1

**Fix:** clamp `scroll` to the real content length and derive
`num_lines` from `content.lines.len()` instead of `total_lines`.

Fixes panic reported via human-panic in
`television/previewer/state.rs:60`.

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [ x] my commits **and PR title** follow the [conventional commits]
…tier#952)

## Summary
- Fix one-frame visual jitter where results shift horizontally when
first appearing
- Root cause: initial selection check read a stale `result_count()`
before `channel.results()` updated it, causing entries to render without
highlight-symbol spacing for one frame

Fixes alexpasmantier#943
## 📺 PR Description

<!-- summary of the change + which issue is fixed if applicable. -->

Remove the redundant branch when assigning `INSTALL_DIR` in
`install.sh`.

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [ ] I have added a reasonable amount of documentation to the code
where appropriate
…lexpasmantier#953)

## Summary
- The `--select-1` and `--take-1` selection tests were flaky because
they used a single-shot raw output read after the 300ms spawn delay
- The full pipeline (TUI start → source command → nucleo processing →
channel finish → auto-select → exit) can exceed that delay, causing the
test to read TUI escape sequences instead of the expected output
- Switched all three auto-select tests to use
`assert_raw_output_contains_with_timeout` with a 2s timeout and
exponential backoff, matching the approach already used by
`--take-1-fast`

## Test plan
- [x] `cargo test --test command_line cli::selection -- --nocapture` —
all 11 tests pass
…ows (alexpasmantier#946)

## 📺 PR Description

<!-- summary of the change + which issue is fixed if applicable. -->
when trying to print content of file paths that starts with '-' on
windows, bat puts out this error:
error: unexpected argument '-1' found

  tip: to pass '-1' as a value, use '-- -1'

Usage: bat.exe [OPTIONS] [FILE]...
       bat.exe <COMMAND>

For more information, try '--help'.

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [x] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [x] I have added a reasonable amount of documentation to the code
where appropriate
## 📺 PR Description

This PR introduced a new channel for tailscale users, it lists the
available exit-nodes in your tailscale system, and on `enter` selects
this as the desired exit node

## Checklist

<!-- a quick pass through the following items to make sure you haven't
forgotten anything -->

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [x] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [x] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [x] I have added a reasonable amount of documentation to the code
where appropriate
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
## 📺 PR Description

Adds four Podman channels mirroring the existing Docker channels,
replacing `docker` with `podman` throughout:

- **podman-containers** — list running and stopped containers; supports
start, stop, restart, exec, follow logs, and remove actions
- **podman-images** — list local images; supports run, open shell, and
remove actions
- **podman-volumes** — list volumes; supports remove and inspect actions
- **podman-networks** — list networks; supports remove action

Note: Podman's `network inspect` JSON uses lowercase keys (`name`,
`driver`, `subnets`, `dns_enabled`) unlike Docker's capitalized
equivalents — the preview jq filter accounts for this.

## Checklist

- [x] my commits **and PR title** follow the [conventional
commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) format
- [ ] if this is a new feature, I have added tests to consolidate the
feature and prevent regressions
- [ ] if this is a bug fix, I have added a test that reproduces the bug
(if applicable)
- [ ] I have added a reasonable amount of documentation to the code
where appropriate
…antier#928)

Bumps
[crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg)
from 6 to 7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/crazy-max/ghaction-import-gpg/releases">crazy-max/ghaction-import-gpg's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.0</h2>
<ul>
<li>Node 24 as default runtime (requires <a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Actions
Runner v2.327.1</a> or later) by <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/241">crazy-max/ghaction-import-gpg#241</a></li>
<li>Switch to ESM and update config/test wiring by <a
href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/239">crazy-max/ghaction-import-gpg#239</a></li>
<li>Bump <code>@​actions/core</code> from 1.11.1 to 3.0.0 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/232">crazy-max/ghaction-import-gpg#232</a></li>
<li>Bump <code>@​actions/exec</code> from 1.1.1 to 3.0.0 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/242">crazy-max/ghaction-import-gpg#242</a></li>
<li>Bump brace-expansion from 1.1.11 to 1.1.12 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/221">crazy-max/ghaction-import-gpg#221</a></li>
<li>Bump minimatch from 3.1.2 to 3.1.5 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/240">crazy-max/ghaction-import-gpg#240</a></li>
<li>Bump openpgp from 6.1.0 to 6.3.0 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/233">crazy-max/ghaction-import-gpg#233</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/crazy-max/ghaction-import-gpg/compare/v6.3.0...v7.0.0">https://github.com/crazy-max/ghaction-import-gpg/compare/v6.3.0...v7.0.0</a></p>
<h2>v6.3.0</h2>
<ul>
<li>Bump openpgp from 5.11.2 to 6.1.0 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/215">crazy-max/ghaction-import-gpg#215</a></li>
<li>Bump cross-spawn from 7.0.3 to 7.0.6 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/212">crazy-max/ghaction-import-gpg#212</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/crazy-max/ghaction-import-gpg/compare/v6.2.0...v6.3.0">https://github.com/crazy-max/ghaction-import-gpg/compare/v6.2.0...v6.3.0</a></p>
<h2>v6.2.0</h2>
<ul>
<li>Bump <code>@​actions/core</code> from 1.10.1 to 1.11.1 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/209">crazy-max/ghaction-import-gpg#209</a></li>
<li>Bump braces from 3.0.2 to 3.0.3 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/203">crazy-max/ghaction-import-gpg#203</a></li>
<li>Bump ip from 2.0.0 to 2.0.1 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/196">crazy-max/ghaction-import-gpg#196</a></li>
<li>Bump micromatch from 4.0.4 to 4.0.8 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/207">crazy-max/ghaction-import-gpg#207</a></li>
<li>Bump openpgp from 5.11.0 to 5.11.2 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/205">crazy-max/ghaction-import-gpg#205</a></li>
<li>Bump tar from 6.1.14 to 6.2.1 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/198">crazy-max/ghaction-import-gpg#198</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/crazy-max/ghaction-import-gpg/compare/v6.1.0...v6.2.0">https://github.com/crazy-max/ghaction-import-gpg/compare/v6.1.0...v6.2.0</a></p>
<h2>v6.1.0</h2>
<ul>
<li>Bump <code>@​actions/core</code> from 1.10.0 to 1.10.1 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/186">crazy-max/ghaction-import-gpg#186</a></li>
<li>Bump <code>@​babel/traverse</code> from 7.17.3 to 7.23.2 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/191">crazy-max/ghaction-import-gpg#191</a></li>
<li>Bump debug from 4.1.1 to 4.3.4 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/190">crazy-max/ghaction-import-gpg#190</a></li>
<li>Bump openpgp from 5.10.1 to 5.11.0 in <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/pull/192">crazy-max/ghaction-import-gpg#192</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/crazy-max/ghaction-import-gpg/compare/v6.0.0...v6.1.0">https://github.com/crazy-max/ghaction-import-gpg/compare/v6.0.0...v6.1.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/2dc316deee8e90f13e1a351ab510b4d5bc0c82cd"><code>2dc316d</code></a>
Merge pull request <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/issues/242">#242</a>
from crazy-max/dependabot/npm_and_yarn/actions/exec-3...</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/5812792d2b1cde341f2ea75ce7ca7ba2d2f9d140"><code>5812792</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/ceb906ede8cacd6fd63677a4c35d8df2c42b6906"><code>ceb906e</code></a>
build(deps): bump <code>@​actions/exec</code> from 1.1.1 to 3.0.0</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/a9dffd930715a967060b1945ffb5a4ccd847e482"><code>a9dffd9</code></a>
Merge pull request <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/issues/241">#241</a>
from crazy-max/node24</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/36d49fcb3ce6996de4ea7013ab71d6bc03a00b04"><code>36d49fc</code></a>
node 24 as default runtime</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/50c4e4f047b7ceb0acad3118559179fb10009d01"><code>50c4e4f</code></a>
Merge pull request <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/issues/233">#233</a>
from crazy-max/dependabot/npm_and_yarn/openpgp-6.3.0</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/c78fe49862245dc2ce48649309af68f2bdaa5758"><code>c78fe49</code></a>
chore: update generated content</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/8dbbb1e8e50d7676574ffd644d8f1ea7a32fd0ea"><code>8dbbb1e</code></a>
Merge pull request <a
href="https://redirect.github.com/crazy-max/ghaction-import-gpg/issues/221">#221</a>
from crazy-max/dependabot/npm_and_yarn/brace-expansio...</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/fc715b05fd639536a0a18c77c724056e4ffa9397"><code>fc715b0</code></a>
build(deps): bump openpgp from 6.1.0 to 6.3.0</li>
<li><a
href="https://github.com/crazy-max/ghaction-import-gpg/commit/99469162d0438cc32ec0ca8bc23d6a405bd28577"><code>9946916</code></a>
build(deps): bump brace-expansion from 1.1.11 to 1.1.12</li>
<li>Additional commits viewable in <a
href="https://github.com/crazy-max/ghaction-import-gpg/compare/v6...v7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crazy-max/ghaction-import-gpg&package-manager=github_actions&previous-version=6&new-version=7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4
to 5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pnpm/action-setup/releases">pnpm/action-setup's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.0</h2>
<p>Updated the action to use Node.js 24.</p>
<h2>v4.4.0</h2>
<p>Updated the action to use Node.js 24.</p>
<h2>v4.3.0</h2>
<h2>What's Changed</h2>
<ul>
<li>docs: fix the run_install example in the Readme by <a
href="https://github.com/dreyks"><code>@​dreyks</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/175">pnpm/action-setup#175</a></li>
<li>chore: remove unused <code>@types/node-fetch</code> dependency by <a
href="https://github.com/silverwind"><code>@​silverwind</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/186">pnpm/action-setup#186</a></li>
<li>Clarify that package_json_file is relative to GITHUB_WORKSPACE by <a
href="https://github.com/chris-martin"><code>@​chris-martin</code></a>
in <a
href="https://redirect.github.com/pnpm/action-setup/pull/184">pnpm/action-setup#184</a></li>
<li>feat: store caching by <a
href="https://github.com/jrmajor"><code>@​jrmajor</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/188">pnpm/action-setup#188</a></li>
<li>refactor: remove star imports by <a
href="https://github.com/KSXGitHub"><code>@​KSXGitHub</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/196">pnpm/action-setup#196</a></li>
<li>fix(ci): exclude macos by <a
href="https://github.com/KSXGitHub"><code>@​KSXGitHub</code></a> in <a
href="https://redirect.github.com/pnpm/action-setup/pull/197">pnpm/action-setup#197</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/dreyks"><code>@​dreyks</code></a> made
their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/175">pnpm/action-setup#175</a></li>
<li><a
href="https://github.com/silverwind"><code>@​silverwind</code></a> made
their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/186">pnpm/action-setup#186</a></li>
<li><a
href="https://github.com/chris-martin"><code>@​chris-martin</code></a>
made their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/184">pnpm/action-setup#184</a></li>
<li><a href="https://github.com/jrmajor"><code>@​jrmajor</code></a> made
their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/188">pnpm/action-setup#188</a></li>
<li><a
href="https://github.com/Boosted-Bonobo"><code>@​Boosted-Bonobo</code></a>
made their first contribution in <a
href="https://redirect.github.com/pnpm/action-setup/pull/199">pnpm/action-setup#199</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/pnpm/action-setup/compare/v4.2.0...v4.3.0">https://github.com/pnpm/action-setup/compare/v4.2.0...v4.3.0</a></p>
<h2>v4.2.0</h2>
<p>When there's a <code>.npmrc</code> file at the root of the
repository, pnpm will be fetched from the registry that is specified in
that <code>.npmrc</code> file <a
href="https://redirect.github.com/pnpm/action-setup/pull/179">#179</a></p>
<h2>v4.1.0</h2>
<p>Add support for <code>package.yaml</code> <a
href="https://redirect.github.com/pnpm/action-setup/pull/156">#156</a>.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/pnpm/action-setup/compare/v4...v5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pnpm/action-setup&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This PR was created by a GitHub Action to update the channel
documentation.

Co-authored-by: alexpasmantier <47638216+alexpasmantier@users.noreply.github.com>
Also fix MDX build: escape <STRING> in patch-notes and add cliff.toml
postprocessor to prevent future occurrences.
Add inline image rendering in the preview pane using ratatui-image.
When a selected entry is a recognized image file, tv now decodes and
displays it natively using the terminal's graphics protocol (Kitty,
iTerm2, Sixel) instead of shelling out to a preview command.

Key changes:

- Introduce PreviewContent enum (Text | Image) to support both modes
- Detect image files by extension and decode via the image crate
- Render images with ratatui-image StatefulImage + Picker
- Cache per-entry protocol state to avoid re-encoding every frame
- Detect graphics protocol from environment variables (KITTY_WINDOW_ID,
  TERM_PROGRAM, LC_TERMINAL) instead of terminal escape queries, which
  avoids conflicts with crossterm's raw mode event reader
- Get font cell size via TIOCGWINSZ ioctl for accurate image scaling
- Add native PDF preview by converting first page via pdftoppm
- Support remote image/PDF URLs with download-to-cache for cable channels
- Apply EXIF orientation metadata so photos display correctly rotated
- Show "Loading..." indicator while preview generates
- Add TERM=dumb to bat-using cable channels to prevent OSC 10/11 leaks
- Switch files.toml preview from bat to tv-preview for broader support
- Drain all event types in flush_existing_events(), not just keys
- Use entry.output() for path detection to handle tab-separated entries

New dependencies: ratatui-image, image, rustix (for ioctl)
@abaj8494
Copy link
Copy Markdown
Author

there is a Loading... whilst the preview is Loading; much like lf provides previews through Kitty

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.